Разобрать буфер закрытого ключа ECC - PullRequest
0 голосов
/ 19 февраля 2019

Я использую OPTEE-OS и mbedTLS и хочу создать CSR.Я создаю свой ключ EC с помощью API Global Platform:

res = TEE_AllocateTransientObject(
    TEE_TYPE_ECDSA_KEYPAIR,
    DSEC_ECDSA_SHA256_KEY_BITS,
    &key_pair);
if (res != TEE_SUCCESS) {
    return res;
}

Затем извлекаю закрытый ключ:

res = TEE_GetObjectBufferAttribute(
    key_pair,
    TEE_ATTR_ECC_PRIVATE_VALUE,
    buffer,
    &bufferlen);
if (res != TEE_SUCCESS) {
    return res;
}

Затем с помощью mbedTLS анализирую это значение и создаю a для создания CSR:

mbedtls_pk_context priv_key;
mbedtls_pk_init(&priv_key);

ret = mbedtls_pk_parse_key(
    &priv_key,
    key,
    size,
    NULL ,
    0
  );

Однако извлеченное значение из TEE_GetObjectBufferAttribute не имеет заголовков и footpage:

"-----BEGIN EC PRIVATE KEY-----"
"-----END EC PRIVATE KEY-----"

и является только двоичным массивом (не строкой).В настоящее время я получаю следующий код ошибки: "-15616: PK - Invalid key tag or value".

Можно ли создать mbedtls_pk_context только с двоичным значением моего личного ключа?

1 Ответ

0 голосов
/ 19 марта 2019

Функции синтаксического анализа в Mbed TLS pk.h предполагают ввод DER или PEM.Если вы можете найти готовый код для экспорта ключа в виде DER (или PEM) из OPTEE, это будет проще (но, возможно, немного менее эффективно).С другой стороны, проще выполнить импорт вручную, чем писать функцию экспорта DER.

Вам нужно вызвать mbedtls_pk_setup(), чтобы объявить, что контекст будет содержать ключ ECC,затем создайте ключ ECC напрямую, используя интерфейс в ecp.h.Преобразуйте обозначение кривой из кодировки TEE в кодировку Mbed TLS и вычислите открытый ключ из частного значения.(В качестве альтернативы вы могли бы экспортировать TEE_ATTR_ECC_PUBLIC_VALUE и установить ec->Q, но это больше работы.)

mbedtls_ecp_grp_id grp_id = …; // you need to convert this from the `TEE_ATTR_ECC_CURVE`
mbedtls_pk_context pk;
mbedtls_ecp_keypair *ec = malloc(sizeof(mbedtls_ecp_keypair));
mbedtls_pk_init(&pk);
mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_ECDSA));
mbedtls_ecp_keypair_init(ec);
mbedtls_ecp_group_load(&ec->grp, grp_id);
mbedtls_mpi_read_binary(&ec->d, buffer, bufferlen);
mbedtls_ecp_check_privkey(&ec->grp, &ec->d);
mbedtls_ecp_mul(&ec->grp, &ec->Q, &ec->d, &ec->grp.G, mbedtls_ctr_drbg_random, &ctr_drbg);
pk->pk_ctx = ec;

Полностью не проверено.Проверка ошибок опущена.ctr_drbg - это экземпляр CTR_DRBG, используемый для ослепления при вычислении открытого ключа.

...