From 20d9ca1e1c2ce1fe4bb4b8b52c423de816aaebd7 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sun, 31 Jul 2022 11:49:58 +0200 Subject: [PATCH] Enabled PKCS#8 for private keys --- dkim/asn1.py | 3 +++ dkim/crypto.py | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dkim/asn1.py b/dkim/asn1.py index 4cc3167..9d8bf2b 100644 --- a/dkim/asn1.py +++ b/dkim/asn1.py @@ -84,6 +84,9 @@ def asn1_parse(template, data): elif tag == SEQUENCE: r.append(asn1_parse(t[1], data[i:i+length])) i += length + elif tag == OCTET_STRING: + r.append(data[i:i+length]) + i += length else: raise ASN1FormatError( "Unexpected tag in template: %02x" % tag) diff --git a/dkim/crypto.py b/dkim/crypto.py index 10e3e5a..3c5d685 100644 --- a/dkim/crypto.py +++ b/dkim/crypto.py @@ -48,6 +48,13 @@ from dkim.asn1 import ( NULL, ) +ASN1_PKCS8_PrivateKey = [ + (SEQUENCE, [ + (INTEGER,), + (SEQUENCE, [ (OBJECT_IDENTIFIER,), (NULL,),]), + (OCTET_STRING,), + ]) +] ASN1_Object = [ (SEQUENCE, [ @@ -167,7 +174,13 @@ def parse_pem_private_key(data): pkdata = base64.b64decode(m.group(1)) except TypeError as e: raise UnparsableKeyError(str(e)) - return parse_private_key(pkdata) + try: + pk = parse_private_key(pkdata) + except UnparsableKeyError: + #If it fails it might be because of PKCS#8 (key generated with openSSL 3.X) + pka = asn1_parse(ASN1_PKCS8_PrivateKey, pkdata) + pk = parse_private_key(pka[0][2]) + return pk def EMSA_PKCS1_v1_5_encode(hash, mlen):