2017-01-17 20 views
0

PKCS#11を介してセキュリティカードにECCキーペアを作成したいとします。使用する曲線がBrainpoolP256r1(1.3.36.3.3.2.8.1.1.7)でなければならない、DERエンコーディングが06 09 2B 24 03 03 02 08 01 01 07なぜC_GenerateKeyPairはエラー(PKCS#11)を返しますか?

である関数である:

CK_RV create_ECC_key_pair() 
{ 
    CK_RV rv; 
    CK_OBJECT_HANDLE publicKey, privateKey; 
    CK_MECHANISM mechanism = { 
      CKM_EC_KEY_PAIR_GEN, NULL_PTR, 0 
    }; 

    CK_BYTE subject[] = "myKey"; 
    CK_BYTE id[] = {0xa1}; 
    CK_BBOOL xtrue = CK_TRUE; 
    CK_BBOOL xfalse = CK_FALSE; 
    CK_BYTE ecparams[] = {0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}; 

    CK_ATTRIBUTE publicKeyTemplate[] = { 
     {CKA_LABEL,  subject,  sizeof(subject)}, 
     {CKA_TOKEN,  &xtrue,  sizeof(xtrue)}, 
     {CKA_MODIFIABLE, &xfalse,  sizeof(xfalse)}, 
     {CKA_EC_PARAMS, &ecparams, sizeof(ecparams)} 
    }; 

    CK_ATTRIBUTE privateKeyTemplate[] = { 
      {CKA_TOKEN,  &xtrue,  sizeof(xtrue)}, 
      {CKA_MODIFIABLE, &xfalse,  sizeof(xfalse)}, 
      {CKA_LABEL,  subject,  sizeof(subject)} 
    }; 

    rv = FunctionPtr->C_GenerateKeyPair(Session, 
          &mechanism, 
          publicKeyTemplate, 4, 
          privateKeyTemplate, 3, 
          &publicKey, 
          &privateKey); 
    if (rv != CKR_OK) 
    { 
     printf("Error C_GenerateKeyPair (ECC): 0x%X\n", rv); 
     return rv; 
    } 

    return CKR_OK; 
} 

C_GenerateKeyPair呼び出しは0x13 = CKR_ATTRIBUTE_VALUE_INVALIDを返します

どの属性が間違っているのかわかりません。 情報が貧弱であることは知っていますが、私はいろいろ試してみましたが、まだこのエラーがあります。根本的に何かが間違っていますか?

答えて

1

他のカーブが機能すると仮定すると、カーブは単にカード/ PKCS#11モジュールにはインストールされていない可能性があります。その場合、別の曲線(P-256など)を試すか、名前(OID)ではなく値でドメインパラメータを明示的に指定する必要があります。

関連する問題