2024年12月3日火曜日

aes-ccm を OpenSSL で

aes-ccm を OpenSSL で

発端

aes-ccm を OpenSSL で処理しようにもコマンドでは対応していない。
OpenSSLのライブラリを使ってプログラムで処理するしかない。

どうすればいい?

OpenSSL WikiのEVP Authenticated Encryption and Decryptionを参考にして検証してみた。(aad は面倒なのでなくした)

int ccm_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext, unsigned char *tag) { EVP_CIPHER_CTX *ctx; int len; int ciphertext_len; /* EVP_CIPHER_CTX の確保 */ if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); /* aes-256-ccm 暗号化モードで初期化(復号化の場合はEVP_DecryptInit_ex) */ if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_ccm(), NULL, NULL, NULL)) handleErrors(); /* IV の長さを設定 */ if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, 7, NULL)) handleErrors(); /* Tag の長さを設定 */ EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, NULL); /* key と IV の値を設定 */ if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv)) handleErrors(); /* 暗号化対象データの長さを設定 */ if(1 != EVP_EncryptUpdate(ctx, NULL, &len, NULL, plaintext_len)) handleErrors(); /* 暗号化対象のデータ、暗号化データの出力先、暗号化データサイズの出力先を渡して 操作の実行 /* if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) handleErrors(); ciphertext_len = len; /* 操作の完了。通常、暗号化データはこの時点で書き込まれるが CCM の場合は書き込まれない。 */ if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors(); ciphertext_len += len; /* Tag の取得 */ if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, 14, tag)) handleErrors(); /* 終了処理 */ EVP_CIPHER_CTX_free(ctx); return ciphertext_len; }

0 件のコメント:

コメントを投稿