Imported Upstream version 2.4
[platform/upstream/nettle.git] / sexp2rsa.c
1 /* sexp2rsa.c
2  *
3  */
4
5 /* nettle, low-level cryptographics library
6  *
7  * Copyright (C) 2002 Niels Möller
8  *  
9  * The nettle library is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or (at your
12  * option) any later version.
13  * 
14  * The nettle library is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
17  * License for more details.
18  * 
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with the nettle library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22  * MA 02111-1307, USA.
23  */
24
25 #if HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28
29 #include <string.h>
30
31 #include "rsa.h"
32
33 #include "bignum.h"
34 #include "sexp.h"
35
36 #define GET(x, l, v)                            \
37 do {                                            \
38   if (!nettle_mpz_set_sexp((x), (l), (v))       \
39       || mpz_sgn(x) <= 0)                       \
40     return 0;                                   \
41 } while(0)
42
43 /* Iterator should point past the algorithm tag, e.g.
44  *
45  *   (public-key (rsa (n |xxxx|) (e |xxxx|))
46  *                    ^ here
47  */
48
49 int
50 rsa_keypair_from_sexp_alist(struct rsa_public_key *pub,
51                             struct rsa_private_key *priv,
52                             unsigned limit,
53                             struct sexp_iterator *i)
54 {
55   static const uint8_t * const names[8]
56     = { "n", "e", "d", "p", "q", "a", "b", "c" };
57   struct sexp_iterator values[8];
58   unsigned nvalues = priv ? 8 : 2;
59   
60   if (!sexp_iterator_assoc(i, nvalues, names, values))
61     return 0;
62
63   if (priv)
64     {
65       GET(priv->d, limit, &values[2]);
66       GET(priv->p, limit, &values[3]);
67       GET(priv->q, limit, &values[4]);
68       GET(priv->a, limit, &values[5]);
69       GET(priv->b, limit, &values[6]);
70       GET(priv->c, limit, &values[7]);
71
72       if (!rsa_private_key_prepare(priv))
73         return 0;
74     }
75
76   if (pub)
77     {
78       GET(pub->n, limit, &values[0]);
79       GET(pub->e, limit, &values[1]);
80
81       if (!rsa_public_key_prepare(pub))
82         return 0;
83     }
84   
85   return 1;
86 }
87
88 int
89 rsa_keypair_from_sexp(struct rsa_public_key *pub,
90                       struct rsa_private_key *priv,
91                       unsigned limit, 
92                       unsigned length, const uint8_t *expr)
93 {
94   struct sexp_iterator i;
95   static const uint8_t * const names[3]
96     = { "rsa", "rsa-pkcs1", "rsa-pkcs1-sha1" };
97
98   if (!sexp_iterator_first(&i, length, expr))
99     return 0;
100   
101   if (!sexp_iterator_check_type(&i, priv ? "private-key" : "public-key"))
102     return 0;
103
104   if (!sexp_iterator_check_types(&i, 3, names))
105     return 0;
106
107   return rsa_keypair_from_sexp_alist(pub, priv, limit, &i);
108 }