77from .rsakey import *
88from .pem import *
99from .deprecations import deprecated_params
10+ if GMPY2_LOADED :
11+ from gmpy2 import mpz
12+ elif gmpyLoaded :
13+ from gmpy import mpz
1014
1115class Python_RSAKey (RSAKey ):
1216 def __init__ (self , n = 0 , e = 0 , d = 0 , p = 0 , q = 0 , dP = 0 , dQ = 0 , qInv = 0 ,
@@ -16,6 +20,15 @@ def __init__(self, n=0, e=0, d=0, p=0, q=0, dP=0, dQ=0, qInv=0,
1620 see also generate() and parsePEM()."""
1721 if (n and not e ) or (e and not n ):
1822 raise AssertionError ()
23+ if gmpyLoaded or GMPY2_LOADED :
24+ n = mpz (n )
25+ e = mpz (e )
26+ d = mpz (d )
27+ p = mpz (p )
28+ q = mpz (q )
29+ dP = mpz (dP )
30+ dQ = mpz (dQ )
31+ qInv = mpz (qInv )
1932 self .n = n
2033 self .e = e
2134 if p and not q or not p and q :
@@ -48,44 +61,46 @@ def hasPrivateKey(self):
4861 return self .d != 0
4962
5063 def _rawPrivateKeyOp (self , message ):
64+ n = self .n
5165 with self ._lock :
5266 # Create blinding values, on the first pass:
5367 if not self .blinder :
54- self .unblinder = getRandomNumber (2 , self . n )
55- self .blinder = powMod (invMod (self .unblinder , self . n ), self .e ,
56- self . n )
68+ self .unblinder = getRandomNumber (2 , n )
69+ self .blinder = powMod (invMod (self .unblinder , n ), self .e ,
70+ n )
5771 unblinder = self .unblinder
5872 blinder = self .blinder
5973
6074 # Update blinding values
61- self .blinder = (self . blinder * self . blinder ) % self . n
62- self .unblinder = (self . unblinder * self . unblinder ) % self . n
75+ self .blinder = (blinder * blinder ) % n
76+ self .unblinder = (unblinder * unblinder ) % n
6377
6478 # Blind the input
65- message = (message * blinder ) % self . n
79+ message = (message * blinder ) % n
6680
6781 # Perform the RSA operation
6882 cipher = self ._rawPrivateKeyOpHelper (message )
6983
7084 # Unblind the output
71- cipher = (cipher * unblinder ) % self . n
85+ cipher = (cipher * unblinder ) % n
7286
7387 # Return the output
7488 return cipher
7589
7690 def _rawPrivateKeyOpHelper (self , m ):
7791 #Non-CRT version
78- #c = powMod(m, self.d, self.n)
79-
80- #CRT version (~3x faster)
81- s1 = powMod (m , self .dP , self .p )
82- s2 = powMod (m , self .dQ , self .q )
83- h = ((s1 - s2 ) * self .qInv ) % self .p
84- c = s2 + self .q * h
92+ #c = pow(m, self.d, self.n)
93+
94+ #CRT version (~3x faster).
95+ p , q = self .p , self .q
96+ s1 = pow (m , self .dP , p )
97+ s2 = pow (m , self .dQ , q )
98+ h = ((s1 - s2 ) * self .qInv ) % p
99+ c = s2 + q * h
85100 return c
86101
87102 def _rawPublicKeyOp (self , ciphertext ):
88- msg = powMod (ciphertext , self .e , self .n )
103+ msg = pow (ciphertext , self .e , self .n )
89104 return msg
90105
91106 def acceptsPassword (self ):
@@ -101,9 +116,15 @@ def generate(bits, key_type="rsa"):
101116 key = Python_RSAKey ()
102117 p = getRandomPrime (bits // 2 , False )
103118 q = getRandomPrime (bits // 2 , False )
119+ if gmpyLoaded or GMPY2_LOADED :
120+ p = mpz (p )
121+ q = mpz (q )
104122 t = lcm (p - 1 , q - 1 )
105123 key .n = p * q
106- key .e = 65537
124+ if gmpyLoaded or GMPY2_LOADED :
125+ key .e = mpz (65537 )
126+ else :
127+ key .e = 65537
107128 key .d = invMod (key .e , t )
108129 key .p = p
109130 key .q = q
0 commit comments