os/security/crypto/weakcryptospi/test/tasymmetric/script_gen/dsa_test.c
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/security/crypto/weakcryptospi/test/tasymmetric/script_gen/dsa_test.c	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,305 @@
     1.4 +/*
     1.5 +* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
     1.6 +* All rights reserved.
     1.7 +* This component and the accompanying materials are made available
     1.8 +* under the terms of the License "Eclipse Public License v1.0"
     1.9 +* which accompanies this distribution, and is available
    1.10 +* at the URL "http://www.eclipse.org/legal/epl-v10.html".
    1.11 +*
    1.12 +* Initial Contributors:
    1.13 +* Nokia Corporation - initial contribution.
    1.14 +*
    1.15 +* Contributors:
    1.16 +*
    1.17 +* Description: 
    1.18 +* Generates DSA test vectors.
    1.19 +*
    1.20 +*/
    1.21 +
    1.22 +
    1.23 +
    1.24 +
    1.25 +/**
    1.26 + @file
    1.27 +*/
    1.28 +
    1.29 +#include <stdio.h>
    1.30 +#include <openssl/crypto.h>
    1.31 +#include <openssl/rand.h>
    1.32 +#include <openssl/dsa.h>
    1.33 +#include "utils.h"
    1.34 +
    1.35 +/*
    1.36 + * The DSA keys have been choosen from randomly generated ones so that either
    1.37 + * the 2nd or 3rd most significant bit of q is set - this is so that a
    1.38 + * particular path is followed when the signing procedure generates k, for which
    1.39 + * our function that generates a random number in a certain range is equivalent
    1.40 + * to the openssl one.
    1.41 + *
    1.42 + * This is nasty, but it means we don't have to change the openssl code.
    1.43 + */
    1.44 +
    1.45 +static DSA* createDSAKey1()
    1.46 +	{
    1.47 +	unsigned char p_data[] =
    1.48 +		"\x8d\xf2\xa4\x94\x49\x22\x76\xaa\x3d\x25\x75\x9b\xb0\x68\x69\xcb"
    1.49 +		"\xea\xc0\xd8\x3a\xfb\x8d\x0c\xf7\xcb\xb8\x32\x4f\x0d\x78\x82\xe5"
    1.50 +		"\xd0\x76\x2f\xc5\xb7\x21\x0e\xaf\xc2\xe9\xad\xac\x32\xab\x7a\xac"
    1.51 +		"\x49\x69\x3d\xfb\xf8\x37\x24\xc2\xec\x07\x36\xee\x31\xc8\x02\x91";
    1.52 +
    1.53 +	int p_data_len = 64;
    1.54 +
    1.55 +	unsigned char q_data[] =
    1.56 +		"\xc7\x73\x21\x8c\x73\x7e\xc8\xee\x99\x3b\x4f\x2d\xed\x30\xf4\x8e"
    1.57 +		"\xda\xce\x91\x5f";
    1.58 +
    1.59 +	int q_data_len = 20;
    1.60 +
    1.61 +	unsigned char g_data[] =
    1.62 +		"\x62\x6d\x02\x78\x39\xea\x0a\x13\x41\x31\x63\xa5\x5b\x4c\xb5\x00"
    1.63 +		"\x29\x9d\x55\x22\x95\x6c\xef\xcb\x3b\xff\x10\xf3\x99\xce\x2c\x2e"
    1.64 +		"\x71\xcb\x9d\xe5\xfa\x24\xba\xbf\x58\xe5\xb7\x95\x21\x92\x5c\x9c"
    1.65 +		"\xc4\x2e\x9f\x6f\x46\x4b\x08\x8c\xc5\x72\xaf\x53\xe6\xd7\x88\x02";
    1.66 +
    1.67 +	int g_data_len = 64;
    1.68 +
    1.69 +	unsigned char priv_key_data[] =
    1.70 +		"\xc2\x5f\xb4\x81\xd7\x9c\x07\x30\x97\xc2\x1d\x0c\xb1\xd7\x07\x2f"
    1.71 +		"\x04\x1d\xbb\x89";
    1.72 +
    1.73 +	int priv_key_data_len = 20;
    1.74 +
    1.75 +	unsigned char pub_key_data[] =
    1.76 +		"\x2d\x52\x1e\x27\x37\xe7\xdb\xdb\xd1\xe4\x7a\xb6\x79\xc5\xae\x69"
    1.77 +		"\xe1\x25\x37\xe9\x96\xb1\x81\xba\xf0\xb8\x85\x0f\x84\xc8\x2b\x9e"
    1.78 +		"\xf5\xb8\xb6\xc2\xb2\x22\x1b\xb5\xa9\xd0\x58\x66\x32\x5a\xb1\x62"
    1.79 +		"\xae\xb7\x13\x68\xbd\xe4\xca\xa0\xf6\x68\x96\x3c\x7d\x1a\x43\x52";
    1.80 +
    1.81 +	int pub_key_data_len = 64;
    1.82 +
    1.83 +	DSA* key = DSA_new();
    1.84 +	key->p = BN_new();
    1.85 +	key->q = BN_new();
    1.86 +	key->g = BN_new();
    1.87 +	key->priv_key = BN_new();
    1.88 +	key->pub_key = BN_new();
    1.89 +
    1.90 +	BN_bin2bn(p_data, p_data_len, key->p);
    1.91 +	BN_bin2bn(q_data, q_data_len, key->q);
    1.92 +	BN_bin2bn(g_data, g_data_len, key->g);
    1.93 +	BN_bin2bn(pub_key_data, pub_key_data_len, key->pub_key);
    1.94 +	BN_bin2bn(priv_key_data, priv_key_data_len, key->priv_key);
    1.95 +
    1.96 +	return key;
    1.97 +	}
    1.98 +
    1.99 +static DSA* createDSAKey2()
   1.100 +	{
   1.101 +	unsigned char p_data[] =
   1.102 +		"\x8d\xf2\xa4\x94\x49\x22\x76\xaa\x3d\x25\x75\x9b\xb0\x68\x69\xcb"
   1.103 +		"\xea\xc0\xd8\x3a\xfb\x8d\x0c\xf7\xcb\xb8\x32\x4f\x0d\x78\x82\xe5"
   1.104 +		"\xd0\x76\x2f\xc5\xb7\x21\x0e\xaf\xc2\xe9\xad\xac\x32\xab\x7a\xac"
   1.105 +		"\x49\x69\x3d\xfb\xf8\x37\x24\xc2\xec\x07\x36\xee\x31\xc8\x02\x91";
   1.106 +
   1.107 +	int p_data_len = 64;
   1.108 +
   1.109 +	unsigned char q_data[] =
   1.110 +		"\xc7\x73\x21\x8c\x73\x7e\xc8\xee\x99\x3b\x4f\x2d\xed\x30\xf4\x8e"
   1.111 +		"\xda\xce\x91\x5f";
   1.112 +
   1.113 +	int q_data_len = 20;
   1.114 +
   1.115 +	unsigned char g_data[] =
   1.116 +		"\x62\x6d\x02\x78\x39\xea\x0a\x13\x41\x31\x63\xa5\x5b\x4c\xb5\x00"
   1.117 +		"\x29\x9d\x55\x22\x95\x6c\xef\xcb\x3b\xff\x10\xf3\x99\xce\x2c\x2e"
   1.118 +		"\x71\xcb\x9d\xe5\xfa\x24\xba\xbf\x58\xe5\xb7\x95\x21\x92\x5c\x9c"
   1.119 +		"\xc4\x2e\x9f\x6f\x46\x4b\x08\x8c\xc5\x72\xaf\x53\xe6\xd7\x88\x02";
   1.120 +
   1.121 +	int g_data_len = 64;
   1.122 +
   1.123 +	unsigned char priv_key_data[] =
   1.124 +		"\x0f\x36\x53\xf7\x51\xa7\x04\x6e\x0b\x52\x30\xfe\x15\x7c\xa3\x3e"
   1.125 +		"\x03\xf0\x84\x73";
   1.126 +
   1.127 +	int priv_key_data_len = 20;
   1.128 +
   1.129 +	unsigned char pub_key_data[] =
   1.130 +		"\x7f\x9a\xd6\x6d\x4d\xa9\xb0\x0e\x71\x76\x04\xc4\xdb\x3b\x96\x93"
   1.131 +		"\x6b\x6c\xa6\x16\xa5\x6b\xb6\xe6\x23\x26\xc7\xf5\xd4\xd6\x5b\x06"
   1.132 +		"\x6c\x10\x47\x0a\xc2\xf2\x1d\xc1\x7b\x39\x54\x6d\x84\x99\x40\xd1"
   1.133 +		"\x7e\xb0\xb5\x17\xc1\x17\xcd\xa0\x78\x0c\xc1\x67\xf1\x57\x83\x2c";
   1.134 +
   1.135 +	int pub_key_data_len = 64;
   1.136 +
   1.137 +	DSA* key = DSA_new();
   1.138 +	key->p = BN_new();
   1.139 +	key->q = BN_new();
   1.140 +	key->g = BN_new();
   1.141 +	key->priv_key = BN_new();
   1.142 +	key->pub_key = BN_new();
   1.143 +
   1.144 +	BN_bin2bn(p_data, p_data_len, key->p);
   1.145 +	BN_bin2bn(q_data, q_data_len, key->q);
   1.146 +	BN_bin2bn(g_data, g_data_len, key->g);
   1.147 +	BN_bin2bn(pub_key_data, pub_key_data_len, key->pub_key);
   1.148 +	BN_bin2bn(priv_key_data, priv_key_data_len, key->priv_key);
   1.149 +
   1.150 +	return key;
   1.151 +	}
   1.152 +
   1.153 +static DSA* createDSAKey3()
   1.154 +	{
   1.155 +	unsigned char p_data[] =
   1.156 +		"\xcf\x62\x62\xfb\x7e\x7d\xc9\xc3\x7b\x4b\xa3\x62\x02\x1c\xfd\xb0"
   1.157 +		"\xcc\xd7\xbe\x39\xba\x89\xfc\x86\xf4\x9b\x29\xee\xe8\xee\x47\x23"
   1.158 +		"\xa8\x36\xd5\xbc\x3f\x31\xfe\x75\xc9\xcc\xc2\xa4\x49\x1d\x44\xc2"
   1.159 +		"\xb2\x7a\x71\x45\xd8\xcd\x84\x41\xe5\x8a\x94\xaa\x02\x0f\xd9\x03";
   1.160 +
   1.161 +	int p_data_len = 64;
   1.162 +
   1.163 +	unsigned char q_data[] =
   1.164 +		"\xfe\xf0\xae\xe8\x2a\x1c\x4b\xdb\xbb\xd7\xdf\x3b\xfa\xc9\x63\xfb"
   1.165 +		"\x6d\xfc\x1e\xe7";
   1.166 +
   1.167 +	int q_data_len = 20;
   1.168 +
   1.169 +	unsigned char g_data[] =
   1.170 +		"\x3b\x48\xa9\x2d\x82\xde\x8c\x21\x81\x09\xf8\x78\xae\xfc\x6a\xf5"
   1.171 +		"\x0e\x2a\x90\x3d\xfb\x64\x90\x6f\x0d\xbc\xfd\x67\x4e\x2c\x56\x00"
   1.172 +		"\xa3\x80\x25\x8a\x00\x26\x62\x10\xdc\xb6\xaa\x11\xa6\x36\x8c\x19"
   1.173 +		"\xb9\x2a\xcc\x00\xca\x84\xd5\xeb\x8f\x9b\x50\x08\x2d\x56\x4b\x37";
   1.174 +
   1.175 +	int g_data_len = 64;
   1.176 +
   1.177 +	unsigned char priv_key_data[] =
   1.178 +		"\x8f\xf4\xb0\xe8\x16\x94\xcb\x45\xaf\x26\xfa\x3b\x52\x96\xb3\xe9"
   1.179 +		"\xc9\x41\xce\x18";
   1.180 +
   1.181 +	int priv_key_data_len = 20;
   1.182 +
   1.183 +	unsigned char pub_key_data[] =
   1.184 +		"\x4e\x31\xab\x0e\x9b\xd5\x16\xaf\xf5\xc7\xf8\xe3\x1d\x01\x20\x90"
   1.185 +		"\x3e\x11\x11\x5f\xf2\x22\x46\x5f\x08\xbb\x9e\x36\x82\xdc\xfb\x33"
   1.186 +		"\xf9\xaa\xa5\xe9\xa0\x12\x16\x65\xc4\xbc\x7c\x6a\xf8\xb3\xc8\x8c"
   1.187 +		"\x2e\x45\xcc\x00\xaa\x7b\x4d\xae\xae\x9a\x1d\x37\x75\xb2\xe6\x86";
   1.188 +
   1.189 +	int pub_key_data_len = 64;
   1.190 +
   1.191 +	DSA* key = DSA_new();
   1.192 +	key->p = BN_new();
   1.193 +	key->q = BN_new();
   1.194 +	key->g = BN_new();
   1.195 +	key->priv_key = BN_new();
   1.196 +	key->pub_key = BN_new();
   1.197 +
   1.198 +	BN_bin2bn(p_data, p_data_len, key->p);
   1.199 +	BN_bin2bn(q_data, q_data_len, key->q);
   1.200 +	BN_bin2bn(g_data, g_data_len, key->g);
   1.201 +	BN_bin2bn(pub_key_data, pub_key_data_len, key->pub_key);
   1.202 +	BN_bin2bn(priv_key_data, priv_key_data_len, key->priv_key);
   1.203 +
   1.204 +	return key;
   1.205 +	}
   1.206 +
   1.207 +static int digest_len = 20;
   1.208 +
   1.209 +static unsigned char digest1[]="12345678901234567890";
   1.210 +
   1.211 +static unsigned char digest2[] =
   1.212 +        "\xb1\xcd\x52\x66\x6d\x22\x60\x16\xd3\x75\x8e\x96\xa1\xff\xfa\xbc"
   1.213 +        "\x1b\x9a\xe2\xd7";
   1.214 +
   1.215 +static unsigned char digest3[] =
   1.216 +        "\x39\x86\x53\xec\xae\xf6\xd7\x7a\x8a\x67\x8a\x74\x20\x30\x3b\xc9"
   1.217 +        "\xda\xc9\xf3\xa7";
   1.218 +/**
   1.219 + * Print DSA public key.
   1.220 + */
   1.221 +
   1.222 +void printDSAPublicKey(DSA* key)
   1.223 +    {    
   1.224 +    printBNElement("keyP", key->p);
   1.225 +    printBNElement("keyQ", key->q);
   1.226 +    printBNElement("keyG", key->g);
   1.227 +    printBNElement("keyY", key->pub_key);
   1.228 +    }
   1.229 +
   1.230 +/**
   1.231 + * Print DSA private key.
   1.232 + */
   1.233 +
   1.234 +void printDSAPrivateKey(DSA* key)
   1.235 +    {    
   1.236 +    printBNElement("keyP", key->p);
   1.237 +    printBNElement("keyQ", key->q);
   1.238 +    printBNElement("keyG", key->g);
   1.239 +    printBNElement("keyX", key->priv_key);
   1.240 +    }
   1.241 +
   1.242 +/**
   1.243 + * Sign a message - DSA deals with generating a digest for us.
   1.244 + */
   1.245 +
   1.246 +static void generateSignatureVector(DSA* key, unsigned char* mess, int len, BOOL passes)
   1.247 +    {
   1.248 +    unsigned char buf[len];
   1.249 +	unsigned int siglen;
   1.250 +    int err;
   1.251 +    DSA_SIG* sig;
   1.252 + 
   1.253 +	Mem::Copy(buf, mess, len);
   1.254 +
   1.255 +    setOurRandom();
   1.256 +    sig = DSA_do_sign(buf, len, key);
   1.257 +    if (sig == NULL)
   1.258 +        processError();
   1.259 +
   1.260 +    if (!passes)
   1.261 +        scramble(buf, len);
   1.262 +
   1.263 +    printActionHeader("DSA test vector", "DSASignVector");
   1.264 +    printDSAPrivateKey(key);
   1.265 +    printHexElement("digest", buf, len);
   1.266 +    printBNElement("sigR", sig->r);
   1.267 +    printBNElement("sigS", sig->s);
   1.268 +    printActionFooter(passes);
   1.269 +
   1.270 +    printActionHeader("DSA test vector", "DSAVerifyVector");
   1.271 +    printDSAPublicKey(key);
   1.272 +    printHexElement("digest", buf, len);
   1.273 +    printBNElement("sigR", sig->r);
   1.274 +    printBNElement("sigS", sig->s);
   1.275 +    printActionFooter(passes);
   1.276 +
   1.277 +    DSA_SIG_free(sig);
   1.278 +    }
   1.279 +
   1.280 +
   1.281 +int main(int argc, char **argv)
   1.282 +	{
   1.283 +	DSA* key1 = createDSAKey1();
   1.284 +	DSA* key2 = createDSAKey2();
   1.285 +	DSA* key3 = createDSAKey3();
   1.286 +
   1.287 +    setOurRandom();
   1.288 +    testOurRandom();
   1.289 +
   1.290 +    generateSignatureVector(key1, digest1, digest_len, TRUE);
   1.291 +    generateSignatureVector(key2, digest1, digest_len, TRUE);
   1.292 +    generateSignatureVector(key3, digest1, digest_len, TRUE);
   1.293 +
   1.294 +    generateSignatureVector(key1, digest2, digest_len, TRUE);
   1.295 +    generateSignatureVector(key2, digest2, digest_len, TRUE);
   1.296 +    generateSignatureVector(key3, digest2, digest_len, TRUE);
   1.297 +
   1.298 +    generateSignatureVector(key1, digest3, digest_len, TRUE);
   1.299 +    generateSignatureVector(key2, digest3, digest_len, TRUE);
   1.300 +    generateSignatureVector(key3, digest3, digest_len, TRUE);
   1.301 +
   1.302 +    generateSignatureVector(key1, digest1, digest_len, FALSE);
   1.303 +    generateSignatureVector(key2, digest1, digest_len, FALSE);
   1.304 +    generateSignatureVector(key3, digest1, digest_len, FALSE);
   1.305 +
   1.306 +	return 0;
   1.307 +	}
   1.308 +