summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Makefile.in2
-rw-r--r--pkcs1-decrypt.c72
-rw-r--r--pkcs1.h6
-rw-r--r--rsa-decrypt.c44
5 files changed, 92 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 29e6283d..0884134d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-04-09 Niels Möller <nisse@lysator.liu.se>
+
+ * Makefile.in (hogweed_SOURCES): Added pkcs1-decrypt.c.
+ * rsa-decrypt.c (rsa_decrypt): Use pkcs1_decrypt.
+ * pkcs1-decrypt.c (pkcs1_decrypt): New file and function,
+ extracted from rsa_decrypt.
+
2012-04-01 Niels Möller <nisse@lysator.liu.se>
* salsa20.c (LE_SWAP32): Typo fix for big-endian case.
diff --git a/Makefile.in b/Makefile.in
index 4d3c89a6..cc36a672 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -99,7 +99,7 @@ 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-rsa-md5.c pkcs1-rsa-sha1.c \
+ pkcs1.c pkcs1-decrypt.c pkcs1-rsa-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-decrypt.c b/pkcs1-decrypt.c
new file mode 100644
index 00000000..bd21f88b
--- /dev/null
+++ b/pkcs1-decrypt.c
@@ -0,0 +1,72 @@
+/* pkcs1-decrypt.c
+ *
+ */
+
+/* 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 <string.h>
+
+#include "pkcs1.h"
+
+#include "bignum.h"
+#include "nettle-internal.h"
+
+int
+pkcs1_decrypt (unsigned key_size,
+ const mpz_t m,
+ unsigned *length, uint8_t *message)
+{
+ TMP_DECL(em, uint8_t, NETTLE_MAX_BIGNUM_BITS / 8);
+ uint8_t *terminator;
+ unsigned padding;
+ unsigned message_length;
+
+ TMP_ALLOC(em, key_size);
+ nettle_mpz_get_str_256(key_size, em, m);
+
+ /* Check format */
+ if (em[0] || em[1] != 2)
+ return 0;
+
+ terminator = memchr(em + 2, 0, key_size - 2);
+
+ if (!terminator)
+ return 0;
+
+ padding = terminator - (em + 2);
+ if (padding < 8)
+ return 0;
+
+ message_length = key_size - 3 - padding;
+
+ if (*length < message_length)
+ return 0;
+
+ memcpy(message, terminator + 1, message_length);
+ *length = message_length;
+
+ return 1;
+}
+
diff --git a/pkcs1.h b/pkcs1.h
index 732d0edc..95a6a835 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_decrypt nettle_pkcs1_decrypt
struct md5_ctx;
struct sha1_ctx;
@@ -57,6 +58,11 @@ pkcs1_signature_prefix(unsigned size,
unsigned digest_size);
int
+pkcs1_decrypt (unsigned key_size,
+ const mpz_t m,
+ unsigned *length, uint8_t *message);
+
+int
pkcs1_rsa_md5_encode(mpz_t m, unsigned length, struct md5_ctx *hash);
int
diff --git a/rsa-decrypt.c b/rsa-decrypt.c
index fe6de23e..cde0d3ce 100644
--- a/rsa-decrypt.c
+++ b/rsa-decrypt.c
@@ -1,11 +1,11 @@
-/* rsa_decrypt.c
+/* rsa-decrypt.c
*
* The RSA publickey algorithm. PKCS#1 encryption.
*/
/* nettle, low-level cryptographics library
*
- * Copyright (C) 2001 Niels Möller
+ * 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
@@ -27,54 +27,22 @@
# 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_decrypt(const struct rsa_private_key *key,
unsigned *length, uint8_t *message,
const mpz_t gibberish)
{
- TMP_DECL(em, uint8_t, NETTLE_MAX_BIGNUM_BITS / 8);
- uint8_t *terminator;
- unsigned padding;
- unsigned message_length;
-
mpz_t m;
+ int res;
mpz_init(m);
rsa_compute_root(key, m, gibberish);
- TMP_ALLOC(em, key->size);
- nettle_mpz_get_str_256(key->size, em, m);
+ res = pkcs1_decrypt (key->size, m, length, message);
mpz_clear(m);
-
- /* Check format */
- if (em[0] || em[1] != 2)
- return 0;
-
- terminator = memchr(em + 2, 0, key->size - 2);
-
- if (!terminator)
- return 0;
-
- padding = terminator - (em + 2);
- if (padding < 8)
- return 0;
-
- message_length = key->size - 3 - padding;
-
- if (*length < message_length)
- return 0;
-
- memcpy(message, terminator + 1, message_length);
- *length = message_length;
-
- return 1;
+ return res;
}