Cannot wrap an EC key?

Michael StJohns mstjohns at comcast.net
Thu Dec 19 20:44:22 UTC 2024


Hmm... looking at the PKCS11 soft token nss code  (from 
hg.mozilla.org/projects/nss) - ANY failure to unwrap a private key gets 
returned as a CKR_INCOMPLETE_TEMPLATE.

The NSS code for sftk_unwrapPrivateKey is weird.  It starts out with a 
CKR_ code in a number of places, and if that code is not CKR_OK, returns 
SECFailure which if that is seen gets translated back into 
CKR_INCOMPLETE_TEMPLATE regardless of the actual underlying error.

see pkcs11c.c sftk_unwrapPrivateKey beginning at line 6443 and 
NSC_UnwrapKey at 6739.

I'd make a fix here to have sftk_unwrapPrivateKey return a CK_RV and 
translate the early SECFailure(s) and others along the way into a 
CKR_VENDOR_DEFINED code that maps to the specific error.

Good Luck - Mike




On 12/18/2024 11:11 PM, Wei-Jun Wang wrote:
> No, it’s the EncryptedPrivateKeyInfo format and internally the data is PKCS8. I can unwrap it with a cipher from SunJCE.
>
> BTW, I made a mistake in my first mail. The config needn’t be sensitive. Then I am able to use the key to init a SunJCE cipher.
>
> —Weijun
>
>> On Dec 18, 2024, at 22:02, Mike StJohns <mstjohns at comcast.net> wrote:
>>
>> If I had to make a wild guess, I’d guess that the wrapped key doesn’t include the curve info.  If the length of the wrapped data is only 40 bytes, then all you have is the x from the private key.  I’m wondering if the algorithm has to include the curve info.
>>
>> Something like “EC/secp256r1”?
>>
>> If it’s longer than 40 bytes (or 8 plus the length of the private key data for a given curve) then something besides the bare private key has been wrapped.
>>
>> For some unknown reason, the format of the key material being wrapped was not specified by PKCS11.
>>
>> Mike
>>
>> Sent from my iPad
>>
>>> On Dec 18, 2024, at 19:23, Wei-Jun Wang <weijun.wang at oracle.com> wrote:
>>>
>>> Hi, PKCS #11 gurus,
>>>
>>>    var sp = KeyPairGenerator.getInstance("EC", p).generateKeyPair().getPrivate();
>>>    var k = KeyGenerator.getInstance("AES", p).generateKey();
>>>
>>>    var cipher = Cipher.getInstance("AES/KW/PKCS5Padding", p);
>>>    cipher.init(Cipher.WRAP_MODE, k);
>>>    var wrapped = cipher.wrap(sp);
>>>    cipher.init(Cipher.UNWRAP_MODE, k);
>>>    cipher.unwrap(wrapped, "EC", Cipher.PRIVATE_KEY);
>>>
>>> Here, p is SunPKCS11-NSS using sensitive config, and the last unwrap method reports an CKR_TEMPLATE_INCOMPLETE error. It runs fine with RSA.
>>>
>>> Thanks,
>>> Weijun
>>>
>>>



More information about the security-dev mailing list