記事の概要
mbet TLSを用いてHKDFを利用します。
サンプルプログラムは以下に置いてあります。
https://github.com/matsuikosuke/mbedTLSTest
HKDFとは何か
HKDFは、入力鍵から別の鍵を生成します。
派生キーを生成するために使用されます。 最初のステップである「抽出」は、入力キーマテリアルを取得し、
入力鍵から固定長の疑似ランダムキー(PRK)を生成し、PRKから任意の長さの別の鍵を生成します。
HKDFを作成する目的は、共有鍵を暗号化鍵に変換することです。
サンプルコード
mbedtls_hkdf
関数を使用してHKDFを作成します。
引数の意味は以下のリンク先を参照ください。
https://tls.mbed.org/api/hkdf_8h.html#add9dfaeb0544fe502c0240c9f90618ed
以下のテスト関数では、生成したHKDFhkdf_okm
が期待値expected_hkdf_okm
と一致することを確認しています。
int mbed_hkdf_test(void)
{
nrf_crypto_hmac_context_t context;
unsigned char hkdf_ikm_len_22[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
unsigned char expected_hkdf_okm[42] = { 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31, 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e, 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, 0x96, 0xc8 };
nrf_crypto_hmac_context_t hkdf_context;
uint32_t i;
int ret;
size_t ikm_len = 22;//sizeof(hkdf_ikm_len_22);
size_t okm_len = sizeof(expected_hkdf_okm);
size_t expected_okm_len = okm_len;
unsigned char hkdf_okm[42];
memset(hkdf_okm, 0xFF, sizeof(hkdf_okm));
ret = mbedtls_hkdf(
mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
NULL, //const unsigned char * salt
0, //size_t salt_len
&hkdf_ikm_len_22[0], //const unsigned char * ikm,
22, //size_t ikm_len,
NULL, //const unsigned char * info,
0, //size_t info_len,
&hkdf_okm[0], //unsigned char * okm,
okm_len //size_t okm_len
);
printf("hkdf_okm=");
for (uint16_t i=0; i<okm_len; i++) {
printf("%02lX, ", hkdf_okm[i]);
}
printf("\r\n");
//Verification: are the computed hkdf and the expected hkdf equal?
ret = memcmp(&hkdf_okm, &expected_hkdf_okm, okm_len);
if( ret != 0 )
printf("error\r\n");
return ret;
}
参照
mbed TLSでAES-GCMを利用する
mbed TLSでRSAを利用する「RSA-OAEPの暗号化と復号」
mbed TLSでRSAを利用する「RSAの公開鍵と秘密鍵の作成」
mbed TLSおよびOberonでECDHを利用する
mbed TLSでHKDFを利用する
mbed TLSでJWTを利用する