def __call__(cls, key_path=None): if key_path is None: obj = type.__call__(cls) if cls is PubKey: cls = PubKeyRSA obj.__class__ = cls obj.frmt = "original" obj.fill_and_store() return obj # This deals with the rare RSA 'kx export' call. if isinstance(key_path, tuple): obj = type.__call__(cls) obj.__class__ = PubKeyRSA obj.frmt = "tuple" obj.import_from_tuple(key_path) return obj # Now for the usual calls, key_path may be the path to either: # _an X509_SubjectPublicKeyInfo, as processed by openssl; # _an RSAPublicKey; # _an ECDSAPublicKey. obj = _PKIObjMaker.__call__(cls, key_path, _MAX_KEY_SIZE) try: spki = X509_SubjectPublicKeyInfo(obj.der) pubkey = spki.subjectPublicKey if isinstance(pubkey, RSAPublicKey): obj.__class__ = PubKeyRSA obj.import_from_asn1pkt(pubkey) elif isinstance(pubkey, ECDSAPublicKey): obj.__class__ = PubKeyECDSA try: obj.import_from_der(obj.der) except ImportError: pass else: raise marker = b"PUBLIC KEY" except: try: pubkey = RSAPublicKey(obj.der) obj.__class__ = PubKeyRSA obj.import_from_asn1pkt(pubkey) marker = b"RSA PUBLIC KEY" except: # We cannot import an ECDSA public key without curve knowledge raise Exception("Unable to import public key") if obj.frmt == "DER": obj.pem = der2pem(obj.der, marker) return obj
def __call__(cls, key_path): # First, we deal with the exceptional RSA KEA call. if type(key_path) is tuple: e, m, mLen = key_path obj = type.__call__(cls) obj.frmt = "tuple" obj.modulus = m obj.modulusLen = mLen obj.pubExp = e return obj # Now for the usual calls, key_path may be the path to either: # _an X509_SubjectPublicKeyInfo, as processed by openssl; # _an RSAPublicKey; # _an ECDSAPublicKey. obj = _PKIObjMaker.__call__(cls, key_path, MAX_KEY_SIZE) try: spki = X509_SubjectPublicKeyInfo(obj.der) pubkey = spki.subjectPublicKey if isinstance(pubkey, RSAPublicKey): obj.__class__ = PubKeyRSA obj.updateWith(pubkey) elif isinstance(pubkey, ECDSAPublicKey): obj.__class__ = PubKeyECDSA obj.updateWith(spki) else: raise Exception("Unsupported publicKey type") marker = "PUBLIC KEY" except: try: pubkey = RSAPublicKey(obj.der) obj.__class__ = PubKeyRSA obj.updateWith(pubkey) marker = "RSA PUBLIC KEY" except: # We cannot import an ECDSA public key without curve knowledge raise Exception("Unable to import public key") if obj.frmt == "DER": obj.pem = der2pem(obj.der, marker) return obj