OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
crypto
dsa
dsa_pmeth.c
Go to the documentation of this file.
1
/* Written by Dr Stephen N Henson (
[email protected]
) for the OpenSSL
2
* project 2006.
3
*/
4
/* ====================================================================
5
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
*
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
*
14
* 2. Redistributions in binary form must reproduce the above copyright
15
* notice, this list of conditions and the following disclaimer in
16
* the documentation and/or other materials provided with the
17
* distribution.
18
*
19
* 3. All advertising materials mentioning features or use of this
20
* software must display the following acknowledgment:
21
* "This product includes software developed by the OpenSSL Project
22
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23
*
24
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25
* endorse or promote products derived from this software without
26
* prior written permission. For written permission, please contact
27
*
[email protected]
.
28
*
29
* 5. Products derived from this software may not be called "OpenSSL"
30
* nor may "OpenSSL" appear in their names without prior written
31
* permission of the OpenSSL Project.
32
*
33
* 6. Redistributions of any form whatsoever must retain the following
34
* acknowledgment:
35
* "This product includes software developed by the OpenSSL Project
36
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37
*
38
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
42
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49
* OF THE POSSIBILITY OF SUCH DAMAGE.
50
* ====================================================================
51
*
52
* This product includes cryptographic software written by Eric Young
53
* (
[email protected]
). This product includes software written by Tim
54
* Hudson (
[email protected]
).
55
*
56
*/
57
58
#include <stdio.h>
59
#include "
cryptlib.h
"
60
#include <
openssl/asn1t.h
>
61
#include <
openssl/x509.h
>
62
#include <
openssl/evp.h
>
63
#include <
openssl/bn.h
>
64
#include "
evp_locl.h
"
65
#include "
dsa_locl.h
"
66
67
/* DSA pkey context structure */
68
69
typedef
struct
70
{
71
/* Parameter gen parameters */
72
int
nbits
;
/* size of p in bits (default: 1024) */
73
int
qbits
;
/* size of q in bits (default: 160) */
74
const
EVP_MD
*
pmd
;
/* MD for parameter generation */
75
/* Keygen callback info */
76
int
gentmp[2];
77
/* message digest */
78
const
EVP_MD
*
md
;
/* MD for the signature */
79
}
DSA_PKEY_CTX
;
80
81
static
int
pkey_dsa_init(
EVP_PKEY_CTX
*ctx)
82
{
83
DSA_PKEY_CTX
*dctx;
84
dctx =
OPENSSL_malloc
(
sizeof
(
DSA_PKEY_CTX
));
85
if
(!dctx)
86
return
0;
87
dctx->
nbits
= 1024;
88
dctx->
qbits
= 160;
89
dctx->
pmd
= NULL;
90
dctx->
md
= NULL;
91
92
ctx->
data
= dctx;
93
ctx->
keygen_info
= dctx->
gentmp
;
94
ctx->
keygen_info_count
= 2;
95
96
return
1;
97
}
98
99
static
int
pkey_dsa_copy(
EVP_PKEY_CTX
*dst,
EVP_PKEY_CTX
*src)
100
{
101
DSA_PKEY_CTX
*dctx, *sctx;
102
if
(!pkey_dsa_init(dst))
103
return
0;
104
sctx = src->
data
;
105
dctx = dst->
data
;
106
dctx->
nbits
= sctx->
nbits
;
107
dctx->
qbits
= sctx->
qbits
;
108
dctx->
pmd
= sctx->
pmd
;
109
dctx->
md
= sctx->
md
;
110
return
1;
111
}
112
113
static
void
pkey_dsa_cleanup(
EVP_PKEY_CTX
*ctx)
114
{
115
DSA_PKEY_CTX
*dctx = ctx->
data
;
116
if
(dctx)
117
OPENSSL_free
(dctx);
118
}
119
120
static
int
pkey_dsa_sign(
EVP_PKEY_CTX
*ctx,
unsigned
char
*sig,
size_t
*siglen,
121
const
unsigned
char
*tbs,
size_t
tbslen)
122
{
123
int
ret,
type
;
124
unsigned
int
sltmp;
125
DSA_PKEY_CTX
*dctx = ctx->
data
;
126
DSA
*dsa = ctx->
pkey
->
pkey
.
dsa
;
127
128
if
(dctx->
md
)
129
type =
EVP_MD_type
(dctx->
md
);
130
else
131
type =
NID_sha1
;
132
133
ret =
DSA_sign
(type, tbs, tbslen, sig, &sltmp, dsa);
134
135
if
(ret <= 0)
136
return
ret;
137
*siglen = sltmp;
138
return
1;
139
}
140
141
static
int
pkey_dsa_verify(
EVP_PKEY_CTX
*ctx,
142
const
unsigned
char
*sig,
size_t
siglen,
143
const
unsigned
char
*tbs,
size_t
tbslen)
144
{
145
int
ret,
type
;
146
DSA_PKEY_CTX
*dctx = ctx->
data
;
147
DSA
*dsa = ctx->
pkey
->
pkey
.
dsa
;
148
149
if
(dctx->
md
)
150
type =
EVP_MD_type
(dctx->
md
);
151
else
152
type =
NID_sha1
;
153
154
ret =
DSA_verify
(type, tbs, tbslen, sig, siglen, dsa);
155
156
return
ret;
157
}
158
159
static
int
pkey_dsa_ctrl(
EVP_PKEY_CTX
*ctx,
int
type,
int
p1,
void
*p2)
160
{
161
DSA_PKEY_CTX
*dctx = ctx->
data
;
162
switch
(type)
163
{
164
case
EVP_PKEY_CTRL_DSA_PARAMGEN_BITS
:
165
if
(p1 < 256)
166
return
-2;
167
dctx->
nbits
= p1;
168
return
1;
169
170
case
EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS
:
171
if
(p1 != 160 && p1 != 224 && p1 && p1 != 256)
172
return
-2;
173
dctx->
qbits
= p1;
174
return
1;
175
176
case
EVP_PKEY_CTRL_DSA_PARAMGEN_MD
:
177
if
(
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha1
&&
178
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha224
&&
179
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha256
)
180
{
181
DSAerr
(
DSA_F_PKEY_DSA_CTRL
,
DSA_R_INVALID_DIGEST_TYPE
);
182
return
0;
183
}
184
dctx->
md
= p2;
185
return
1;
186
187
case
EVP_PKEY_CTRL_MD
:
188
if
(
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha1
&&
189
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_dsa
&&
190
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_dsaWithSHA
&&
191
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha224
&&
192
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha256
&&
193
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha384
&&
194
EVP_MD_type
((
const
EVP_MD
*)p2) !=
NID_sha512
)
195
{
196
DSAerr
(
DSA_F_PKEY_DSA_CTRL
,
DSA_R_INVALID_DIGEST_TYPE
);
197
return
0;
198
}
199
dctx->
md
= p2;
200
return
1;
201
202
case
EVP_PKEY_CTRL_DIGESTINIT
:
203
case
EVP_PKEY_CTRL_PKCS7_SIGN
:
204
case
EVP_PKEY_CTRL_CMS_SIGN
:
205
return
1;
206
207
case
EVP_PKEY_CTRL_PEER_KEY
:
208
DSAerr
(
DSA_F_PKEY_DSA_CTRL
,
209
EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE
);
210
return
-2;
211
default
:
212
return
-2;
213
214
}
215
}
216
217
static
int
pkey_dsa_ctrl_str(
EVP_PKEY_CTX
*ctx,
218
const
char
*type,
const
char
*value)
219
{
220
if
(!strcmp(type,
"dsa_paramgen_bits"
))
221
{
222
int
nbits;
223
nbits = atoi(value);
224
return
EVP_PKEY_CTX_set_dsa_paramgen_bits
(ctx, nbits);
225
}
226
if
(!strcmp(type,
"dsa_paramgen_q_bits"
))
227
{
228
int
qbits = atoi(value);
229
return
EVP_PKEY_CTX_ctrl
(ctx,
EVP_PKEY_DSA
,
EVP_PKEY_OP_PARAMGEN
,
230
EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS
, qbits, NULL);
231
}
232
if
(!strcmp(type,
"dsa_paramgen_md"
))
233
{
234
return
EVP_PKEY_CTX_ctrl
(ctx,
EVP_PKEY_DSA
,
EVP_PKEY_OP_PARAMGEN
,
235
EVP_PKEY_CTRL_DSA_PARAMGEN_MD
, 0,
236
(
void
*)
EVP_get_digestbyname
(value));
237
}
238
return
-2;
239
}
240
241
static
int
pkey_dsa_paramgen(
EVP_PKEY_CTX
*ctx,
EVP_PKEY
*pkey)
242
{
243
DSA
*dsa = NULL;
244
DSA_PKEY_CTX
*dctx = ctx->
data
;
245
BN_GENCB
*pcb,
cb
;
246
int
ret;
247
if
(ctx->
pkey_gencb
)
248
{
249
pcb = &
cb
;
250
evp_pkey_set_cb_translate
(pcb, ctx);
251
}
252
else
253
pcb = NULL;
254
dsa =
DSA_new
();
255
if
(!dsa)
256
return
0;
257
ret =
dsa_builtin_paramgen
(dsa, dctx->
nbits
, dctx->
qbits
, dctx->
pmd
,
258
NULL, 0, NULL, NULL, NULL, pcb);
259
if
(ret)
260
EVP_PKEY_assign_DSA
(pkey, dsa);
261
else
262
DSA_free
(dsa);
263
return
ret;
264
}
265
266
static
int
pkey_dsa_keygen(
EVP_PKEY_CTX
*ctx,
EVP_PKEY
*pkey)
267
{
268
DSA
*dsa = NULL;
269
if
(ctx->
pkey
== NULL)
270
{
271
DSAerr
(
DSA_F_PKEY_DSA_KEYGEN
,
DSA_R_NO_PARAMETERS_SET
);
272
return
0;
273
}
274
dsa =
DSA_new
();
275
if
(!dsa)
276
return
0;
277
EVP_PKEY_assign_DSA
(pkey, dsa);
278
/* Note: if error return, pkey is freed by parent routine */
279
if
(!
EVP_PKEY_copy_parameters
(pkey, ctx->
pkey
))
280
return
0;
281
return
DSA_generate_key
(pkey->
pkey
.
dsa
);
282
}
283
284
const
EVP_PKEY_METHOD
dsa_pkey_meth
=
285
{
286
EVP_PKEY_DSA
,
287
EVP_PKEY_FLAG_AUTOARGLEN
,
288
pkey_dsa_init,
289
pkey_dsa_copy,
290
pkey_dsa_cleanup,
291
292
0,
293
pkey_dsa_paramgen,
294
295
0,
296
pkey_dsa_keygen,
297
298
0,
299
pkey_dsa_sign,
300
301
0,
302
pkey_dsa_verify,
303
304
0,0,
305
306
0,0,0,0,
307
308
0,0,
309
310
0,0,
311
312
0,0,
313
314
pkey_dsa_ctrl,
315
pkey_dsa_ctrl_str
316
317
318
};
Generated on Thu Jan 10 2013 09:53:35 for OpenSSL by
1.8.2