dsa.h 5.51 KB
Newer Older
Niels Möller's avatar
Niels Möller committed
1
/* dsa.h
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

   The DSA publickey algorithm.

   Copyright (C) 2002, 2013, 2014 Niels Möller

   This file is part of GNU Nettle.

   GNU Nettle is free software: you can redistribute it and/or
   modify it under the terms of either:

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at your
       option) any later version.

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at your
       option) any later version.

   or both in parallel, as here.

   GNU Nettle 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
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see http://www.gnu.org/licenses/.
*/
Niels Möller's avatar
Niels Möller committed
33 34 35 36
 
#ifndef NETTLE_DSA_H_INCLUDED
#define NETTLE_DSA_H_INCLUDED

37
#include "nettle-types.h"
38
#include "bignum.h"
39

Niels Möller's avatar
Niels Möller committed
40 41 42 43
#ifdef __cplusplus
extern "C" {
#endif

44
/* Name mangling */
45 46
#define dsa_params_init nettle_dsa_params_init
#define dsa_params_clear nettle_dsa_params_clear
47 48
#define dsa_signature_init nettle_dsa_signature_init
#define dsa_signature_clear nettle_dsa_signature_clear
49 50
#define dsa_sign nettle_dsa_sign
#define dsa_verify nettle_dsa_verify
51
#define dsa_generate_params nettle_dsa_generate_params
52 53
#define dsa_generate_keypair nettle_dsa_generate_keypair
#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 57
#define dsa_sha1_keypair_from_sexp nettle_dsa_sha1_keypair_from_sexp
#define dsa_sha256_keypair_from_sexp nettle_dsa_sha256_keypair_from_sexp
58 59 60 61
#define dsa_params_from_der_iterator nettle_dsa_params_from_der_iterator
#define dsa_public_key_from_der_iterator nettle_dsa_public_key_from_der_iterator
#define dsa_openssl_private_key_from_der_iterator nettle_dsa_openssl_private_key_from_der_iterator 
#define dsa_openssl_private_key_from_der nettle_openssl_provate_key_from_der
62

63
/* For FIPS approved parameters */
64 65 66
#define DSA_SHA1_MIN_P_BITS 512
#define DSA_SHA1_Q_OCTETS 20
#define DSA_SHA1_Q_BITS 160
Niels Möller's avatar
Niels Möller committed
67

68 69 70
#define DSA_SHA256_MIN_P_BITS 1024
#define DSA_SHA256_Q_OCTETS 32
#define DSA_SHA256_Q_BITS 256
71 72 73 74 75 76 77 78 79 80 81 82 83

struct dsa_params
{  
  /* Modulo */
  mpz_t p;

  /* Group order */
  mpz_t q;

  /* Generator */
  mpz_t g;
};

84 85 86 87 88 89
void
dsa_params_init (struct dsa_params *params);

void
dsa_params_clear (struct dsa_params *params);

Niels Möller's avatar
Niels Möller committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103
struct dsa_signature
{
  mpz_t r;
  mpz_t s;
};

/* Calls mpz_init to initialize bignum storage. */
void
dsa_signature_init(struct dsa_signature *signature);

/* Calls mpz_clear to deallocate bignum storage. */
void
dsa_signature_clear(struct dsa_signature *signature);

104
int
105 106
dsa_sign(const struct dsa_params *params,
	 const mpz_t x,
107 108 109 110 111 112
	 void *random_ctx, nettle_random_func *random,
	 size_t digest_size,
	 const uint8_t *digest,
	 struct dsa_signature *signature);

int
113 114
dsa_verify(const struct dsa_params *params,
	   const mpz_t y,
115 116 117 118
	   size_t digest_size,
	   const uint8_t *digest,
	   const struct dsa_signature *signature);

119

Niels Möller's avatar
Niels Möller committed
120 121
/* Key generation */

122 123 124 125 126 127
int
dsa_generate_params(struct dsa_params *params,
		    void *random_ctx, nettle_random_func *random,
		    void *progress_ctx, nettle_progress_func *progress,
		    unsigned p_bits, unsigned q_bits);

128 129 130 131 132
void
dsa_generate_keypair (const struct dsa_params *params,
		      mpz_t pub, mpz_t key,
		      void *random_ctx, nettle_random_func *random);

133 134 135 136 137 138 139 140
/* Keys in sexp form. */

struct nettle_buffer;

/* Generates a public-key expression if PRIV is NULL .*/
int
dsa_keypair_to_sexp(struct nettle_buffer *buffer,
		    const char *algorithm_name, /* NULL means "dsa" */
141 142 143
		    const struct dsa_params *params,
		    const mpz_t pub,
		    const mpz_t priv);
144

145 146
struct sexp_iterator;

147 148
int
dsa_signature_from_sexp(struct dsa_signature *rs,
149 150
			struct sexp_iterator *i,
			unsigned q_bits);
151

152
int
153 154 155
dsa_keypair_from_sexp_alist(struct dsa_params *params,
			    mpz_t pub,
			    mpz_t priv,
156 157
			    unsigned p_max_bits,
			    unsigned q_bits,
158 159 160 161 162 163 164
			    struct sexp_iterator *i);

/* If PRIV is NULL, expect a public-key expression. If PUB is NULL,
 * expect a private key expression and ignore the parts not needed for
 * the public key. */
/* Keys must be initialized before calling this function, as usual. */
int
165 166 167
dsa_sha1_keypair_from_sexp(struct dsa_params *params,
			   mpz_t pub,
			   mpz_t priv,
168
			   unsigned p_max_bits,
169
			   size_t length, const uint8_t *expr);
170 171

int
172 173 174
dsa_sha256_keypair_from_sexp(struct dsa_params *params,
			     mpz_t pub,
			     mpz_t priv,
175
			     unsigned p_max_bits,
176
			     size_t length, const uint8_t *expr);
177

178 179 180 181
/* Keys in X.509 andd OpenSSL format. */
struct asn1_der_iterator;

int
182 183
dsa_params_from_der_iterator(struct dsa_params *params,
			     unsigned max_bits, unsigned q_bits,
184
			     struct asn1_der_iterator *i);
185

186
int
187 188
dsa_public_key_from_der_iterator(const struct dsa_params *params,
				 mpz_t pub,
189
				 struct asn1_der_iterator *i);
190 191

int
192 193 194
dsa_openssl_private_key_from_der_iterator(struct dsa_params *params,
					  mpz_t pub,
					  mpz_t priv,
195
					  unsigned p_max_bits,
196
					  struct asn1_der_iterator *i);
197 198

int
199 200 201
dsa_openssl_private_key_from_der(struct dsa_params *params,
				 mpz_t pub,
				 mpz_t priv,
202
				 unsigned p_max_bits,
Niels Möller's avatar
Niels Möller committed
203
				 size_t length, const uint8_t *data);
204

205

Niels Möller's avatar
Niels Möller committed
206 207 208 209
#ifdef __cplusplus
}
#endif

Niels Möller's avatar
Niels Möller committed
210
#endif /* NETTLE_DSA_H_INCLUDED */