New function pkcs1_decrypt, use in rsa_decrypt.
authorNiels Möller <nisse@lysator.liu.se>
Mon, 9 Apr 2012 19:46:13 +0000 (21:46 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Mon, 9 Apr 2012 19:46:13 +0000 (21:46 +0200)
ChangeLog
Makefile.in
pkcs1-decrypt.c [new file with mode: 0644]
pkcs1.h
rsa-decrypt.c

index 29e6283d759186d70d0e4e3df91c03639944ec1b..0884134dd17ffb83befaf6d4799b9346b70d99a1 100644 (file)
--- 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.
index 4d3c89a6db2e77cd12a09717ff26a6704111bea0..cc36a6722c96112a694cb607237dbfeb432853b0 100644 (file)
@@ -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 (file)
index 0000000..bd21f88
--- /dev/null
@@ -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 732d0edc9d2e8b0f3d6272966266561ffb541e56..95a6a8354d771aee0cf7413492fa5d7e9fb6e463 100644 (file)
--- 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;
@@ -56,6 +57,11 @@ pkcs1_signature_prefix(unsigned size,
                       const uint8_t *id,
                       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);
 
index fe6de23ef634f852961d28b3089f87edbded5cf6..cde0d3ce282e0b8595b495e991e294632d790892 100644 (file)
@@ -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
 # 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;
 }