Imported Upstream version 2.4
[platform/upstream/nettle.git] / rsa-decrypt.c
1 /* rsa_decrypt.c
2  *
3  * The RSA publickey algorithm. PKCS#1 encryption.
4  */
5
6 /* nettle, low-level cryptographics library
7  *
8  * Copyright (C) 2001 Niels Möller
9  *  
10  * The nettle library is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation; either version 2.1 of the License, or (at your
13  * option) any later version.
14  * 
15  * The nettle library is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
18  * License for more details.
19  * 
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with the nettle library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23  * MA 02111-1307, USA.
24  */
25
26 #if HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <assert.h>
31 #include <stdlib.h>
32 #include <string.h>
33
34 #include "rsa.h"
35
36 #include "bignum.h"
37 #include "nettle-internal.h"
38
39 int
40 rsa_decrypt(const struct rsa_private_key *key,
41             unsigned *length, uint8_t *message,
42             const mpz_t gibberish)
43 {
44   TMP_DECL(em, uint8_t, NETTLE_MAX_BIGNUM_BITS / 8);
45   uint8_t *terminator;
46   unsigned padding;
47   unsigned message_length;
48   
49   mpz_t m;
50
51   mpz_init(m);
52   rsa_compute_root(key, m, gibberish);
53
54   TMP_ALLOC(em, key->size);
55   nettle_mpz_get_str_256(key->size, em, m);
56   mpz_clear(m);
57
58   /* Check format */
59   if (em[0] || em[1] != 2)
60     return 0;
61
62   terminator = memchr(em + 2, 0, key->size - 2);
63
64   if (!terminator)
65     return 0;
66   
67   padding = terminator - (em + 2);
68   if (padding < 8)
69     return 0;
70
71   message_length = key->size - 3 - padding;
72
73   if (*length < message_length)
74     return 0;
75   
76   memcpy(message, terminator + 1, message_length);
77   *length = message_length;
78
79   return 1;
80 }