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

1"""ASN1 encoding helpers for converting between PKCS1 and PKCS8. 

2 

3Required by rsa_backend but not cryptography_backend. 

4""" 

5from pyasn1.codec.der import decoder, encoder 

6from pyasn1.type import namedtype, univ 

7 

8RSA_ENCRYPTION_ASN1_OID = "1.2.840.113549.1.1.1" 

9 

10 

11class RsaAlgorithmIdentifier(univ.Sequence): 

12 """ASN1 structure for recording RSA PrivateKeyAlgorithm identifiers.""" 

13 

14 componentType = namedtype.NamedTypes( 

15 namedtype.NamedType("rsaEncryption", univ.ObjectIdentifier()), namedtype.NamedType("parameters", univ.Null()) 

16 ) 

17 

18 

19class PKCS8PrivateKey(univ.Sequence): 

20 """ASN1 structure for recording PKCS8 private keys.""" 

21 

22 componentType = namedtype.NamedTypes( 

23 namedtype.NamedType("version", univ.Integer()), 

24 namedtype.NamedType("privateKeyAlgorithm", RsaAlgorithmIdentifier()), 

25 namedtype.NamedType("privateKey", univ.OctetString()), 

26 ) 

27 

28 

29class PublicKeyInfo(univ.Sequence): 

30 """ASN1 structure for recording PKCS8 public keys.""" 

31 

32 componentType = namedtype.NamedTypes( 

33 namedtype.NamedType("algorithm", RsaAlgorithmIdentifier()), namedtype.NamedType("publicKey", univ.BitString()) 

34 ) 

35 

36 

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()) 

40 

41 try: 

42 decoded_key = decoded_values[0] 

43 except IndexError: 

44 raise ValueError("Invalid private key encoding") 

45 

46 return decoded_key["privateKey"] 

47 

48 

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 

53 

54 pkcs8_key = PKCS8PrivateKey() 

55 pkcs8_key["version"] = 0 

56 pkcs8_key["privateKeyAlgorithm"] = algorithm 

57 pkcs8_key["privateKey"] = pkcs1_key 

58 

59 return encoder.encode(pkcs8_key) 

60 

61 

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 

66 

67 pkcs8_key = PublicKeyInfo() 

68 pkcs8_key["algorithm"] = algorithm 

69 pkcs8_key["publicKey"] = univ.BitString.fromOctetString(pkcs1_key) 

70 

71 return encoder.encode(pkcs8_key) 

72 

73 

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()) 

77 

78 try: 

79 decoded_key = decoded_values[0] 

80 except IndexError: 

81 raise ValueError("Invalid public key encoding.") 

82 

83 return decoded_key["publicKey"].asOctets()