ecdsa.h 13.6 KB
Newer Older
B
Bodo Möller 已提交
1
/* crypto/ecdsa/ecdsa.h */
2 3 4 5
/**
 * \file   crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions
 * \author Written by Nils Larsch for the OpenSSL project
 */
B
Bodo Möller 已提交
6
/* ====================================================================
N
Nils Larsch 已提交
7
 * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
B
Bodo Möller 已提交
8 9 10 11 12 13
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
B
Bodo Möller 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
#ifndef HEADER_ECDSA_H
60
# define HEADER_ECDSA_H
B
Bodo Möller 已提交
61

62
# include <openssl/opensslconf.h>
63

64
# ifdef OPENSSL_NO_EC
65
#  error EC is disabled.
66
# endif
B
Bodo Möller 已提交
67

68 69 70 71 72
# include <openssl/ec.h>
# include <openssl/ossl_typ.h>
# ifdef OPENSSL_USE_DEPRECATED
#  include <openssl/bn.h>
# endif
B
Bodo Möller 已提交
73 74 75 76 77

#ifdef __cplusplus
extern "C" {
#endif

78 79 80 81
typedef struct ECDSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;
B
Bodo Möller 已提交
82

N
Nils Larsch 已提交
83 84
/** Allocates and initialize a ECDSA_SIG structure
 *  \return pointer to a ECDSA_SIG structure or NULL if an error occurred
85
 */
B
Bodo Möller 已提交
86
ECDSA_SIG *ECDSA_SIG_new(void);
87

N
Nils Larsch 已提交
88 89
/** frees a ECDSA_SIG structure
 *  \param  sig  pointer to the ECDSA_SIG structure
90
 */
91
void ECDSA_SIG_free(ECDSA_SIG *sig);
92

N
Nils Larsch 已提交
93 94 95 96
/** DER encode content of ECDSA_SIG object (note: this function modifies *pp
 *  (*pp += length of the DER encoded signature)).
 *  \param  sig  pointer to the ECDSA_SIG object
 *  \param  pp   pointer to a unsigned char pointer for the output or NULL
97
 *  \return the length of the DER encoded ECDSA_SIG object or 0
98
 */
99
int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp);
B
Bodo Möller 已提交
100

N
Nils Larsch 已提交
101
/** Decodes a DER encoded ECDSA signature (note: this function changes *pp
102
 *  (*pp += len)).
N
Nils Larsch 已提交
103 104 105 106
 *  \param  sig  pointer to ECDSA_SIG pointer (may be NULL)
 *  \param  pp   memory buffer with the DER encoded signature
 *  \param  len  length of the buffer
 *  \return pointer to the decoded ECDSA_SIG structure (or NULL)
107
 */
108
ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len);
109

N
Nils Larsch 已提交
110 111 112 113 114 115
/** Computes the ECDSA signature of the given hash value using
 *  the supplied private key and returns the created signature.
 *  \param  dgst      pointer to the hash value
 *  \param  dgst_len  length of the hash value
 *  \param  eckey     EC_KEY object containing a private EC key
 *  \return pointer to a ECDSA_SIG structure or NULL if an error occurred
116
 */
117 118
ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len,
                         EC_KEY *eckey);
119

N
Nils Larsch 已提交
120 121 122 123 124
/** Computes ECDSA signature of a given hash value using the supplied
 *  private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
 *  \param  dgst     pointer to the hash value to sign
 *  \param  dgstlen  length of the hash value
 *  \param  kinv     BIGNUM with a pre-computed inverse k (optional)
125
 *  \param  rp       BIGNUM with a pre-computed rp value (optioanl),
N
Nils Larsch 已提交
126 127 128
 *                   see ECDSA_sign_setup
 *  \param  eckey    EC_KEY object containing a private EC key
 *  \return pointer to a ECDSA_SIG structure or NULL if an error occurred
N
Nils Larsch 已提交
129
 */
130 131 132
ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen,
                            const BIGNUM *kinv, const BIGNUM *rp,
                            EC_KEY *eckey);
N
Nils Larsch 已提交
133

N
Nils Larsch 已提交
134 135 136 137 138 139 140 141
/** Verifies that the supplied signature is a valid ECDSA
 *  signature of the supplied hash value using the supplied public key.
 *  \param  dgst      pointer to the hash value
 *  \param  dgst_len  length of the hash value
 *  \param  sig       ECDSA_SIG structure
 *  \param  eckey     EC_KEY object containing a public EC key
 *  \return 1 if the signature is valid, 0 if the signature is invalid
 *          and -1 on error
142
 */
143 144
int ECDSA_do_verify(const unsigned char *dgst, int dgst_len,
                    const ECDSA_SIG *sig, EC_KEY *eckey);
B
Bodo Möller 已提交
145 146 147

