Fix accidental use of C99 for loop.
[gd/nettle] / dsa.h
1 /* dsa.h
2
3    The DSA publickey algorithm.
4
5    Copyright (C) 2002, 2013, 2014 Niels Möller
6
7    This file is part of GNU Nettle.
8
9    GNU Nettle is free software: you can redistribute it and/or
10    modify it under the terms of either:
11
12      * the GNU Lesser General Public License as published by the Free
13        Software Foundation; either version 3 of the License, or (at your
14        option) any later version.
15
16    or
17
18      * the GNU General Public License as published by the Free
19        Software Foundation; either version 2 of the License, or (at your
20        option) any later version.
21
22    or both in parallel, as here.
23
24    GNU Nettle is distributed in the hope that it will be useful,
25    but WITHOUT ANY WARRANTY; without even the implied warranty of
26    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27    General Public License for more details.
28
29    You should have received copies of the GNU General Public License and
30    the GNU Lesser General Public License along with this program.  If
31    not, see http://www.gnu.org/licenses/.
32 */
33  
34 #ifndef NETTLE_DSA_H_INCLUDED
35 #define NETTLE_DSA_H_INCLUDED
36
37 #include "nettle-types.h"
38 #include "bignum.h"
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /* Name mangling */
45 #define dsa_params_init nettle_dsa_params_init
46 #define dsa_params_clear nettle_dsa_params_clear
47 #define dsa_signature_init nettle_dsa_signature_init
48 #define dsa_signature_clear nettle_dsa_signature_clear
49 #define dsa_sign nettle_dsa_sign
50 #define dsa_verify nettle_dsa_verify
51 #define dsa_generate_params nettle_dsa_generate_params
52 #define dsa_generate_keypair nettle_dsa_generate_keypair
53 #define dsa_signature_from_sexp nettle_dsa_signature_from_sexp
54 #define dsa_keypair_to_sexp nettle_dsa_keypair_to_sexp
55 #define dsa_keypair_from_sexp_alist nettle_dsa_keypair_from_sexp_alist
56 #define dsa_sha1_keypair_from_sexp nettle_dsa_sha1_keypair_from_sexp
57 #define dsa_sha256_keypair_from_sexp nettle_dsa_sha256_keypair_from_sexp
58 #define dsa_params_from_der_iterator nettle_dsa_params_from_der_iterator
59 #define dsa_public_key_from_der_iterator nettle_dsa_public_key_from_der_iterator
60 #define dsa_openssl_private_key_from_der_iterator nettle_dsa_openssl_private_key_from_der_iterator 
61 #define dsa_openssl_private_key_from_der nettle_openssl_provate_key_from_der
62 #define _dsa_hash _nettle_dsa_hash
63
64 /* For FIPS approved parameters */
65 #define DSA_SHA1_MIN_P_BITS 512
66 #define DSA_SHA1_Q_OCTETS 20
67 #define DSA_SHA1_Q_BITS 160
68
69 #define DSA_SHA256_MIN_P_BITS 1024
70 #define DSA_SHA256_Q_OCTETS 32
71 #define DSA_SHA256_Q_BITS 256
72
73 struct dsa_params
74 {  
75   /* Modulo */
76   mpz_t p;
77
78   /* Group order */
79   mpz_t q;
80
81   /* Generator */
82   mpz_t g;
83 };
84
85 void
86 dsa_params_init (struct dsa_params *params);
87
88 void
89 dsa_params_clear (struct dsa_params *params);
90
91 struct dsa_signature
92 {
93   mpz_t r;
94   mpz_t s;
95 };
96
97 /* Calls mpz_init to initialize bignum storage. */
98 void
99 dsa_signature_init(struct dsa_signature *signature);
100
101 /* Calls mpz_clear to deallocate bignum storage. */
102 void
103 dsa_signature_clear(struct dsa_signature *signature);
104
105 int
106 dsa_sign(const struct dsa_params *params,
107          const mpz_t x,
108          void *random_ctx, nettle_random_func *random,
109          size_t digest_size,
110          const uint8_t *digest,
111          struct dsa_signature *signature);
112
113 int
114 dsa_verify(const struct dsa_params *params,
115            const mpz_t y,
116            size_t digest_size,
117            const uint8_t *digest,
118            const struct dsa_signature *signature);
119
120
121 /* Key generation */
122
123 int
124 dsa_generate_params(struct dsa_params *params,
125                     void *random_ctx, nettle_random_func *random,
126                     void *progress_ctx, nettle_progress_func *progress,
127                     unsigned p_bits, unsigned q_bits);
128
129 void
130 dsa_generate_keypair (const struct dsa_params *params,
131                       mpz_t pub, mpz_t key,
132                       void *random_ctx, nettle_random_func *random);
133
134 /* Keys in sexp form. */
135
136 struct nettle_buffer;
137
138 /* Generates a public-key expression if PRIV is NULL .*/
139 int
140 dsa_keypair_to_sexp(struct nettle_buffer *buffer,
141                     const char *algorithm_name, /* NULL means "dsa" */
142                     const struct dsa_params *params,
143                     const mpz_t pub,
144                     const mpz_t priv);
145
146 struct sexp_iterator;
147
148 int
149 dsa_signature_from_sexp(struct dsa_signature *rs,
150                         struct sexp_iterator *i,
151                         unsigned q_bits);
152
153 int
154 dsa_keypair_from_sexp_alist(struct dsa_params *params,
155                             mpz_t pub,
156                             mpz_t priv,
157                             unsigned p_max_bits,
158                             unsigned q_bits,
159                             struct sexp_iterator *i);
160
161 /* If PRIV is NULL, expect a public-key expression. If PUB is NULL,
162  * expect a private key expression and ignore the parts not needed for
163  * the public key. */
164 /* Keys must be initialized before calling this function, as usual. */
165 int
166 dsa_sha1_keypair_from_sexp(struct dsa_params *params,
167                            mpz_t pub,
168                            mpz_t priv,
169                            unsigned p_max_bits,
170                            size_t length, const uint8_t *expr);
171
172 int
173 dsa_sha256_keypair_from_sexp(struct dsa_params *params,
174                              mpz_t pub,
175                              mpz_t priv,
176                              unsigned p_max_bits,
177                              size_t length, const uint8_t *expr);
178
179 /* Keys in X.509 andd OpenSSL format. */
180 struct asn1_der_iterator;
181
182 int
183 dsa_params_from_der_iterator(struct dsa_params *params,
184                              unsigned max_bits, unsigned q_bits,
185                              struct asn1_der_iterator *i);
186
187 int
188 dsa_public_key_from_der_iterator(const struct dsa_params *params,
189                                  mpz_t pub,
190                                  struct asn1_der_iterator *i);
191
192 int
193 dsa_openssl_private_key_from_der_iterator(struct dsa_params *params,
194                                           mpz_t pub,
195                                           mpz_t priv,
196                                           unsigned p_max_bits,
197                                           struct asn1_der_iterator *i);
198
199 int
200 dsa_openssl_private_key_from_der(struct dsa_params *params,
201                                  mpz_t pub,
202                                  mpz_t priv,
203                                  unsigned p_max_bits,
204                                  size_t length, const uint8_t *data);
205
206
207 /* Internal functions. */
208 void
209 _dsa_hash (mpz_t h, unsigned bit_size,
210            size_t length, const uint8_t *digest);
211
212 #ifdef __cplusplus
213 }
214 #endif
215
216 #endif /* NETTLE_DSA_H_INCLUDED */