1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/ec/ec_lib.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Originally written by Bodo Moeller for the OpenSSL project. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@openssl.org. 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Binary polynomial ECC support in OpenSSL originally developed by 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslv.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "ec_lcl.h" 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const char EC_version[] = "EC" OPENSSL_VERSION_PTEXT; 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* functions for EC_GROUP objects */ 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEC_GROUP *EC_GROUP_new(const EC_METHOD *meth) 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_GROUP *ret; 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (meth == NULL) 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ECerr(EC_F_EC_GROUP_NEW, EC_R_SLOT_FULL); 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (meth->group_init == 0) 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_NEW, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = OPENSSL_malloc(sizeof *ret); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_NEW, ERR_R_MALLOC_FAILURE); 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->meth = meth; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->extra_data = NULL; 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->generator = NULL; 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_init(&ret->order); 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_init(&ret->cofactor); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->curve_name = 0; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->asn1_flag = 0; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->asn1_form = POINT_CONVERSION_UNCOMPRESSED; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->seed = NULL; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->seed_len = 0; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!meth->group_init(ret)) 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ret); 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_GROUP_free(EC_GROUP *group) 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!group) return; 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_finish != 0) 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->meth->group_finish(group); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EX_DATA_free_all_data(&group->extra_data); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->generator != NULL) 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_POINT_free(group->generator); 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_free(&group->order); 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_free(&group->cofactor); 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->seed) 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(group->seed); 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(group); 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_GROUP_clear_free(EC_GROUP *group) 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!group) return; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_clear_finish != 0) 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->meth->group_clear_finish(group); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (group->meth->group_finish != 0) 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->meth->group_finish(group); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EX_DATA_clear_free_all_data(&group->extra_data); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->generator != NULL) 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_POINT_clear_free(group->generator); 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_clear_free(&group->order); 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_clear_free(&group->cofactor); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->seed) 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_cleanse(group->seed, group->seed_len); 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(group->seed); 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_cleanse(group, sizeof *group); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(group); 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *d; 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->meth->group_copy == 0) 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_COPY, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->meth != src->meth) 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_COPY, EC_R_INCOMPATIBLE_OBJECTS); 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest == src) 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EX_DATA_free_all_data(&dest->extra_data); 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (d = src->extra_data; d != NULL; d = d->next) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *t = d->dup_func(d->data); 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (t == NULL) 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EC_EX_DATA_set_data(&dest->extra_data, t, d->dup_func, d->free_func, d->clear_free_func)) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (src->generator != NULL) 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->generator == NULL) 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->generator = EC_POINT_new(dest); 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->generator == NULL) return 0; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EC_POINT_copy(dest->generator, src->generator)) return 0; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* src->generator == NULL */ 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->generator != NULL) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_POINT_clear_free(dest->generator); 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->generator = NULL; 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BN_copy(&dest->order, &src->order)) return 0; 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BN_copy(&dest->cofactor, &src->cofactor)) return 0; 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->curve_name = src->curve_name; 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->asn1_flag = src->asn1_flag; 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->asn1_form = src->asn1_form; 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (src->seed) 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->seed) 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(dest->seed); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->seed = OPENSSL_malloc(src->seed_len); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->seed == NULL) 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!memcpy(dest->seed, src->seed, src->seed_len)) 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->seed_len = src->seed_len; 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->seed) 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(dest->seed); 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->seed = NULL; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dest->seed_len = 0; 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return dest->meth->group_copy(dest, src); 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEC_GROUP *EC_GROUP_dup(const EC_GROUP *a) 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_GROUP *t = NULL; 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ok = 0; 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a == NULL) return NULL; 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((t = EC_GROUP_new(a->meth)) == NULL) return(NULL); 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EC_GROUP_copy(t, a)) goto err; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok = 1; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ok) 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (t) EC_GROUP_free(t); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else return t; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group) 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_METHOD_get_field_type(const EC_METHOD *meth) 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return meth->field_type; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor) 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (generator == NULL) 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_SET_GENERATOR, ERR_R_PASSED_NULL_PARAMETER); 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0 ; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->generator == NULL) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->generator = EC_POINT_new(group); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->generator == NULL) return 0; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EC_POINT_copy(group->generator, generator)) return 0; 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (order != NULL) 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { if (!BN_copy(&group->order, order)) return 0; } 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_zero(&group->order); 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cofactor != NULL) 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { if (!BN_copy(&group->cofactor, cofactor)) return 0; } 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_zero(&group->cofactor); 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group) 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->generator; 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx) 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BN_copy(order, &group->order)) 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return !BN_is_zero(order); 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx) 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BN_copy(cofactor, &group->cofactor)) 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return !BN_is_zero(&group->cofactor); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_GROUP_set_curve_name(EC_GROUP *group, int nid) 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->curve_name = nid; 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_curve_name(const EC_GROUP *group) 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->curve_name; 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag) 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->asn1_flag = flag; 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_asn1_flag(const EC_GROUP *group) 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->asn1_flag; 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_GROUP_set_point_conversion_form(EC_GROUP *group, 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project point_conversion_form_t form) 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->asn1_form = form; 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpoint_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *group) 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->asn1_form; 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsize_t EC_GROUP_set_seed(EC_GROUP *group, const unsigned char *p, size_t len) 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->seed) 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(group->seed); 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->seed = NULL; 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->seed_len = 0; 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!len || !p) 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((group->seed = OPENSSL_malloc(len)) == NULL) 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(group->seed, p, len); 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group->seed_len = len; 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return len; 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *EC_GROUP_get0_seed(const EC_GROUP *group) 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->seed; 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsize_t EC_GROUP_get_seed_len(const EC_GROUP *group) 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->seed_len; 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_set_curve == 0) 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_SET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->group_set_curve(group, p, a, b, ctx); 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_get_curve == 0) 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_GET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->group_get_curve(group, p, a, b, ctx); 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 428392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_NO_EC2M 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_set_curve == 0) 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_SET_CURVE_GF2M, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->group_set_curve(group, p, a, b, ctx); 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_get_curve == 0) 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_GET_CURVE_GF2M, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->group_get_curve(group, p, a, b, ctx); 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_get_degree(const EC_GROUP *group) 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_get_degree == 0) 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_GET_DEGREE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->group_get_degree(group); 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->group_check_discriminant == 0) 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_GROUP_CHECK_DISCRIMINANT, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->group_check_discriminant(group, ctx); 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx) 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int r = 0; 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIGNUM *a1, *a2, *a3, *b1, *b2, *b3; 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX *ctx_new = NULL; 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* compare the field types*/ 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (EC_METHOD_get_field_type(EC_GROUP_method_of(a)) != 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_METHOD_get_field_type(EC_GROUP_method_of(b))) 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 483ff41a4bc41ae1e1391f9b05117623ff70b985983Kenny Root /* compare the curve name (if present in both) */ 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (EC_GROUP_get_curve_name(a) && EC_GROUP_get_curve_name(b) && 485ff41a4bc41ae1e1391f9b05117623ff70b985983Kenny Root EC_GROUP_get_curve_name(a) != EC_GROUP_get_curve_name(b)) 486ff41a4bc41ae1e1391f9b05117623ff70b985983Kenny Root return 1; 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ctx) 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ctx_new = ctx = BN_CTX_new(); 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ctx) 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_start(ctx); 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a1 = BN_CTX_get(ctx); 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a2 = BN_CTX_get(ctx); 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a3 = BN_CTX_get(ctx); 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b1 = BN_CTX_get(ctx); 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b2 = BN_CTX_get(ctx); 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b3 = BN_CTX_get(ctx); 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!b3) 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_end(ctx); 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx_new) 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_free(ctx); 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* XXX This approach assumes that the external representation 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * of curves over the same field type is the same. 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!a->meth->group_get_curve(a, a1, a2, a3, ctx) || 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !b->meth->group_get_curve(b, b1, b2, b3, ctx)) 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project r = 1; 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (r || BN_cmp(a1, b1) || BN_cmp(a2, b2) || BN_cmp(a3, b3)) 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project r = 1; 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* XXX EC_POINT_cmp() assumes that the methods are equal */ 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (r || EC_POINT_cmp(a, EC_GROUP_get0_generator(a), 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_GROUP_get0_generator(b), ctx)) 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project r = 1; 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!r) 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* compare the order and cofactor */ 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EC_GROUP_get_order(a, a1, ctx) || 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !EC_GROUP_get_order(b, b1, ctx) || 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !EC_GROUP_get_cofactor(a, a2, ctx) || 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !EC_GROUP_get_cofactor(b, b2, ctx)) 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_end(ctx); 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx_new) 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_free(ctx); 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BN_cmp(a1, b1) || BN_cmp(a2, b2)) 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project r = 1; 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_end(ctx); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx_new) 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_CTX_free(ctx); 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return r; 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* this has 'package' visibility */ 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_EX_DATA_set_data(EC_EXTRA_DATA **ex_data, void *data, 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)) 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *d; 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ex_data == NULL) 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (d = *ex_data; d != NULL; d = d->next) 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (d->dup_func == dup_func && d->free_func == free_func && d->clear_free_func == clear_free_func) 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_EX_DATA_SET_DATA, EC_R_SLOT_FULL); 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (data == NULL) 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* no explicit entry needed */ 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d = OPENSSL_malloc(sizeof *d); 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (d == NULL) 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->data = data; 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->dup_func = dup_func; 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->free_func = free_func; 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->clear_free_func = clear_free_func; 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->next = *ex_data; 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ex_data = d; 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* this has 'package' visibility */ 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *EC_EX_DATA_get_data(const EC_EXTRA_DATA *ex_data, 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)) 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EC_EXTRA_DATA *d; 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (d = ex_data; d != NULL; d = d->next) 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (d->dup_func == dup_func && d->free_func == free_func && d->clear_free_func == clear_free_func) 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return d->data; 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* this has 'package' visibility */ 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_EX_DATA_free_data(EC_EXTRA_DATA **ex_data, 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)) 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA **p; 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ex_data == NULL) 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (p = ex_data; *p != NULL; p = &((*p)->next)) 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((*p)->dup_func == dup_func && (*p)->free_func == free_func && (*p)->clear_free_func == clear_free_func) 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *next = (*p)->next; 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (*p)->free_func((*p)->data); 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(*p); 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *p = next; 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* this has 'package' visibility */ 625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_EX_DATA_clear_free_data(EC_EXTRA_DATA **ex_data, 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)) 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA **p; 629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ex_data == NULL) 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (p = ex_data; *p != NULL; p = &((*p)->next)) 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((*p)->dup_func == dup_func && (*p)->free_func == free_func && (*p)->clear_free_func == clear_free_func) 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *next = (*p)->next; 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (*p)->clear_free_func((*p)->data); 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(*p); 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *p = next; 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* this has 'package' visibility */ 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_EX_DATA_free_all_data(EC_EXTRA_DATA **ex_data) 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *d; 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ex_data == NULL) 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d = *ex_data; 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (d) 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *next = d->next; 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->free_func(d->data); 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(d); 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d = next; 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ex_data = NULL; 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* this has 'package' visibility */ 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA **ex_data) 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *d; 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ex_data == NULL) 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d = *ex_data; 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (d) 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_EXTRA_DATA *next = d->next; 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->clear_free_func(d->data); 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(d); 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d = next; 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ex_data = NULL; 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* functions for EC_POINT objects */ 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEC_POINT *EC_POINT_new(const EC_GROUP *group) 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_POINT *ret; 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group == NULL) 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_NEW, ERR_R_PASSED_NULL_PARAMETER); 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_init == 0) 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_NEW, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = OPENSSL_malloc(sizeof *ret); 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_NEW, ERR_R_MALLOC_FAILURE); 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->meth = group->meth; 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ret->meth->point_init(ret)) 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ret); 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_POINT_free(EC_POINT *point) 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!point) return; 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (point->meth->point_finish != 0) 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project point->meth->point_finish(point); 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(point); 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EC_POINT_clear_free(EC_POINT *point) 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!point) return; 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (point->meth->point_clear_finish != 0) 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project point->meth->point_clear_finish(point); 743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (point->meth->point_finish != 0) 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project point->meth->point_finish(point); 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_cleanse(point, sizeof *point); 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(point); 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->meth->point_copy == 0) 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_COPY, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest->meth != src->meth) 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_COPY, EC_R_INCOMPATIBLE_OBJECTS); 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dest == src) 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return dest->meth->point_copy(dest, src); 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEC_POINT *EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_POINT *t; 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int r; 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a == NULL) return NULL; 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project t = EC_POINT_new(group); 776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (t == NULL) return(NULL); 777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project r = EC_POINT_copy(t, a); 778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!r) 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_POINT_free(t); 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else return t; 784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EC_METHOD *EC_POINT_method_of(const EC_POINT *point) 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return point->meth; 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_set_to_infinity == 0) 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_TO_INFINITY, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_TO_INFINITY, EC_R_INCOMPATIBLE_OBJECTS); 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_set_to_infinity(group, point); 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx) 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_set_Jprojective_coordinates_GFp == 0) 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP, EC_R_INCOMPATIBLE_OBJECTS); 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_set_Jprojective_coordinates_GFp(group, point, x, y, z, ctx); 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point, 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_get_Jprojective_coordinates_GFp == 0) 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP, EC_R_INCOMPATIBLE_OBJECTS); 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_get_Jprojective_coordinates_GFp(group, point, x, y, z, ctx); 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_set_affine_coordinates == 0) 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP, EC_R_INCOMPATIBLE_OBJECTS); 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_set_affine_coordinates(group, point, x, y, ctx); 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 859392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_NO_EC2M 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point, 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_set_affine_coordinates == 0) 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M, EC_R_INCOMPATIBLE_OBJECTS); 871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_set_affine_coordinates(group, point, x, y, ctx); 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 875392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point, 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIGNUM *x, BIGNUM *y, BN_CTX *ctx) 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_get_affine_coordinates == 0) 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP, EC_R_INCOMPATIBLE_OBJECTS); 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_get_affine_coordinates(group, point, x, y, ctx); 891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 893392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_NO_EC2M 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, const EC_POINT *point, 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIGNUM *x, BIGNUM *y, BN_CTX *ctx) 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_get_affine_coordinates == 0) 898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M, EC_R_INCOMPATIBLE_OBJECTS); 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_get_affine_coordinates(group, point, x, y, ctx); 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 909392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->add == 0) 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_ADD, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((group->meth != r->meth) || (r->meth != a->meth) || (a->meth != b->meth)) 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_ADD, EC_R_INCOMPATIBLE_OBJECTS); 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->add(group, r, a, b, ctx); 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx) 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->dbl == 0) 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_DBL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((group->meth != r->meth) || (r->meth != a->meth)) 935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_DBL, EC_R_INCOMPATIBLE_OBJECTS); 937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->dbl(group, r, a, ctx); 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx) 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 945c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if (group->meth->invert == 0) 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_INVERT, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != a->meth) 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_INVERT, EC_R_INCOMPATIBLE_OBJECTS); 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->invert(group, a, ctx); 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->is_at_infinity == 0) 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_IS_AT_INFINITY, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_IS_AT_INFINITY, EC_R_INCOMPATIBLE_OBJECTS); 969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->is_at_infinity(group, point); 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) 976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->is_on_curve == 0) 978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_IS_ON_CURVE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_IS_ON_CURVE, EC_R_INCOMPATIBLE_OBJECTS); 985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->is_on_curve(group, point, ctx); 988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) 992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->point_cmp == 0) 994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_CMP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 996ff41a4bc41ae1e1391f9b05117623ff70b985983Kenny Root return -1; 997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((group->meth != a->meth) || (a->meth != b->meth)) 999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_CMP, EC_R_INCOMPATIBLE_OBJECTS); 1001ff41a4bc41ae1e1391f9b05117623ff70b985983Kenny Root return -1; 1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->point_cmp(group, a, b, ctx); 1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) 1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->make_affine == 0) 1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_MAKE_AFFINE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != point->meth) 1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINT_MAKE_AFFINE, EC_R_INCOMPATIBLE_OBJECTS); 1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->make_affine(group, point, ctx); 1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx) 1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t i; 1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->points_make_affine == 0) 1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINTS_MAKE_AFFINE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < num; i++) 1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth != points[i]->meth) 1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ECerr(EC_F_EC_POINTS_MAKE_AFFINE, EC_R_INCOMPATIBLE_OBJECTS); 1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->points_make_affine(group, num, points, ctx); 1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Functions for point multiplication. 1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If group->meth->mul is 0, we use the wNAF-based implementations in ec_mult.c; 1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * otherwise we dispatch through methods. 1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, 1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) 1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->mul == 0) 1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* use default */ 1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx); 1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->mul(group, r, scalar, num, points, scalars, ctx); 1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, 1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EC_POINT *point, const BIGNUM *p_scalar, BN_CTX *ctx) 1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* just a convenient interface to EC_POINTs_mul() */ 1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EC_POINT *points[1]; 1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const BIGNUM *scalars[1]; 1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project points[0] = point; 1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project scalars[0] = p_scalar; 1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return EC_POINTs_mul(group, r, g_scalar, (point != NULL && p_scalar != NULL), points, scalars, ctx); 1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx) 1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->mul == 0) 1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* use default */ 1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ec_wNAF_precompute_mult(group, ctx); 1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->precompute_mult != 0) 1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->precompute_mult(group, ctx); 1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; /* nothing to do, so report success */ 1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EC_GROUP_have_precompute_mult(const EC_GROUP *group) 1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->mul == 0) 1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* use default */ 1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ec_wNAF_have_precompute_mult(group); 1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (group->meth->have_precompute_mult != 0) 1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return group->meth->have_precompute_mult(group); 1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; /* cannot tell whether precomputation has been performed */ 1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1097