Index: third_party/tlslite/tlslite/utils/Python_RSAKey.py |
diff --git a/third_party/tlslite/tlslite/utils/Python_RSAKey.py b/third_party/tlslite/tlslite/utils/Python_RSAKey.py |
deleted file mode 100644 |
index b57553a1ac374c9027618a724a881da0cf3fae07..0000000000000000000000000000000000000000 |
--- a/third_party/tlslite/tlslite/utils/Python_RSAKey.py |
+++ /dev/null |
@@ -1,209 +0,0 @@ |
-"""Pure-Python RSA implementation.""" |
- |
-from cryptomath import * |
-import xmltools |
-from ASN1Parser import ASN1Parser |
-from RSAKey import * |
- |
-class Python_RSAKey(RSAKey): |
- def __init__(self, n=0, e=0, d=0, p=0, q=0, dP=0, dQ=0, qInv=0): |
- if (n and not e) or (e and not n): |
- raise AssertionError() |
- self.n = n |
- self.e = e |
- self.d = d |
- self.p = p |
- self.q = q |
- self.dP = dP |
- self.dQ = dQ |
- self.qInv = qInv |
- self.blinder = 0 |
- self.unblinder = 0 |
- |
- def hasPrivateKey(self): |
- return self.d != 0 |
- |
- def hash(self): |
- s = self.writeXMLPublicKey('\t\t') |
- return hashAndBase64(s.strip()) |
- |
- def _rawPrivateKeyOp(self, m): |
- #Create blinding values, on the first pass: |
- if not self.blinder: |
- self.unblinder = getRandomNumber(2, self.n) |
- self.blinder = powMod(invMod(self.unblinder, self.n), self.e, |
- self.n) |
- |
- #Blind the input |
- m = (m * self.blinder) % self.n |
- |
- #Perform the RSA operation |
- c = self._rawPrivateKeyOpHelper(m) |
- |
- #Unblind the output |
- c = (c * self.unblinder) % self.n |
- |
- #Update blinding values |
- self.blinder = (self.blinder * self.blinder) % self.n |
- self.unblinder = (self.unblinder * self.unblinder) % self.n |
- |
- #Return the output |
- return c |
- |
- |
- def _rawPrivateKeyOpHelper(self, m): |
- #Non-CRT version |
- #c = powMod(m, self.d, self.n) |
- |
- #CRT version (~3x faster) |
- s1 = powMod(m, self.dP, self.p) |
- s2 = powMod(m, self.dQ, self.q) |
- h = ((s1 - s2) * self.qInv) % self.p |
- c = s2 + self.q * h |
- return c |
- |
- def _rawPublicKeyOp(self, c): |
- m = powMod(c, self.e, self.n) |
- return m |
- |
- def acceptsPassword(self): return False |
- |
- def write(self, indent=''): |
- if self.d: |
- s = indent+'<privateKey xmlns="http://trevp.net/rsa">\n' |
- else: |
- s = indent+'<publicKey xmlns="http://trevp.net/rsa">\n' |
- s += indent+'\t<n>%s</n>\n' % numberToBase64(self.n) |
- s += indent+'\t<e>%s</e>\n' % numberToBase64(self.e) |
- if self.d: |
- s += indent+'\t<d>%s</d>\n' % numberToBase64(self.d) |
- s += indent+'\t<p>%s</p>\n' % numberToBase64(self.p) |
- s += indent+'\t<q>%s</q>\n' % numberToBase64(self.q) |
- s += indent+'\t<dP>%s</dP>\n' % numberToBase64(self.dP) |
- s += indent+'\t<dQ>%s</dQ>\n' % numberToBase64(self.dQ) |
- s += indent+'\t<qInv>%s</qInv>\n' % numberToBase64(self.qInv) |
- s += indent+'</privateKey>' |
- else: |
- s += indent+'</publicKey>' |
- #Only add \n if part of a larger structure |
- if indent != '': |
- s += '\n' |
- return s |
- |
- def writeXMLPublicKey(self, indent=''): |
- return Python_RSAKey(self.n, self.e).write(indent) |
- |
- def generate(bits): |
- key = Python_RSAKey() |
- p = getRandomPrime(bits/2, False) |
- q = getRandomPrime(bits/2, False) |
- t = lcm(p-1, q-1) |
- key.n = p * q |
- key.e = 3L #Needed to be long, for Java |
- key.d = invMod(key.e, t) |
- key.p = p |
- key.q = q |
- key.dP = key.d % (p-1) |
- key.dQ = key.d % (q-1) |
- key.qInv = invMod(q, p) |
- return key |
- generate = staticmethod(generate) |
- |
- def parsePEM(s, passwordCallback=None): |
- """Parse a string containing a <privateKey> or <publicKey>, or |
- PEM-encoded key.""" |
- |
- start = s.find("-----BEGIN PRIVATE KEY-----") |
- if start != -1: |
- end = s.find("-----END PRIVATE KEY-----") |
- if end == -1: |
- raise SyntaxError("Missing PEM Postfix") |
- s = s[start+len("-----BEGIN PRIVATE KEY -----") : end] |
- bytes = base64ToBytes(s) |
- return Python_RSAKey._parsePKCS8(bytes) |
- else: |
- start = s.find("-----BEGIN RSA PRIVATE KEY-----") |
- if start != -1: |
- end = s.find("-----END RSA PRIVATE KEY-----") |
- if end == -1: |
- raise SyntaxError("Missing PEM Postfix") |
- s = s[start+len("-----BEGIN RSA PRIVATE KEY -----") : end] |
- bytes = base64ToBytes(s) |
- return Python_RSAKey._parseSSLeay(bytes) |
- raise SyntaxError("Missing PEM Prefix") |
- parsePEM = staticmethod(parsePEM) |
- |
- def parseXML(s): |
- element = xmltools.parseAndStripWhitespace(s) |
- return Python_RSAKey._parseXML(element) |
- parseXML = staticmethod(parseXML) |
- |
- def _parsePKCS8(bytes): |
- p = ASN1Parser(bytes) |
- |
- version = p.getChild(0).value[0] |
- if version != 0: |
- raise SyntaxError("Unrecognized PKCS8 version") |
- |
- rsaOID = p.getChild(1).value |
- if list(rsaOID) != [6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0]: |
- raise SyntaxError("Unrecognized AlgorithmIdentifier") |
- |
- #Get the privateKey |
- privateKeyP = p.getChild(2) |
- |
- #Adjust for OCTET STRING encapsulation |
- privateKeyP = ASN1Parser(privateKeyP.value) |
- |
- return Python_RSAKey._parseASN1PrivateKey(privateKeyP) |
- _parsePKCS8 = staticmethod(_parsePKCS8) |
- |
- def _parseSSLeay(bytes): |
- privateKeyP = ASN1Parser(bytes) |
- return Python_RSAKey._parseASN1PrivateKey(privateKeyP) |
- _parseSSLeay = staticmethod(_parseSSLeay) |
- |
- def _parseASN1PrivateKey(privateKeyP): |
- version = privateKeyP.getChild(0).value[0] |
- if version != 0: |
- raise SyntaxError("Unrecognized RSAPrivateKey version") |
- n = bytesToNumber(privateKeyP.getChild(1).value) |
- e = bytesToNumber(privateKeyP.getChild(2).value) |
- d = bytesToNumber(privateKeyP.getChild(3).value) |
- p = bytesToNumber(privateKeyP.getChild(4).value) |
- q = bytesToNumber(privateKeyP.getChild(5).value) |
- dP = bytesToNumber(privateKeyP.getChild(6).value) |
- dQ = bytesToNumber(privateKeyP.getChild(7).value) |
- qInv = bytesToNumber(privateKeyP.getChild(8).value) |
- return Python_RSAKey(n, e, d, p, q, dP, dQ, qInv) |
- _parseASN1PrivateKey = staticmethod(_parseASN1PrivateKey) |
- |
- def _parseXML(element): |
- try: |
- xmltools.checkName(element, "privateKey") |
- except SyntaxError: |
- xmltools.checkName(element, "publicKey") |
- |
- #Parse attributes |
- xmltools.getReqAttribute(element, "xmlns", "http://trevp.net/rsa\Z") |
- xmltools.checkNoMoreAttributes(element) |
- |
- #Parse public values (<n> and <e>) |
- n = base64ToNumber(xmltools.getText(xmltools.getChild(element, 0, "n"), xmltools.base64RegEx)) |
- e = base64ToNumber(xmltools.getText(xmltools.getChild(element, 1, "e"), xmltools.base64RegEx)) |
- d = 0 |
- p = 0 |
- q = 0 |
- dP = 0 |
- dQ = 0 |
- qInv = 0 |
- #Parse private values, if present |
- if element.childNodes.length>=3: |
- d = base64ToNumber(xmltools.getText(xmltools.getChild(element, 2, "d"), xmltools.base64RegEx)) |
- p = base64ToNumber(xmltools.getText(xmltools.getChild(element, 3, "p"), xmltools.base64RegEx)) |
- q = base64ToNumber(xmltools.getText(xmltools.getChild(element, 4, "q"), xmltools.base64RegEx)) |
- dP = base64ToNumber(xmltools.getText(xmltools.getChild(element, 5, "dP"), xmltools.base64RegEx)) |
- dQ = base64ToNumber(xmltools.getText(xmltools.getChild(element, 6, "dQ"), xmltools.base64RegEx)) |
- qInv = base64ToNumber(xmltools.getText(xmltools.getLastChild(element, 7, "qInv"), xmltools.base64RegEx)) |
- return Python_RSAKey(n, e, d, p, q, dP, dQ, qInv) |
- _parseXML = staticmethod(_parseXML) |