1 /* dsa.h
2  *
3  * Copyright (C) 2006-2021 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL.
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20  */
21 
22 /* dsa.h for openSSL */
23 
24 
25 #ifndef WOLFSSL_DSA_H_
26 #define WOLFSSL_DSA_H_
27 
28 #include <wolfssl/openssl/bn.h>
29 
30 #ifdef __cplusplus
31     extern "C" {
32 #endif
33 
34 typedef struct WOLFSSL_DSA_SIG {
35     WOLFSSL_BIGNUM *r;
36     WOLFSSL_BIGNUM *s;
37 } WOLFSSL_DSA_SIG;
38 
39 #ifndef WOLFSSL_DSA_TYPE_DEFINED /* guard on redeclaration */
40 typedef struct WOLFSSL_DSA            WOLFSSL_DSA;
41 #define WOLFSSL_DSA_TYPE_DEFINED
42 #endif
43 
44 typedef WOLFSSL_DSA                   DSA;
45 
46 struct WOLFSSL_DSA {
47     WOLFSSL_BIGNUM* p;
48     WOLFSSL_BIGNUM* q;
49     WOLFSSL_BIGNUM* g;
50     WOLFSSL_BIGNUM* pub_key;      /* our y */
51     WOLFSSL_BIGNUM* priv_key;     /* our x */
52     void*          internal;     /* our Dsa Key */
53     char           inSet;        /* internal set from external ? */
54     char           exSet;        /* external set from internal ? */
55 };
56 
57 
58 WOLFSSL_API WOLFSSL_DSA* wolfSSL_DSA_new(void);
59 WOLFSSL_API void wolfSSL_DSA_free(WOLFSSL_DSA*);
60 #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
61 WOLFSSL_API int wolfSSL_DSA_print_fp(XFILE, WOLFSSL_DSA*, int);
62 #endif /* !NO_FILESYSTEM && NO_STDIO_FILESYSTEM */
63 
64 WOLFSSL_API int wolfSSL_DSA_generate_key(WOLFSSL_DSA*);
65 
66 typedef void (*WOLFSSL_BN_CB)(int i, int j, void* exArg);
67 WOLFSSL_API WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits,
68                    unsigned char* seed, int seedLen, int* counterRet,
69                    unsigned long* hRet, WOLFSSL_BN_CB cb, void* CBArg);
70 WOLFSSL_API int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA*, int bits,
71                    unsigned char* seed, int seedLen, int* counterRet,
72                    unsigned long* hRet, void* cb);
73 
74 WOLFSSL_API void wolfSSL_DSA_get0_pqg(const WOLFSSL_DSA *d, const WOLFSSL_BIGNUM **p,
75         const WOLFSSL_BIGNUM **q, const WOLFSSL_BIGNUM **g);
76 WOLFSSL_API int wolfSSL_DSA_set0_pqg(WOLFSSL_DSA *d, WOLFSSL_BIGNUM *p,
77         WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g);
78 
79 WOLFSSL_API void wolfSSL_DSA_get0_key(const WOLFSSL_DSA *d,
80         const WOLFSSL_BIGNUM **pub_key, const WOLFSSL_BIGNUM **priv_key);
81 WOLFSSL_API int wolfSSL_DSA_set0_key(WOLFSSL_DSA *d, WOLFSSL_BIGNUM *pub_key,
82         WOLFSSL_BIGNUM *priv_key);
83 
84 
85 WOLFSSL_API int wolfSSL_DSA_LoadDer(WOLFSSL_DSA*, const unsigned char*, int sz);
86 
87 WOLFSSL_API int wolfSSL_DSA_LoadDer_ex(WOLFSSL_DSA*, const unsigned char*,
88                                        int sz, int opt);
89 
90 WOLFSSL_API int wolfSSL_DSA_do_sign(const unsigned char* d,
91                                     unsigned char* sigRet, WOLFSSL_DSA* dsa);
92 
93 WOLFSSL_API int wolfSSL_DSA_do_verify(const unsigned char* d,
94                                       unsigned char* sig,
95                                       WOLFSSL_DSA* dsa, int *dsacheck);
96 
97 WOLFSSL_API int wolfSSL_DSA_bits(const WOLFSSL_DSA *d);
98 
99 WOLFSSL_API WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void);
100 WOLFSSL_API void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig);
101 
102 WOLFSSL_API void wolfSSL_DSA_SIG_get0(const WOLFSSL_DSA_SIG *sig,
103         const WOLFSSL_BIGNUM **r, const WOLFSSL_BIGNUM **s);
104 WOLFSSL_API int wolfSSL_DSA_SIG_set0(WOLFSSL_DSA_SIG *sig, WOLFSSL_BIGNUM *r,
105         WOLFSSL_BIGNUM *s);
106 
107 WOLFSSL_API int wolfSSL_i2d_DSA_SIG(const WOLFSSL_DSA_SIG *sig, byte **out);
108 WOLFSSL_API WOLFSSL_DSA_SIG* wolfSSL_d2i_DSA_SIG(WOLFSSL_DSA_SIG **sig,
109         const unsigned char **pp, long length);
110 WOLFSSL_API WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest,
111                                                     int inLen, WOLFSSL_DSA* dsa);
112 WOLFSSL_API int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
113                                          WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa);
114 
115 WOLFSSL_API int wolfSSL_i2d_DSAparams(const WOLFSSL_DSA*, unsigned char**);
116 WOLFSSL_API WOLFSSL_DSA* wolfSSL_d2i_DSAparams(WOLFSSL_DSA**,
117                                                const unsigned char **, long);
118 
119 #define WOLFSSL_DSA_LOAD_PRIVATE 1
120 #define WOLFSSL_DSA_LOAD_PUBLIC  2
121 
122 #define DSA_new wolfSSL_DSA_new
123 #define DSA_free wolfSSL_DSA_free
124 #define DSA_print_fp wolfSSL_DSA_print_fp
125 
126 #define DSA_LoadDer                wolfSSL_DSA_LoadDer
127 #define DSA_generate_key           wolfSSL_DSA_generate_key
128 #define DSA_generate_parameters    wolfSSL_DSA_generate_parameters
129 #define DSA_generate_parameters_ex wolfSSL_DSA_generate_parameters_ex
130 #define DSA_get0_pqg               wolfSSL_DSA_get0_pqg
131 #define DSA_set0_pqg               wolfSSL_DSA_set0_pqg
132 #define DSA_get0_key               wolfSSL_DSA_get0_key
133 #define DSA_set0_key               wolfSSL_DSA_set0_key
134 
135 #define DSA_SIG_new                wolfSSL_DSA_SIG_new
136 #define DSA_SIG_free               wolfSSL_DSA_SIG_free
137 #define DSA_SIG_get0               wolfSSL_DSA_SIG_get0
138 #define DSA_SIG_set0               wolfSSL_DSA_SIG_set0
139 #define i2d_DSA_SIG                wolfSSL_i2d_DSA_SIG
140 #define d2i_DSA_SIG                wolfSSL_d2i_DSA_SIG
141 #define DSA_do_sign                wolfSSL_DSA_do_sign_ex
142 #define DSA_do_verify              wolfSSL_DSA_do_verify_ex
143 #define i2d_DSAparams              wolfSSL_i2d_DSAparams
144 #define d2i_DSAparams              wolfSSL_d2i_DSAparams
145 
146 #define DSA_SIG                    WOLFSSL_DSA_SIG
147 
148 #ifdef __cplusplus
149     }  /* extern "C" */
150 #endif
151 
152 #endif /* header */
153