LoginSignup
1
0

More than 1 year has passed since last update.

mbed TLSでHKDFを利用する

Last updated at Posted at 2021-07-17

記事の概要

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を利用する

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0