diff --git a/ChangeLog b/ChangeLog index 19bd0fc7928024f325dec9c47b750c4d5decd0a0..7543e5ac6d09c0358edc6b5c752e36ac5338246e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-05-18 Niels Möller <nisse@lysator.liu.se> + + * pkcs1-encrypt.c (pkcs1_encrypt): New file and function. + * rsa-encrypt.c (rsa_encrypt): Use pkcs1_encrypt. + 2012-05-09 Niels Möller <nisse@lysator.liu.se> * rsa-decrypt-tr.c (rsa_decrypt_tr): Added missing mpz_clear, diff --git a/Makefile.in b/Makefile.in index 71d92564551767c045a1a0c6996ca5ad3ef22b34..97585ebc0283c91594151bb877b46944a1c9fb2b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -99,7 +99,8 @@ hogweed_SOURCES = sexp.c sexp-format.c \ bignum.c bignum-next-prime.c \ bignum-random.c bignum-random-prime.c \ sexp2bignum.c \ - pkcs1.c pkcs1-decrypt.c pkcs1-rsa-md5.c pkcs1-rsa-sha1.c \ + pkcs1.c pkcs1-encrypt.c pkcs1-decrypt.c \ + pkcs1-md5.c pkcs1-rsa-sha1.c \ pkcs1-rsa-sha256.c pkcs1-rsa-sha512.c \ rsa.c rsa-sign.c rsa-verify.c \ rsa-md5-sign.c rsa-md5-verify.c \ diff --git a/pkcs1-encrypt.c b/pkcs1-encrypt.c new file mode 100644 index 0000000000000000000000000000000000000000..10f4f9a307891d4c7dac8f619e62da511735493e --- /dev/null +++ b/pkcs1-encrypt.c @@ -0,0 +1,81 @@ +/* pkcs1-encrypt.c + * + * The RSA publickey algorithm. PKCS#1 encryption. + */ + +/* nettle, low-level cryptographics library + * + * Copyright (C) 2001, 2012 Niels Möller + * + * The nettle library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The nettle library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the nettle library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include <assert.h> +#include <stdlib.h> +#include <string.h> + +#include "pkcs1.h" + +#include "bignum.h" +#include "nettle-internal.h" + +int +pkcs1_encrypt (unsigned key_size, + /* For padding */ + void *random_ctx, nettle_random_func random, + unsigned length, const uint8_t *message, + mpz_t m) +{ + TMP_DECL(em, uint8_t, NETTLE_MAX_BIGNUM_SIZE); + unsigned padding; + unsigned i; + + /* The message is encoded as a string of the same length as the + * modulo n, of the form + * + * 00 02 pad 00 message + * + * where padding should be at least 8 pseudorandomly generated + * *non-zero* octets. */ + + if (length + 11 > key_size) + /* Message too long for this key. */ + return 0; + + /* At least 8 octets of random padding */ + padding = key_size - length - 3; + assert(padding >= 8); + + TMP_ALLOC(em, key_size - 1); + em[0] = 2; + + random(random_ctx, padding, em + 1); + + /* Replace 0-octets with 1 */ + for (i = 0; i<padding; i++) + if (!em[i+1]) + em[i+1] = 1; + + em[padding+1] = 0; + memcpy(em + padding + 2, message, length); + + nettle_mpz_set_str_256_u(m, key_size - 1, em); + return 1; +} diff --git a/pkcs1.h b/pkcs1.h index 95a6a8354d771aee0cf7413492fa5d7e9fb6e463..68de0b7d769894e818b41517be4e3de2c7e596ce 100644 --- a/pkcs1.h +++ b/pkcs1.h @@ -43,6 +43,7 @@ extern "C" { #define pkcs1_rsa_sha256_encode_digest nettle_pkcs1_rsa_sha256_encode_digest #define pkcs1_rsa_sha512_encode nettle_pkcs1_rsa_sha512_encode #define pkcs1_rsa_sha512_encode_digest nettle_pkcs1_rsa_sha512_encode_digest +#define pkcs1_encrypt nettle_pkcs1_encrypt #define pkcs1_decrypt nettle_pkcs1_decrypt struct md5_ctx; @@ -57,6 +58,13 @@ pkcs1_signature_prefix(unsigned size, const uint8_t *id, unsigned digest_size); +int +pkcs1_encrypt (unsigned key_size, + /* For padding */ + void *random_ctx, nettle_random_func random, + unsigned length, const uint8_t *message, + mpz_t m); + int pkcs1_decrypt (unsigned key_size, const mpz_t m, diff --git a/rsa-encrypt.c b/rsa-encrypt.c index 29523fcbd93dee2c5ebf73fb27e4cbd8d70ed126..2e1df1d8d9ce1e54d951478687b2f4238d1509e4 100644 --- a/rsa-encrypt.c +++ b/rsa-encrypt.c @@ -1,4 +1,4 @@ -/* rsa_encrypt.c +/* rsa-encrypt.c * * The RSA publickey algorithm. PKCS#1 encryption. */ @@ -27,57 +27,23 @@ # include "config.h" #endif -#include <assert.h> -#include <stdlib.h> -#include <string.h> - #include "rsa.h" -#include "bignum.h" -#include "nettle-internal.h" +#include "pkcs1.h" int rsa_encrypt(const struct rsa_public_key *key, /* For padding */ void *random_ctx, nettle_random_func random, unsigned length, const uint8_t *message, - mpz_t gibbberish) + mpz_t gibberish) { - TMP_DECL(em, uint8_t, NETTLE_MAX_BIGNUM_SIZE); - unsigned padding; - unsigned i; - - /* The message is encoded as a string of the same length as the - * modulo n, of the form - * - * 00 02 pad 00 message - * - * where padding should be at least 8 pseudorandomly generated - * *non-zero* octets. */ - - if (length + 11 > key->size) - /* Message too long for this key. */ + if (pkcs1_encrypt (key->size, random_ctx, random, + length, message, gibberish)) + { + mpz_powm(gibberish, gibberish, key->e, key->n); + return 1; + } + else return 0; - - /* At least 8 octets of random padding */ - padding = key->size - length - 3; - assert(padding >= 8); - - TMP_ALLOC(em, key->size - 1); - em[0] = 2; - - random(random_ctx, padding, em + 1); - - /* Replace 0-octets with 1 */ - for (i = 0; i<padding; i++) - if (!em[i+1]) - em[i+1] = 1; - - em[padding+1] = 0; - memcpy(em + padding + 2, message, length); - - nettle_mpz_set_str_256_u(gibbberish, key->size - 1, em); - mpz_powm(gibbberish, gibbberish, key->e, key->n); - - return 1; }