const ECDSA_METHOD *ECDSA_OpenSSL(void);

N
Nils Larsch 已提交
148 149
/** Sets the default ECDSA method
 *  \param  meth  new default ECDSA_METHOD
150
 */
151
void ECDSA_set_default_method(const ECDSA_METHOD *meth);
152

N
Nils Larsch 已提交
153 154
/** Returns the default ECDSA method
 *  \return pointer to ECDSA_METHOD structure containing the default method
155
 */
B
Bodo Möller 已提交
156
const ECDSA_METHOD *ECDSA_get_default_method(void);
B
Bodo Möller 已提交
157

N
Nils Larsch 已提交
158 159 160
/** Sets method to be used for the ECDSA operations
 *  \param  eckey  EC_KEY object
 *  \param  meth   new method
161
 *  \return 1 on success and 0 otherwise
162
 */
163
int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth);
164

N
Nils Larsch 已提交
165 166 167
/** Returns the maximum length of the DER encoded signature
 *  \param  eckey  EC_KEY object
 *  \return numbers of bytes required for the DER encoded signature
168
 */
169
int ECDSA_size(const EC_KEY *eckey);
170

N
Nils Larsch 已提交
171 172 173 174 175 176
/** Precompute parts of the signing operation
 *  \param  eckey  EC_KEY object containing a private EC key
 *  \param  ctx    BN_CTX object (optional)
 *  \param  kinv   BIGNUM pointer for the inverse of k
 *  \param  rp     BIGNUM pointer for x coordinate of k * generator
 *  \return 1 on success and 0 otherwise
177
 */
178
int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, BIGNUM **rp);
179

N
Nils Larsch 已提交
180 181 182 183 184 185 186 187 188
/** Computes ECDSA signature of a given hash value using the supplied
 *  private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
 *  \param  type     this parameter is ignored
 *  \param  dgst     pointer to the hash value to sign
 *  \param  dgstlen  length of the hash value
 *  \param  sig      memory for the DER encoded created signature
 *  \param  siglen   pointer to the length of the returned signature
 *  \param  eckey    EC_KEY object containing a private EC key
 *  \return 1 on success and 0 otherwise
189
 */
190 191
int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen,
               unsigned char *sig, unsigned int *siglen, EC_KEY *eckey);
N
Nils Larsch 已提交
192

N
Nils Larsch 已提交
193 194 195 196 197 198 199 200
/** Computes ECDSA signature of a given hash value using the supplied
 *  private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
 *  \param  type     this parameter is ignored
 *  \param  dgst     pointer to the hash value to sign
 *  \param  dgstlen  length of the hash value
 *  \param  sig      buffer to hold the DER encoded signature
 *  \param  siglen   pointer to the length of the returned signature
 *  \param  kinv     BIGNUM with a pre-computed inverse k (optional)
201
 *  \param  rp       BIGNUM with a pre-computed rp value (optioanl),
N
Nils Larsch 已提交
202 203 204
 *                   see ECDSA_sign_setup
 *  \param  eckey    EC_KEY object containing a private EC key
 *  \return 1 on success and 0 otherwise
N
Nils Larsch 已提交
205
 */
206 207 208
int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen,
                  unsigned char *sig, unsigned int *siglen,
                  const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey);
N
Nils Larsch 已提交
209

N
Nils Larsch 已提交
210 211 212
/** Verifies that the given signature is valid ECDSA signature
 *  of the supplied hash value using the specified public key.
 *  \param  type     this parameter is ignored
213
 *  \param  dgst     pointer to the hash value
N
Nils Larsch 已提交
214 215 216 217 218 219
 *  \param  dgstlen  length of the hash value
 *  \param  sig      pointer to the DER encoded signature
 *  \param  siglen   length of the DER encoded signature
 *  \param  eckey    EC_KEY object containing a public EC key
 *  \return 1 if the signature is valid, 0 if the signature is invalid
 *          and -1 on error
220
 */
221 222
int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen,
                 const unsigned char *sig, int siglen, EC_KEY *eckey);
B
Bodo Möller 已提交
223

224
/* the standard ex_data functions */
225 226 227 228 229
int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new
                           *new_func, CRYPTO_EX_dup *dup_func,
                           CRYPTO_EX_free *free_func);
int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg);
void *ECDSA_get_ex_data(EC_KEY *d, int idx);
B
Bodo Möller 已提交
230

231 232 233 234 235 236 237 238 239 240 241 242
/** Allocates and initialize a ECDSA_METHOD structure
 *  \param ecdsa_method pointer to ECDSA_METHOD to copy.  (May be NULL)
 *  \return pointer to a ECDSA_METHOD structure or NULL if an error occurred
 */

ECDSA_METHOD *ECDSA_METHOD_new(ECDSA_METHOD *ecdsa_method);

