VTS(Vendor Test Suite)のテストケース PerInstance/EncryptionOperationsTest.TripleDesEcbRoundTripSuccess/0_default は、Keymaster HAL が Triple DES(3DES)アルゴリズムの ECB モードを正しくサポートしているかを検証するものである。このテストは OP-TEE 上の Keymaster TA(Trusted Application)に 3DES の実装が不足している場合、複数のエラーを引き起こす。
問題1: GenerateKey で UNSUPPORTED_ALGORITHM
初期状態では、TA_generate_key() 関数が KM_ALGORITHM_TRIPLE_DES(値 33)に対応しておらず、default ケースで KM_ERROR_UNSUPPORTED_ALGORITHM を返していた。
解決策として、以下のように switch 文にケースを追加した:
case KM_ALGORITHM_TRIPLE_DES:
attributes = attributes_aes_hmac;
attr_count = KM_ATTR_COUNT_AES_HMAC;
type = TEE_TYPE_DES3;
break;
問題2: Begin 操作で INCOMPATIBLE_DIGEST
キー生成後に Begin() を呼び出すと、復元されたキーのヘッダ情報が破損しており、アルゴリズム識別子が不正な値となっていた。原因は TA_get_key_size() が 3DES に対応しておらず、バッファサイズがゼロとなり、後続のシリアライズ処理でキー本体が上書きされていたためである。
修正内容:
case KM_ALGORITHM_TRIPLE_DES:
return KM_ATTR_COUNT_AES_HMAC *
(2 * sizeof(uint32_t) + KM_DES3_ATTR_SIZE)
+ sizeof(algorithm) + sizeof(uint32_t);
問題3: キー属性復元時のアルゴリズム誤認
TA_populate_key_attrs() において、TEE_TYPE_DES3(0xA0000013)が HMAC として扱われていた。明示的なケース追加により修正:
case TEE_TYPE_DES3:
att->attrs_count = KM_ATTR_COUNT_AES_HMAC;
att->alg = KM_ALGORITHM_TRIPLE_DES;
break;
問題4: 暗号操作ハンドル作成時の未対応
TA_create_operation() に 3DES 用のブロックモードマッピングを追加:
case KM_ALGORITHM_TRIPLE_DES:
switch (op_mode) {
case KM_MODE_ECB:
algo = TEE_ALG_DES3_ECB_NOPAD;
break;
case KM_MODE_CBC:
algo = TEE_ALG_DES3_CBC_NOPAD;
break;
default:
algo = TEE_ALG_DES3_CMAC;
break;
}
break;
また、初期化処理にも対応:
case KM_ALGORITHM_TRIPLE_DES:
TEE_CipherInit(*operation, nonce.data, nonce.data_length);
break;
問題5: Update および Finish 処理の未実装
既存の AES 向け処理を参考に、3DES 専用の TA_des3_update() および TA_des3_finish() を実装。特にブロックサイズ(8 バイト)やパディング処理に注意を払った。
パディング追加関数も汎用化し、ブロックサイズを引数で受け取るように修正:
keymaster_error_t TA_add_pkcs7_pad2(keymaster_blob_t *input,
const bool force,
keymaster_blob_t *output,
uint32_t *out_size,
bool *is_input_ext,
uint32_t pad,
uint32_t block_size);
その他の関連修正
ta_ca_defs.hにKM_ALGORITHM_TRIPLE_DES = 33を定義TA_import_key()に 3DES ケースを追加TA_possible_size()で出力バッファ計算時にDES3_BLOCK_SIZE(8)を使用TA_begin()およびTA_check_params()で 3DES に対する IV サイズやモード検証を追加
テスト結果
上記すべての修正を適用後、VTS テストは正常にパスするようになった:
[ RUN ] PerInstance/EncryptionOperationsTest.TripleDesEcbRoundTripSuccess/0_default
[ OK ] PerInstance/EncryptionOperationsTest.TripleDesEcbRoundTripSuccess/0_default (4651 ms)
[ PASSED ] 1 test.