os/security/crypto/weakcrypto/test/tasymmetric/script_gen/dsa_test.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
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