On 04/13/2011 01:22 PM, Superpacko wrote:
> On 12 abr, 16:00, Robert Relyea <rrel...@redhat.com> wrote:
>> On 04/12/2011 10:55 AM, Superpacko wrote:
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>> On 28 mar, 15:28, Robert Relyea <rrel...@redhat.com> wrote:
>>>> On 03/28/2011 05:32 AM, Superpacko wrote:
>>>>> On 23 mar, 14:40, Robert Relyea <rrel...@redhat.com> wrote:
>>>>>> On 03/23/2011 06:24 AM, Superpacko wrote:> Well, so i 've been told that 
>>>>>> i shuld be able to extract the MPI as
>>>>>>> bytes and pass it to NSS since GPG original key format is PEM, i
>>>>>>> should be able to use MPIs data as raw bytes.
>>>>>> If it's really PEM (which should be a printable string), then you should
>>>>>> be able to pull out the Base 64 portion and pass it to the NSS atob 
>>>>>> routine:
>>>>>> ATOB_ConvertAsciiToItem()
>>>>>> It will return a secItem which has a date and a length. This secitem is
>>>>>> DER data.
>>>>>> bob
>>>>>> PEM is an ascii file in which all the data outside specific wrappers:
>>>>>>  ( ------------------------- BEGIN xxxxx 
>>>>>> ---------------------------------),
>>>>>>  (---------------------- END xxx ------------------------)
>>>>>> are ignored. Inside the wrappers is base 64 encoded binary. Base 64
>>>>>> takes the 27 letters of the alphabet, both upper and lower case, with
>>>>>> the 10 digits, plus and / and assigns each a value between 0 and 64. The
>>>>>> binary blob is then considered a long binary integer. That integer is
>>>>>> converted to base 64 using those printable digits.  The encoding used 4
>>>>>> base 64 digits to encode 3 binary bytes (base 64 is 6 bits per value)
>>>>>> The PEM base64 pem data is DER data, so the nss der functions should
>>>>>> work for them, once you've decoded the base 64.
>>>>>> bob
>>>>>>> The thing is that the only function i found that takes unsigned char*
>>>>>>> as argument is PK11_MakeKEAPubKey, and when i try to encrypt using
>>>>>>> that key, i get error 8178 (BAD KEY)
>>>>>>> So is there a way to import a public and private key with raw bytes?
>>>>>>> so far i've seen that most functions need SECKEYPrivateKeyInfo and
>>>>>>> stuff like that.
>>>>> Thanks for the help, im going to try to extract this information from
>>>>> the key stored in the MPIs.
>>>>> Is there a way to import an RSA key from external source that is not
>>>>> DER encoded nor KEA?
>>>> Do you mean an RSA public key or an RSA private key?
>>>> bob
>>>>> otherwise im gonna have to build a custom PK11_MakeRSAPubKey to create
>>>>> a SECKEYPublicKey from raw bytes, filling the
>>>>>      modulusItem.data = modulusData;
>>>>>      modulusItem.len = modulusLen;
>>>>>      exponentItem.data = exponentData;
>>>>>      exponentItem.len = exponentLen;
>>>>> with the info from the raw bytes
>>>>> thanks again!
>>> Is still anyone here?
>>> I've managed to imort public and private keys from GPG to NSS. The
>>> only help i need now is with the RSA encryption.
>>> Im generating a asymmetric key with random bytes, and i need to
>>> encrypt this key with RSA.
>>> How am i supposed to proceed? according to what i read, i cant just
>>> encrypt the whole thing with RSA, instead i have to turn the
>>> asymmetric key into a big number and then encrypt the number with RSA.
>>> is that correct?
>>> is there any other way? how would those options be implemented using
>>> NSS functions?
>> That's correct.
>>
>> 1. Your best bet is to use PK11_TokenKeyGenWithFlags() to generate a new
>> symmetric key. (keyid= NULL attrrFlags = 0,
>> opFlags=CKF_ENCRYPT|CKF_WRAP, the rest the same as PK11_KeyGen()). The
>> output of this is a PK11SymKey.
>>
>> 2. You can wrap that symmetric key from step 1 with your imported RSA
>> (public) key with PK11_PubWrapSymKey(). You'll get a secitem 'data'
>> output here.
>>
>> 3. You can use PK11_WrapPrivKey() to wrap your random asymmetric key
>> with the symmetric key you generated in step 1. You'll get a second
>> secitem 'data' here. (NOTE: that this point you are through with your
>> assymetric key, you can free it with PK11_FreeSymKey()).
>>
>> 4.  You take to two secitem data values and packages them together.
>> You'll need to identify the first secitem (from step 2) as the 'wrapped
>> symkey' and the second secitem (from step 3) as the 'wrapped private key'.
>>
>> To recover your key:
>>
>> 1. separate the 2 secitem data values from your package.
>>
>> 2. use PK11_PubUnwrapSymKey() with your imported RSA (private) key and
>> the 'wrapped symKey'. The result will be a PK11SymKey.
>>
>> 3. use PK11_UnwrapPrivKey() with the symkey returned in 2 and the
>> 'wrapped private key'. This will return the private key you can now use.
>> The symkey is not longer needed, so you can free it.
>>
>> There's a number of parameters for these functions I've skipped, but
>> this should get you started.
>>
>> bob
>>
>>
>>
>>
>>
>>
>>
>>> thanks!
>>> Sebastian.
> I followed your previous example, and got the same error.
> Generated a symmetric key with
>       PK11SymKey* symkey =  PK11_TokenKeyGenWithFlags(slot,
>                                                                               
>                         CKM_AES_CBC,
>                                                                               
>                         NULL,
>                                                                               
>                         len,
>                                                                               
>                         NULL,
>                                                                               
>                         CKF_ENCRYPT|CKF_WRAP,
>                                                                               
>                         0,
>                                                                               
>                         NULL);
>
> did a
> PK11_PubWrapSymKey(CKM_RSA_PKCS,
>                                  pubKey,
>                                  symkey,
>                                  wrapped);
>
> and work fine. But when decrypting, im reading the 256 buffer (the RSA
> is 2048 bits), loading in into a SECItem and passing it to the decrypt
> method.
> PK11_PubUnwrapSymKey (privkey, wrappedKey, CKM_AES_CBC, CKF_DECRYPT,
> wrappedKey->len);
>
> and theres is when i get the ASSERT error:
> file mpi.c
> Expression: mp != ((void*)0) && str != ((void*)0) && len >0
>
> Any ideas?
> Thanks a lot!
>
Oops, I forgot to tell you. You should wrap Private keys with and _PAD
mechanism (CKM_AES_CBC_PAD).

It's interesting that it asserted. We should have just returned an
error. That is probably worth a low priority bug report.

bob

-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to