diff --git a/sort_certificate.py b/sort_certificate.py index a40bb2f..d147c8a 100755 --- a/sort_certificate.py +++ b/sort_certificate.py @@ -30,6 +30,70 @@ ASN1TIME_FMT = str('%Y%m%d%H%M%SZ'.encode('utf8')) OPENSSLTIME_FMT = '%b %e %T %Y GMT' +class PkDecorator(object): + ''' + Provide some information on the private key object + ''' + pk = None + + def __init__(self, pk): + self.pk = pk + + def __str__(self): + return "Private key" + + +class PkDecoratorEC(PkDecorator): + + def __str__(self): + pk_crypto = self.pk.to_cryptography_key() + return "EC Private key curve %s (%d bits)" % ( + pk_crypto.curve.name, pk_crypto.key_size) + + +class PkDecoratorRSA(PkDecorator): + + def __str__(self): + pk_crypto = self.pk.to_cryptography_key() + return "RSA Private key %d bits" % pk_crypto.key_size + + +class PkDecoratorDSA(PkDecorator): + + def __str__(self): + pk_crypto = self.pk.to_cryptography_key() + return "DSA Private key %d bits" % pk_crypto.key_size + + +class PkDecoratorDH(PkDecorator): + + def __str__(self): + pk_crypto = self.pk.to_cryptography_key() + return "DH Private key %d bits" % pk_crypto.key_size + + +class PkDecoratorFactory(object): + ''' + Provide some information on the private key object + ''' + + def create(pk): + ''' + Create the appropriate decorater object + ''' + decorators = { + crypto.TYPE_DH: PkDecoratorDH, + crypto.TYPE_EC: PkDecoratorEC, + crypto.TYPE_DSA: PkDecoratorDSA, + crypto.TYPE_RSA: PkDecoratorRSA, + } + if pk.type() in decorators: + return decorators[pk.type()](pk) + else: + raise UnsupportedPkEncryption("Unsupported private key type %d" + % pk.type()) + + class UnsupportedPkEncryption(Exception): ''' When we encounter unsupported encryption algorithms @@ -438,6 +502,8 @@ def main(): if not args.check: logging.info('Print RSA private keys') for rsa_object in rsa_objects: + if args.informational: + print(PkDecoratorFactory.create(rsa_object)) print(rsa_object.to_cryptography_key().private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, @@ -448,6 +514,8 @@ def main(): if not args.check: logging.info('Print private keys') for pk_object in pk_objects: + if args.informational: + print(PkDecoratorFactory.create(pk_object)) print(crypto.dump_privatekey(crypto.FILETYPE_PEM, pk_object).decode('ascii'), end='')