/** frees a ECDSA_METHOD structure
 *  \param  ecdsa_method  pointer to the ECDSA_METHOD structure
 */
void ECDSA_METHOD_free(ECDSA_METHOD *ecdsa_method);

243 244 245 246 247 248 249 250 251 252 253 254
/**  Sets application specific data in the ECDSA_METHOD
 *   \param  ecdsa_method pointer to existing ECDSA_METHOD
 *   \param  app application specific data to set
 */

void ECDSA_METHOD_set_app_data(ECDSA_METHOD *ecdsa_method, void *app);

/** Returns application specific data from a ECDSA_METHOD structure
 *  \param ecdsa_method pointer to ECDSA_METHOD structure
 *  \return pointer to application specific data.
 */

255
void *ECDSA_METHOD_get_app_data(ECDSA_METHOD *ecdsa_method);
256

257 258 259 260 261 262
/**  Set the ECDSA_do_sign function in the ECDSA_METHOD
 *   \param  ecdsa_method  pointer to existing ECDSA_METHOD
 *   \param  ecdsa_do_sign a funtion of type ECDSA_do_sign
 */

void ECDSA_METHOD_set_sign(ECDSA_METHOD *ecdsa_method,
263 264 265 266 267
                           ECDSA_SIG *(*ecdsa_do_sign) (const unsigned char
                                                        *dgst, int dgst_len,
                                                        const BIGNUM *inv,
                                                        const BIGNUM *rp,
                                                        EC_KEY *eckey));
268 269 270 271 272 273 274

/**  Set the  ECDSA_sign_setup function in the ECDSA_METHOD
 *   \param  ecdsa_method  pointer to existing ECDSA_METHOD
 *   \param  ecdsa_sign_setup a funtion of type ECDSA_sign_setup
 */

void ECDSA_METHOD_set_sign_setup(ECDSA_METHOD *ecdsa_method,
275 276 277 278
                                 int (*ecdsa_sign_setup) (EC_KEY *eckey,
                                                          BN_CTX *ctx,
                                                          BIGNUM **kinv,
                                                          BIGNUM **r));
279 280 281 282 283 284 285

/**  Set the ECDSA_do_verify function in the ECDSA_METHOD
 *   \param  ecdsa_method  pointer to existing ECDSA_METHOD
 *   \param  ecdsa_do_verify a funtion of type ECDSA_do_verify
 */

void ECDSA_METHOD_set_verify(ECDSA_METHOD *ecdsa_method,
286 287 288 289
                             int (*ecdsa_do_verify) (const unsigned char
                                                     *dgst, int dgst_len,
                                                     const ECDSA_SIG *sig,
                                                     EC_KEY *eckey));
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304

void ECDSA_METHOD_set_flags(ECDSA_METHOD *ecdsa_method, int flags);

/**  Set the flags field in the ECDSA_METHOD
 *   \param  ecdsa_method  pointer to existing ECDSA_METHOD
 *   \param  flags flags value to set
 */

void ECDSA_METHOD_set_name(ECDSA_METHOD *ecdsa_method, char *name);

/**  Set the name field in the ECDSA_METHOD
 *   \param  ecdsa_method  pointer to existing ECDSA_METHOD
 *   \param  name name to set
 */

B
Bodo Möller 已提交
305
/* BEGIN ERROR CODES */
306 307
/*
 * The following lines are auto generated by the script mkerr.pl. Any changes
B
Bodo Möller 已提交
308 309
 * made after this point may be overwritten when the script is next run.
 */
B
Bodo Möller 已提交
310
void ERR_load_ECDSA_strings(void);
B
Bodo Möller 已提交
311 312 313 314

/* Error codes for the ECDSA functions. */

/* Function codes. */
315 316 317 318 319
# define ECDSA_F_ECDSA_DATA_NEW_METHOD                    100
# define ECDSA_F_ECDSA_DO_SIGN                            101
# define ECDSA_F_ECDSA_DO_VERIFY                          102
# define ECDSA_F_ECDSA_METHOD_NEW                         105
# define ECDSA_F_ECDSA_SIGN_SETUP                         103
B
Bodo Möller 已提交
320 321

/* Reason codes. */
322 323 324 325 326 327 328
# define ECDSA_R_BAD_SIGNATURE                            100
# define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE              101
# define ECDSA_R_ERR_EC_LIB                               102
# define ECDSA_R_MISSING_PARAMETERS                       103
# define ECDSA_R_NEED_NEW_SETUP_VALUES                    106
# define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED          104
# define ECDSA_R_SIGNATURE_MALLOC_FAILED                  105
B
Bodo Möller 已提交
329 330 331 332 333

#ifdef  __cplusplus
}
#endif
#endif