+ else /* nid == NID_X9_62_characteristic_two_field */
+ {
+ int field_type;
+
+ char_two = X9_62_CHARACTERISTIC_TWO_new();
+ if (char_two == NULL)
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+
+ char_two->m = (long)EC_GROUP_get_degree(group);
+
+ field_type = EC_GROUP_get_basis_type(group);
+
+ if (field_type == 0)
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB);
+ goto err;
+ }
+ /* set base type OID */
+ if ((char_two->basis = OBJ_nid2obj(field_type)) == NULL)
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB);
+ goto err;
+ }
+
+ if (field_type == NID_X9_62_tpBasis)
+ {
+ unsigned int k;
+
+ if (!EC_GROUP_get_trinomial_basis(group, &k))
+ goto err;
+
+ char_two->parameters->type = V_ASN1_INTEGER;
+ char_two->parameters->value.integer =
+ ASN1_INTEGER_new();
+ if (char_two->parameters->value.integer == NULL)
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2FIELDID,
+ ERR_R_ASN1_LIB);
+ goto err;
+ }
+ if (!ASN1_INTEGER_set(char_two->parameters->value.integer, (long)k))
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS,
+ ERR_R_ASN1_LIB);
+ goto err;
+ }
+ }
+ else if (field_type == NID_X9_62_ppBasis)
+ {
+ unsigned int k1, k2, k3;
+
+ if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3))
+ goto err;
+
+ penta = X9_62_PENTANOMIAL_new();
+ /* set k? values */
+ penta->k1 = (long)k1;
+ penta->k2 = (long)k2;
+ penta->k3 = (long)k3;
+ /* get the length of the encoded structure */
+ buf_len = i2d_X9_62_PENTANOMIAL(penta, NULL);
+ if ((buffer = OPENSSL_malloc(buf_len)) == NULL)
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2FIELDID,
+ ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ pp = buffer;
+ i2d_X9_62_PENTANOMIAL(penta, &pp);
+ /* set the encoded pentanomial */
+ char_two->parameters->type=V_ASN1_SEQUENCE;
+ char_two->parameters->value.sequence=ASN1_STRING_new();
+ ASN1_STRING_set(char_two->parameters->value.sequence,
+ buffer, buf_len);
+
+ OPENSSL_free(buffer);
+ buffer = NULL;
+ }
+ else /* field_type == NID_X9_62_onBasis */
+ {
+ /* for ONB the parameters are (asn1) NULL */
+ char_two->parameters->type = V_ASN1_NULL;
+ }
+ /* encoded the X9_62_CHARACTERISTIC_TWO structure */
+ buf_len = i2d_X9_62_CHARACTERISTIC_TWO(char_two, NULL);
+
+ if ((buffer = OPENSSL_malloc(buf_len)) == NULL)
+ {
+ ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ pp = buffer;
+ i2d_X9_62_CHARACTERISTIC_TWO(char_two, &pp);
+ /* set the encoded parameters */
+ ret->parameters->type = V_ASN1_SEQUENCE;
+ ret->parameters->value.sequence = ASN1_STRING_new();
+ ASN1_STRING_set(ret->parameters->value.sequence,
+ buffer, buf_len);
+ }