LCOV - code coverage report
Current view: top level - ec - ec_asn1.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 49 586 8.4 %
Date: 2014-08-02 Functions: 6 31 19.4 %
Branches: 26 456 5.7 %

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

Generated by: LCOV version 1.9