RustCrypto / formats

Cryptography-related format encoders/decoders: DER, PEM, PKCS, PKIX
228 stars 122 forks source link

Can not parse some pem data #1364

Closed ZhanhuaJin closed 4 months ago

ZhanhuaJin commented 4 months ago

Hello! I wrote small code to decode private key from pem data. const SAMPLE: str = "-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgaWJBcVYaYzQN4OfY afKgVJJVjhoEhotqn4VKhmeIGI2hRANCAAQcrP+1Xy8s79idies3SyaBFSRSgC3u oJkWBoE32DnPf8SBpESSME1+9mrBF77+g6jQjxVfK1L59hjdRHApBI4P -----END PRIVATE KEY----- "; let priv_key = parse(SAMPLE).unwrap(); let private_key: PrivateKeyInfo = PrivateKeyInfo::try_from(priv_key.contents()).unwrap(); println!("Algorithm: {:?}", private_key.algorithm.oid); println!("Private key: {:?}", private_key.private_key); println!("Public key: {:?}", private_key.public_key);

This code could run correctly. If I change SAMPLE TO: const SAMPLE: str = "-----BEGIN RSA PRIVATE KEY----- MIIBPQIBAAJBAOsfi5AGYhdRs/x6q5H7kScxA0Kzzqe6WI6gf6+tc6IvKQJo5rQc dWWSQ0nRGt2hOPDO+35NKhQEjBQxPh/v7n0CAwEAAQJBAOGaBAyuw0ICyENy5NsO 2gkT00AWTSzM9Zns0HedY31yEabkuFvrMCHjscEF7u3Y6PB7An3IzooBHchsFDei AAECIQD/JahddzR5K3A6rzTidmAf1PBtqi7296EnWv8WvpfAAQIhAOvowIXZI4Un DXjgZ9ekuUjZN+GUQRAVlkEEohGLVy59AiEA90VtqDdQuWWpvJX0cM08V10tLXrT TTGsEtITid1ogAECIQDAaFl90ZgS5cMrL3wCeatVKzVUmuJmB/VAmlLFFGzK0QIh ANJGc7AFk4fyFD/OezhwGHbWmo/S+bfeAiIh2Ss2FxKJ -----END RSA PRIVATE KEY----- "; It report: called Result::unwrap() on an Err value: Asn1(Error { kind: TagUnexpected { expected: Some(Tag(0x30: SEQUENCE)), actual: Tag(0x02: INTEGER) }, position: Some(Length(5)) })

tarcieri commented 4 months ago

These are two different types of keys.

The first is PKCS#8 and can be parsed with the pkcs8 crate. Note it begins with BEGIN PRIVATE KEY.

The second one is PKCS#1 and can be parsed with the pkcs1 crate. Note it begins with BEGIN RSA PRIVATE KEY.