Fix the BIT STRING encoding of EC points or parameter seeds

(need to prevent the removal of trailing zero bits).
This commit is contained in:
Bodo Möller 2006-12-19 15:10:46 +00:00
parent 9d5460d72d
commit 1a8521ff24
2 changed files with 12 additions and 0 deletions

View File

@ -4,6 +4,14 @@
Changes between 0.9.8d and 0.9.8e [XX xxx XXXX] Changes between 0.9.8d and 0.9.8e [XX xxx XXXX]
*) Fix the BIT STRING encoding generated by crypto/ec/ec_asn1.c
(within i2d_ECPrivateKey, i2d_ECPKParameters, i2d_ECParameters):
When a point or a seed is encoded in a BIT STRING, we need to
prevent the removal of trailing zero bits to get the proper DER
encoding. (By default, crypto/asn1/a_bitstr.c assumes the case
of a NamedBitList, for which trailing 0 bits need to be removed.)
[Bodo Moeller]
*) Have SSL/TLS server implementation tolerate "mismatched" record *) Have SSL/TLS server implementation tolerate "mismatched" record
protocol version while receiving ClientHello even if the protocol version while receiving ClientHello even if the
ClientHello is fragmented. (The server can't insist on the ClientHello is fragmented. (The server can't insist on the

View File

@ -529,6 +529,8 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE);
goto err; goto err;
} }
curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);
curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT;
if (!ASN1_BIT_STRING_set(curve->seed, group->seed, if (!ASN1_BIT_STRING_set(curve->seed, group->seed,
(int)group->seed_len)) (int)group->seed_len))
{ {
@ -1291,6 +1293,8 @@ int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out)
goto err; goto err;
} }
priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);
priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT;
if (!M_ASN1_BIT_STRING_set(priv_key->publicKey, buffer, if (!M_ASN1_BIT_STRING_set(priv_key->publicKey, buffer,
buf_len)) buf_len))
{ {