1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner. 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works. 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All curves taken from NIST recommendation paper of July 1999 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Available at http://csrc.nist.gov/cryptval/dss.htm 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h" 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @file ecc_make_key.c 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ECC Crypto, Tom St Denis 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MECC 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Make a new ECC key 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param prng An active PRNG state 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param wprng The index of the PRNG you wish to use 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param keysize The keysize for the new key (in octets from 20 to 65 bytes) 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param key [out] Destination of the newly created key 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful, upon error all allocated memory will be freed 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key) 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x, err; 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find key size */ 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; (keysize > ltc_ecc_sets[x].size) && (ltc_ecc_sets[x].size != 0); x++); 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project keysize = ltc_ecc_sets[x].size; 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (keysize > ECC_MAXSIZE || ltc_ecc_sets[x].size == 0) { 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_INVALID_KEYSIZE; 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = ecc_make_key_ex(prng, wprng, key, <c_ecc_sets[x]); 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project key->idx = x; 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp) 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int err; 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ecc_point *base; 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *prime; 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *buf; 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int keysize; 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(key != NULL); 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(ltc_mp.name != NULL); 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(dp != NULL); 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* good prng? */ 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = prng_is_valid(wprng)) != CRYPT_OK) { 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project key->idx = -1; 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project key->dp = dp; 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project keysize = dp->size; 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* allocate ram */ 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project base = NULL; 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf = XMALLOC(ECC_MAXSIZE); 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (buf == NULL) { 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_MEM; 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* make up random string */ 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (prng_descriptor[wprng].read(buf, (unsigned long)keysize, prng) != (unsigned long)keysize) { 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_ERROR_READPRNG; 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto ERR_BUF; 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* setup the key variables */ 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, &prime, NULL)) != CRYPT_OK) { 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto ERR_BUF; 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project base = ltc_ecc_new_point(); 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (base == NULL) { 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_MEM; 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto errkey; 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* read in the specs for this key */ 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_radix(prime, (char *)key->dp->prime, 16)) != CRYPT_OK) { goto errkey; } 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_radix(base->x, (char *)key->dp->Gx, 16)) != CRYPT_OK) { goto errkey; } 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_radix(base->y, (char *)key->dp->Gy, 16)) != CRYPT_OK) { goto errkey; } 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_set(base->z, 1)) != CRYPT_OK) { goto errkey; } 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_unsigned_bin(key->k, (unsigned char *)buf, keysize)) != CRYPT_OK) { goto errkey; } 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* make the public key */ 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptmul(key->k, base, &key->pubkey, prime, 1)) != CRYPT_OK) { goto errkey; } 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project key->type = PK_PRIVATE; 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* free up ram */ 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_OK; 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto cleanup; 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projecterrkey: 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, key->k, NULL); 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectcleanup: 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(base); 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(prime); 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectERR_BUF: 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(buf, ECC_MAXSIZE); 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project XFREE(buf); 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/pk/ecc/ecc_make_key.c,v $ */ 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.9 $ */ 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/12/04 02:50:11 $ */ 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 126