X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=crypt.c;h=b3bac46697765c02132c7a18603f102516d360c7;hp=cf1cabecbad80cdca6d69cf2bbc2165427a84ed8;hb=ae0e4594c6a0312c5b4b4c0bde86f9c12253d11b;hpb=3580fe47cc87b25aa0497eb54387e1165ba17407 diff --git a/crypt.c b/crypt.c index cf1cabec..b3bac466 100644 --- a/crypt.c +++ b/crypt.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2006 Andre Noll + * Copyright (C) 2005-2007 Andre Noll * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,7 +41,17 @@ static EVP_PKEY *load_key(const char *file, int private) return pkey; } - +/** + * read an RSA key from a file + * + * \param key_file the file containing the key + * \param rsa RSA structure is returned here + * \param private if non-zero, read the private key, otherwise the public key + * + * \return The size of the RSA key on success, negative on errors. + * + * \sa openssl(1), rsa(1). + */ int get_rsa_key(char *key_file, RSA **rsa, int private) { EVP_PKEY *key = load_key(key_file, private); @@ -55,6 +65,19 @@ int get_rsa_key(char *key_file, RSA **rsa, int private) return RSA_size(*rsa); } +/** + * free an RSA structure + * + * \param rsa pointer to the RSA struct to free + * + * This must be called for any key obtained by get_rsa_key(). + */ +void rsa_free(RSA *rsa) +{ + if (rsa) + RSA_free(rsa); +} + /** * decrypt a buffer using an RSA key * @@ -70,14 +93,18 @@ int get_rsa_key(char *key_file, RSA **rsa, int private) * \sa RSA_private_decrypt(3) **/ int para_decrypt_buffer(char *key_file, unsigned char *outbuf, unsigned char *inbuf, - int rsa_inlen) + unsigned rsa_inlen) { RSA *rsa; - int ret = get_rsa_key(key_file, &rsa, LOAD_PRIVATE_KEY); + int ret, inlen = rsa_inlen; + if (inlen < 0) + return -E_RSA; + ret = get_rsa_key(key_file, &rsa, LOAD_PRIVATE_KEY); if (ret < 0) return ret; - ret = RSA_private_decrypt(rsa_inlen, inbuf, outbuf, rsa, RSA_PKCS1_PADDING); + ret = RSA_private_decrypt(inlen, inbuf, outbuf, rsa, RSA_PKCS1_PADDING); + rsa_free(rsa); return (ret > 0)? ret : -E_DECRYPT; } @@ -94,7 +121,7 @@ int para_decrypt_buffer(char *key_file, unsigned char *outbuf, unsigned char *in * \sa para_decrypt_buffer() */ int para_decrypt_challenge(char *key_file, long unsigned *challenge_nr, - unsigned char *inbuf, int rsa_inlen) + unsigned char *inbuf, unsigned rsa_inlen) { unsigned char *rsa_out = OPENSSL_malloc(rsa_inlen + 1); int ret = para_decrypt_buffer(key_file, rsa_out, inbuf, rsa_inlen); @@ -121,10 +148,13 @@ int para_decrypt_challenge(char *key_file, long unsigned *challenge_nr, * \sa RSA_public_encrypt(3) */ int para_encrypt_buffer(RSA *rsa, unsigned char *inbuf, - const unsigned len, unsigned char *outbuf) + unsigned len, unsigned char *outbuf) { - int ret = RSA_public_encrypt(len, inbuf, outbuf, rsa, - RSA_PKCS1_PADDING); + int ret, flen = len; /* RSA_public_encrypt expects a signed int */ + + if (flen < 0) + return -E_ENCRYPT; + ret = RSA_public_encrypt(flen, inbuf, outbuf, rsa, RSA_PKCS1_PADDING); return ret < 0? -E_ENCRYPT : ret; }