aboutsummaryrefslogtreecommitdiffstats
path: root/src/pubkey/ec_dompar/ec_dompar.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2010-03-19 17:59:40 +0000
committerlloyd <[email protected]>2010-03-19 17:59:40 +0000
commitdab16b79c89e54e9551d30dcf54ca89432932dce (patch)
treefcd4ccce7e442006f8075f8c8a9b298aab5167b3 /src/pubkey/ec_dompar/ec_dompar.cpp
parent8fa0099ce0f2f488ca4c5046c6d019125d1d3b68 (diff)
Add a couple of new helper functions to BER_Decoder:
decode_and_check takes an expected value; if the decoded value does not match, a Decoding_Error with a specified string is thrown. Useful for checking embedded version codes. decode_octet_string_bigint is for decoding INTEGER values that are stored as OCTET STRINGs. Totally obnoxious and useless, but common especially in the ECC standards.
Diffstat (limited to 'src/pubkey/ec_dompar/ec_dompar.cpp')
-rw-r--r--src/pubkey/ec_dompar/ec_dompar.cpp27
1 files changed, 7 insertions, 20 deletions
diff --git a/src/pubkey/ec_dompar/ec_dompar.cpp b/src/pubkey/ec_dompar/ec_dompar.cpp
index 42ae9211e..3512060d1 100644
--- a/src/pubkey/ec_dompar/ec_dompar.cpp
+++ b/src/pubkey/ec_dompar/ec_dompar.cpp
@@ -54,23 +54,20 @@ EC_Domain_Params::EC_Domain_Params(const MemoryRegion<byte>& ber_data)
}
else if(obj.type_tag == SEQUENCE)
{
- BigInt ecpVers1(1);
- OID curve_type;
- SecureVector<byte> sv_a;
- SecureVector<byte> sv_b;
- BigInt p;
+ BigInt p, a, b;
SecureVector<byte> sv_base_point;
BER_Decoder(ber_data)
.start_cons(SEQUENCE)
- .decode(ecpVers1)
+ .decode_and_check<u32bit>(1, "Unknown ECC param version code")
.start_cons(SEQUENCE)
- .decode(curve_type)
+ .decode_and_check(OID("1.2.840.10045.1.1"),
+ "Only prime ECC fields supported")
.decode(p)
.end_cons()
.start_cons(SEQUENCE)
- .decode(sv_a, OCTET_STRING)
- .decode(sv_b, OCTET_STRING)
+ .decode_octet_string_bigint(a)
+ .decode_octet_string_bigint(b)
.end_cons()
.decode(sv_base_point, OCTET_STRING)
.decode(order)
@@ -78,17 +75,7 @@ EC_Domain_Params::EC_Domain_Params(const MemoryRegion<byte>& ber_data)
.end_cons()
.verify_end();
- if(ecpVers1 != 1)
- throw Decoding_Error("EC_Domain_Params: Unknown version code");
-
- // Only prime curves supported
- if(curve_type.as_string() != "1.2.840.10045.1.1")
- throw Decoding_Error("Unexpected curve type " + curve_type.as_string());
-
- curve = CurveGFp(p,
- BigInt::decode(sv_a, sv_a.size()),
- BigInt::decode(sv_b, sv_b.size()));
-
+ curve = CurveGFp(p, a, b);
base_point = OS2ECP(sv_base_point, curve);
base_point.check_invariants();
}