|
|
|
|
|
|
|
|
|
|
|
|
|
import Standards.ASN1.Types; |
|
private object ECDSA; |
|
|
|
|
|
Crypto.Sign.State parse_private_key(Sequence seq) |
{ |
if ((sizeof(seq->elements) < 3) || |
(sizeof(seq->elements) > 4) || |
(seq->elements[1]->type_name != "SEQUENCE") || |
(seq->elements[2]->type_name != "OCTET STRING") || |
(seq->elements[0]->type_name != "INTEGER") || |
(seq->elements[0]->value) || |
(sizeof(seq->elements[1]->elements) != 2) || |
(seq->elements[1]->elements[0]->type_name != "OBJECT IDENTIFIER")) |
return UNDEFINED; |
|
|
Identifier alg_id = seq->elements[1]->elements[0]; |
if (alg_id == .Identifiers.rsa_id) { |
return .RSA.parse_private_key(seq->elements[2]->value); |
} |
if (alg_id == .Identifiers.dsa_id) { |
return .DSA.parse_private_key(seq->elements[2]->value); |
} |
#if constant(Crypto.ECC.Curve) |
|
if ((alg_id == .Identifiers.ec_id) || |
(alg_id == .Identifiers.ec_dh_id) || |
(alg_id == .Identifiers.ec_mqw_id)) { |
if(!ECDSA) |
ECDSA = master()->resolv("Standards.PKCS.ECDSA"); |
Crypto.ECC.Curve curve = |
ECDSA.parse_ec_parameters(seq->elements[1]->elements[1]); |
return ECDSA.parse_private_key(seq->elements[2]->value, curve); |
} |
#endif /* Crypto.ECC.Curve */ |
return UNDEFINED; |
} |
|
|
variant Crypto.Sign.State parse_private_key(string key) |
{ |
Object a = Standards.ASN1.Decode.simple_der_decode(key); |
|
if (!a || (a->type_name != "SEQUENCE")) |
return UNDEFINED; |
return parse_private_key([object(Sequence)]a); |
} |
|
|
|