diff options
author | Narayan Desai <desai@mcs.anl.gov> | 2009-05-06 01:26:53 +0000 |
---|---|---|
committer | Narayan Desai <desai@mcs.anl.gov> | 2009-05-06 01:26:53 +0000 |
commit | 9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b (patch) | |
tree | 768763aa48be1a5a2c8dae7cba81859510f1146e /src/lib/tlslite/utils/Python_RSAKey.py | |
parent | 13f6d1554dd24d08d44662906fa9f3f008a23058 (diff) | |
download | bcfg2-9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b.tar.gz bcfg2-9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b.tar.bz2 bcfg2-9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b.zip |
more to python 2.6 ssl
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5187 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/tlslite/utils/Python_RSAKey.py')
-rwxr-xr-x | src/lib/tlslite/utils/Python_RSAKey.py | 209 |
1 files changed, 0 insertions, 209 deletions
diff --git a/src/lib/tlslite/utils/Python_RSAKey.py b/src/lib/tlslite/utils/Python_RSAKey.py deleted file mode 100755 index 2c469b572..000000000 --- a/src/lib/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) |