[openssl-users] Storing private key on tokens

Jakob Bohm jb-openssl at wisemo.com
Wed Oct 4 12:30:36 UTC 2017


On 04/10/2017 10:44, Jan Just Keijser wrote:
> Hi,
>
> On 04/10/17 10:17, lists wrote:
>> On 09/27/2017 11:13 PM, Ken Goldman wrote:
>>> On 9/27/2017 2:19 PM, Dirk-Willem van Gulik wrote:
>>>>
>>>>> On 27 Sep 2017, at 20:02, Michael Wojcik
>>>>>
>>>>> The tokens / HSMs I've used don't let you generate a key somewhere
>>>>> else and install it on the token. They insist on doing the key
>>>>> generation locally. That is, after all, part of the point of using
>>>>> a token - the key never leaves it.
>>>>
>>>> I've found that the Feitian ePass2000's and the Yubico keys allow for
>>>> importing of the private key. They do usually want the 'extra' flags
>>>> to specify use:
>>>
>>> FWIW, the TPM hardware also permits key import.  It does validate 
>>> attributes, so users will know that the key was not generated on chip.
>>>
>>
>> Most smart cards (G&D, Oberthur and InCard) I've dealt with allow for 
>> external generation of RSA keys and import into the token.
>> Currently I mostly use InCard cards sold in Italy, I can't tell if 
>> the other brands are still easily purchaseable.
>>
>>
> FWIW:  I've used mostly Aladdin/Safenet/Gemalto eTokens (32K, 64K, 
> 72K) and they all support the import of RSA keys (as well as 
> generation of keys, of course).
>
> Furthermore, if you look at the libp11 library then you will find that 
> it does just that:  generate a key in memory and then store it on the 
> etoken. The source code even has a comment about this:
>
> 110 /*
> 111  * Generate and store a private key on the token
> 112  * FIXME: We should check first whether the token supports
> 113  * on-board key generation, and if it does, use its own algorithm
> 114  */
> 115 int
> 116 PKCS11_generate_key(PKCS11_TOKEN * token,
> 117             int algorithm, unsigned int bits, char *label, 
> unsigned char* id, size_t id_len)
> 118 {
> 119     PKCS11_KEY *key_obj;
> 120     EVP_PKEY *pk;
> 121     RSA *rsa;
> 122     BIO *err;
> 123     int rc;
> 124
> 125     if (algorithm != EVP_PKEY_RSA) {
> 126         PKCS11err(PKCS11_F_PKCS11_GENERATE_KEY, 
> PKCS11_NOT_SUPPORTED);
> 127         return -1;
> 128     }
> 129
> 130     err = BIO_new_fp(stderr, BIO_NOCLOSE);
> 131     rsa = RSA_generate_key(bits, 0x10001, NULL, err);
> 132     BIO_free(err);
> 133     if (rsa == NULL) {
> 134         PKCS11err(PKCS11_F_PKCS11_GENERATE_KEY, 
> PKCS11_KEYGEN_FAILED);
> 135         return -1;
> 136     }
> 137
> 138     pk = EVP_PKEY_new();
> 139     EVP_PKEY_assign_RSA(pk, rsa);
> 140     rc = pkcs11_store_private_key(token, pk, label, id, id_len, 
> &key_obj);
>
>
That's a shitty place to hide such a glaring security hole. Hopefully
it is also an open, non-hidden bug and a warning in the README, manpage
etc.

Because most users of PKCS#11 hardware would presume that software using
their hardware doesn't silently nullify a key hardware security feature.


Enjoy

Jakob
-- 
Jakob Bohm, CIO, Partner, WiseMo A/S.  https://www.wisemo.com
Transformervej 29, 2860 Søborg, Denmark.  Direct +45 31 13 16 10
This public discussion message is non-binding and may contain errors.
WiseMo - Remote Service Management for PCs, Phones and Embedded



More information about the openssl-users mailing list