15
15
# You should have received a copy of the GNU Lesser General Public License
16
16
# along with this library. If not, see <http://www.gnu.org/licenses/>.
17
17
18
- try :
19
- import Crypto
20
- except ImportError :
21
- import crypto as Crypto
22
-
23
- from Crypto import Cipher
24
- from Crypto .Hash import SHA256 as _SHA256
25
- from Crypto .Hash import SHA as _SHA1
26
- from Crypto .Hash import HMAC as _HMAC
27
- from Crypto .PublicKey import DSA
28
- import Crypto .Random .random
18
+ from Cryptodome import Cipher
19
+ from Cryptodome .Hash import HMAC as _HMAC
20
+ from Cryptodome .Hash import SHA256 as _SHA256
21
+ from Cryptodome .Hash import SHA as _SHA1
22
+ from Cryptodome .PublicKey import DSA
23
+ from Cryptodome .Random import random
24
+ from Cryptodome .Signature import DSS
25
+ from Cryptodome .Util import Counter
26
+
29
27
from numbers import Number
30
28
31
29
from potr .compatcrypto import common
@@ -45,36 +43,14 @@ def SHA256HMAC(key, data):
45
43
46
44
def AESCTR (key , counter = 0 ):
47
45
if isinstance (counter , Number ):
48
- counter = Counter (counter )
49
- if not isinstance (counter , Counter ):
46
+ counter = Counter .new (nbits = 64 , prefix = long_to_bytes (counter , 8 ), initial_value = 0 )
47
+ # in pycrypto Counter used to be an object,
48
+ # in pycryptodome it's now only a dict.
49
+ # This tries to validate its "type" so we don't feed anything as a counter
50
+ if set (counter ) != set (Counter .new (64 )):
50
51
raise TypeError
51
52
return Cipher .AES .new (key , Cipher .AES .MODE_CTR , counter = counter )
52
53
53
- class Counter (object ):
54
- def __init__ (self , prefix ):
55
- self .prefix = prefix
56
- self .val = 0
57
-
58
- def inc (self ):
59
- self .prefix += 1
60
- self .val = 0
61
-
62
- def __setattr__ (self , attr , val ):
63
- if attr == 'prefix' :
64
- self .val = 0
65
- super (Counter , self ).__setattr__ (attr , val )
66
-
67
- def __repr__ (self ):
68
- return '<Counter(p={p!r},v={v!r})>' .format (p = self .prefix , v = self .val )
69
-
70
- def byteprefix (self ):
71
- return long_to_bytes (self .prefix , 8 )
72
-
73
- def __call__ (self ):
74
- bytesuffix = long_to_bytes (self .val , 8 )
75
- self .val += 1
76
- return self .byteprefix () + bytesuffix
77
-
78
54
@common .registerkeytype
79
55
class DSAKey (common .PK ):
80
56
keyType = 0x0000
@@ -107,12 +83,14 @@ def fingerprint(self):
107
83
def sign (self , data ):
108
84
# 2 <= K <= q
109
85
K = randrange (2 , self .priv .q )
110
- r , s = self .priv .sign (data , K )
86
+ M = bytes_to_long (data )
87
+ r , s = self .priv ._sign (M , K )
111
88
return long_to_bytes (r , 20 ) + long_to_bytes (s , 20 )
112
89
113
90
def verify (self , data , sig ):
114
91
r , s = bytes_to_long (sig [:20 ]), bytes_to_long (sig [20 :])
115
- return self .pub .verify (data , (r , s ))
92
+ M = bytes_to_long (data )
93
+ return self .pub ._verify (M , (r , s ))
116
94
117
95
def __hash__ (self ):
118
96
return bytes_to_long (self .fingerprint ())
@@ -128,8 +106,8 @@ def __ne__(self, other):
128
106
@classmethod
129
107
def generate (cls ):
130
108
privkey = DSA .generate (1024 )
131
- return cls ((privkey .key . y , privkey .key . g , privkey .key . p , privkey . key .q ,
132
- privkey .key . x ), private = True )
109
+ return cls ((privkey .y , privkey .g , privkey .p , privkey .q ,
110
+ privkey .x ), private = True )
133
111
134
112
@classmethod
135
113
def parsePayload (cls , data , private = False ):
@@ -143,7 +121,7 @@ def parsePayload(cls, data, private=False):
143
121
return cls ((y , g , p , q ), private = False ), data
144
122
145
123
def getrandbits (k ):
146
- return Crypto . Random . random .getrandbits (k )
124
+ return random .getrandbits (k )
147
125
148
126
def randrange (start , stop ):
149
- return Crypto . Random . random .randrange (start , stop )
127
+ return random .randrange (start , stop )
0 commit comments