1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (C) 1995-1998 Eric Young ([email protected]) 2*8fb009dcSAndroid Build Coastguard Worker * All rights reserved. 3*8fb009dcSAndroid Build Coastguard Worker * 4*8fb009dcSAndroid Build Coastguard Worker * This package is an SSL implementation written 5*8fb009dcSAndroid Build Coastguard Worker * by Eric Young ([email protected]). 6*8fb009dcSAndroid Build Coastguard Worker * The implementation was written so as to conform with Netscapes SSL. 7*8fb009dcSAndroid Build Coastguard Worker * 8*8fb009dcSAndroid Build Coastguard Worker * This library is free for commercial and non-commercial use as long as 9*8fb009dcSAndroid Build Coastguard Worker * the following conditions are aheared to. The following conditions 10*8fb009dcSAndroid Build Coastguard Worker * apply to all code found in this distribution, be it the RC4, RSA, 11*8fb009dcSAndroid Build Coastguard Worker * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12*8fb009dcSAndroid Build Coastguard Worker * included with this distribution is covered by the same copyright terms 13*8fb009dcSAndroid Build Coastguard Worker * except that the holder is Tim Hudson ([email protected]). 14*8fb009dcSAndroid Build Coastguard Worker * 15*8fb009dcSAndroid Build Coastguard Worker * Copyright remains Eric Young's, and as such any Copyright notices in 16*8fb009dcSAndroid Build Coastguard Worker * the code are not to be removed. 17*8fb009dcSAndroid Build Coastguard Worker * If this package is used in a product, Eric Young should be given attribution 18*8fb009dcSAndroid Build Coastguard Worker * as the author of the parts of the library used. 19*8fb009dcSAndroid Build Coastguard Worker * This can be in the form of a textual message at program startup or 20*8fb009dcSAndroid Build Coastguard Worker * in documentation (online or textual) provided with the package. 21*8fb009dcSAndroid Build Coastguard Worker * 22*8fb009dcSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 23*8fb009dcSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 24*8fb009dcSAndroid Build Coastguard Worker * are met: 25*8fb009dcSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the copyright 26*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 27*8fb009dcSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 28*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 29*8fb009dcSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 30*8fb009dcSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this software 31*8fb009dcSAndroid Build Coastguard Worker * must display the following acknowledgement: 32*8fb009dcSAndroid Build Coastguard Worker * "This product includes cryptographic software written by 33*8fb009dcSAndroid Build Coastguard Worker * Eric Young ([email protected])" 34*8fb009dcSAndroid Build Coastguard Worker * The word 'cryptographic' can be left out if the rouines from the library 35*8fb009dcSAndroid Build Coastguard Worker * being used are not cryptographic related :-). 36*8fb009dcSAndroid Build Coastguard Worker * 4. If you include any Windows specific code (or a derivative thereof) from 37*8fb009dcSAndroid Build Coastguard Worker * the apps directory (application code) you must include an acknowledgement: 38*8fb009dcSAndroid Build Coastguard Worker * "This product includes software written by Tim Hudson ([email protected])" 39*8fb009dcSAndroid Build Coastguard Worker * 40*8fb009dcSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41*8fb009dcSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42*8fb009dcSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43*8fb009dcSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44*8fb009dcSAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45*8fb009dcSAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46*8fb009dcSAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47*8fb009dcSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48*8fb009dcSAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49*8fb009dcSAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50*8fb009dcSAndroid Build Coastguard Worker * SUCH DAMAGE. 51*8fb009dcSAndroid Build Coastguard Worker * 52*8fb009dcSAndroid Build Coastguard Worker * The licence and distribution terms for any publically available version or 53*8fb009dcSAndroid Build Coastguard Worker * derivative of this code cannot be changed. i.e. this code cannot simply be 54*8fb009dcSAndroid Build Coastguard Worker * copied and put under another distribution licence 55*8fb009dcSAndroid Build Coastguard Worker * [including the GNU Public Licence.] 56*8fb009dcSAndroid Build Coastguard Worker * 57*8fb009dcSAndroid Build Coastguard Worker * The DSS routines are based on patches supplied by 58*8fb009dcSAndroid Build Coastguard Worker * Steven Schoch <[email protected]>. */ 59*8fb009dcSAndroid Build Coastguard Worker 60*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_DSA_H 61*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_DSA_H 62*8fb009dcSAndroid Build Coastguard Worker 63*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h> 64*8fb009dcSAndroid Build Coastguard Worker 65*8fb009dcSAndroid Build Coastguard Worker #include <openssl/ex_data.h> 66*8fb009dcSAndroid Build Coastguard Worker 67*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 68*8fb009dcSAndroid Build Coastguard Worker extern "C" { 69*8fb009dcSAndroid Build Coastguard Worker #endif 70*8fb009dcSAndroid Build Coastguard Worker 71*8fb009dcSAndroid Build Coastguard Worker 72*8fb009dcSAndroid Build Coastguard Worker // DSA contains functions for signing and verifying with the Digital Signature 73*8fb009dcSAndroid Build Coastguard Worker // Algorithm. 74*8fb009dcSAndroid Build Coastguard Worker // 75*8fb009dcSAndroid Build Coastguard Worker // This module is deprecated and retained for legacy reasons only. It is not 76*8fb009dcSAndroid Build Coastguard Worker // considered a priority for performance or hardening work. Do not use it in 77*8fb009dcSAndroid Build Coastguard Worker // new code. Use Ed25519, ECDSA with P-256, or RSA instead. 78*8fb009dcSAndroid Build Coastguard Worker 79*8fb009dcSAndroid Build Coastguard Worker 80*8fb009dcSAndroid Build Coastguard Worker // Allocation and destruction. 81*8fb009dcSAndroid Build Coastguard Worker // 82*8fb009dcSAndroid Build Coastguard Worker // A |DSA| object represents a DSA key or group parameters. A given object may 83*8fb009dcSAndroid Build Coastguard Worker // be used concurrently on multiple threads by non-mutating functions, provided 84*8fb009dcSAndroid Build Coastguard Worker // no other thread is concurrently calling a mutating function. Unless otherwise 85*8fb009dcSAndroid Build Coastguard Worker // documented, functions which take a |const| pointer are non-mutating and 86*8fb009dcSAndroid Build Coastguard Worker // functions which take a non-|const| pointer are mutating. 87*8fb009dcSAndroid Build Coastguard Worker 88*8fb009dcSAndroid Build Coastguard Worker // DSA_new returns a new, empty DSA object or NULL on error. 89*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *DSA_new(void); 90*8fb009dcSAndroid Build Coastguard Worker 91*8fb009dcSAndroid Build Coastguard Worker // DSA_free decrements the reference count of |dsa| and frees it if the 92*8fb009dcSAndroid Build Coastguard Worker // reference count drops to zero. 93*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DSA_free(DSA *dsa); 94*8fb009dcSAndroid Build Coastguard Worker 95*8fb009dcSAndroid Build Coastguard Worker // DSA_up_ref increments the reference count of |dsa| and returns one. It does 96*8fb009dcSAndroid Build Coastguard Worker // not mutate |dsa| for thread-safety purposes and may be used concurrently. 97*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_up_ref(DSA *dsa); 98*8fb009dcSAndroid Build Coastguard Worker 99*8fb009dcSAndroid Build Coastguard Worker 100*8fb009dcSAndroid Build Coastguard Worker // Properties. 101*8fb009dcSAndroid Build Coastguard Worker 102*8fb009dcSAndroid Build Coastguard Worker // DSA_bits returns the size of |dsa|'s group modulus, in bits. 103*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT unsigned DSA_bits(const DSA *dsa); 104*8fb009dcSAndroid Build Coastguard Worker 105*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_pub_key returns |dsa|'s public key. 106*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DSA_get0_pub_key(const DSA *dsa); 107*8fb009dcSAndroid Build Coastguard Worker 108*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_priv_key returns |dsa|'s private key, or NULL if |dsa| is a public 109*8fb009dcSAndroid Build Coastguard Worker // key. 110*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DSA_get0_priv_key(const DSA *dsa); 111*8fb009dcSAndroid Build Coastguard Worker 112*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_p returns |dsa|'s group modulus. 113*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DSA_get0_p(const DSA *dsa); 114*8fb009dcSAndroid Build Coastguard Worker 115*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_q returns the size of |dsa|'s subgroup. 116*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DSA_get0_q(const DSA *dsa); 117*8fb009dcSAndroid Build Coastguard Worker 118*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_g returns |dsa|'s group generator. 119*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DSA_get0_g(const DSA *dsa); 120*8fb009dcSAndroid Build Coastguard Worker 121*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_key sets |*out_pub_key| and |*out_priv_key|, if non-NULL, to |dsa|'s 122*8fb009dcSAndroid Build Coastguard Worker // public and private key, respectively. If |dsa| is a public key, the private 123*8fb009dcSAndroid Build Coastguard Worker // key will be set to NULL. 124*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DSA_get0_key(const DSA *dsa, const BIGNUM **out_pub_key, 125*8fb009dcSAndroid Build Coastguard Worker const BIGNUM **out_priv_key); 126*8fb009dcSAndroid Build Coastguard Worker 127*8fb009dcSAndroid Build Coastguard Worker // DSA_get0_pqg sets |*out_p|, |*out_q|, and |*out_g|, if non-NULL, to |dsa|'s 128*8fb009dcSAndroid Build Coastguard Worker // p, q, and g parameters, respectively. 129*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DSA_get0_pqg(const DSA *dsa, const BIGNUM **out_p, 130*8fb009dcSAndroid Build Coastguard Worker const BIGNUM **out_q, const BIGNUM **out_g); 131*8fb009dcSAndroid Build Coastguard Worker 132*8fb009dcSAndroid Build Coastguard Worker // DSA_set0_key sets |dsa|'s public and private key to |pub_key| and |priv_key|, 133*8fb009dcSAndroid Build Coastguard Worker // respectively, if non-NULL. On success, it takes ownership of each argument 134*8fb009dcSAndroid Build Coastguard Worker // and returns one. Otherwise, it returns zero. 135*8fb009dcSAndroid Build Coastguard Worker // 136*8fb009dcSAndroid Build Coastguard Worker // |priv_key| may be NULL, but |pub_key| must either be non-NULL or already 137*8fb009dcSAndroid Build Coastguard Worker // configured on |dsa|. 138*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_set0_key(DSA *dsa, BIGNUM *pub_key, BIGNUM *priv_key); 139*8fb009dcSAndroid Build Coastguard Worker 140*8fb009dcSAndroid Build Coastguard Worker // DSA_set0_pqg sets |dsa|'s parameters to |p|, |q|, and |g|, if non-NULL, and 141*8fb009dcSAndroid Build Coastguard Worker // takes ownership of them. On success, it takes ownership of each argument and 142*8fb009dcSAndroid Build Coastguard Worker // returns one. Otherwise, it returns zero. 143*8fb009dcSAndroid Build Coastguard Worker // 144*8fb009dcSAndroid Build Coastguard Worker // Each argument must either be non-NULL or already configured on |dsa|. 145*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_set0_pqg(DSA *dsa, BIGNUM *p, BIGNUM *q, BIGNUM *g); 146*8fb009dcSAndroid Build Coastguard Worker 147*8fb009dcSAndroid Build Coastguard Worker 148*8fb009dcSAndroid Build Coastguard Worker // Parameter generation. 149*8fb009dcSAndroid Build Coastguard Worker 150*8fb009dcSAndroid Build Coastguard Worker // DSA_generate_parameters_ex generates a set of DSA parameters by following 151*8fb009dcSAndroid Build Coastguard Worker // the procedure given in FIPS 186-4, appendix A. 152*8fb009dcSAndroid Build Coastguard Worker // (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) 153*8fb009dcSAndroid Build Coastguard Worker // 154*8fb009dcSAndroid Build Coastguard Worker // The larger prime will have a length of |bits| (e.g. 2048). The |seed| value 155*8fb009dcSAndroid Build Coastguard Worker // allows others to generate and verify the same parameters and should be 156*8fb009dcSAndroid Build Coastguard Worker // random input which is kept for reference. If |out_counter| or |out_h| are 157*8fb009dcSAndroid Build Coastguard Worker // not NULL then the counter and h value used in the generation are written to 158*8fb009dcSAndroid Build Coastguard Worker // them. 159*8fb009dcSAndroid Build Coastguard Worker // 160*8fb009dcSAndroid Build Coastguard Worker // The |cb| argument is passed to |BN_generate_prime_ex| and is thus called 161*8fb009dcSAndroid Build Coastguard Worker // during the generation process in order to indicate progress. See the 162*8fb009dcSAndroid Build Coastguard Worker // comments for that function for details. In addition to the calls made by 163*8fb009dcSAndroid Build Coastguard Worker // |BN_generate_prime_ex|, |DSA_generate_parameters_ex| will call it with 164*8fb009dcSAndroid Build Coastguard Worker // |event| equal to 2 and 3 at different stages of the process. 165*8fb009dcSAndroid Build Coastguard Worker // 166*8fb009dcSAndroid Build Coastguard Worker // It returns one on success and zero otherwise. 167*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, 168*8fb009dcSAndroid Build Coastguard Worker const uint8_t *seed, 169*8fb009dcSAndroid Build Coastguard Worker size_t seed_len, int *out_counter, 170*8fb009dcSAndroid Build Coastguard Worker unsigned long *out_h, 171*8fb009dcSAndroid Build Coastguard Worker BN_GENCB *cb); 172*8fb009dcSAndroid Build Coastguard Worker 173*8fb009dcSAndroid Build Coastguard Worker // DSAparams_dup returns a freshly allocated |DSA| that contains a copy of the 174*8fb009dcSAndroid Build Coastguard Worker // parameters from |dsa|. It returns NULL on error. 175*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *DSAparams_dup(const DSA *dsa); 176*8fb009dcSAndroid Build Coastguard Worker 177*8fb009dcSAndroid Build Coastguard Worker 178*8fb009dcSAndroid Build Coastguard Worker // Key generation. 179*8fb009dcSAndroid Build Coastguard Worker 180*8fb009dcSAndroid Build Coastguard Worker // DSA_generate_key generates a public/private key pair in |dsa|, which must 181*8fb009dcSAndroid Build Coastguard Worker // already have parameters setup. It returns one on success and zero on 182*8fb009dcSAndroid Build Coastguard Worker // error. 183*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_generate_key(DSA *dsa); 184*8fb009dcSAndroid Build Coastguard Worker 185*8fb009dcSAndroid Build Coastguard Worker 186*8fb009dcSAndroid Build Coastguard Worker // Signatures. 187*8fb009dcSAndroid Build Coastguard Worker 188*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_st (aka |DSA_SIG|) contains a DSA signature as a pair of integers. 189*8fb009dcSAndroid Build Coastguard Worker struct DSA_SIG_st { 190*8fb009dcSAndroid Build Coastguard Worker BIGNUM *r, *s; 191*8fb009dcSAndroid Build Coastguard Worker }; 192*8fb009dcSAndroid Build Coastguard Worker 193*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_new returns a freshly allocated, DIG_SIG structure or NULL on error. 194*8fb009dcSAndroid Build Coastguard Worker // Both |r| and |s| in the signature will be NULL. 195*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA_SIG *DSA_SIG_new(void); 196*8fb009dcSAndroid Build Coastguard Worker 197*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_free frees the contents of |sig| and then frees |sig| itself. 198*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DSA_SIG_free(DSA_SIG *sig); 199*8fb009dcSAndroid Build Coastguard Worker 200*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_get0 sets |*out_r| and |*out_s|, if non-NULL, to the two components 201*8fb009dcSAndroid Build Coastguard Worker // of |sig|. 202*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **out_r, 203*8fb009dcSAndroid Build Coastguard Worker const BIGNUM **out_s); 204*8fb009dcSAndroid Build Coastguard Worker 205*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_set0 sets |sig|'s components to |r| and |s|, neither of which may be 206*8fb009dcSAndroid Build Coastguard Worker // NULL. On success, it takes ownership of each argument and returns one. 207*8fb009dcSAndroid Build Coastguard Worker // Otherwise, it returns zero. 208*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s); 209*8fb009dcSAndroid Build Coastguard Worker 210*8fb009dcSAndroid Build Coastguard Worker // DSA_do_sign returns a signature of the hash in |digest| by the key in |dsa| 211*8fb009dcSAndroid Build Coastguard Worker // and returns an allocated, DSA_SIG structure, or NULL on error. 212*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, 213*8fb009dcSAndroid Build Coastguard Worker const DSA *dsa); 214*8fb009dcSAndroid Build Coastguard Worker 215*8fb009dcSAndroid Build Coastguard Worker // DSA_do_verify verifies that |sig| is a valid signature, by the public key in 216*8fb009dcSAndroid Build Coastguard Worker // |dsa|, of the hash in |digest|. It returns one if so, zero if invalid and -1 217*8fb009dcSAndroid Build Coastguard Worker // on error. 218*8fb009dcSAndroid Build Coastguard Worker // 219*8fb009dcSAndroid Build Coastguard Worker // WARNING: do not use. This function returns -1 for error, 0 for invalid and 1 220*8fb009dcSAndroid Build Coastguard Worker // for valid. However, this is dangerously different to the usual OpenSSL 221*8fb009dcSAndroid Build Coastguard Worker // convention and could be a disaster if a user did |if (DSA_do_verify(...))|. 222*8fb009dcSAndroid Build Coastguard Worker // Because of this, |DSA_check_signature| is a safer version of this. 223*8fb009dcSAndroid Build Coastguard Worker // 224*8fb009dcSAndroid Build Coastguard Worker // TODO(fork): deprecate. 225*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_do_verify(const uint8_t *digest, size_t digest_len, 226*8fb009dcSAndroid Build Coastguard Worker const DSA_SIG *sig, const DSA *dsa); 227*8fb009dcSAndroid Build Coastguard Worker 228*8fb009dcSAndroid Build Coastguard Worker // DSA_do_check_signature sets |*out_valid| to zero. Then it verifies that |sig| 229*8fb009dcSAndroid Build Coastguard Worker // is a valid signature, by the public key in |dsa| of the hash in |digest| 230*8fb009dcSAndroid Build Coastguard Worker // and, if so, it sets |*out_valid| to one. 231*8fb009dcSAndroid Build Coastguard Worker // 232*8fb009dcSAndroid Build Coastguard Worker // It returns one if it was able to verify the signature as valid or invalid, 233*8fb009dcSAndroid Build Coastguard Worker // and zero on error. 234*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_do_check_signature(int *out_valid, const uint8_t *digest, 235*8fb009dcSAndroid Build Coastguard Worker size_t digest_len, const DSA_SIG *sig, 236*8fb009dcSAndroid Build Coastguard Worker const DSA *dsa); 237*8fb009dcSAndroid Build Coastguard Worker 238*8fb009dcSAndroid Build Coastguard Worker 239*8fb009dcSAndroid Build Coastguard Worker // ASN.1 signatures. 240*8fb009dcSAndroid Build Coastguard Worker // 241*8fb009dcSAndroid Build Coastguard Worker // These functions also perform DSA signature operations, but deal with ASN.1 242*8fb009dcSAndroid Build Coastguard Worker // encoded signatures as opposed to raw |BIGNUM|s. If you don't know what 243*8fb009dcSAndroid Build Coastguard Worker // encoding a DSA signature is in, it's probably ASN.1. 244*8fb009dcSAndroid Build Coastguard Worker 245*8fb009dcSAndroid Build Coastguard Worker // DSA_sign signs |digest| with the key in |dsa| and writes the resulting 246*8fb009dcSAndroid Build Coastguard Worker // signature, in ASN.1 form, to |out_sig| and the length of the signature to 247*8fb009dcSAndroid Build Coastguard Worker // |*out_siglen|. There must be, at least, |DSA_size(dsa)| bytes of space in 248*8fb009dcSAndroid Build Coastguard Worker // |out_sig|. It returns one on success and zero otherwise. 249*8fb009dcSAndroid Build Coastguard Worker // 250*8fb009dcSAndroid Build Coastguard Worker // (The |type| argument is ignored.) 251*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_sign(int type, const uint8_t *digest, size_t digest_len, 252*8fb009dcSAndroid Build Coastguard Worker uint8_t *out_sig, unsigned int *out_siglen, 253*8fb009dcSAndroid Build Coastguard Worker const DSA *dsa); 254*8fb009dcSAndroid Build Coastguard Worker 255*8fb009dcSAndroid Build Coastguard Worker // DSA_verify verifies that |sig| is a valid, ASN.1 signature, by the public 256*8fb009dcSAndroid Build Coastguard Worker // key in |dsa|, of the hash in |digest|. It returns one if so, zero if invalid 257*8fb009dcSAndroid Build Coastguard Worker // and -1 on error. 258*8fb009dcSAndroid Build Coastguard Worker // 259*8fb009dcSAndroid Build Coastguard Worker // (The |type| argument is ignored.) 260*8fb009dcSAndroid Build Coastguard Worker // 261*8fb009dcSAndroid Build Coastguard Worker // WARNING: do not use. This function returns -1 for error, 0 for invalid and 1 262*8fb009dcSAndroid Build Coastguard Worker // for valid. However, this is dangerously different to the usual OpenSSL 263*8fb009dcSAndroid Build Coastguard Worker // convention and could be a disaster if a user did |if (DSA_do_verify(...))|. 264*8fb009dcSAndroid Build Coastguard Worker // Because of this, |DSA_check_signature| is a safer version of this. 265*8fb009dcSAndroid Build Coastguard Worker // 266*8fb009dcSAndroid Build Coastguard Worker // TODO(fork): deprecate. 267*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_verify(int type, const uint8_t *digest, 268*8fb009dcSAndroid Build Coastguard Worker size_t digest_len, const uint8_t *sig, 269*8fb009dcSAndroid Build Coastguard Worker size_t sig_len, const DSA *dsa); 270*8fb009dcSAndroid Build Coastguard Worker 271*8fb009dcSAndroid Build Coastguard Worker // DSA_check_signature sets |*out_valid| to zero. Then it verifies that |sig| 272*8fb009dcSAndroid Build Coastguard Worker // is a valid, ASN.1 signature, by the public key in |dsa|, of the hash in 273*8fb009dcSAndroid Build Coastguard Worker // |digest|. If so, it sets |*out_valid| to one. 274*8fb009dcSAndroid Build Coastguard Worker // 275*8fb009dcSAndroid Build Coastguard Worker // It returns one if it was able to verify the signature as valid or invalid, 276*8fb009dcSAndroid Build Coastguard Worker // and zero on error. 277*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_check_signature(int *out_valid, const uint8_t *digest, 278*8fb009dcSAndroid Build Coastguard Worker size_t digest_len, const uint8_t *sig, 279*8fb009dcSAndroid Build Coastguard Worker size_t sig_len, const DSA *dsa); 280*8fb009dcSAndroid Build Coastguard Worker 281*8fb009dcSAndroid Build Coastguard Worker // DSA_size returns the size, in bytes, of an ASN.1 encoded, DSA signature 282*8fb009dcSAndroid Build Coastguard Worker // generated by |dsa|. Parameters must already have been setup in |dsa|. 283*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_size(const DSA *dsa); 284*8fb009dcSAndroid Build Coastguard Worker 285*8fb009dcSAndroid Build Coastguard Worker 286*8fb009dcSAndroid Build Coastguard Worker // ASN.1 encoding. 287*8fb009dcSAndroid Build Coastguard Worker 288*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_parse parses a DER-encoded DSA-Sig-Value structure from |cbs| and 289*8fb009dcSAndroid Build Coastguard Worker // advances |cbs|. It returns a newly-allocated |DSA_SIG| or NULL on error. 290*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA_SIG *DSA_SIG_parse(CBS *cbs); 291*8fb009dcSAndroid Build Coastguard Worker 292*8fb009dcSAndroid Build Coastguard Worker // DSA_SIG_marshal marshals |sig| as a DER-encoded DSA-Sig-Value and appends the 293*8fb009dcSAndroid Build Coastguard Worker // result to |cbb|. It returns one on success and zero on error. 294*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_SIG_marshal(CBB *cbb, const DSA_SIG *sig); 295*8fb009dcSAndroid Build Coastguard Worker 296*8fb009dcSAndroid Build Coastguard Worker // DSA_parse_public_key parses a DER-encoded DSA public key from |cbs| and 297*8fb009dcSAndroid Build Coastguard Worker // advances |cbs|. It returns a newly-allocated |DSA| or NULL on error. 298*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *DSA_parse_public_key(CBS *cbs); 299*8fb009dcSAndroid Build Coastguard Worker 300*8fb009dcSAndroid Build Coastguard Worker // DSA_marshal_public_key marshals |dsa| as a DER-encoded DSA public key and 301*8fb009dcSAndroid Build Coastguard Worker // appends the result to |cbb|. It returns one on success and zero on 302*8fb009dcSAndroid Build Coastguard Worker // failure. 303*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_marshal_public_key(CBB *cbb, const DSA *dsa); 304*8fb009dcSAndroid Build Coastguard Worker 305*8fb009dcSAndroid Build Coastguard Worker // DSA_parse_private_key parses a DER-encoded DSA private key from |cbs| and 306*8fb009dcSAndroid Build Coastguard Worker // advances |cbs|. It returns a newly-allocated |DSA| or NULL on error. 307*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *DSA_parse_private_key(CBS *cbs); 308*8fb009dcSAndroid Build Coastguard Worker 309*8fb009dcSAndroid Build Coastguard Worker // DSA_marshal_private_key marshals |dsa| as a DER-encoded DSA private key and 310*8fb009dcSAndroid Build Coastguard Worker // appends the result to |cbb|. It returns one on success and zero on 311*8fb009dcSAndroid Build Coastguard Worker // failure. 312*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_marshal_private_key(CBB *cbb, const DSA *dsa); 313*8fb009dcSAndroid Build Coastguard Worker 314*8fb009dcSAndroid Build Coastguard Worker // DSA_parse_parameters parses a DER-encoded Dss-Parms structure (RFC 3279) 315*8fb009dcSAndroid Build Coastguard Worker // from |cbs| and advances |cbs|. It returns a newly-allocated |DSA| or NULL on 316*8fb009dcSAndroid Build Coastguard Worker // error. 317*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *DSA_parse_parameters(CBS *cbs); 318*8fb009dcSAndroid Build Coastguard Worker 319*8fb009dcSAndroid Build Coastguard Worker // DSA_marshal_parameters marshals |dsa| as a DER-encoded Dss-Parms structure 320*8fb009dcSAndroid Build Coastguard Worker // (RFC 3279) and appends the result to |cbb|. It returns one on success and 321*8fb009dcSAndroid Build Coastguard Worker // zero on failure. 322*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_marshal_parameters(CBB *cbb, const DSA *dsa); 323*8fb009dcSAndroid Build Coastguard Worker 324*8fb009dcSAndroid Build Coastguard Worker 325*8fb009dcSAndroid Build Coastguard Worker // Conversion. 326*8fb009dcSAndroid Build Coastguard Worker 327*8fb009dcSAndroid Build Coastguard Worker // DSA_dup_DH returns a |DH| constructed from the parameters of |dsa|. This is 328*8fb009dcSAndroid Build Coastguard Worker // sometimes needed when Diffie-Hellman parameters are stored in the form of 329*8fb009dcSAndroid Build Coastguard Worker // DSA parameters. It returns an allocated |DH| on success or NULL on error. 330*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *DSA_dup_DH(const DSA *dsa); 331*8fb009dcSAndroid Build Coastguard Worker 332*8fb009dcSAndroid Build Coastguard Worker 333*8fb009dcSAndroid Build Coastguard Worker // ex_data functions. 334*8fb009dcSAndroid Build Coastguard Worker // 335*8fb009dcSAndroid Build Coastguard Worker // See |ex_data.h| for details. 336*8fb009dcSAndroid Build Coastguard Worker 337*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_get_ex_new_index(long argl, void *argp, 338*8fb009dcSAndroid Build Coastguard Worker CRYPTO_EX_unused *unused, 339*8fb009dcSAndroid Build Coastguard Worker CRYPTO_EX_dup *dup_unused, 340*8fb009dcSAndroid Build Coastguard Worker CRYPTO_EX_free *free_func); 341*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DSA_set_ex_data(DSA *dsa, int idx, void *arg); 342*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void *DSA_get_ex_data(const DSA *dsa, int idx); 343*8fb009dcSAndroid Build Coastguard Worker 344*8fb009dcSAndroid Build Coastguard Worker 345*8fb009dcSAndroid Build Coastguard Worker // Deprecated functions. 346*8fb009dcSAndroid Build Coastguard Worker 347*8fb009dcSAndroid Build Coastguard Worker // d2i_DSA_SIG parses a DER-encoded DSA-Sig-Value structure from |len| bytes at 348*8fb009dcSAndroid Build Coastguard Worker // |*inp|, as described in |d2i_SAMPLE|. 349*8fb009dcSAndroid Build Coastguard Worker // 350*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_SIG_parse| instead. 351*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA_SIG *d2i_DSA_SIG(DSA_SIG **out_sig, const uint8_t **inp, 352*8fb009dcSAndroid Build Coastguard Worker long len); 353*8fb009dcSAndroid Build Coastguard Worker 354*8fb009dcSAndroid Build Coastguard Worker // i2d_DSA_SIG marshals |in| to a DER-encoded DSA-Sig-Value structure, as 355*8fb009dcSAndroid Build Coastguard Worker // described in |i2d_SAMPLE|. 356*8fb009dcSAndroid Build Coastguard Worker // 357*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_SIG_marshal| instead. 358*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int i2d_DSA_SIG(const DSA_SIG *in, uint8_t **outp); 359*8fb009dcSAndroid Build Coastguard Worker 360*8fb009dcSAndroid Build Coastguard Worker // d2i_DSAPublicKey parses a DER-encoded DSA public key from |len| bytes at 361*8fb009dcSAndroid Build Coastguard Worker // |*inp|, as described in |d2i_SAMPLE|. 362*8fb009dcSAndroid Build Coastguard Worker // 363*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_parse_public_key| instead. 364*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *d2i_DSAPublicKey(DSA **out, const uint8_t **inp, long len); 365*8fb009dcSAndroid Build Coastguard Worker 366*8fb009dcSAndroid Build Coastguard Worker // i2d_DSAPublicKey marshals |in| as a DER-encoded DSA public key, as described 367*8fb009dcSAndroid Build Coastguard Worker // in |i2d_SAMPLE|. 368*8fb009dcSAndroid Build Coastguard Worker // 369*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_marshal_public_key| instead. 370*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int i2d_DSAPublicKey(const DSA *in, uint8_t **outp); 371*8fb009dcSAndroid Build Coastguard Worker 372*8fb009dcSAndroid Build Coastguard Worker // d2i_DSAPrivateKey parses a DER-encoded DSA private key from |len| bytes at 373*8fb009dcSAndroid Build Coastguard Worker // |*inp|, as described in |d2i_SAMPLE|. 374*8fb009dcSAndroid Build Coastguard Worker // 375*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_parse_private_key| instead. 376*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *d2i_DSAPrivateKey(DSA **out, const uint8_t **inp, long len); 377*8fb009dcSAndroid Build Coastguard Worker 378*8fb009dcSAndroid Build Coastguard Worker // i2d_DSAPrivateKey marshals |in| as a DER-encoded DSA private key, as 379*8fb009dcSAndroid Build Coastguard Worker // described in |i2d_SAMPLE|. 380*8fb009dcSAndroid Build Coastguard Worker // 381*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_marshal_private_key| instead. 382*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int i2d_DSAPrivateKey(const DSA *in, uint8_t **outp); 383*8fb009dcSAndroid Build Coastguard Worker 384*8fb009dcSAndroid Build Coastguard Worker // d2i_DSAparams parses a DER-encoded Dss-Parms structure (RFC 3279) from |len| 385*8fb009dcSAndroid Build Coastguard Worker // bytes at |*inp|, as described in |d2i_SAMPLE|. 386*8fb009dcSAndroid Build Coastguard Worker // 387*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_parse_parameters| instead. 388*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *d2i_DSAparams(DSA **out, const uint8_t **inp, long len); 389*8fb009dcSAndroid Build Coastguard Worker 390*8fb009dcSAndroid Build Coastguard Worker // i2d_DSAparams marshals |in|'s parameters as a DER-encoded Dss-Parms structure 391*8fb009dcSAndroid Build Coastguard Worker // (RFC 3279), as described in |i2d_SAMPLE|. 392*8fb009dcSAndroid Build Coastguard Worker // 393*8fb009dcSAndroid Build Coastguard Worker // Use |DSA_marshal_parameters| instead. 394*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int i2d_DSAparams(const DSA *in, uint8_t **outp); 395*8fb009dcSAndroid Build Coastguard Worker 396*8fb009dcSAndroid Build Coastguard Worker // DSA_generate_parameters is a deprecated version of 397*8fb009dcSAndroid Build Coastguard Worker // |DSA_generate_parameters_ex| that creates and returns a |DSA*|. Don't use 398*8fb009dcSAndroid Build Coastguard Worker // it. 399*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DSA *DSA_generate_parameters(int bits, unsigned char *seed, 400*8fb009dcSAndroid Build Coastguard Worker int seed_len, int *counter_ret, 401*8fb009dcSAndroid Build Coastguard Worker unsigned long *h_ret, 402*8fb009dcSAndroid Build Coastguard Worker void (*callback)(int, int, void *), 403*8fb009dcSAndroid Build Coastguard Worker void *cb_arg); 404*8fb009dcSAndroid Build Coastguard Worker 405*8fb009dcSAndroid Build Coastguard Worker 406*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 407*8fb009dcSAndroid Build Coastguard Worker } // extern C 408*8fb009dcSAndroid Build Coastguard Worker 409*8fb009dcSAndroid Build Coastguard Worker extern "C++" { 410*8fb009dcSAndroid Build Coastguard Worker 411*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_BEGIN 412*8fb009dcSAndroid Build Coastguard Worker 413*8fb009dcSAndroid Build Coastguard Worker BORINGSSL_MAKE_DELETER(DSA, DSA_free) 414*8fb009dcSAndroid Build Coastguard Worker BORINGSSL_MAKE_UP_REF(DSA, DSA_up_ref) 415*8fb009dcSAndroid Build Coastguard Worker BORINGSSL_MAKE_DELETER(DSA_SIG, DSA_SIG_free) 416*8fb009dcSAndroid Build Coastguard Worker 417*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_END 418*8fb009dcSAndroid Build Coastguard Worker 419*8fb009dcSAndroid Build Coastguard Worker } // extern C++ 420*8fb009dcSAndroid Build Coastguard Worker 421*8fb009dcSAndroid Build Coastguard Worker #endif 422*8fb009dcSAndroid Build Coastguard Worker 423*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_BAD_Q_VALUE 100 424*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_MISSING_PARAMETERS 101 425*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_MODULUS_TOO_LARGE 102 426*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_NEED_NEW_SETUP_VALUES 103 427*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_BAD_VERSION 104 428*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_DECODE_ERROR 105 429*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_ENCODE_ERROR 106 430*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_INVALID_PARAMETERS 107 431*8fb009dcSAndroid Build Coastguard Worker #define DSA_R_TOO_MANY_ITERATIONS 108 432*8fb009dcSAndroid Build Coastguard Worker 433*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_HEADER_DSA_H 434