Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/jose/backends/_asn1.py: 34%
38 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:16 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:16 +0000
1"""ASN1 encoding helpers for converting between PKCS1 and PKCS8.
3Required by rsa_backend but not cryptography_backend.
4"""
5from pyasn1.codec.der import decoder, encoder
6from pyasn1.type import namedtype, univ
8RSA_ENCRYPTION_ASN1_OID = "1.2.840.113549.1.1.1"
11class RsaAlgorithmIdentifier(univ.Sequence):
12 """ASN1 structure for recording RSA PrivateKeyAlgorithm identifiers."""
14 componentType = namedtype.NamedTypes(
15 namedtype.NamedType("rsaEncryption", univ.ObjectIdentifier()), namedtype.NamedType("parameters", univ.Null())
16 )
19class PKCS8PrivateKey(univ.Sequence):
20 """ASN1 structure for recording PKCS8 private keys."""
22 componentType = namedtype.NamedTypes(
23 namedtype.NamedType("version", univ.Integer()),
24 namedtype.NamedType("privateKeyAlgorithm", RsaAlgorithmIdentifier()),
25 namedtype.NamedType("privateKey", univ.OctetString()),
26 )
29class PublicKeyInfo(univ.Sequence):
30 """ASN1 structure for recording PKCS8 public keys."""
32 componentType = namedtype.NamedTypes(
33 namedtype.NamedType("algorithm", RsaAlgorithmIdentifier()), namedtype.NamedType("publicKey", univ.BitString())
34 )
37def rsa_private_key_pkcs8_to_pkcs1(pkcs8_key):
38 """Convert a PKCS8-encoded RSA private key to PKCS1."""
39 decoded_values = decoder.decode(pkcs8_key, asn1Spec=PKCS8PrivateKey())
41 try:
42 decoded_key = decoded_values[0]
43 except IndexError:
44 raise ValueError("Invalid private key encoding")
46 return decoded_key["privateKey"]
49def rsa_private_key_pkcs1_to_pkcs8(pkcs1_key):
50 """Convert a PKCS1-encoded RSA private key to PKCS8."""
51 algorithm = RsaAlgorithmIdentifier()
52 algorithm["rsaEncryption"] = RSA_ENCRYPTION_ASN1_OID
54 pkcs8_key = PKCS8PrivateKey()
55 pkcs8_key["version"] = 0
56 pkcs8_key["privateKeyAlgorithm"] = algorithm
57 pkcs8_key["privateKey"] = pkcs1_key
59 return encoder.encode(pkcs8_key)
62def rsa_public_key_pkcs1_to_pkcs8(pkcs1_key):
63 """Convert a PKCS1-encoded RSA private key to PKCS8."""
64 algorithm = RsaAlgorithmIdentifier()
65 algorithm["rsaEncryption"] = RSA_ENCRYPTION_ASN1_OID
67 pkcs8_key = PublicKeyInfo()
68 pkcs8_key["algorithm"] = algorithm
69 pkcs8_key["publicKey"] = univ.BitString.fromOctetString(pkcs1_key)
71 return encoder.encode(pkcs8_key)
74def rsa_public_key_pkcs8_to_pkcs1(pkcs8_key):
75 """Convert a PKCS8-encoded RSA private key to PKCS1."""
76 decoded_values = decoder.decode(pkcs8_key, asn1Spec=PublicKeyInfo())
78 try:
79 decoded_key = decoded_values[0]
80 except IndexError:
81 raise ValueError("Invalid public key encoding.")
83 return decoded_key["publicKey"].asOctets()