OP-TEE Keymaster 4.0 における Triple DES ECB モードの VTS テスト対応

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.hKM_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.

タグ: OP-TEE Keymaster Android VTS TripleDES TEE

6月20日 20:03 投稿