Advertisement
Guest User

sonic_rainboom.py

a guest
Jan 29th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.00 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. TheEnd = 'Sonic Rainboom'
  4.  
  5. import base64
  6. import sys
  7. from cryptography import x509
  8. from cryptography.exceptions import InvalidSignature
  9. from cryptography.hazmat.backends import default_backend
  10. from cryptography.hazmat.primitives import hashes, serialization
  11. from cryptography.hazmat.primitives.asymmetric import ec, padding, rsa
  12. from cryptography.hazmat.primitives.serialization import Encoding, NoEncryption, PrivateFormat
  13. try:
  14.   from pgpy import PGPKey
  15.   from pgpy.constants import EllipticCurveOID, PubKeyAlgorithm
  16.   from pgpy.packet.fields import ECDSAPriv, RSAPriv
  17.   from pgpy.packet.packets import PrivKeyV4
  18.   from pgpy.packet.types import MPI
  19. except ImportError:
  20.   PGPKey = None
  21.  
  22. class PGP:
  23.   def __init__(self, data):
  24.     if PGPKey is None:
  25.       raise ImportError('PGPy')
  26.     self.id = PGPKey()
  27.     self.id.parse(data)
  28.     self.pub = self.id._key.keymaterial.__pubkey__()
  29.   def __repr__(self):
  30.     if len(self.id.userids) > 0 and self.id.userids[0].name != '':
  31.        return self.id.userids[0].name+' <'+self.id.userids[0].email+'>'
  32.     return self.id._key.fingerprint
  33.   def export(self, priv):
  34.     priv = priv.private_numbers()
  35.     key = PGPKey()
  36.     key._uids = self.id._uids
  37.     key._key = PrivKeyV4()
  38.     key._key._created = self.id._key._created
  39.     key._key._pkalg = self.id._key._pkalg
  40.     if key._key._pkalg in (PubKeyAlgorithm.RSAEncryptOrSign, PubKeyAlgorithm.RSAEncrypt, PubKeyAlgorithm.RSASign):
  41.       km = RSAPriv()
  42.       km.e = MPI(priv.public_numbers.e)
  43.       km.n = MPI(priv.public_numbers.n)
  44.       km.d = MPI(priv.d)
  45.       km.p = MPI(priv.p)
  46.       km.q = MPI(priv.q)
  47.       km.u = MPI(rsa.rsa_crt_iqmp(priv.q, priv.p))
  48.     elif key._key._pkalg is PubKeyAlgorithm.ECDSA:
  49.       km = ECDSAPriv()
  50.       km.oid = self.id._key.keymaterial.oid
  51.       km.x = MPI(priv._public_numbers.x)
  52.       km.y = MPI(priv._public_numbers.y)
  53.       km.s = MPI(priv._private_value)
  54.     else:
  55.       raise TypeError
  56.     key._key.keymaterial = km
  57.     key._key.keymaterial._compute_chksum()
  58.     key._key.update_hlen()
  59.     return str(key)
  60.  
  61. class SSH:
  62.   def __init__(self, data):
  63.     self.id = data.split()
  64.     self.pub = serialization.load_ssh_public_key(data, default_backend())
  65.   def __repr__(self):
  66.     if len(self.id) > 2 and self.id[2] != '':
  67.       return self.id[2].decode()
  68.     fp = hashes.Hash(hashes.SHA256(), backend=default_backend())
  69.     fp.update(base64.b64decode(self.id[1]))
  70.     return base64.b64encode(fp.finalize()).decode().rstrip('=')
  71.   def export(self, priv):
  72.     return priv.private_bytes(Encoding.PEM, PrivateFormat.TraditionalOpenSSL, NoEncryption()).decode()
  73.  
  74. class SSL:
  75.   def __init__(self, data, fmt='crt'):
  76.     self.fmt = fmt
  77.     if fmt is 'crt':
  78.       self.cert = x509.load_pem_x509_certificate(data, default_backend())
  79.     elif fmt is 'csr':
  80.       self.cert = x509.load_pem_x509_csr(data, default_backend())
  81.     else:
  82.       raise TypeError
  83.     self.pub = self.cert.public_key()
  84.   def __repr__(self):
  85.     cn = self.cert.subject.get_attributes_for_oid(x509.NameOID.COMMON_NAME)
  86.     if len(cn) > 0:
  87.       return cn[0].value
  88.     org = self.cert.subject.get_attributes_for_oid(x509.NameOID.ORGANIZATION_NAME)
  89.     if len(org) > 0:
  90.       return org[0].value
  91.     if self.fmt == 'crt':
  92.       return self.cert.fingerprint(hashes.SHA256()).hex()
  93.     return 'Unknown'
  94.   def export(self, priv):
  95.     return priv.private_bytes(Encoding.PEM, PrivateFormat.PKCS8, NoEncryption()).decode()
  96.  
  97. class ECC:
  98.   def __init__(self, tgt):
  99.     self.pub = tgt.pub
  100.   def compute(self, vqc):
  101.     pub = self.pub.public_numbers()
  102.     p = vqc.ecpoint(pub.curve, pub.x, pub.y)
  103.     priv = ec.EllipticCurvePrivateNumbers(p, pub)
  104.     try:
  105.       self.priv = default_backend().load_elliptic_curve_private_numbers(priv)
  106.     except ValueError:
  107.       return False
  108.     return True
  109.   def verify(self):
  110.     m = TheEnd.encode()
  111.     s = self.priv.sign(m, ec.ECDSA(hashes.SHA256()))
  112.     try:
  113.       self.pub.verify(s, m, ec.ECDSA(hashes.SHA256()))
  114.     except InvalidSignature:
  115.       return False
  116.     return True
  117.  
  118. class RSA:
  119.   def __init__(self, tgt):
  120.     self.pub = tgt.pub
  121.   def _egcd(self, a, b):
  122.     if a == 0:
  123.       return (b, 0, 1)
  124.     g, y, x = self._egcd(b%a, a)
  125.     return (g, x-y*(b//a), y)
  126.   def _invert(self, a, m):
  127.     g, x, y = self._egcd(a, m)
  128.     if g != 1:
  129.       return None
  130.     return x%m
  131.   def compute(self, vqc):
  132.     pub = self.pub.public_numbers()
  133.     p, q = vqc.factors(pub.n)
  134.     d = self._invert(pub.e, (p-1)*(q-1))
  135.     dmp1 = rsa.rsa_crt_dmp1(d, p)
  136.     dmq1 = rsa.rsa_crt_dmq1(d, q)
  137.     iqmp = rsa.rsa_crt_iqmp(p, q)
  138.     priv = rsa.RSAPrivateNumbers(p, q, d, dmp1, dmq1, iqmp, pub)
  139.     try:
  140.       self.priv = default_backend().load_rsa_private_numbers(priv)
  141.     except ValueError:
  142.       return False
  143.     return True
  144.   def verify(self):
  145.     m = TheEnd.encode()
  146.     pad = padding.PSS(padding.MGF1(hashes.SHA256()), padding.PSS.MAX_LENGTH)
  147.     s = self.priv.sign(m, pad, hashes.SHA256())
  148.     try:
  149.       self.pub.verify(s, m, pad, hashes.SHA256())
  150.     except InvalidSignature:
  151.       return False
  152.     return True
  153.  
  154. class VQC:
  155.   def factors(self, c):
  156.     # lewd ponies
  157.     return a, b
  158.   def ecpoint(self, curve, x, y):
  159.     raise FutureWarning
  160.     return s
  161.  
  162.  
  163.  
  164. if __name__ == '__main__':
  165.   f = open(sys.argv[1], 'rb')
  166.   data = f.read()
  167.  
  168.   if data.startswith(b'-----BEGIN PGP PUBLIC KEY BLOCK-----'):
  169.     tgt = PGP(data)
  170.   elif data.startswith(b'-----BEGIN CERTIFICATE-----'):
  171.     tgt = SSL(data)
  172.   elif data.startswith(b'-----BEGIN CERTIFICATE REQUEST-----'):
  173.     tgt = SSL(data, fmt='csr')
  174.   elif data.startswith(b'ssh-rsa') or data.startswith(b'ecdsa'):
  175.     tgt = SSH(data)
  176.  
  177.   print(tgt, file=sys.stderr)
  178.  
  179.   if isinstance(tgt.pub, ec.EllipticCurvePublicKey):
  180.     key = ECC(tgt)
  181.   elif isinstance(tgt.pub, rsa.RSAPublicKey):
  182.     key = RSA(tgt)
  183.   else:
  184.     raise TypeError
  185.  
  186.   vqc = VQC()
  187.  
  188.   if not key.compute(vqc) or not key.verify():
  189.     print('No boom make sad pony :(', file=sys.stderr)
  190.     sys.exit(9)
  191.   print(tgt.export(key.priv), end='')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement