1/* 2 * Copyright (c) 2009 Kungliga Tekniska H�gskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#include "ec.h" 35 36struct EC_POINT { 37 int inf; 38 mp_int x; 39 mp_int y; 40 mp_int z; 41}; 42 43struct EC_GROUP { 44 size_t size; 45 mp_int prime; 46 mp_int order; 47 mp_int Gx; 48 mp_int Gy; 49}; 50 51struct EC_KEY { 52 int type; 53 EC_GROUP *group; 54 EC_POINT *pubkey; 55 mp_int privkey; 56}; 57 58 59unsigned long 60EC_GROUP_get_degree(EC_GROUP *) 61{ 62} 63 64EC_GROUP * 65EC_KEY_get0_group(EC_KEY *) 66{ 67} 68 69int 70EC_GROUP_get_order(EC_GROUP *, BIGNUM *, BN_CTX *) 71{ 72} 73 74EC_KEY * 75o2i_ECPublicKey(EC_KEY **key, unsigned char **, size_t) 76{ 77} 78 79void 80EC_KEY_free(EC_KEY *) 81{ 82 83} 84 85EC_GROUP * 86EC_GROUP_new_by_curve_name(int nid) 87{ 88} 89 90EC_KEY * 91EC_KEY_new_by_curve_name(EC_GROUP_ID nid) 92{ 93 EC_KEY *key; 94 95 key = calloc(1, sizeof(*key)); 96 return key; 97} 98 99void 100EC_POINT_free(EC_POINT *p) 101{ 102 mp_clear_multi(&p->x, p->y, p->z, NULL); 103 free(p); 104} 105 106static int 107ec_point_mul(EC_POINT *res, const EC_GROUP *group, const mp_int *point) 108{ 109} 110 111EC_POINT * 112EC_POINT_new(void) 113{ 114 EC_POINT *p; 115 116 p = calloc(1, sizeof(*p)); 117 118 if (mp_init_multi(&p->x, &p->y, &p->z, NULL) != 0) { 119 EC_POINT_free(p); 120 return NULL; 121 } 122 123 return p; 124} 125 126int 127EC_KEY_generate_key(EC_KEY *key) 128{ 129 int ret = 0; 130 131 if (key->group == NULL) 132 return 0; 133 134 do { 135 random(key->privkey, key->group->size); 136 } while(mp_cmp(key->privkey, key->group->order) >= 0); 137 138 if (key->pubkey == NULL) 139 key->pubkey = EC_POINT_new(); 140 141 if (ec_point_mul(&key->pubkey, key->group, key->privkey) != 1) 142 goto error; 143 144 ret = 1; 145 error: 146 ECPOINT_free(&base); 147 148 return ret; 149} 150 151void 152EC_KEY_set_group(EC_KEY *, EC_GROUP *) 153{ 154 155} 156 157void 158EC_GROUP_free(EC_GROUP *) 159{ 160} 161 162int 163EC_KEY_check_key(const EC_KEY *) 164{ 165} 166 167const BIGNUM * 168EC_KEY_get0_private_key(const EC_KEY *key) 169{ 170} 171 172int 173EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *bn) 174{ 175} 176