move ECC ASN1 that is not specific to ECDSA into crypto/ec/,
[openssl.git] / crypto / ec / ec_lib.c
index f469b679d86affa93a19cc292e8122a8adde3bb5..06d45e998f8326b0aa3d6d2afed1fd4f4a4f76ab 100644 (file)
@@ -99,6 +99,10 @@ EC_GROUP *EC_GROUP_new(const EC_METHOD *meth)
        BN_init(&ret->cofactor);
 
        ret->nid = 0;   
+       ret->asn1_flag = OPENSSL_EC_EXPLICIT | OPENSSL_EC_COMPRESSED;
+
+       ret->seed = NULL;
+       ret->seed_len = 0;
 
        if (!meth->group_init(ret))
                {
@@ -124,6 +128,9 @@ void EC_GROUP_free(EC_GROUP *group)
        BN_free(&group->order);
        BN_free(&group->cofactor);
 
+       if (group->seed)
+               OPENSSL_free(group->seed);
+
        OPENSSL_free(group);
        }
  
@@ -144,6 +151,12 @@ void EC_GROUP_clear_free(EC_GROUP *group)
        BN_clear_free(&group->order);
        BN_clear_free(&group->cofactor);
 
+       if (group->seed)
+               {
+               memset(group->seed, 0, group->seed_len);
+               OPENSSL_free(group->seed);
+               }
+
        memset(group, 0, sizeof *group);
        OPENSSL_free(group);
        }
@@ -202,6 +215,27 @@ int EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src)
        if (!BN_copy(&dest->cofactor, &src->cofactor)) return 0;
 
        dest->nid = src->nid;
+       dest->asn1_flag = src->asn1_flag;
+
+       if (src->seed)
+               {
+               if (dest->seed)
+                       OPENSSL_free(dest->seed);
+               dest->seed = OPENSSL_malloc(src->seed_len);
+               if (dest->seed == NULL)
+                       return 0;
+               if (!memcpy(dest->seed, src->seed, src->seed_len))
+                       return 0;
+               dest->seed_len = src->seed_len;
+               }
+       else
+               {
+               if (dest->seed)
+                       OPENSSL_free(dest->seed);
+               dest->seed = NULL;
+               dest->seed_len = 0;
+               }
+       
 
        return dest->meth->group_copy(dest, src);
        }
@@ -213,6 +247,12 @@ const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group)
        }
 
 
+int EC_METHOD_get_field_type(const EC_METHOD *meth)
+        {
+        return meth->field_type;
+        }
+
+
 int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor)
        {
        if (generator == NULL)
@@ -278,6 +318,18 @@ int EC_GROUP_get_nid(const EC_GROUP *group)
        }
 
 
+void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag)
+       {
+       group->asn1_flag = flag;
+       }
+
+
+int EC_GROUP_get_asn1_flag(const EC_GROUP *group)
+       {
+       return group->asn1_flag;
+       }
+
+
 int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
        {
        if (group->meth->group_set_curve_GFp == 0)