>       From: owner-openssl-us...@openssl.org On Behalf Of Carlos Saldaña
>       Sent: Friday, 09 July, 2010 12:48

>       Thanks for answer Dave, 

>       Actually what I'm trying to do is encode messages using the public
key 
> presumably encoded in a .pem file. I checked the contents of this .pem
file 
> and ir has the -----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY-----
headers. 
> I fixed my code to take away this headers and then base64 decode the
string.

Okay, that's simple enough. Note that your security relies on the
authenticity 
and integrity of the pubkey file -- if (any of) your users can be convinced
to 
install/use a bogus file, their 'secret' data is exposed. If anyone besides
you 
will use this system, make sure this limitation is acceptable to them. And
bear 
in mind that user representatives like managers usually promise that people
will 
follow rules perfectly, and those promises are almost always broken.

>       I'm new to this technology of using openssl and using certificates,
this is 
> the code I've buit, so far I don't get any RSA object from the
d2i_RSAPublicKey function:

<snip: get publickey.pem, trim whitespace, drop BEGIN/END lines, trim again>

looks reasonable to me; I don't know ObjC/NS details but I assume you can 
see with a debugger that this produces the correct string in memory

>       const char *base64Text = [unlabeledEndPemString
cStringUsingEncoding:[NSString defaultCStringEncoding]];
>       char *unBase64Text = unbase64((unsigned char *)base64Text,
strlen(base64Text));

>       //Create a new RSA instance
>       int dataLengt = strlen(unBase64Text);
>       RSA *anRSA = d2i_RSAPublicKey(0, (unsigned char **)&unBase64Text,
dataLengt);

As I mostly said before:

1. unbase64 of a .pem file body block gives DER which is binary data 
containing zero/nulls and strlen will not give the correct length.
(And if you don't give the correct length OpenSSL can't decode it.)

2. It's better to treat DER as unsigned char (as you do for the 
plaintext and ciphertext below). C will mostly let you 'cheat' on 
signed/unsigned/plain, but DER data is in fact unsigned bytes.

3. The contents of a BEGIN/END PUBLIC KEY are NOT an RSAPublicKey object.
They are a PublicKeyInfo object CONTAINING a (labelled) RSAPublicKey.
OpenSSL can only decode a DER if you tell it the correct type. 
See below.

>               unsigned char cleartext[2560] = "A";
>           unsigned char encrypted[2560] = { 0 };
>       int resultEncrypt = 0;
>       NSLog(@"here");
>       resultEncrypt = RSA_public_encrypt ( 1 , cleartext, encrypted,
anRSA, RSA_PKCS1_OAEP_PADDING );
>       NSLog(@"%d from encrypt.", resultEncrypt);

The (raw) result of RSA encryption is as big as the key size.
Key sizes > 2560 are possible though unusual. To avoid buffer overflow 
and possible exploit of your system, you should either check that the 
size of the key you read is not too big, or allocate the output buffer 
using the actual key size.

>       Well, after all this the long question I think is: am I calling 
> the right functions to encrypt and send back a message using the public
key 
> that's inside a .pem file? 

Once you get the key correctly it should encrypt. Direct RSA encryption 
with OAEP is limited to 'message' sizes of the key size minus about 200 bits

(I don't remember the exact number but you'll get an error when you hit it).
For most schemes for most people this is unacceptable and the usual practice

is to encrypt the data with a symmetric cipher (e.g. AES) under a random key

(called Data Encrypting Key, DEK) and encrypt and transport that DEK under 
under the RSA key (Key Encrypting Key, KEK) and transport with the data.
The approach you are using works if both/all ends agree, but you probably 
won't interoperate with anybody else.

>       Thanks in advance.

>       2010/7/8 Dave Thompson <dthomp...@prinpay.com>

>               Even if unBase64Text for dataLength is correctly the
unbase64-ed data,
>               it is *very* unlikely you have a file containing an
RSAPublicKey structure.
>               Openssl normally uses files containing a X.509 cert which
contains a publickey
>               for any of several algorithms, possibly with
algorithm-dependent parameters;

This part didn't apply to your case.

>               or a "PubKeyInfo" structure which does similarly. For the
latter you should
>               use d2i_PUBKEY[_*] to get a generic EVP structure and then
get the RSA part
>               if necessary -- or just use the openssl EVP routines which
take it as-is --
>               or use d2i_RSA_PUBKEY[_*] which just does those two for you.

This part did. Except maybe the middle point -- I don't think there are 
EVP wrappings for just-RSA.


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to