@@ -45,54 +45,54 @@ public class MD5: Digest {
45
45
val s = S
46
46
47
47
val x = x
48
+ val state = state
48
49
49
50
var a = state[0 ]
50
51
var b = state[1 ]
51
52
var c = state[2 ]
52
53
var d = state[3 ]
53
54
54
- for (i in 0 .. < blockSize()) {
55
- when {
56
- i < 16 -> {
57
- var j = (i * 4 ) + offset
58
- x[i] =
59
- ((input[j++ ].toInt() and 0xff ) ) or
60
- ((input[j++ ].toInt() and 0xff ) shl 8 ) or
61
- ((input[j++ ].toInt() and 0xff ) shl 16 ) or
62
- ((input[j ].toInt() and 0xff ) shl 24 )
63
-
64
- val g = i + 0
65
- val f = ((b and c) or (b.inv () and d)) + a + k[i] + x[g]
66
- a = d
67
- d = c
68
- c = b
69
- b + = f rotateLeft s[i]
70
- }
71
- i < 32 -> {
72
- val g = ((5 * i) + 1 ) % 16
73
- val f = ((d and b) or (d.inv () and c)) + a + k[i] + x[g]
74
- a = d
75
- d = c
76
- c = b
77
- b + = f rotateLeft s[i]
78
- }
79
- i < 48 -> {
80
- val g = ((3 * i) + 5 ) % 16
81
- val f = (b xor c xor d) + a + k[i] + x[g]
82
- a = d
83
- d = c
84
- c = b
85
- b + = f rotateLeft s[i]
86
- }
87
- else -> {
88
- val g = (7 * i) % 16
89
- val f = (c xor (b or d.inv ())) + a + k[i] + x[g]
90
- a = d
91
- d = c
92
- c = b
93
- b + = f rotateLeft s[i]
94
- }
95
- }
55
+ var j = offset
56
+ for (i in 0 .. < 16 ) {
57
+ x[i] =
58
+ ((input[j++ ].toInt() and 0xff ) ) or
59
+ ((input[j++ ].toInt() and 0xff ) shl 8 ) or
60
+ ((input[j++ ].toInt() and 0xff ) shl 16 ) or
61
+ ((input[j++ ].toInt() and 0xff ) shl 24 )
62
+
63
+ val g = i + 0
64
+ val f = ((b and c) or (b.inv () and d)) + a + k[i] + x[g]
65
+ a = d
66
+ d = c
67
+ c = b
68
+ b + = f.rotateLeft(s[i])
69
+ }
70
+
71
+ for (i in 16 .. < 32 ) {
72
+ val g = ((5 * i) + 1 ) % 16
73
+ val f = ((d and b) or (d.inv () and c)) + a + k[i] + x[g]
74
+ a = d
75
+ d = c
76
+ c = b
77
+ b + = f.rotateLeft(s[i])
78
+ }
79
+
80
+ for (i in 32 .. < 48 ) {
81
+ val g = ((3 * i) + 5 ) % 16
82
+ val f = (b xor c xor d) + a + k[i] + x[g]
83
+ a = d
84
+ d = c
85
+ c = b
86
+ b + = f.rotateLeft(s[i])
87
+ }
88
+
89
+ for (i in 48 .. < 64 ) {
90
+ val g = (7 * i) % 16
91
+ val f = (c xor (b or d.inv ())) + a + k[i] + x[g]
92
+ a = d
93
+ d = c
94
+ c = b
95
+ b + = f.rotateLeft(s[i])
96
96
}
97
97
98
98
state[0 ] + = a
@@ -113,17 +113,21 @@ public class MD5: Digest {
113
113
buffer.fill(0 , size, 56 )
114
114
}
115
115
116
- buffer[56 ] = (bitLength ).toByte()
117
- buffer[57 ] = (bitLength ushr 8 ).toByte()
118
- buffer[58 ] = (bitLength ushr 16 ).toByte()
119
- buffer[59 ] = (bitLength ushr 24 ).toByte()
120
- buffer[60 ] = (bitLength ushr 32 ).toByte()
121
- buffer[61 ] = (bitLength ushr 40 ).toByte()
122
- buffer[62 ] = (bitLength ushr 48 ).toByte()
123
- buffer[63 ] = (bitLength ushr 56 ).toByte()
116
+ val lo = bitLength.toInt()
117
+ val hi = bitLength.rotateLeft(32 ).toInt()
118
+
119
+ buffer[56 ] = (lo ).toByte()
120
+ buffer[57 ] = (lo ushr 8 ).toByte()
121
+ buffer[58 ] = (lo ushr 16 ).toByte()
122
+ buffer[59 ] = (lo ushr 24 ).toByte()
123
+ buffer[60 ] = (hi ).toByte()
124
+ buffer[61 ] = (hi ushr 8 ).toByte()
125
+ buffer[62 ] = (hi ushr 16 ).toByte()
126
+ buffer[63 ] = (hi ushr 24 ).toByte()
124
127
125
128
compress(buffer, 0 )
126
129
130
+ val state = state
127
131
val a = state[0 ]
128
132
val b = state[1 ]
129
133
val c = state[2 ]
@@ -150,16 +154,14 @@ public class MD5: Digest {
150
154
}
151
155
152
156
protected override fun resetDigest () {
157
+ val state = state
153
158
x.fill(0 )
154
159
state[0 ] = 1732584193
155
160
state[1 ] = - 271733879
156
161
state[2 ] = - 1732584194
157
162
state[3 ] = 271733878
158
163
}
159
164
160
- @Suppress(" NOTHING_TO_INLINE" , " KotlinRedundantDiagnosticSuppress" )
161
- private inline infix fun Int.rotateLeft (n : Int ): Int = (this shl n) or (this ushr (32 - n))
162
-
163
165
private companion object {
164
166
private val S = intArrayOf(
165
167
// round 1 left rotates
@@ -186,17 +188,25 @@ public class MD5: Digest {
186
188
187
189
private val K = intArrayOf(
188
190
// round 1
189
- - 680876936 , - 389564586 , 606105819 , - 1044525330 , - 176418897 , 1200080426 , - 1473231341 , - 45705983 ,
190
- 1770035416 , - 1958414417 , - 42063 , - 1990404162 , 1804603682 , - 40341101 , - 1502002290 , 1236535329 ,
191
+ - 680876936 , - 389564586 , 606105819 , - 1044525330 ,
192
+ - 176418897 , 1200080426 , - 1473231341 , - 45705983 ,
193
+ 1770035416 , - 1958414417 , - 42063 , - 1990404162 ,
194
+ 1804603682 , - 40341101 , - 1502002290 , 1236535329 ,
191
195
// round 2
192
- - 165796510 , - 1069501632 , 643717713 , - 373897302 , - 701558691 , 38016083 , - 660478335 , - 405537848 ,
193
- 568446438 , - 1019803690 , - 187363961 , 1163531501 , - 1444681467 , - 51403784 , 1735328473 , - 1926607734 ,
196
+ - 165796510 , - 1069501632 , 643717713 , - 373897302 ,
197
+ - 701558691 , 38016083 , - 660478335 , - 405537848 ,
198
+ 568446438 , - 1019803690 , - 187363961 , 1163531501 ,
199
+ - 1444681467 , - 51403784 , 1735328473 , - 1926607734 ,
194
200
// round 3
195
- - 378558 , - 2022574463 , 1839030562 , - 35309556 , - 1530992060 , 1272893353 , - 155497632 , - 1094730640 ,
196
- 681279174 , - 358537222 , - 722521979 , 76029189 , - 640364487 , - 421815835 , 530742520 , - 995338651 ,
201
+ - 378558 , - 2022574463 , 1839030562 , - 35309556 ,
202
+ - 1530992060 , 1272893353 , - 155497632 , - 1094730640 ,
203
+ 681279174 , - 358537222 , - 722521979 , 76029189 ,
204
+ - 640364487 , - 421815835 , 530742520 , - 995338651 ,
197
205
// round 4
198
- - 198630844 , 1126891415 , - 1416354905 , - 57434055 , 1700485571 , - 1894986606 , - 1051523 , - 2054922799 ,
199
- 1873313359 , - 30611744 , - 1560198380 , 1309151649 , - 145523070 , - 1120210379 , 718787259 , - 343485551 ,
206
+ - 198630844 , 1126891415 , - 1416354905 , - 57434055 ,
207
+ 1700485571 , - 1894986606 , - 1051523 , - 2054922799 ,
208
+ 1873313359 , - 30611744 , - 1560198380 , 1309151649 ,
209
+ - 145523070 , - 1120210379 , 718787259 , - 343485551 ,
200
210
)
201
211
}
202
212
}
0 commit comments