|
17 | 17 | adapted for MicroPython
|
18 | 18 | """
|
19 | 19 |
|
20 |
| -rotate_amounts = [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, |
21 |
| - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, |
22 |
| - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, |
23 |
| - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21] |
24 |
| - |
25 |
| -#constants = [int(abs(math.sin(i+1)) * 2**32) & 0xFFFFFFFF for i in range(64)] # precision is not enough |
26 |
| -constants = [3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, |
27 |
| - 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, |
28 |
| - 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, |
29 |
| - 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, |
30 |
| - 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, |
31 |
| - 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, |
32 |
| - 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, |
33 |
| - 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745] |
34 |
| - |
35 |
| -init_values = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476] |
36 |
| - |
37 |
| -functions = 16*[lambda b, c, d: (b & c) | (~b & d)] + \ |
38 |
| - 16*[lambda b, c, d: (d & b) | (~d & c)] + \ |
39 |
| - 16*[lambda b, c, d: b ^ c ^ d] + \ |
40 |
| - 16*[lambda b, c, d: c ^ (b | ~d)] |
41 |
| - |
42 |
| -index_functions = 16*[lambda i: i] + \ |
43 |
| - 16*[lambda i: (5*i + 1)%16] + \ |
44 |
| - 16*[lambda i: (3*i + 5)%16] + \ |
45 |
| - 16*[lambda i: (7*i)%16] |
| 20 | +rotate_amounts = [ |
| 21 | + 7, |
| 22 | + 12, |
| 23 | + 17, |
| 24 | + 22, |
| 25 | + 7, |
| 26 | + 12, |
| 27 | + 17, |
| 28 | + 22, |
| 29 | + 7, |
| 30 | + 12, |
| 31 | + 17, |
| 32 | + 22, |
| 33 | + 7, |
| 34 | + 12, |
| 35 | + 17, |
| 36 | + 22, |
| 37 | + 5, |
| 38 | + 9, |
| 39 | + 14, |
| 40 | + 20, |
| 41 | + 5, |
| 42 | + 9, |
| 43 | + 14, |
| 44 | + 20, |
| 45 | + 5, |
| 46 | + 9, |
| 47 | + 14, |
| 48 | + 20, |
| 49 | + 5, |
| 50 | + 9, |
| 51 | + 14, |
| 52 | + 20, |
| 53 | + 4, |
| 54 | + 11, |
| 55 | + 16, |
| 56 | + 23, |
| 57 | + 4, |
| 58 | + 11, |
| 59 | + 16, |
| 60 | + 23, |
| 61 | + 4, |
| 62 | + 11, |
| 63 | + 16, |
| 64 | + 23, |
| 65 | + 4, |
| 66 | + 11, |
| 67 | + 16, |
| 68 | + 23, |
| 69 | + 6, |
| 70 | + 10, |
| 71 | + 15, |
| 72 | + 21, |
| 73 | + 6, |
| 74 | + 10, |
| 75 | + 15, |
| 76 | + 21, |
| 77 | + 6, |
| 78 | + 10, |
| 79 | + 15, |
| 80 | + 21, |
| 81 | + 6, |
| 82 | + 10, |
| 83 | + 15, |
| 84 | + 21, |
| 85 | +] |
| 86 | + |
| 87 | +# constants = [int(abs(math.sin(i+1)) * 2**32) & 0xFFFFFFFF for i in range(64)] # precision is not enough |
| 88 | +constants = [ |
| 89 | + 3614090360, |
| 90 | + 3905402710, |
| 91 | + 606105819, |
| 92 | + 3250441966, |
| 93 | + 4118548399, |
| 94 | + 1200080426, |
| 95 | + 2821735955, |
| 96 | + 4249261313, |
| 97 | + 1770035416, |
| 98 | + 2336552879, |
| 99 | + 4294925233, |
| 100 | + 2304563134, |
| 101 | + 1804603682, |
| 102 | + 4254626195, |
| 103 | + 2792965006, |
| 104 | + 1236535329, |
| 105 | + 4129170786, |
| 106 | + 3225465664, |
| 107 | + 643717713, |
| 108 | + 3921069994, |
| 109 | + 3593408605, |
| 110 | + 38016083, |
| 111 | + 3634488961, |
| 112 | + 3889429448, |
| 113 | + 568446438, |
| 114 | + 3275163606, |
| 115 | + 4107603335, |
| 116 | + 1163531501, |
| 117 | + 2850285829, |
| 118 | + 4243563512, |
| 119 | + 1735328473, |
| 120 | + 2368359562, |
| 121 | + 4294588738, |
| 122 | + 2272392833, |
| 123 | + 1839030562, |
| 124 | + 4259657740, |
| 125 | + 2763975236, |
| 126 | + 1272893353, |
| 127 | + 4139469664, |
| 128 | + 3200236656, |
| 129 | + 681279174, |
| 130 | + 3936430074, |
| 131 | + 3572445317, |
| 132 | + 76029189, |
| 133 | + 3654602809, |
| 134 | + 3873151461, |
| 135 | + 530742520, |
| 136 | + 3299628645, |
| 137 | + 4096336452, |
| 138 | + 1126891415, |
| 139 | + 2878612391, |
| 140 | + 4237533241, |
| 141 | + 1700485571, |
| 142 | + 2399980690, |
| 143 | + 4293915773, |
| 144 | + 2240044497, |
| 145 | + 1873313359, |
| 146 | + 4264355552, |
| 147 | + 2734768916, |
| 148 | + 1309151649, |
| 149 | + 4149444226, |
| 150 | + 3174756917, |
| 151 | + 718787259, |
| 152 | + 3951481745, |
| 153 | +] |
| 154 | + |
| 155 | +init_values = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476] |
| 156 | + |
| 157 | +functions = ( |
| 158 | + 16 * [lambda b, c, d: (b & c) | (~b & d)] |
| 159 | + + 16 * [lambda b, c, d: (d & b) | (~d & c)] |
| 160 | + + 16 * [lambda b, c, d: b ^ c ^ d] |
| 161 | + + 16 * [lambda b, c, d: c ^ (b | ~d)] |
| 162 | +) |
| 163 | + |
| 164 | +index_functions = ( |
| 165 | + 16 * [lambda i: i] |
| 166 | + + 16 * [lambda i: (5 * i + 1) % 16] |
| 167 | + + 16 * [lambda i: (3 * i + 5) % 16] |
| 168 | + + 16 * [lambda i: (7 * i) % 16] |
| 169 | +) |
| 170 | + |
46 | 171 |
|
47 | 172 | def left_rotate(x, amount):
|
48 | 173 | x &= 0xFFFFFFFF
|
49 |
| - return ((x<<amount) | (x>>(32-amount))) & 0xFFFFFFFF |
| 174 | + return ((x << amount) | (x >> (32 - amount))) & 0xFFFFFFFF |
| 175 | + |
50 | 176 |
|
51 | 177 | def md5(message):
|
52 |
| - message = bytearray(message) #copy our input into a mutable buffer |
53 |
| - orig_len_in_bits = (8 * len(message)) & 0xffffffffffffffff |
| 178 | + message = bytearray(message) # copy our input into a mutable buffer |
| 179 | + orig_len_in_bits = (8 * len(message)) & 0xFFFFFFFFFFFFFFFF |
54 | 180 | message.append(0x80)
|
55 |
| - while len(message)%64 != 56: |
| 181 | + while len(message) % 64 != 56: |
56 | 182 | message.append(0)
|
57 |
| - message += orig_len_in_bits.to_bytes(8, 'little') |
58 |
| - #print (message) |
| 183 | + message += orig_len_in_bits.to_bytes(8, "little") |
| 184 | + # print (message) |
59 | 185 |
|
60 | 186 | hash_pieces = init_values[:]
|
61 | 187 |
|
62 | 188 | for chunk_ofst in range(0, len(message), 64):
|
63 | 189 | a, b, c, d = hash_pieces
|
64 |
| - chunk = message[chunk_ofst:chunk_ofst+64] |
65 |
| - #print(a, b, c, d) |
| 190 | + chunk = message[chunk_ofst : chunk_ofst + 64] |
| 191 | + # print(a, b, c, d) |
66 | 192 | for i in range(64):
|
67 | 193 | f = functions[i](b, c, d)
|
68 | 194 | g = index_functions[i](i)
|
69 |
| - #print(constants[i]) |
70 |
| - to_rotate = a + f + constants[i] + int.from_bytes(chunk[4*g:4*g+4], 'little') |
| 195 | + # print(constants[i]) |
| 196 | + to_rotate = ( |
| 197 | + a |
| 198 | + + f |
| 199 | + + constants[i] |
| 200 | + + int.from_bytes(chunk[4 * g : 4 * g + 4], "little") |
| 201 | + ) |
71 | 202 | new_b = (b + left_rotate(to_rotate, rotate_amounts[i])) & 0xFFFFFFFF
|
72 | 203 | a, b, c, d = d, new_b, b, c
|
73 |
| - #print(to_rotate) |
| 204 | + # print(to_rotate) |
74 | 205 |
|
75 | 206 | for i, val in enumerate([a, b, c, d]):
|
76 | 207 | hash_pieces[i] += val
|
77 | 208 | hash_pieces[i] &= 0xFFFFFFFF
|
78 |
| - return sum(x<<(32*i) for i, x in enumerate(hash_pieces)) |
| 209 | + return sum(x << (32 * i) for i, x in enumerate(hash_pieces)) |
| 210 | + |
79 | 211 |
|
80 | 212 | def digest(message):
|
81 | 213 | digest = md5(message)
|
82 |
| - raw = digest.to_bytes(16, 'little') |
83 |
| - return '{:032x}'.format(int.from_bytes(raw, 'big')) |
84 |
| - #return raw |
| 214 | + raw = digest.to_bytes(16, "little") |
| 215 | + return "{:032x}".format(int.from_bytes(raw, "big")) |
| 216 | + # return raw |
0 commit comments