256 lines
8.2 KiB
Dart
256 lines
8.2 KiB
Dart
// See file LICENSE for more information.
|
|
|
|
library impl.digest.ripemd256;
|
|
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/api.dart';
|
|
import 'package:pointycastle/src/impl/md4_family_digest.dart';
|
|
import 'package:pointycastle/src/registry/registry.dart';
|
|
import 'package:pointycastle/src/ufixnum.dart';
|
|
|
|
/// Implementation of RIPEMD-256 digest.
|
|
class RIPEMD256Digest extends MD4FamilyDigest implements Digest {
|
|
static final FactoryConfig factoryConfig =
|
|
StaticFactoryConfig(Digest, 'RIPEMD-256', () => RIPEMD256Digest());
|
|
|
|
static const _DIGEST_LENGTH = 32;
|
|
|
|
RIPEMD256Digest() : super(Endian.little, 8, 16);
|
|
|
|
@override
|
|
final algorithmName = 'RIPEMD-256';
|
|
|
|
@override
|
|
final digestSize = _DIGEST_LENGTH;
|
|
|
|
@override
|
|
void resetState() {
|
|
state[0] = 0x67452301;
|
|
state[1] = 0xefcdab89;
|
|
state[2] = 0x98badcfe;
|
|
state[3] = 0x10325476;
|
|
state[4] = 0x76543210;
|
|
state[5] = 0xFEDCBA98;
|
|
state[6] = 0x89ABCDEF;
|
|
state[7] = 0x01234567;
|
|
}
|
|
|
|
@override
|
|
void processBlock() {
|
|
int? a, aa;
|
|
int? b, bb;
|
|
int? c, cc;
|
|
int? d, dd;
|
|
int t;
|
|
|
|
a = state[0];
|
|
b = state[1];
|
|
c = state[2];
|
|
d = state[3];
|
|
aa = state[4];
|
|
bb = state[5];
|
|
cc = state[6];
|
|
dd = state[7];
|
|
|
|
// Round 1
|
|
a = _f1(a, b, c, d, buffer[0], 11);
|
|
d = _f1(d, a, b, c, buffer[1], 14);
|
|
c = _f1(c, d, a, b, buffer[2], 15);
|
|
b = _f1(b, c, d, a, buffer[3], 12);
|
|
a = _f1(a, b, c, d, buffer[4], 5);
|
|
d = _f1(d, a, b, c, buffer[5], 8);
|
|
c = _f1(c, d, a, b, buffer[6], 7);
|
|
b = _f1(b, c, d, a, buffer[7], 9);
|
|
a = _f1(a, b, c, d, buffer[8], 11);
|
|
d = _f1(d, a, b, c, buffer[9], 13);
|
|
c = _f1(c, d, a, b, buffer[10], 14);
|
|
b = _f1(b, c, d, a, buffer[11], 15);
|
|
a = _f1(a, b, c, d, buffer[12], 6);
|
|
d = _f1(d, a, b, c, buffer[13], 7);
|
|
c = _f1(c, d, a, b, buffer[14], 9);
|
|
b = _f1(b, c, d, a, buffer[15], 8);
|
|
|
|
aa = _ff4(aa, bb, cc, dd, buffer[5], 8);
|
|
dd = _ff4(dd, aa, bb, cc, buffer[14], 9);
|
|
cc = _ff4(cc, dd, aa, bb, buffer[7], 9);
|
|
bb = _ff4(bb, cc, dd, aa, buffer[0], 11);
|
|
aa = _ff4(aa, bb, cc, dd, buffer[9], 13);
|
|
dd = _ff4(dd, aa, bb, cc, buffer[2], 15);
|
|
cc = _ff4(cc, dd, aa, bb, buffer[11], 15);
|
|
bb = _ff4(bb, cc, dd, aa, buffer[4], 5);
|
|
aa = _ff4(aa, bb, cc, dd, buffer[13], 7);
|
|
dd = _ff4(dd, aa, bb, cc, buffer[6], 7);
|
|
cc = _ff4(cc, dd, aa, bb, buffer[15], 8);
|
|
bb = _ff4(bb, cc, dd, aa, buffer[8], 11);
|
|
aa = _ff4(aa, bb, cc, dd, buffer[1], 14);
|
|
dd = _ff4(dd, aa, bb, cc, buffer[10], 14);
|
|
cc = _ff4(cc, dd, aa, bb, buffer[3], 12);
|
|
bb = _ff4(bb, cc, dd, aa, buffer[12], 6);
|
|
|
|
t = a;
|
|
a = aa;
|
|
aa = t;
|
|
|
|
// Round 2
|
|
a = _f2(a, b, c, d, buffer[7], 7);
|
|
d = _f2(d, a, b, c, buffer[4], 6);
|
|
c = _f2(c, d, a, b, buffer[13], 8);
|
|
b = _f2(b, c, d, a, buffer[1], 13);
|
|
a = _f2(a, b, c, d, buffer[10], 11);
|
|
d = _f2(d, a, b, c, buffer[6], 9);
|
|
c = _f2(c, d, a, b, buffer[15], 7);
|
|
b = _f2(b, c, d, a, buffer[3], 15);
|
|
a = _f2(a, b, c, d, buffer[12], 7);
|
|
d = _f2(d, a, b, c, buffer[0], 12);
|
|
c = _f2(c, d, a, b, buffer[9], 15);
|
|
b = _f2(b, c, d, a, buffer[5], 9);
|
|
a = _f2(a, b, c, d, buffer[2], 11);
|
|
d = _f2(d, a, b, c, buffer[14], 7);
|
|
c = _f2(c, d, a, b, buffer[11], 13);
|
|
b = _f2(b, c, d, a, buffer[8], 12);
|
|
|
|
aa = _ff3(aa, bb, cc, dd, buffer[6], 9);
|
|
dd = _ff3(dd, aa, bb, cc, buffer[11], 13);
|
|
cc = _ff3(cc, dd, aa, bb, buffer[3], 15);
|
|
bb = _ff3(bb, cc, dd, aa, buffer[7], 7);
|
|
aa = _ff3(aa, bb, cc, dd, buffer[0], 12);
|
|
dd = _ff3(dd, aa, bb, cc, buffer[13], 8);
|
|
cc = _ff3(cc, dd, aa, bb, buffer[5], 9);
|
|
bb = _ff3(bb, cc, dd, aa, buffer[10], 11);
|
|
aa = _ff3(aa, bb, cc, dd, buffer[14], 7);
|
|
dd = _ff3(dd, aa, bb, cc, buffer[15], 7);
|
|
cc = _ff3(cc, dd, aa, bb, buffer[8], 12);
|
|
bb = _ff3(bb, cc, dd, aa, buffer[12], 7);
|
|
aa = _ff3(aa, bb, cc, dd, buffer[4], 6);
|
|
dd = _ff3(dd, aa, bb, cc, buffer[9], 15);
|
|
cc = _ff3(cc, dd, aa, bb, buffer[1], 13);
|
|
bb = _ff3(bb, cc, dd, aa, buffer[2], 11);
|
|
|
|
t = b;
|
|
b = bb;
|
|
bb = t;
|
|
|
|
// Round 3
|
|
a = _f3(a, b, c, d, buffer[3], 11);
|
|
d = _f3(d, a, b, c, buffer[10], 13);
|
|
c = _f3(c, d, a, b, buffer[14], 6);
|
|
b = _f3(b, c, d, a, buffer[4], 7);
|
|
a = _f3(a, b, c, d, buffer[9], 14);
|
|
d = _f3(d, a, b, c, buffer[15], 9);
|
|
c = _f3(c, d, a, b, buffer[8], 13);
|
|
b = _f3(b, c, d, a, buffer[1], 15);
|
|
a = _f3(a, b, c, d, buffer[2], 14);
|
|
d = _f3(d, a, b, c, buffer[7], 8);
|
|
c = _f3(c, d, a, b, buffer[0], 13);
|
|
b = _f3(b, c, d, a, buffer[6], 6);
|
|
a = _f3(a, b, c, d, buffer[13], 5);
|
|
d = _f3(d, a, b, c, buffer[11], 12);
|
|
c = _f3(c, d, a, b, buffer[5], 7);
|
|
b = _f3(b, c, d, a, buffer[12], 5);
|
|
|
|
aa = _ff2(aa, bb, cc, dd, buffer[15], 9);
|
|
dd = _ff2(dd, aa, bb, cc, buffer[5], 7);
|
|
cc = _ff2(cc, dd, aa, bb, buffer[1], 15);
|
|
bb = _ff2(bb, cc, dd, aa, buffer[3], 11);
|
|
aa = _ff2(aa, bb, cc, dd, buffer[7], 8);
|
|
dd = _ff2(dd, aa, bb, cc, buffer[14], 6);
|
|
cc = _ff2(cc, dd, aa, bb, buffer[6], 6);
|
|
bb = _ff2(bb, cc, dd, aa, buffer[9], 14);
|
|
aa = _ff2(aa, bb, cc, dd, buffer[11], 12);
|
|
dd = _ff2(dd, aa, bb, cc, buffer[8], 13);
|
|
cc = _ff2(cc, dd, aa, bb, buffer[12], 5);
|
|
bb = _ff2(bb, cc, dd, aa, buffer[2], 14);
|
|
aa = _ff2(aa, bb, cc, dd, buffer[10], 13);
|
|
dd = _ff2(dd, aa, bb, cc, buffer[0], 13);
|
|
cc = _ff2(cc, dd, aa, bb, buffer[4], 7);
|
|
bb = _ff2(bb, cc, dd, aa, buffer[13], 5);
|
|
|
|
t = c;
|
|
c = cc;
|
|
cc = t;
|
|
|
|
// Round 4
|
|
a = _f4(a, b, c, d, buffer[1], 11);
|
|
d = _f4(d, a, b, c, buffer[9], 12);
|
|
c = _f4(c, d, a, b, buffer[11], 14);
|
|
b = _f4(b, c, d, a, buffer[10], 15);
|
|
a = _f4(a, b, c, d, buffer[0], 14);
|
|
d = _f4(d, a, b, c, buffer[8], 15);
|
|
c = _f4(c, d, a, b, buffer[12], 9);
|
|
b = _f4(b, c, d, a, buffer[4], 8);
|
|
a = _f4(a, b, c, d, buffer[13], 9);
|
|
d = _f4(d, a, b, c, buffer[3], 14);
|
|
c = _f4(c, d, a, b, buffer[7], 5);
|
|
b = _f4(b, c, d, a, buffer[15], 6);
|
|
a = _f4(a, b, c, d, buffer[14], 8);
|
|
d = _f4(d, a, b, c, buffer[5], 6);
|
|
c = _f4(c, d, a, b, buffer[6], 5);
|
|
b = _f4(b, c, d, a, buffer[2], 12);
|
|
|
|
aa = _ff1(aa, bb, cc, dd, buffer[8], 15);
|
|
dd = _ff1(dd, aa, bb, cc, buffer[6], 5);
|
|
cc = _ff1(cc, dd, aa, bb, buffer[4], 8);
|
|
bb = _ff1(bb, cc, dd, aa, buffer[1], 11);
|
|
aa = _ff1(aa, bb, cc, dd, buffer[3], 14);
|
|
dd = _ff1(dd, aa, bb, cc, buffer[11], 14);
|
|
cc = _ff1(cc, dd, aa, bb, buffer[15], 6);
|
|
bb = _ff1(bb, cc, dd, aa, buffer[0], 14);
|
|
aa = _ff1(aa, bb, cc, dd, buffer[5], 6);
|
|
dd = _ff1(dd, aa, bb, cc, buffer[12], 9);
|
|
cc = _ff1(cc, dd, aa, bb, buffer[2], 12);
|
|
bb = _ff1(bb, cc, dd, aa, buffer[13], 9);
|
|
aa = _ff1(aa, bb, cc, dd, buffer[9], 12);
|
|
dd = _ff1(dd, aa, bb, cc, buffer[7], 5);
|
|
cc = _ff1(cc, dd, aa, bb, buffer[10], 15);
|
|
bb = _ff1(bb, cc, dd, aa, buffer[14], 8);
|
|
|
|
t = d;
|
|
d = dd;
|
|
dd = t;
|
|
|
|
state[0] = sum32(state[0], a);
|
|
state[1] = sum32(state[1], b);
|
|
state[2] = sum32(state[2], c);
|
|
state[3] = sum32(state[3], d);
|
|
state[4] = sum32(state[4], aa);
|
|
state[5] = sum32(state[5], bb);
|
|
state[6] = sum32(state[6], cc);
|
|
state[7] = sum32(state[7], dd);
|
|
}
|
|
|
|
int _function1(int x, int y, int z) => x ^ y ^ z;
|
|
|
|
int _function2(int x, int y, int z) => (x & y) | (~x & z);
|
|
|
|
int _function3(int x, int y, int z) => (x | ~y) ^ z;
|
|
|
|
int _function4(int x, int y, int z) => (x & z) | (y & ~z);
|
|
|
|
int _f1(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function1(b, c, d) + x, s);
|
|
|
|
int _f2(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function2(b, c, d) + x + 0x5a827999, s);
|
|
|
|
int _f3(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function3(b, c, d) + x + 0x6ed9eba1, s);
|
|
|
|
int _f4(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function4(b, c, d) + x + 0x8f1bbcdc, s);
|
|
|
|
int _ff1(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function1(b, c, d) + x, s);
|
|
|
|
int _ff2(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function2(b, c, d) + x + 0x6d703ef3, s);
|
|
|
|
int _ff3(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function3(b, c, d) + x + 0x5c4dd124, s);
|
|
|
|
int _ff4(int a, int b, int c, int d, int x, int s) =>
|
|
crotl32(a + _function4(b, c, d) + x + 0x50a28be6, s);
|
|
|
|
@override
|
|
int get byteLength => 64;
|
|
}
|