blob: e6ddce672c1bfd9a34bb6e5c7633750d2c50a7bd [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.]
56 *
57 * The DSS routines are based on patches supplied by
58 * Steven Schoch <schoch@sheba.arc.nasa.gov>. */
59
60#ifndef OPENSSL_HEADER_DSA_H
61#define OPENSSL_HEADER_DSA_H
62
63#include <openssl/base.h>
64
65#include <openssl/engine.h>
66#include <openssl/ex_data.h>
Adam Langley683d7bd2015-04-13 11:04:14 -070067#include <openssl/thread.h>
Adam Langley95c29f32014-06-20 12:00:00 -070068
69#if defined(__cplusplus)
70extern "C" {
71#endif
72
73
David Benjamin4512b792017-08-18 19:21:50 -040074// DSA contains functions for signing and verifying with the Digital Signature
75// Algorithm.
David Benjamin7139f752018-06-07 11:32:15 -040076//
77// This module is deprecated and retained for legacy reasons only. It is not
78// considered a priority for performance or hardening work. Do not use it in
79// new code. Use Ed25519, ECDSA with P-256, or RSA instead.
Adam Langley95c29f32014-06-20 12:00:00 -070080
81
David Benjamin4512b792017-08-18 19:21:50 -040082// Allocation and destruction.
Adam Langley95c29f32014-06-20 12:00:00 -070083
David Benjamin4512b792017-08-18 19:21:50 -040084// DSA_new returns a new, empty DSA object or NULL on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070085OPENSSL_EXPORT DSA *DSA_new(void);
Adam Langley95c29f32014-06-20 12:00:00 -070086
David Benjamin4512b792017-08-18 19:21:50 -040087// DSA_free decrements the reference count of |dsa| and frees it if the
88// reference count drops to zero.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070089OPENSSL_EXPORT void DSA_free(DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -070090
David Benjamin4512b792017-08-18 19:21:50 -040091// DSA_up_ref increments the reference count of |dsa| and returns one.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070092OPENSSL_EXPORT int DSA_up_ref(DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -070093
94
David Benjamin4512b792017-08-18 19:21:50 -040095// Properties.
David Benjamin5a915032016-08-09 11:04:24 -040096
David Benjamincdc5c182020-04-01 12:13:31 -040097// DSA_get0_pub_key returns |dsa|'s public key.
98OPENSSL_EXPORT const BIGNUM *DSA_get0_pub_key(const DSA *dsa);
99
100// DSA_get0_priv_key returns |dsa|'s private key, or NULL if |dsa| is a public
101// key.
102OPENSSL_EXPORT const BIGNUM *DSA_get0_priv_key(const DSA *dsa);
103
104// DSA_get0_p returns |dsa|'s group modulus.
105OPENSSL_EXPORT const BIGNUM *DSA_get0_p(const DSA *dsa);
106
107// DSA_get0_q returns the size of |dsa|'s subgroup.
108OPENSSL_EXPORT const BIGNUM *DSA_get0_q(const DSA *dsa);
109
110// DSA_get0_g returns |dsa|'s group generator.
111OPENSSL_EXPORT const BIGNUM *DSA_get0_g(const DSA *dsa);
112
David Benjamin4512b792017-08-18 19:21:50 -0400113// DSA_get0_key sets |*out_pub_key| and |*out_priv_key|, if non-NULL, to |dsa|'s
114// public and private key, respectively. If |dsa| is a public key, the private
115// key will be set to NULL.
David Benjamin5a915032016-08-09 11:04:24 -0400116OPENSSL_EXPORT void DSA_get0_key(const DSA *dsa, const BIGNUM **out_pub_key,
117 const BIGNUM **out_priv_key);
118
David Benjamin4512b792017-08-18 19:21:50 -0400119// DSA_get0_pqg sets |*out_p|, |*out_q|, and |*out_g|, if non-NULL, to |dsa|'s
120// p, q, and g parameters, respectively.
David Benjamin5a915032016-08-09 11:04:24 -0400121OPENSSL_EXPORT void DSA_get0_pqg(const DSA *dsa, const BIGNUM **out_p,
122 const BIGNUM **out_q, const BIGNUM **out_g);
123
David Benjamin81f030b2016-08-12 14:48:19 -0400124// DSA_set0_key sets |dsa|'s public and private key to |pub_key| and |priv_key|,
125// respectively, if non-NULL. On success, it takes ownership of each argument
126// and returns one. Otherwise, it returns zero.
127//
128// |priv_key| may be NULL, but |pub_key| must either be non-NULL or already
129// configured on |dsa|.
130OPENSSL_EXPORT int DSA_set0_key(DSA *dsa, BIGNUM *pub_key, BIGNUM *priv_key);
131
132// DSA_set0_pqg sets |dsa|'s parameters to |p|, |q|, and |g|, if non-NULL, and
133// takes ownership of them. On success, it takes ownership of each argument and
134// returns one. Otherwise, it returns zero.
135//
136// Each argument must either be non-NULL or already configured on |dsa|.
137OPENSSL_EXPORT int DSA_set0_pqg(DSA *dsa, BIGNUM *p, BIGNUM *q, BIGNUM *g);
138
David Benjamin5a915032016-08-09 11:04:24 -0400139
David Benjamin4512b792017-08-18 19:21:50 -0400140// Parameter generation.
Adam Langley95c29f32014-06-20 12:00:00 -0700141
David Benjamin4512b792017-08-18 19:21:50 -0400142// DSA_generate_parameters_ex generates a set of DSA parameters by following
143// the procedure given in FIPS 186-4, appendix A.
144// (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf)
145//
146// The larger prime will have a length of |bits| (e.g. 2048). The |seed| value
147// allows others to generate and verify the same parameters and should be
148// random input which is kept for reference. If |out_counter| or |out_h| are
149// not NULL then the counter and h value used in the generation are written to
150// them.
151//
152// The |cb| argument is passed to |BN_generate_prime_ex| and is thus called
153// during the generation process in order to indicate progress. See the
154// comments for that function for details. In addition to the calls made by
155// |BN_generate_prime_ex|, |DSA_generate_parameters_ex| will call it with
156// |event| equal to 2 and 3 at different stages of the process.
157//
158// It returns one on success and zero otherwise.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700159OPENSSL_EXPORT int DSA_generate_parameters_ex(DSA *dsa, unsigned bits,
160 const uint8_t *seed,
161 size_t seed_len, int *out_counter,
162 unsigned long *out_h,
163 BN_GENCB *cb);
Adam Langley95c29f32014-06-20 12:00:00 -0700164
David Benjamin4512b792017-08-18 19:21:50 -0400165// DSAparams_dup returns a freshly allocated |DSA| that contains a copy of the
166// parameters from |dsa|. It returns NULL on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700167OPENSSL_EXPORT DSA *DSAparams_dup(const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700168
169
David Benjamin4512b792017-08-18 19:21:50 -0400170// Key generation.
Adam Langley95c29f32014-06-20 12:00:00 -0700171
David Benjamin4512b792017-08-18 19:21:50 -0400172// DSA_generate_key generates a public/private key pair in |dsa|, which must
173// already have parameters setup. It returns one on success and zero on
174// error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700175OPENSSL_EXPORT int DSA_generate_key(DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700176
177
David Benjamin4512b792017-08-18 19:21:50 -0400178// Signatures.
Adam Langley95c29f32014-06-20 12:00:00 -0700179
David Benjamin4512b792017-08-18 19:21:50 -0400180// DSA_SIG_st (aka |DSA_SIG|) contains a DSA signature as a pair of integers.
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700181struct DSA_SIG_st {
Adam Langley95c29f32014-06-20 12:00:00 -0700182 BIGNUM *r, *s;
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700183};
Adam Langley95c29f32014-06-20 12:00:00 -0700184
David Benjamin4512b792017-08-18 19:21:50 -0400185// DSA_SIG_new returns a freshly allocated, DIG_SIG structure or NULL on error.
186// Both |r| and |s| in the signature will be NULL.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700187OPENSSL_EXPORT DSA_SIG *DSA_SIG_new(void);
Adam Langley95c29f32014-06-20 12:00:00 -0700188
David Benjamin4512b792017-08-18 19:21:50 -0400189// DSA_SIG_free frees the contents of |sig| and then frees |sig| itself.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700190OPENSSL_EXPORT void DSA_SIG_free(DSA_SIG *sig);
Adam Langley95c29f32014-06-20 12:00:00 -0700191
David Benjamin16a94932021-11-17 14:01:11 -0500192// DSA_SIG_get0 sets |*out_r| and |*out_s|, if non-NULL, to the two components
193// of |sig|.
194OPENSSL_EXPORT void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **out_r,
195 const BIGNUM **out_s);
196
197// DSA_SIG_set0 sets |sig|'s components to |r| and |s|, neither of which may be
198// NULL. On success, it takes ownership of each argument and returns one.
199// Otherwise, it returns zero.
200OPENSSL_EXPORT int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s);
201
David Benjamin4512b792017-08-18 19:21:50 -0400202// DSA_do_sign returns a signature of the hash in |digest| by the key in |dsa|
203// and returns an allocated, DSA_SIG structure, or NULL on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700204OPENSSL_EXPORT DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len,
David Benjamin2056d722017-11-21 12:58:36 -0500205 const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700206
David Benjamin4512b792017-08-18 19:21:50 -0400207// DSA_do_verify verifies that |sig| is a valid signature, by the public key in
208// |dsa|, of the hash in |digest|. It returns one if so, zero if invalid and -1
209// on error.
210//
211// WARNING: do not use. This function returns -1 for error, 0 for invalid and 1
212// for valid. However, this is dangerously different to the usual OpenSSL
213// convention and could be a disaster if a user did |if (DSA_do_verify(...))|.
214// Because of this, |DSA_check_signature| is a safer version of this.
215//
216// TODO(fork): deprecate.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700217OPENSSL_EXPORT int DSA_do_verify(const uint8_t *digest, size_t digest_len,
218 DSA_SIG *sig, const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700219
David Benjamin4512b792017-08-18 19:21:50 -0400220// DSA_do_check_signature sets |*out_valid| to zero. Then it verifies that |sig|
221// is a valid signature, by the public key in |dsa| of the hash in |digest|
222// and, if so, it sets |*out_valid| to one.
223//
224// It returns one if it was able to verify the signature as valid or invalid,
225// and zero on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700226OPENSSL_EXPORT int DSA_do_check_signature(int *out_valid, const uint8_t *digest,
227 size_t digest_len, DSA_SIG *sig,
228 const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700229
230
David Benjamin4512b792017-08-18 19:21:50 -0400231// ASN.1 signatures.
232//
233// These functions also perform DSA signature operations, but deal with ASN.1
234// encoded signatures as opposed to raw |BIGNUM|s. If you don't know what
235// encoding a DSA signature is in, it's probably ASN.1.
Adam Langley95c29f32014-06-20 12:00:00 -0700236
David Benjamin4512b792017-08-18 19:21:50 -0400237// DSA_sign signs |digest| with the key in |dsa| and writes the resulting
238// signature, in ASN.1 form, to |out_sig| and the length of the signature to
239// |*out_siglen|. There must be, at least, |DSA_size(dsa)| bytes of space in
240// |out_sig|. It returns one on success and zero otherwise.
241//
242// (The |type| argument is ignored.)
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700243OPENSSL_EXPORT int DSA_sign(int type, const uint8_t *digest, size_t digest_len,
244 uint8_t *out_sig, unsigned int *out_siglen,
David Benjamin2056d722017-11-21 12:58:36 -0500245 const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700246
David Benjamin4512b792017-08-18 19:21:50 -0400247// DSA_verify verifies that |sig| is a valid, ASN.1 signature, by the public
248// key in |dsa|, of the hash in |digest|. It returns one if so, zero if invalid
249// and -1 on error.
250//
251// (The |type| argument is ignored.)
252//
253// WARNING: do not use. This function returns -1 for error, 0 for invalid and 1
254// for valid. However, this is dangerously different to the usual OpenSSL
255// convention and could be a disaster if a user did |if (DSA_do_verify(...))|.
256// Because of this, |DSA_check_signature| is a safer version of this.
257//
258// TODO(fork): deprecate.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700259OPENSSL_EXPORT int DSA_verify(int type, const uint8_t *digest,
260 size_t digest_len, const uint8_t *sig,
261 size_t sig_len, const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700262
David Benjamin4512b792017-08-18 19:21:50 -0400263// DSA_check_signature sets |*out_valid| to zero. Then it verifies that |sig|
264// is a valid, ASN.1 signature, by the public key in |dsa|, of the hash in
265// |digest|. If so, it sets |*out_valid| to one.
266//
267// It returns one if it was able to verify the signature as valid or invalid,
268// and zero on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700269OPENSSL_EXPORT int DSA_check_signature(int *out_valid, const uint8_t *digest,
270 size_t digest_len, const uint8_t *sig,
271 size_t sig_len, const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700272
David Benjamin4512b792017-08-18 19:21:50 -0400273// DSA_size returns the size, in bytes, of an ASN.1 encoded, DSA signature
274// generated by |dsa|. Parameters must already have been setup in |dsa|.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700275OPENSSL_EXPORT int DSA_size(const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700276
277
David Benjamin4512b792017-08-18 19:21:50 -0400278// ASN.1 encoding.
Adam Langley95c29f32014-06-20 12:00:00 -0700279
David Benjamin4512b792017-08-18 19:21:50 -0400280// DSA_SIG_parse parses a DER-encoded DSA-Sig-Value structure from |cbs| and
281// advances |cbs|. It returns a newly-allocated |DSA_SIG| or NULL on error.
David Benjaminfda22a72016-01-30 01:51:01 -0500282OPENSSL_EXPORT DSA_SIG *DSA_SIG_parse(CBS *cbs);
Adam Langley95c29f32014-06-20 12:00:00 -0700283
David Benjamin4512b792017-08-18 19:21:50 -0400284// DSA_SIG_marshal marshals |sig| as a DER-encoded DSA-Sig-Value and appends the
285// result to |cbb|. It returns one on success and zero on error.
David Benjaminfda22a72016-01-30 01:51:01 -0500286OPENSSL_EXPORT int DSA_SIG_marshal(CBB *cbb, const DSA_SIG *sig);
Adam Langley95c29f32014-06-20 12:00:00 -0700287
David Benjamin4512b792017-08-18 19:21:50 -0400288// DSA_parse_public_key parses a DER-encoded DSA public key from |cbs| and
289// advances |cbs|. It returns a newly-allocated |DSA| or NULL on error.
David Benjaminfda22a72016-01-30 01:51:01 -0500290OPENSSL_EXPORT DSA *DSA_parse_public_key(CBS *cbs);
Adam Langley95c29f32014-06-20 12:00:00 -0700291
David Benjamin4512b792017-08-18 19:21:50 -0400292// DSA_marshal_public_key marshals |dsa| as a DER-encoded DSA public key and
293// appends the result to |cbb|. It returns one on success and zero on
294// failure.
David Benjaminfda22a72016-01-30 01:51:01 -0500295OPENSSL_EXPORT int DSA_marshal_public_key(CBB *cbb, const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700296
David Benjamin4512b792017-08-18 19:21:50 -0400297// DSA_parse_private_key parses a DER-encoded DSA private key from |cbs| and
298// advances |cbs|. It returns a newly-allocated |DSA| or NULL on error.
David Benjaminfda22a72016-01-30 01:51:01 -0500299OPENSSL_EXPORT DSA *DSA_parse_private_key(CBS *cbs);
Adam Langley95c29f32014-06-20 12:00:00 -0700300
David Benjamin4512b792017-08-18 19:21:50 -0400301// DSA_marshal_private_key marshals |dsa| as a DER-encoded DSA private key and
302// appends the result to |cbb|. It returns one on success and zero on
303// failure.
David Benjaminfda22a72016-01-30 01:51:01 -0500304OPENSSL_EXPORT int DSA_marshal_private_key(CBB *cbb, const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700305
David Benjamin4512b792017-08-18 19:21:50 -0400306// DSA_parse_parameters parses a DER-encoded Dss-Parms structure (RFC 3279)
307// from |cbs| and advances |cbs|. It returns a newly-allocated |DSA| or NULL on
308// error.
David Benjaminfda22a72016-01-30 01:51:01 -0500309OPENSSL_EXPORT DSA *DSA_parse_parameters(CBS *cbs);
Adam Langley95c29f32014-06-20 12:00:00 -0700310
David Benjamin4512b792017-08-18 19:21:50 -0400311// DSA_marshal_parameters marshals |dsa| as a DER-encoded Dss-Parms structure
David Benjamincfafcd42021-10-14 17:22:23 -0400312// (RFC 3279) and appends the result to |cbb|. It returns one on success and
David Benjamin4512b792017-08-18 19:21:50 -0400313// zero on failure.
David Benjaminfda22a72016-01-30 01:51:01 -0500314OPENSSL_EXPORT int DSA_marshal_parameters(CBB *cbb, const DSA *dsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700315
316
David Benjamin4512b792017-08-18 19:21:50 -0400317// Conversion.
Adam Langleybed8ce72014-09-05 17:04:51 -0700318
David Benjamin4512b792017-08-18 19:21:50 -0400319// DSA_dup_DH returns a |DH| constructed from the parameters of |dsa|. This is
320// sometimes needed when Diffie-Hellman parameters are stored in the form of
321// DSA parameters. It returns an allocated |DH| on success or NULL on error.
Adam Langleybed8ce72014-09-05 17:04:51 -0700322OPENSSL_EXPORT DH *DSA_dup_DH(const DSA *dsa);
323
324
David Benjamin4512b792017-08-18 19:21:50 -0400325// ex_data functions.
326//
327// See |ex_data.h| for details.
Adam Langley95c29f32014-06-20 12:00:00 -0700328
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700329OPENSSL_EXPORT int DSA_get_ex_new_index(long argl, void *argp,
David Benjamin8a589332015-12-04 23:14:35 -0500330 CRYPTO_EX_unused *unused,
David Benjamind94682d2017-05-14 17:10:18 -0400331 CRYPTO_EX_dup *dup_unused,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700332 CRYPTO_EX_free *free_func);
David Benjamin27e377e2017-07-31 19:09:42 -0400333OPENSSL_EXPORT int DSA_set_ex_data(DSA *dsa, int idx, void *arg);
334OPENSSL_EXPORT void *DSA_get_ex_data(const DSA *dsa, int idx);
Adam Langley95c29f32014-06-20 12:00:00 -0700335
336
David Benjamin4512b792017-08-18 19:21:50 -0400337// Deprecated functions.
David Benjaminfda22a72016-01-30 01:51:01 -0500338
David Benjamincfafcd42021-10-14 17:22:23 -0400339// d2i_DSA_SIG parses a DER-encoded DSA-Sig-Value structure from |len| bytes at
340// |*inp|, as described in |d2i_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400341//
342// Use |DSA_SIG_parse| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500343OPENSSL_EXPORT DSA_SIG *d2i_DSA_SIG(DSA_SIG **out_sig, const uint8_t **inp,
344 long len);
345
David Benjamincfafcd42021-10-14 17:22:23 -0400346// i2d_DSA_SIG marshals |in| to a DER-encoded DSA-Sig-Value structure, as
347// described in |i2d_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400348//
349// Use |DSA_SIG_marshal| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500350OPENSSL_EXPORT int i2d_DSA_SIG(const DSA_SIG *in, uint8_t **outp);
351
David Benjamincfafcd42021-10-14 17:22:23 -0400352// d2i_DSAPublicKey parses a DER-encoded DSA public key from |len| bytes at
353// |*inp|, as described in |d2i_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400354//
355// Use |DSA_parse_public_key| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500356OPENSSL_EXPORT DSA *d2i_DSAPublicKey(DSA **out, const uint8_t **inp, long len);
357
David Benjamincfafcd42021-10-14 17:22:23 -0400358// i2d_DSAPublicKey marshals |in| as a DER-encoded DSA public key, as described
359// in |i2d_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400360//
361// Use |DSA_marshal_public_key| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500362OPENSSL_EXPORT int i2d_DSAPublicKey(const DSA *in, uint8_t **outp);
363
David Benjamincfafcd42021-10-14 17:22:23 -0400364// d2i_DSAPrivateKey parses a DER-encoded DSA private key from |len| bytes at
365// |*inp|, as described in |d2i_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400366//
367// Use |DSA_parse_private_key| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500368OPENSSL_EXPORT DSA *d2i_DSAPrivateKey(DSA **out, const uint8_t **inp, long len);
369
David Benjamincfafcd42021-10-14 17:22:23 -0400370// i2d_DSAPrivateKey marshals |in| as a DER-encoded DSA private key, as
371// described in |i2d_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400372//
373// Use |DSA_marshal_private_key| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500374OPENSSL_EXPORT int i2d_DSAPrivateKey(const DSA *in, uint8_t **outp);
375
David Benjamincfafcd42021-10-14 17:22:23 -0400376// d2i_DSAparams parses a DER-encoded Dss-Parms structure (RFC 3279) from |len|
377// bytes at |*inp|, as described in |d2i_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400378//
379// Use |DSA_parse_parameters| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500380OPENSSL_EXPORT DSA *d2i_DSAparams(DSA **out, const uint8_t **inp, long len);
381
David Benjamincfafcd42021-10-14 17:22:23 -0400382// i2d_DSAparams marshals |in|'s parameters as a DER-encoded Dss-Parms structure
383// (RFC 3279), as described in |i2d_SAMPLE|.
David Benjamin4512b792017-08-18 19:21:50 -0400384//
385// Use |DSA_marshal_parameters| instead.
David Benjaminfda22a72016-01-30 01:51:01 -0500386OPENSSL_EXPORT int i2d_DSAparams(const DSA *in, uint8_t **outp);
387
David Benjamin4512b792017-08-18 19:21:50 -0400388// DSA_generate_parameters is a deprecated version of
389// |DSA_generate_parameters_ex| that creates and returns a |DSA*|. Don't use
390// it.
Adam Langley99a24ba2016-03-07 16:11:01 -0800391OPENSSL_EXPORT DSA *DSA_generate_parameters(int bits, unsigned char *seed,
392 int seed_len, int *counter_ret,
393 unsigned long *h_ret,
394 void (*callback)(int, int, void *),
395 void *cb_arg);
396
David Benjaminfda22a72016-01-30 01:51:01 -0500397
Adam Langley95c29f32014-06-20 12:00:00 -0700398struct dsa_st {
399 long version;
Adam Langley95c29f32014-06-20 12:00:00 -0700400 BIGNUM *p;
David Benjamin4512b792017-08-18 19:21:50 -0400401 BIGNUM *q; // == 20
Adam Langley95c29f32014-06-20 12:00:00 -0700402 BIGNUM *g;
403
David Benjamin4512b792017-08-18 19:21:50 -0400404 BIGNUM *pub_key; // y public key
405 BIGNUM *priv_key; // x private key
Adam Langley95c29f32014-06-20 12:00:00 -0700406
Adam Langley95c29f32014-06-20 12:00:00 -0700407 int flags;
David Benjamin4512b792017-08-18 19:21:50 -0400408 // Normally used to cache montgomery values
David Benjamin99c752a2016-06-16 15:13:43 -0400409 CRYPTO_MUTEX method_mont_lock;
Adam Langley95c29f32014-06-20 12:00:00 -0700410 BN_MONT_CTX *method_mont_p;
David Benjamin99c752a2016-06-16 15:13:43 -0400411 BN_MONT_CTX *method_mont_q;
Adam Langley0da323a2015-05-15 12:49:30 -0700412 CRYPTO_refcount_t references;
Adam Langley95c29f32014-06-20 12:00:00 -0700413 CRYPTO_EX_DATA ex_data;
Adam Langley95c29f32014-06-20 12:00:00 -0700414};
415
416
417#if defined(__cplusplus)
David Benjamin4512b792017-08-18 19:21:50 -0400418} // extern C
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700419
420extern "C++" {
421
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700422BSSL_NAMESPACE_BEGIN
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700423
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700424BORINGSSL_MAKE_DELETER(DSA, DSA_free)
David Benjamin5cf05ad2018-09-14 09:34:17 -0700425BORINGSSL_MAKE_UP_REF(DSA, DSA_up_ref)
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700426BORINGSSL_MAKE_DELETER(DSA_SIG, DSA_SIG_free)
427
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700428BSSL_NAMESPACE_END
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700429
David Benjamin4512b792017-08-18 19:21:50 -0400430} // extern C++
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700431
Adam Langley95c29f32014-06-20 12:00:00 -0700432#endif
433
David Benjamin689be0f2015-02-11 15:55:26 -0500434#define DSA_R_BAD_Q_VALUE 100
435#define DSA_R_MISSING_PARAMETERS 101
Adam Langley95c29f32014-06-20 12:00:00 -0700436#define DSA_R_MODULUS_TOO_LARGE 102
David Benjamin689be0f2015-02-11 15:55:26 -0500437#define DSA_R_NEED_NEW_SETUP_VALUES 103
David Benjaminfda22a72016-01-30 01:51:01 -0500438#define DSA_R_BAD_VERSION 104
439#define DSA_R_DECODE_ERROR 105
440#define DSA_R_ENCODE_ERROR 106
David Benjamin8728af42019-05-07 11:41:25 -0500441#define DSA_R_INVALID_PARAMETERS 107
Adam Langley95c29f32014-06-20 12:00:00 -0700442
David Benjamin4512b792017-08-18 19:21:50 -0400443#endif // OPENSSL_HEADER_DSA_H