1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/ec/ec_asn1.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Written by Nils Larsch for the OpenSSL project. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ==================================================================== 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright (c) 2000-2003 The OpenSSL Project. All rights reserved. 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the above copyright 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the documentation and/or other materials provided with the 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * distribution. 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * software must display the following acknowledgment: 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software developed by the OpenSSL Project 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * endorse or promote products derived from this software without 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * prior written permission. For written permission, please contact 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * licensing@OpenSSL.org. 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5. Products derived from this software may not be called "OpenSSL" 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * nor may "OpenSSL" appear in their names without prior written 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * permission of the OpenSSL Project. 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 6. Redistributions of any form whatsoever must retain the following 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * acknowledgment: 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software developed by the OpenSSL Project 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE. 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ==================================================================== 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This product includes cryptographic software written by Eric Young 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * (eay@cryptsoft.com). This product includes software written by Tim 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Hudson (tjh@cryptsoft.com). 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <string.h> 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "ec_lcl.h" 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/err.h> 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/asn1t.h> 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/objects.h> 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint EC_GROUP_get_basis_type(const EC_GROUP *group) 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i=0; 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NID_X9_62_characteristic_two_field) 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* everything else is currently not supported */ 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (group->poly[i] != 0) 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i++; 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (i == 4) 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NID_X9_62_ppBasis; 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (i == 2) 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NID_X9_62_tpBasis; 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* everything else is currently not supported */ 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 862c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#ifndef OPENSSL_NO_EC2M 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k) 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (group == NULL) 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (k) 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *k = group->poly[1]; 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 1; 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned int *k2, unsigned int *k3) 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (group == NULL) 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (k1) 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *k1 = group->poly[3]; 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (k2) 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *k2 = group->poly[2]; 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (k3) 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *k3 = group->poly[1]; 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 1; 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1262c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#endif 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* some structures needed for the asn1 encoding */ 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct x9_62_pentanomial_st { 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long k1; 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long k2; 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long k3; 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } X9_62_PENTANOMIAL; 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct x9_62_characteristic_two_st { 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long m; 138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OBJECT *type; 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org union { 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *ptr; 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* NID_X9_62_onBasis */ 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_NULL *onBasis; 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* NID_X9_62_tpBasis */ 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_INTEGER *tpBasis; 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* NID_X9_62_ppBasis */ 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_PENTANOMIAL *ppBasis; 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* anything else */ 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_TYPE *other; 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } p; 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } X9_62_CHARACTERISTIC_TWO; 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct x9_62_fieldid_st { 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OBJECT *fieldType; 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org union { 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *ptr; 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* NID_X9_62_prime_field */ 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_INTEGER *prime; 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* NID_X9_62_characteristic_two_field */ 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_CHARACTERISTIC_TWO *char_two; 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* anything else */ 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_TYPE *other; 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } p; 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } X9_62_FIELDID; 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct x9_62_curve_st { 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OCTET_STRING *a; 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OCTET_STRING *b; 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_BIT_STRING *seed; 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } X9_62_CURVE; 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct ec_parameters_st { 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long version; 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_FIELDID *fieldID; 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_CURVE *curve; 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OCTET_STRING *base; 176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_INTEGER *order; 177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_INTEGER *cofactor; 178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } ECPARAMETERS; 179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstruct ecpk_parameters_st { 181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int type; 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org union { 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OBJECT *named_curve; 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPARAMETERS *parameters; 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_NULL *implicitlyCA; 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } value; 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org }/* ECPKPARAMETERS */; 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* SEC1 ECPrivateKey */ 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct ec_privatekey_st { 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long version; 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OCTET_STRING *privateKey; 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS *parameters; 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_BIT_STRING *publicKey; 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } EC_PRIVATEKEY; 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* the OpenSSL ASN.1 definitions */ 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_SEQUENCE(X9_62_PENTANOMIAL) = { 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_PENTANOMIAL, k1, LONG), 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_PENTANOMIAL, k2, LONG), 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_PENTANOMIAL, k3, LONG) 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_SEQUENCE_END(X9_62_PENTANOMIAL) 203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_PENTANOMIAL) 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgIMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_PENTANOMIAL) 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_ADB_TEMPLATE(char_two_def) = ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.other, ASN1_ANY); 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_ADB(X9_62_CHARACTERISTIC_TWO) = { 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ADB_ENTRY(NID_X9_62_onBasis, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.onBasis, ASN1_NULL)), 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ADB_ENTRY(NID_X9_62_tpBasis, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.tpBasis, ASN1_INTEGER)), 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ADB_ENTRY(NID_X9_62_ppBasis, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.ppBasis, X9_62_PENTANOMIAL)) 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_ADB_END(X9_62_CHARACTERISTIC_TWO, 0, type, 0, &char_two_def_tt, NULL); 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_SEQUENCE(X9_62_CHARACTERISTIC_TWO) = { 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, m, LONG), 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, type, ASN1_OBJECT), 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_ADB_OBJECT(X9_62_CHARACTERISTIC_TWO) 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_SEQUENCE_END(X9_62_CHARACTERISTIC_TWO) 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO) 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgIMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO) 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_ADB_TEMPLATE(fieldID_def) = ASN1_SIMPLE(X9_62_FIELDID, p.other, ASN1_ANY); 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_ADB(X9_62_FIELDID) = { 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ADB_ENTRY(NID_X9_62_prime_field, ASN1_SIMPLE(X9_62_FIELDID, p.prime, ASN1_INTEGER)), 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ADB_ENTRY(NID_X9_62_characteristic_two_field, ASN1_SIMPLE(X9_62_FIELDID, p.char_two, X9_62_CHARACTERISTIC_TWO)) 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_ADB_END(X9_62_FIELDID, 0, fieldType, 0, &fieldID_def_tt, NULL); 230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_SEQUENCE(X9_62_FIELDID) = { 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_FIELDID, fieldType, ASN1_OBJECT), 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_ADB_OBJECT(X9_62_FIELDID) 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_SEQUENCE_END(X9_62_FIELDID) 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_SEQUENCE(X9_62_CURVE) = { 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_CURVE, a, ASN1_OCTET_STRING), 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(X9_62_CURVE, b, ASN1_OCTET_STRING), 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OPT(X9_62_CURVE, seed, ASN1_BIT_STRING) 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_SEQUENCE_END(X9_62_CURVE) 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_SEQUENCE(ECPARAMETERS) = { 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPARAMETERS, version, LONG), 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPARAMETERS, fieldID, X9_62_FIELDID), 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPARAMETERS, curve, X9_62_CURVE), 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPARAMETERS, base, ASN1_OCTET_STRING), 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPARAMETERS, order, ASN1_INTEGER), 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OPT(ECPARAMETERS, cofactor, ASN1_INTEGER) 249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_SEQUENCE_END(ECPARAMETERS) 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgIMPLEMENT_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_CHOICE(ECPKPARAMETERS) = { 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPKPARAMETERS, value.named_curve, ASN1_OBJECT), 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPKPARAMETERS, value.parameters, ECPARAMETERS), 257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(ECPKPARAMETERS, value.implicitlyCA, ASN1_NULL) 258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_CHOICE_END(ECPKPARAMETERS) 259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS) 261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS) 262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgIMPLEMENT_ASN1_FUNCTIONS_const(ECPKPARAMETERS) 263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_SEQUENCE(EC_PRIVATEKEY) = { 265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(EC_PRIVATEKEY, version, LONG), 266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_SIMPLE(EC_PRIVATEKEY, privateKey, ASN1_OCTET_STRING), 267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_EXP_OPT(EC_PRIVATEKEY, parameters, ECPKPARAMETERS, 0), 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_EXP_OPT(EC_PRIVATEKEY, publicKey, ASN1_BIT_STRING, 1) 269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} ASN1_SEQUENCE_END(EC_PRIVATEKEY) 270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) 272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY) 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgIMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* some declarations of internal function */ 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ec_asn1_group2field() sets the values in a X9_62_FIELDID object */ 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ec_asn1_group2fieldid(const EC_GROUP *, X9_62_FIELDID *); 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ec_asn1_group2curve() sets the values in a X9_62_CURVE object */ 280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ec_asn1_group2curve(const EC_GROUP *, X9_62_CURVE *); 281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ec_asn1_parameters2group() creates a EC_GROUP object from a 282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ECPARAMETERS object */ 283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *); 284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ec_asn1_group2parameters() creates a ECPARAMETERS object from a 285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * EC_GROUP object */ 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *,ECPARAMETERS *); 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ec_asn1_pkparameters2group() creates a EC_GROUP object from a 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ECPKPARAMETERS object */ 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *); 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * EC_GROUP object */ 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *, 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS *); 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* the function definitions */ 297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) 299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok=0, nid; 301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *tmp = NULL; 302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (group == NULL || field == NULL) 304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* clear the old values (if necessary) */ 307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field->fieldType != NULL) 308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OBJECT_free(field->fieldType); 309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field->p.other != NULL) 310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_TYPE_free(field->p.other); 311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); 313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set OID for the field */ 314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((field->fieldType = OBJ_nid2obj(nid)) == NULL) 315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); 317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (nid == NID_X9_62_prime_field) 321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((tmp = BN_new()) == NULL) 323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); 325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* the parameters are specified by the prime number p */ 328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) 329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); 331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the prime number */ 334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org field->p.prime = BN_to_ASN1_INTEGER(tmp,NULL); 335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field->p.prime == NULL) 336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_ASN1_LIB); 338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else /* nid == NID_X9_62_characteristic_two_field */ 3422c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#ifdef OPENSSL_NO_EC2M 3432c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org { 3442c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, EC_R_GF2M_NOT_SUPPORTED); 3452c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org goto err; 3462c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org } 3472c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#else 348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int field_type; 350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_CHARACTERISTIC_TWO *char_two; 351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org field->p.char_two = X9_62_CHARACTERISTIC_TWO_new(); 353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two = field->p.char_two; 354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (char_two == NULL) 356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); 358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->m = (long)EC_GROUP_get_degree(group); 362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org field_type = EC_GROUP_get_basis_type(group); 364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field_type == 0) 366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); 368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set base type OID */ 371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((char_two->type = OBJ_nid2obj(field_type)) == NULL) 372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); 374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field_type == NID_X9_62_tpBasis) 378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned int k; 380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_get_trinomial_basis(group, &k)) 382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->p.tpBasis = ASN1_INTEGER_new(); 385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!char_two->p.tpBasis) 386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); 388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(char_two->p.tpBasis, (long)k)) 391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, 393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_ASN1_LIB); 394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (field_type == NID_X9_62_ppBasis) 398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned int k1, k2, k3; 400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 401c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)) 402c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 403c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 404c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->p.ppBasis = X9_62_PENTANOMIAL_new(); 405c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!char_two->p.ppBasis) 406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 407c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); 408c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 410c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set k? values */ 412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->p.ppBasis->k1 = (long)k1; 413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->p.ppBasis->k2 = (long)k2; 414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->p.ppBasis->k3 = (long)k3; 415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 416c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else /* field_type == NID_X9_62_onBasis */ 417c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 418c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* for ONB the parameters are (asn1) NULL */ 419c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two->p.onBasis = ASN1_NULL_new(); 420c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!char_two->p.onBasis) 421c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 422c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); 423c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 424c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 425c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 426c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 4272c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#endif 428c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 429c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 1; 430c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr : if (tmp) 432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(tmp); 433c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ok); 434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} 435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) 437c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 438c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok=0, nid; 439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *tmp_1=NULL, *tmp_2=NULL; 440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char *buffer_1=NULL, *buffer_2=NULL, 441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *a_buf=NULL, *b_buf=NULL; 442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org size_t len_1, len_2; 443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char char_zero = 0; 444c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 445c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!group || !curve || !curve->a || !curve->b) 446c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 447c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 448c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((tmp_1 = BN_new()) == NULL || (tmp_2 = BN_new()) == NULL) 449c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 450c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); 451c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 452c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 453c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 454c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); 455c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 456c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* get a and b */ 457c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (nid == NID_X9_62_prime_field) 458c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 459c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL)) 460c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 461c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); 462c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 463c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 464c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 4652c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#ifndef OPENSSL_NO_EC2M 466c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else /* nid == NID_X9_62_characteristic_two_field */ 467c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 468c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) 469c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 470c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); 471c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 472c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 473c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 4742c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#endif 475c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org len_1 = (size_t)BN_num_bytes(tmp_1); 476c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org len_2 = (size_t)BN_num_bytes(tmp_2); 477c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 478c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (len_1 == 0) 479c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 480c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* len_1 == 0 => a == 0 */ 481c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a_buf = &char_zero; 482c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org len_1 = 1; 483c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 484c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 485c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 486c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((buffer_1 = OPENSSL_malloc(len_1)) == NULL) 487c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 488c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, 489c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 490c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 491c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 492c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ( (len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) 493c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 494c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); 495c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 496c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 497c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a_buf = buffer_1; 498c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 499c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 500c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (len_2 == 0) 501c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 502c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* len_2 == 0 => b == 0 */ 503c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b_buf = &char_zero; 504c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org len_2 = 1; 505c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 506c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 507c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 508c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((buffer_2 = OPENSSL_malloc(len_2)) == NULL) 509c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 510c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, 511c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 512c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 513c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 514c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ( (len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) 515c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 516c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); 517c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 518c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 519c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b_buf = buffer_2; 520c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 521c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 522c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set a and b */ 523c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!M_ASN1_OCTET_STRING_set(curve->a, a_buf, len_1) || 524c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org !M_ASN1_OCTET_STRING_set(curve->b, b_buf, len_2)) 525c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 526c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB); 527c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 528c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 529c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 530c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the seed (optional) */ 531c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (group->seed) 532c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 533c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!curve->seed) 534c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((curve->seed = ASN1_BIT_STRING_new()) == NULL) 535c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 536c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); 537c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 538c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 539c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); 540c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT; 541c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_BIT_STRING_set(curve->seed, group->seed, 542c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org (int)group->seed_len)) 543c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 544c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB); 545c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 546c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 547c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 548c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 549c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 550c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (curve->seed) 551c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 552c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_BIT_STRING_free(curve->seed); 553c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org curve->seed = NULL; 554c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 555c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 556c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 557c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 1; 558c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 559c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: if (buffer_1) 560c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(buffer_1); 561c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (buffer_2) 562c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(buffer_2); 563c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp_1) 564c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(tmp_1); 565c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp_2) 566c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(tmp_2); 567c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ok); 568c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 569c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 570c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group, 571c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPARAMETERS *param) 572c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 573c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok=0; 574c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org size_t len=0; 575c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPARAMETERS *ret=NULL; 576c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *tmp=NULL; 577c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char *buffer=NULL; 578c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org const EC_POINT *point=NULL; 579c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org point_conversion_form_t form; 580c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 581c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((tmp = BN_new()) == NULL) 582c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 583c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); 584c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 585c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 586c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 587c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (param == NULL) 588c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 589c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = ECPARAMETERS_new()) == NULL) 590c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 591c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, 592c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 593c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 594c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 595c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 596c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 597c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = param; 598c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 599c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the version (always one) */ 600c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->version = (long)0x1; 601c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 602c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the fieldID */ 603c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ec_asn1_group2fieldid(group, ret->fieldID)) 604c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 605c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); 606c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 607c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 608c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 609c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the curve */ 610c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ec_asn1_group2curve(group, ret->curve)) 611c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 612c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); 613c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 614c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 615c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 616c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the base point */ 617c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((point = EC_GROUP_get0_generator(group)) == NULL) 618c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 619c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, EC_R_UNDEFINED_GENERATOR); 620c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 621c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 622c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 623c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org form = EC_GROUP_get_point_conversion_form(group); 624c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 625c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org len = EC_POINT_point2oct(group, point, form, NULL, len, NULL); 626c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (len == 0) 627c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 628c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); 629c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 630c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 631c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((buffer = OPENSSL_malloc(len)) == NULL) 632c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 633c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); 634c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 635c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 636c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL)) 637c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 638c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); 639c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 640c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 641c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL) 642c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 643c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); 644c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 645c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 646c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_OCTET_STRING_set(ret->base, buffer, len)) 647c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 648c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); 649c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 650c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 651c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 652c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the order */ 653c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_get_order(group, tmp, NULL)) 654c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 655c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); 656c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 657c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 658c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->order = BN_to_ASN1_INTEGER(tmp, ret->order); 659c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->order == NULL) 660c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 661c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); 662c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 663c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 664c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 665c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the cofactor (optional) */ 666c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (EC_GROUP_get_cofactor(group, tmp, NULL)) 667c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 668c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor); 669c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->cofactor == NULL) 670c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 671c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); 672c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 673c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 674c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 675c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 676c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 1; 677c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 678c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr : if(!ok) 679c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 680c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret && !param) 681c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPARAMETERS_free(ret); 682c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = NULL; 683c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 684c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp) 685c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(tmp); 686c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (buffer) 687c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(buffer); 688c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 689c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 690c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 691c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *group, 692c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS *params) 693c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 694c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok = 1, tmp; 695c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS *ret = params; 696c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 697c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret == NULL) 698c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 699c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = ECPKPARAMETERS_new()) == NULL) 700c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 701c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_GROUP2PKPARAMETERS, 702c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 703c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 704c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 705c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 706c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 707c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 708c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->type == 0 && ret->value.named_curve) 709c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OBJECT_free(ret->value.named_curve); 710c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (ret->type == 1 && ret->value.parameters) 711c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPARAMETERS_free(ret->value.parameters); 712c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 713c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 714c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (EC_GROUP_get_asn1_flag(group)) 715c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 716c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* use the asn1 OID to describe the 717c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the elliptic curve parameters 718c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 719c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tmp = EC_GROUP_get_curve_name(group); 720c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp) 721c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 722c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->type = 0; 723c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL) 724c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 0; 725c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 726c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 727c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* we don't kmow the nid => ERROR */ 728c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 0; 729c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 730c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 731c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 732c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* use the ECPARAMETERS structure */ 733c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->type = 1; 734c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret->value.parameters = ec_asn1_group2parameters( 735c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org group, NULL)) == NULL) 736c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 0; 737c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 738c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 739c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ok) 740c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 741c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS_free(ret); 742c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 743c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 744c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return ret; 745c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 746c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 747c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) 748c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 749c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok = 0, tmp; 750c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP *ret = NULL; 751c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *p = NULL, *a = NULL, *b = NULL; 752c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_POINT *point=NULL; 753c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long field_bits; 754c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 755c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!params->fieldID || !params->fieldID->fieldType || 756c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org !params->fieldID->p.ptr) 757c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 758c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 759c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 760c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 761c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 762c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* now extract the curve parameters a and b */ 763c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!params->curve || !params->curve->a || 764c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org !params->curve->a->data || !params->curve->b || 765c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org !params->curve->b->data) 766c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 767c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 768c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 769c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 770c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a = BN_bin2bn(params->curve->a->data, params->curve->a->length, NULL); 771c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL) 772c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 773c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); 774c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 775c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 776c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL); 777c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (b == NULL) 778c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 779c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); 780c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 781c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 782c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 783c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* get the field parameters */ 784c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tmp = OBJ_obj2nid(params->fieldID->fieldType); 785c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp == NID_X9_62_characteristic_two_field) 7862c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#ifdef OPENSSL_NO_EC2M 7872c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org { 7882c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_GF2M_NOT_SUPPORTED); 7892c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org goto err; 7902c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org } 7912c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#else 792c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 793c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_CHARACTERISTIC_TWO *char_two; 794c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 795c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char_two = params->fieldID->p.char_two; 796c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 797c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org field_bits = char_two->m; 798c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) 799c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 800c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); 801c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 802c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 803c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 804c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p = BN_new()) == NULL) 805c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 806c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE); 807c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 808c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 809c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 810c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* get the base type */ 811c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tmp = OBJ_obj2nid(char_two->type); 812c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 813c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp == NID_X9_62_tpBasis) 814c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 815c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long tmp_long; 816c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 817c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!char_two->p.tpBasis) 818c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 819c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 820c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 821c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 822c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 823c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis); 824c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 825c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(char_two->m > tmp_long && tmp_long > 0)) 826c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 827c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_TRINOMIAL_BASIS); 828c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 829c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 830c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 831c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* create the polynomial */ 832c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, (int)char_two->m)) 833c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 834c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, (int)tmp_long)) 835c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 836c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, 0)) 837c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 838c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 839c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (tmp == NID_X9_62_ppBasis) 840c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 841c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X9_62_PENTANOMIAL *penta; 842c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 843c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org penta = char_two->p.ppBasis; 844c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!penta) 845c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 846c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 847c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 848c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 849c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 850c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0)) 851c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 852c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_PENTANOMIAL_BASIS); 853c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 854c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 855c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 856c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* create the polynomial */ 857c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, (int)char_two->m)) goto err; 858c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, (int)penta->k1)) goto err; 859c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, (int)penta->k2)) goto err; 860c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, (int)penta->k3)) goto err; 861c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_set_bit(p, 0)) goto err; 862c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 863c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (tmp == NID_X9_62_onBasis) 864c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 865c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_NOT_IMPLEMENTED); 866c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 867c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 868c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else /* error */ 869c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 870c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 871c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 872c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 873c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 874c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* create the EC_GROUP structure */ 875c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL); 876c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 8772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#endif 878c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (tmp == NID_X9_62_prime_field) 879c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 880c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* we have a curve over a prime field */ 881c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* extract the prime number */ 882c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!params->fieldID->p.prime) 883c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 884c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 885c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 886c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 887c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p = ASN1_INTEGER_to_BN(params->fieldID->p.prime, NULL); 888c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (p == NULL) 889c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 890c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); 891c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 892c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 893c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 894c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_is_negative(p) || BN_is_zero(p)) 895c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 896c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); 897c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 898c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 899c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 900c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org field_bits = BN_num_bits(p); 901c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) 902c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 903c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); 904c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 905c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 906c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 907c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* create the EC_GROUP structure */ 908c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = EC_GROUP_new_curve_GFp(p, a, b, NULL); 909c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 910c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 911c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 912c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); 913c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 914c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 915c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 916c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret == NULL) 917c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 918c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); 919c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 920c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 921c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 922c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* extract seed (optional) */ 923c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (params->curve->seed != NULL) 924c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 925c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->seed != NULL) 926c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(ret->seed); 927c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(ret->seed = OPENSSL_malloc(params->curve->seed->length))) 928c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 929c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, 930c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 931c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 932c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 933c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org memcpy(ret->seed, params->curve->seed->data, 934c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org params->curve->seed->length); 935c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->seed_len = params->curve->seed->length; 936c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 937c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 938c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!params->order || !params->base || !params->base->data) 939c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 940c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); 941c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 942c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 943c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 944c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((point = EC_POINT_new(ret)) == NULL) goto err; 945c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 946c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the point conversion form */ 947c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP_set_point_conversion_form(ret, (point_conversion_form_t) 948c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org (params->base->data[0] & ~0x01)); 949c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 950c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* extract the ec point */ 951c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_POINT_oct2point(ret, point, params->base->data, 952c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org params->base->length, NULL)) 953c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 954c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); 955c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 956c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 957c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 958c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* extract the order */ 959c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((a = ASN1_INTEGER_to_BN(params->order, a)) == NULL) 960c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 961c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); 962c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 963c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 964c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_is_negative(a) || BN_is_zero(a)) 965c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 966c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); 967c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 968c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 969c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_num_bits(a) > (int)field_bits + 1) /* Hasse bound */ 970c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 971c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); 972c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 973c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 974c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 975c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* extract the cofactor (optional) */ 976c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (params->cofactor == NULL) 977c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 978c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (b) 979c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 980c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(b); 981c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b = NULL; 982c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 983c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 984c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 985c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((b = ASN1_INTEGER_to_BN(params->cofactor, b)) == NULL) 986c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 987c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); 988c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 989c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 990c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* set the generator, order and cofactor (if present) */ 991c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_GROUP_set_generator(ret, point, a, b)) 992c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 993c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); 994c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 995c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 996c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 997c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 1; 998c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 999c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: if (!ok) 1000c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1001c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret) 1002c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP_clear_free(ret); 1003c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = NULL; 1004c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1005c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1006c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (p) 1007c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(p); 1008c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a) 1009c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(a); 1010c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (b) 1011c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_free(b); 1012c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (point) 1013c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_POINT_free(point); 1014c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 1015c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} 1016c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1017c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgEC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *params) 1018c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1019c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP *ret=NULL; 1020c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int tmp=0; 1021c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1022c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (params == NULL) 1023c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1024c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, 1025c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_R_MISSING_PARAMETERS); 1026c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1027c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1028c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1029c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (params->type == 0) 1030c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { /* the curve is given by an OID */ 1031c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tmp = OBJ_obj2nid(params->value.named_curve); 1032c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL) 1033c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1034c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, 1035c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_R_EC_GROUP_NEW_BY_NAME_FAILURE); 1036c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1037c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1038c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE); 1039c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1040c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (params->type == 1) 1041c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { /* the parameters are given by a ECPARAMETERS 1042c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * structure */ 1043c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = ec_asn1_parameters2group(params->value.parameters); 1044c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ret) 1045c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1046c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, ERR_R_EC_LIB); 1047c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1048c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1049c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP_set_asn1_flag(ret, 0x0); 1050c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1051c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (params->type == 2) 1052c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { /* implicitlyCA */ 1053c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1054c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1055c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 1056c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1057c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, EC_R_ASN1_ERROR); 1058c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1059c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1060c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1061c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return ret; 1062c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1063c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1064c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* EC_GROUP <-> DER encoding of ECPKPARAMETERS */ 1065c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1066c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgEC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len) 1067c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1068c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP *group = NULL; 1069c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS *params = NULL; 1070c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1071c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) 1072c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1073c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE); 1074c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS_free(params); 1075c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1076c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1077c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1078c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((group = ec_asn1_pkparameters2group(params)) == NULL) 1079c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1080c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); 10812c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org ECPKPARAMETERS_free(params); 1082c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1083c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1084c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1085c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1086c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a && *a) 1087c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP_clear_free(*a); 1088c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a) 1089c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *a = group; 1090c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1091c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS_free(params); 1092c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(group); 1093c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1094c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1095c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint i2d_ECPKParameters(const EC_GROUP *a, unsigned char **out) 1096c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1097c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=0; 1098c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS *tmp = ec_asn1_group2pkparameters(a, NULL); 1099c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp == NULL) 1100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_GROUP2PKPARAMETERS_FAILURE); 1102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = i2d_ECPKPARAMETERS(tmp, out)) == 0) 1105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_I2D_ECPKPARAMETERS_FAILURE); 1107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS_free(tmp); 1108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECPKPARAMETERS_free(tmp); 1111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 1112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* some EC_KEY functions */ 1115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgEC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len) 1117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok=0; 1119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_KEY *ret=NULL; 1120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_PRIVATEKEY *priv_key=NULL; 1121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((priv_key = EC_PRIVATEKEY_new()) == NULL) 1123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); 1125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((priv_key = d2i_EC_PRIVATEKEY(&priv_key, in, len)) == NULL) 1129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); 1131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_PRIVATEKEY_free(priv_key); 1132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL || *a == NULL) 1136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = EC_KEY_new()) == NULL) 1138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, 1140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 1141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a) 1144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *a = ret; 1145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 1147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = *a; 1148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (priv_key->parameters) 1150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->group) 1152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_GROUP_clear_free(ret->group); 1153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->group = ec_asn1_pkparameters2group(priv_key->parameters); 1154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->group == NULL) 1157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); 1159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->version = priv_key->version; 1163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (priv_key->privateKey) 1165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->priv_key = BN_bin2bn( 1167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org M_ASN1_STRING_data(priv_key->privateKey), 1168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org M_ASN1_STRING_length(priv_key->privateKey), 1169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->priv_key); 1170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->priv_key == NULL) 1171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, 1173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_BN_LIB); 1174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 1178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, 1180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_R_MISSING_PRIVATE_KEY); 1181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (priv_key->publicKey) 1185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org const unsigned char *pub_oct; 1187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org size_t pub_oct_len; 1188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->pub_key) 1190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_POINT_clear_free(ret->pub_key); 1191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->pub_key = EC_POINT_new(ret->group); 1192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->pub_key == NULL) 1193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); 1195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pub_oct = M_ASN1_STRING_data(priv_key->publicKey); 1198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pub_oct_len = M_ASN1_STRING_length(priv_key->publicKey); 1199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* save the point conversion form */ 1200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->conv_form = (point_conversion_form_t)(pub_oct[0] & ~0x01); 1201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_POINT_oct2point(ret->group, ret->pub_key, 1202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pub_oct, pub_oct_len, NULL)) 1203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); 1205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 1; 1210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 1211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ok) 1212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret) 1214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_KEY_free(ret); 1215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = NULL; 1216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (priv_key) 1219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_PRIVATEKEY_free(priv_key); 1220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 1222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint i2d_ECPrivateKey(EC_KEY *a, unsigned char **out) 1225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=0, ok=0; 1227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char *buffer=NULL; 1228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org size_t buf_len=0, tmp_len; 1229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_PRIVATEKEY *priv_key=NULL; 1230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL || a->group == NULL || a->priv_key == NULL) 1232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, 1234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_PASSED_NULL_PARAMETER); 1235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((priv_key = EC_PRIVATEKEY_new()) == NULL) 1239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, 1241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 1242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org priv_key->version = a->version; 1246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf_len = (size_t)BN_num_bytes(a->priv_key); 1248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buffer = OPENSSL_malloc(buf_len); 1249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (buffer == NULL) 1250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, 1252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 1253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!BN_bn2bin(a->priv_key, buffer)) 1257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_BN_LIB); 1259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!M_ASN1_OCTET_STRING_set(priv_key->privateKey, buffer, buf_len)) 1263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB); 1265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) 1269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((priv_key->parameters = ec_asn1_group2pkparameters( 1271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a->group, priv_key->parameters)) == NULL) 1272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); 1274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(a->enc_flag & EC_PKEY_NO_PUBKEY)) 1279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org priv_key->publicKey = M_ASN1_BIT_STRING_new(); 1281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (priv_key->publicKey == NULL) 1282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, 1284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_MALLOC_FAILURE); 1285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tmp_len = EC_POINT_point2oct(a->group, a->pub_key, 1289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a->conv_form, NULL, 0, NULL); 1290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (tmp_len > buf_len) 1292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char *tmp_buffer = OPENSSL_realloc(buffer, tmp_len); 1294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!tmp_buffer) 1295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); 1297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buffer = tmp_buffer; 1300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf_len = tmp_len; 1301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_POINT_point2oct(a->group, a->pub_key, 1304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a->conv_form, buffer, buf_len, NULL)) 1305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); 1307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); 1311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT; 1312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!M_ASN1_BIT_STRING_set(priv_key->publicKey, buffer, 1313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf_len)) 1314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB); 1316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = i2d_EC_PRIVATEKEY(priv_key, out)) == 0) 1321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); 1323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 1324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok=1; 1326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 1327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (buffer) 1328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(buffer); 1329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (priv_key) 1330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_PRIVATEKEY_free(priv_key); 1331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ok?ret:0); 1332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint i2d_ECParameters(EC_KEY *a, unsigned char **out) 1335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL) 1337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2D_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER); 1339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return i2d_ECPKParameters(a->group, out); 1342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgEC_KEY *d2i_ECParameters(EC_KEY **a, const unsigned char **in, long len) 1345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_KEY *ret; 1347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (in == NULL || *in == NULL) 1349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER); 1351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL || *a == NULL) 1355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret = EC_KEY_new()) == NULL) 1357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE); 1359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a) 1362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *a = ret; 1363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 1365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = *a; 1366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!d2i_ECPKParameters(&ret->group, in, len)) 1368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB); 1370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return NULL; 1371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return ret; 1374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgEC_KEY *o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len) 1377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EC_KEY *ret=NULL; 1379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL || (*a) == NULL || (*a)->group == NULL) 1381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* sorry, but a EC_GROUP-structur is necessary 1383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * to set the public key */ 1384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER); 1385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = *a; 1388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret->pub_key == NULL && 1389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org (ret->pub_key = EC_POINT_new(ret->group)) == NULL) 1390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_MALLOC_FAILURE); 1392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL)) 1395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_EC_LIB); 1397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* save the point conversion form */ 1400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->conv_form = (point_conversion_form_t)(*in[0] & ~0x01); 1401c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *in += len; 1402c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return ret; 1403c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1404c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1405c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint i2o_ECPublicKey(EC_KEY *a, unsigned char **out) 1406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1407c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org size_t buf_len=0; 1408c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int new_buffer = 0; 1409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1410c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL) 1411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER); 1413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1416c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf_len = EC_POINT_point2oct(a->group, a->pub_key, 1417c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a->conv_form, NULL, 0, NULL); 1418c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1419c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (out == NULL || buf_len == 0) 1420c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* out == NULL => just return the length of the octet string */ 1421c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return buf_len; 1422c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 1423c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*out == NULL) 1424c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1425c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((*out = OPENSSL_malloc(buf_len)) == NULL) 1426c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1427c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_MALLOC_FAILURE); 1428c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1429c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1430c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org new_buffer = 1; 1431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form, 1433c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *out, buf_len, NULL)) 1434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 1435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_EC_LIB); 1436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(*out); 1437c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *out = NULL; 1438c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 1439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!new_buffer) 1441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *out += buf_len; 1442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return buf_len; 1443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 1444