発端
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 件のコメント:
コメントを投稿