sl@0
|
1 |
/*
|
sl@0
|
2 |
* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
|
sl@0
|
3 |
* All rights reserved.
|
sl@0
|
4 |
* This component and the accompanying materials are made available
|
sl@0
|
5 |
* under the terms of the License "Eclipse Public License v1.0"
|
sl@0
|
6 |
* which accompanies this distribution, and is available
|
sl@0
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
sl@0
|
8 |
*
|
sl@0
|
9 |
* Initial Contributors:
|
sl@0
|
10 |
* Nokia Corporation - initial contribution.
|
sl@0
|
11 |
*
|
sl@0
|
12 |
* Contributors:
|
sl@0
|
13 |
*
|
sl@0
|
14 |
* Description:
|
sl@0
|
15 |
* Generates DSA test vectors.
|
sl@0
|
16 |
*
|
sl@0
|
17 |
*/
|
sl@0
|
18 |
|
sl@0
|
19 |
|
sl@0
|
20 |
|
sl@0
|
21 |
|
sl@0
|
22 |
/**
|
sl@0
|
23 |
@file
|
sl@0
|
24 |
*/
|
sl@0
|
25 |
|
sl@0
|
26 |
#include <stdio.h>
|
sl@0
|
27 |
#include <openssl/crypto.h>
|
sl@0
|
28 |
#include <openssl/rand.h>
|
sl@0
|
29 |
#include <openssl/dsa.h>
|
sl@0
|
30 |
#include "utils.h"
|
sl@0
|
31 |
|
sl@0
|
32 |
/*
|
sl@0
|
33 |
* The DSA keys have been choosen from randomly generated ones so that either
|
sl@0
|
34 |
* the 2nd or 3rd most significant bit of q is set - this is so that a
|
sl@0
|
35 |
* particular path is followed when the signing procedure generates k, for which
|
sl@0
|
36 |
* our function that generates a random number in a certain range is equivalent
|
sl@0
|
37 |
* to the openssl one.
|
sl@0
|
38 |
*
|
sl@0
|
39 |
* This is nasty, but it means we don't have to change the openssl code.
|
sl@0
|
40 |
*/
|
sl@0
|
41 |
|
sl@0
|
42 |
static DSA* createDSAKey1()
|
sl@0
|
43 |
{
|
sl@0
|
44 |
unsigned char p_data[] =
|
sl@0
|
45 |
"\x8d\xf2\xa4\x94\x49\x22\x76\xaa\x3d\x25\x75\x9b\xb0\x68\x69\xcb"
|
sl@0
|
46 |
"\xea\xc0\xd8\x3a\xfb\x8d\x0c\xf7\xcb\xb8\x32\x4f\x0d\x78\x82\xe5"
|
sl@0
|
47 |
"\xd0\x76\x2f\xc5\xb7\x21\x0e\xaf\xc2\xe9\xad\xac\x32\xab\x7a\xac"
|
sl@0
|
48 |
"\x49\x69\x3d\xfb\xf8\x37\x24\xc2\xec\x07\x36\xee\x31\xc8\x02\x91";
|
sl@0
|
49 |
|
sl@0
|
50 |
int p_data_len = 64;
|
sl@0
|
51 |
|
sl@0
|
52 |
unsigned char q_data[] =
|
sl@0
|
53 |
"\xc7\x73\x21\x8c\x73\x7e\xc8\xee\x99\x3b\x4f\x2d\xed\x30\xf4\x8e"
|
sl@0
|
54 |
"\xda\xce\x91\x5f";
|
sl@0
|
55 |
|
sl@0
|
56 |
int q_data_len = 20;
|
sl@0
|
57 |
|
sl@0
|
58 |
unsigned char g_data[] =
|
sl@0
|
59 |
"\x62\x6d\x02\x78\x39\xea\x0a\x13\x41\x31\x63\xa5\x5b\x4c\xb5\x00"
|
sl@0
|
60 |
"\x29\x9d\x55\x22\x95\x6c\xef\xcb\x3b\xff\x10\xf3\x99\xce\x2c\x2e"
|
sl@0
|
61 |
"\x71\xcb\x9d\xe5\xfa\x24\xba\xbf\x58\xe5\xb7\x95\x21\x92\x5c\x9c"
|
sl@0
|
62 |
"\xc4\x2e\x9f\x6f\x46\x4b\x08\x8c\xc5\x72\xaf\x53\xe6\xd7\x88\x02";
|
sl@0
|
63 |
|
sl@0
|
64 |
int g_data_len = 64;
|
sl@0
|
65 |
|
sl@0
|
66 |
unsigned char priv_key_data[] =
|
sl@0
|
67 |
"\xc2\x5f\xb4\x81\xd7\x9c\x07\x30\x97\xc2\x1d\x0c\xb1\xd7\x07\x2f"
|
sl@0
|
68 |
"\x04\x1d\xbb\x89";
|
sl@0
|
69 |
|
sl@0
|
70 |
int priv_key_data_len = 20;
|
sl@0
|
71 |
|
sl@0
|
72 |
unsigned char pub_key_data[] =
|
sl@0
|
73 |
"\x2d\x52\x1e\x27\x37\xe7\xdb\xdb\xd1\xe4\x7a\xb6\x79\xc5\xae\x69"
|
sl@0
|
74 |
"\xe1\x25\x37\xe9\x96\xb1\x81\xba\xf0\xb8\x85\x0f\x84\xc8\x2b\x9e"
|
sl@0
|
75 |
"\xf5\xb8\xb6\xc2\xb2\x22\x1b\xb5\xa9\xd0\x58\x66\x32\x5a\xb1\x62"
|
sl@0
|
76 |
"\xae\xb7\x13\x68\xbd\xe4\xca\xa0\xf6\x68\x96\x3c\x7d\x1a\x43\x52";
|
sl@0
|
77 |
|
sl@0
|
78 |
int pub_key_data_len = 64;
|
sl@0
|
79 |
|
sl@0
|
80 |
DSA* key = DSA_new();
|
sl@0
|
81 |
key->p = BN_new();
|
sl@0
|
82 |
key->q = BN_new();
|
sl@0
|
83 |
key->g = BN_new();
|
sl@0
|
84 |
key->priv_key = BN_new();
|
sl@0
|
85 |
key->pub_key = BN_new();
|
sl@0
|
86 |
|
sl@0
|
87 |
BN_bin2bn(p_data, p_data_len, key->p);
|
sl@0
|
88 |
BN_bin2bn(q_data, q_data_len, key->q);
|
sl@0
|
89 |
BN_bin2bn(g_data, g_data_len, key->g);
|
sl@0
|
90 |
BN_bin2bn(pub_key_data, pub_key_data_len, key->pub_key);
|
sl@0
|
91 |
BN_bin2bn(priv_key_data, priv_key_data_len, key->priv_key);
|
sl@0
|
92 |
|
sl@0
|
93 |
return key;
|
sl@0
|
94 |
}
|
sl@0
|
95 |
|
sl@0
|
96 |
static DSA* createDSAKey2()
|
sl@0
|
97 |
{
|
sl@0
|
98 |
unsigned char p_data[] =
|
sl@0
|
99 |
"\x8d\xf2\xa4\x94\x49\x22\x76\xaa\x3d\x25\x75\x9b\xb0\x68\x69\xcb"
|
sl@0
|
100 |
"\xea\xc0\xd8\x3a\xfb\x8d\x0c\xf7\xcb\xb8\x32\x4f\x0d\x78\x82\xe5"
|
sl@0
|
101 |
"\xd0\x76\x2f\xc5\xb7\x21\x0e\xaf\xc2\xe9\xad\xac\x32\xab\x7a\xac"
|
sl@0
|
102 |
"\x49\x69\x3d\xfb\xf8\x37\x24\xc2\xec\x07\x36\xee\x31\xc8\x02\x91";
|
sl@0
|
103 |
|
sl@0
|
104 |
int p_data_len = 64;
|
sl@0
|
105 |
|
sl@0
|
106 |
unsigned char q_data[] =
|
sl@0
|
107 |
"\xc7\x73\x21\x8c\x73\x7e\xc8\xee\x99\x3b\x4f\x2d\xed\x30\xf4\x8e"
|
sl@0
|
108 |
"\xda\xce\x91\x5f";
|
sl@0
|
109 |
|
sl@0
|
110 |
int q_data_len = 20;
|
sl@0
|
111 |
|
sl@0
|
112 |
unsigned char g_data[] =
|
sl@0
|
113 |
"\x62\x6d\x02\x78\x39\xea\x0a\x13\x41\x31\x63\xa5\x5b\x4c\xb5\x00"
|
sl@0
|
114 |
"\x29\x9d\x55\x22\x95\x6c\xef\xcb\x3b\xff\x10\xf3\x99\xce\x2c\x2e"
|
sl@0
|
115 |
"\x71\xcb\x9d\xe5\xfa\x24\xba\xbf\x58\xe5\xb7\x95\x21\x92\x5c\x9c"
|
sl@0
|
116 |
"\xc4\x2e\x9f\x6f\x46\x4b\x08\x8c\xc5\x72\xaf\x53\xe6\xd7\x88\x02";
|
sl@0
|
117 |
|
sl@0
|
118 |
int g_data_len = 64;
|
sl@0
|
119 |
|
sl@0
|
120 |
unsigned char priv_key_data[] =
|
sl@0
|
121 |
"\x0f\x36\x53\xf7\x51\xa7\x04\x6e\x0b\x52\x30\xfe\x15\x7c\xa3\x3e"
|
sl@0
|
122 |
"\x03\xf0\x84\x73";
|
sl@0
|
123 |
|
sl@0
|
124 |
int priv_key_data_len = 20;
|
sl@0
|
125 |
|
sl@0
|
126 |
unsigned char pub_key_data[] =
|
sl@0
|
127 |
"\x7f\x9a\xd6\x6d\x4d\xa9\xb0\x0e\x71\x76\x04\xc4\xdb\x3b\x96\x93"
|
sl@0
|
128 |
"\x6b\x6c\xa6\x16\xa5\x6b\xb6\xe6\x23\x26\xc7\xf5\xd4\xd6\x5b\x06"
|
sl@0
|
129 |
"\x6c\x10\x47\x0a\xc2\xf2\x1d\xc1\x7b\x39\x54\x6d\x84\x99\x40\xd1"
|
sl@0
|
130 |
"\x7e\xb0\xb5\x17\xc1\x17\xcd\xa0\x78\x0c\xc1\x67\xf1\x57\x83\x2c";
|
sl@0
|
131 |
|
sl@0
|
132 |
int pub_key_data_len = 64;
|
sl@0
|
133 |
|
sl@0
|
134 |
DSA* key = DSA_new();
|
sl@0
|
135 |
key->p = BN_new();
|
sl@0
|
136 |
key->q = BN_new();
|
sl@0
|
137 |
key->g = BN_new();
|
sl@0
|
138 |
key->priv_key = BN_new();
|
sl@0
|
139 |
key->pub_key = BN_new();
|
sl@0
|
140 |
|
sl@0
|
141 |
BN_bin2bn(p_data, p_data_len, key->p);
|
sl@0
|
142 |
BN_bin2bn(q_data, q_data_len, key->q);
|
sl@0
|
143 |
BN_bin2bn(g_data, g_data_len, key->g);
|
sl@0
|
144 |
BN_bin2bn(pub_key_data, pub_key_data_len, key->pub_key);
|
sl@0
|
145 |
BN_bin2bn(priv_key_data, priv_key_data_len, key->priv_key);
|
sl@0
|
146 |
|
sl@0
|
147 |
return key;
|
sl@0
|
148 |
}
|
sl@0
|
149 |
|
sl@0
|
150 |
static DSA* createDSAKey3()
|
sl@0
|
151 |
{
|
sl@0
|
152 |
unsigned char p_data[] =
|
sl@0
|
153 |
"\xcf\x62\x62\xfb\x7e\x7d\xc9\xc3\x7b\x4b\xa3\x62\x02\x1c\xfd\xb0"
|
sl@0
|
154 |
"\xcc\xd7\xbe\x39\xba\x89\xfc\x86\xf4\x9b\x29\xee\xe8\xee\x47\x23"
|
sl@0
|
155 |
"\xa8\x36\xd5\xbc\x3f\x31\xfe\x75\xc9\xcc\xc2\xa4\x49\x1d\x44\xc2"
|
sl@0
|
156 |
"\xb2\x7a\x71\x45\xd8\xcd\x84\x41\xe5\x8a\x94\xaa\x02\x0f\xd9\x03";
|
sl@0
|
157 |
|
sl@0
|
158 |
int p_data_len = 64;
|
sl@0
|
159 |
|
sl@0
|
160 |
unsigned char q_data[] =
|
sl@0
|
161 |
"\xfe\xf0\xae\xe8\x2a\x1c\x4b\xdb\xbb\xd7\xdf\x3b\xfa\xc9\x63\xfb"
|
sl@0
|
162 |
"\x6d\xfc\x1e\xe7";
|
sl@0
|
163 |
|
sl@0
|
164 |
int q_data_len = 20;
|
sl@0
|
165 |
|
sl@0
|
166 |
unsigned char g_data[] =
|
sl@0
|
167 |
"\x3b\x48\xa9\x2d\x82\xde\x8c\x21\x81\x09\xf8\x78\xae\xfc\x6a\xf5"
|
sl@0
|
168 |
"\x0e\x2a\x90\x3d\xfb\x64\x90\x6f\x0d\xbc\xfd\x67\x4e\x2c\x56\x00"
|
sl@0
|
169 |
"\xa3\x80\x25\x8a\x00\x26\x62\x10\xdc\xb6\xaa\x11\xa6\x36\x8c\x19"
|
sl@0
|
170 |
"\xb9\x2a\xcc\x00\xca\x84\xd5\xeb\x8f\x9b\x50\x08\x2d\x56\x4b\x37";
|
sl@0
|
171 |
|
sl@0
|
172 |
int g_data_len = 64;
|
sl@0
|
173 |
|
sl@0
|
174 |
unsigned char priv_key_data[] =
|
sl@0
|
175 |
"\x8f\xf4\xb0\xe8\x16\x94\xcb\x45\xaf\x26\xfa\x3b\x52\x96\xb3\xe9"
|
sl@0
|
176 |
"\xc9\x41\xce\x18";
|
sl@0
|
177 |
|
sl@0
|
178 |
int priv_key_data_len = 20;
|
sl@0
|
179 |
|
sl@0
|
180 |
unsigned char pub_key_data[] =
|
sl@0
|
181 |
"\x4e\x31\xab\x0e\x9b\xd5\x16\xaf\xf5\xc7\xf8\xe3\x1d\x01\x20\x90"
|
sl@0
|
182 |
"\x3e\x11\x11\x5f\xf2\x22\x46\x5f\x08\xbb\x9e\x36\x82\xdc\xfb\x33"
|
sl@0
|
183 |
"\xf9\xaa\xa5\xe9\xa0\x12\x16\x65\xc4\xbc\x7c\x6a\xf8\xb3\xc8\x8c"
|
sl@0
|
184 |
"\x2e\x45\xcc\x00\xaa\x7b\x4d\xae\xae\x9a\x1d\x37\x75\xb2\xe6\x86";
|
sl@0
|
185 |
|
sl@0
|
186 |
int pub_key_data_len = 64;
|
sl@0
|
187 |
|
sl@0
|
188 |
DSA* key = DSA_new();
|
sl@0
|
189 |
key->p = BN_new();
|
sl@0
|
190 |
key->q = BN_new();
|
sl@0
|
191 |
key->g = BN_new();
|
sl@0
|
192 |
key->priv_key = BN_new();
|
sl@0
|
193 |
key->pub_key = BN_new();
|
sl@0
|
194 |
|
sl@0
|
195 |
BN_bin2bn(p_data, p_data_len, key->p);
|
sl@0
|
196 |
BN_bin2bn(q_data, q_data_len, key->q);
|
sl@0
|
197 |
BN_bin2bn(g_data, g_data_len, key->g);
|
sl@0
|
198 |
BN_bin2bn(pub_key_data, pub_key_data_len, key->pub_key);
|
sl@0
|
199 |
BN_bin2bn(priv_key_data, priv_key_data_len, key->priv_key);
|
sl@0
|
200 |
|
sl@0
|
201 |
return key;
|
sl@0
|
202 |
}
|
sl@0
|
203 |
|
sl@0
|
204 |
static int digest_len = 20;
|
sl@0
|
205 |
|
sl@0
|
206 |
static unsigned char digest1[]="12345678901234567890";
|
sl@0
|
207 |
|
sl@0
|
208 |
static unsigned char digest2[] =
|
sl@0
|
209 |
"\xb1\xcd\x52\x66\x6d\x22\x60\x16\xd3\x75\x8e\x96\xa1\xff\xfa\xbc"
|
sl@0
|
210 |
"\x1b\x9a\xe2\xd7";
|
sl@0
|
211 |
|
sl@0
|
212 |
static unsigned char digest3[] =
|
sl@0
|
213 |
"\x39\x86\x53\xec\xae\xf6\xd7\x7a\x8a\x67\x8a\x74\x20\x30\x3b\xc9"
|
sl@0
|
214 |
"\xda\xc9\xf3\xa7";
|
sl@0
|
215 |
/**
|
sl@0
|
216 |
* Print DSA public key.
|
sl@0
|
217 |
*/
|
sl@0
|
218 |
|
sl@0
|
219 |
void printDSAPublicKey(DSA* key)
|
sl@0
|
220 |
{
|
sl@0
|
221 |
printBNElement("keyP", key->p);
|
sl@0
|
222 |
printBNElement("keyQ", key->q);
|
sl@0
|
223 |
printBNElement("keyG", key->g);
|
sl@0
|
224 |
printBNElement("keyY", key->pub_key);
|
sl@0
|
225 |
}
|
sl@0
|
226 |
|
sl@0
|
227 |
/**
|
sl@0
|
228 |
* Print DSA private key.
|
sl@0
|
229 |
*/
|
sl@0
|
230 |
|
sl@0
|
231 |
void printDSAPrivateKey(DSA* key)
|
sl@0
|
232 |
{
|
sl@0
|
233 |
printBNElement("keyP", key->p);
|
sl@0
|
234 |
printBNElement("keyQ", key->q);
|
sl@0
|
235 |
printBNElement("keyG", key->g);
|
sl@0
|
236 |
printBNElement("keyX", key->priv_key);
|
sl@0
|
237 |
}
|
sl@0
|
238 |
|
sl@0
|
239 |
/**
|
sl@0
|
240 |
* Sign a message - DSA deals with generating a digest for us.
|
sl@0
|
241 |
*/
|
sl@0
|
242 |
|
sl@0
|
243 |
static void generateSignatureVector(DSA* key, unsigned char* mess, int len, BOOL passes)
|
sl@0
|
244 |
{
|
sl@0
|
245 |
unsigned char buf[len];
|
sl@0
|
246 |
unsigned int siglen;
|
sl@0
|
247 |
int err;
|
sl@0
|
248 |
DSA_SIG* sig;
|
sl@0
|
249 |
|
sl@0
|
250 |
Mem::Copy(buf, mess, len);
|
sl@0
|
251 |
|
sl@0
|
252 |
setOurRandom();
|
sl@0
|
253 |
sig = DSA_do_sign(buf, len, key);
|
sl@0
|
254 |
if (sig == NULL)
|
sl@0
|
255 |
processError();
|
sl@0
|
256 |
|
sl@0
|
257 |
if (!passes)
|
sl@0
|
258 |
scramble(buf, len);
|
sl@0
|
259 |
|
sl@0
|
260 |
printActionHeader("DSA test vector", "DSASignVector");
|
sl@0
|
261 |
printDSAPrivateKey(key);
|
sl@0
|
262 |
printHexElement("digest", buf, len);
|
sl@0
|
263 |
printBNElement("sigR", sig->r);
|
sl@0
|
264 |
printBNElement("sigS", sig->s);
|
sl@0
|
265 |
printActionFooter(passes);
|
sl@0
|
266 |
|
sl@0
|
267 |
printActionHeader("DSA test vector", "DSAVerifyVector");
|
sl@0
|
268 |
printDSAPublicKey(key);
|
sl@0
|
269 |
printHexElement("digest", buf, len);
|
sl@0
|
270 |
printBNElement("sigR", sig->r);
|
sl@0
|
271 |
printBNElement("sigS", sig->s);
|
sl@0
|
272 |
printActionFooter(passes);
|
sl@0
|
273 |
|
sl@0
|
274 |
DSA_SIG_free(sig);
|
sl@0
|
275 |
}
|
sl@0
|
276 |
|
sl@0
|
277 |
|
sl@0
|
278 |
int main(int argc, char **argv)
|
sl@0
|
279 |
{
|
sl@0
|
280 |
DSA* key1 = createDSAKey1();
|
sl@0
|
281 |
DSA* key2 = createDSAKey2();
|
sl@0
|
282 |
DSA* key3 = createDSAKey3();
|
sl@0
|
283 |
|
sl@0
|
284 |
setOurRandom();
|
sl@0
|
285 |
testOurRandom();
|
sl@0
|
286 |
|
sl@0
|
287 |
generateSignatureVector(key1, digest1, digest_len, TRUE);
|
sl@0
|
288 |
generateSignatureVector(key2, digest1, digest_len, TRUE);
|
sl@0
|
289 |
generateSignatureVector(key3, digest1, digest_len, TRUE);
|
sl@0
|
290 |
|
sl@0
|
291 |
generateSignatureVector(key1, digest2, digest_len, TRUE);
|
sl@0
|
292 |
generateSignatureVector(key2, digest2, digest_len, TRUE);
|
sl@0
|
293 |
generateSignatureVector(key3, digest2, digest_len, TRUE);
|
sl@0
|
294 |
|
sl@0
|
295 |
generateSignatureVector(key1, digest3, digest_len, TRUE);
|
sl@0
|
296 |
generateSignatureVector(key2, digest3, digest_len, TRUE);
|
sl@0
|
297 |
generateSignatureVector(key3, digest3, digest_len, TRUE);
|
sl@0
|
298 |
|
sl@0
|
299 |
generateSignatureVector(key1, digest1, digest_len, FALSE);
|
sl@0
|
300 |
generateSignatureVector(key2, digest1, digest_len, FALSE);
|
sl@0
|
301 |
generateSignatureVector(key3, digest1, digest_len, FALSE);
|
sl@0
|
302 |
|
sl@0
|
303 |
return 0;
|
sl@0
|
304 |
}
|
sl@0
|
305 |
|