A bit of cleanup and README update

This commit is contained in:
Ugljesa Jovanovic 2019-07-20 18:59:37 +02:00
parent bebe05757d
commit 7b57a931ef
No known key found for this signature in database
GPG Key ID: 46D004C9820EBB98
17 changed files with 821 additions and 766 deletions

View File

@ -3,6 +3,6 @@
#### Initial release/BigInteger - 0.0.1 - 20.7.2019 #### Initial release - 0.0.1 - 20.7.2019
- Implemented Blake2b and SHA256/512 - Implemented Blake2b and SHA256/512

View File

@ -8,12 +8,23 @@ This is an extremely early release, currently only consisting of Blake2b and SHA
**The API will move fast and break often until v1.0** **The API will move fast and break often until v1.0**
Tenative plan is to add 25519 curve based signing and key exchange next. Make SHA hashes "updateable" like Blake2b
After that tenative plan is to add 25519 curve based signing and key exchange next.
## Should I use this in production? ## Should I use this in production?
No, it's untested and unproven. No, it's untested and unproven.
## Supported
## Hashing functions
* Blake2b
* SHA512
* SHA256
More to come.
## Integration ## Integration
#### Gradle #### Gradle
@ -34,7 +45,58 @@ implementation("com.ionspin.kotlin:crypto:0.0.1-SNAPSHOT")
## Usage ## Usage
To be continued... ### Blake2b
You can use Blake 2b in two modes
#### Using a `Blake2b` object
You need to deliver the complete data that is to be hashed in one go
```kotlin
val input = "abc"
val result = Blake2b.digest(input)
```
Result is returned as a `Array<Byte>`
#### Using a `Blake2b` instance
You can create an instance and feed the data by using `update(input : Array<Byte>)` call. Once all data is supplied,
you should call `digest()` or `digestString()` convinence method that converts the `Array<Byte>` into hexadecimal string.
If you want to use Blake2b with a key, you should supply it when creating the `Blake2b` instance.
```kotlin
val test = "abc"
val key = "key"
val blake2b = Blake2b(key)
blake2b.update(test)
val result = blake2b.digest()
```
After digest is called, the instance is reset and can be reused (Keep in mind key stays the same for the particular instance).
### SHA2 (SHA256 and SHA512)
You need to deliver the complete data that is to be hashed in one go. You can either provide the `Array<Byte>` as input
or `String`. Result is always returned as `Array<Byte>` (At least in verision 0.0.1)
```kotlin
val input = "abc"
val result = Sha256.digest(input)
```
```kotlin
val input ="abc"
val result = Sha512.digest(message = input.encodeToByteArray().map { it.toUByte() }.toTypedArray())
```
Result is returned as a `Array<Byte>`

View File

@ -1,6 +1,7 @@
(function (_, Kotlin, $module$bignum, $module$kotlinx_coroutines_core) { (function (_, Kotlin, $module$bignum) {
'use strict'; 'use strict';
var $$importsForInline$$ = _.$$importsForInline$$ || (_.$$importsForInline$$ = {}); var $$importsForInline$$ = _.$$importsForInline$$ || (_.$$importsForInline$$ = {});
var Kind_OBJECT = Kotlin.Kind.OBJECT;
var Kind_INTERFACE = Kotlin.Kind.INTERFACE; var Kind_INTERFACE = Kotlin.Kind.INTERFACE;
var chunked = Kotlin.kotlin.collections.chunked_ba2ldo$; var chunked = Kotlin.kotlin.collections.chunked_ba2ldo$;
var joinToString = Kotlin.kotlin.collections.joinToString_fmv235$; var joinToString = Kotlin.kotlin.collections.joinToString_fmv235$;
@ -13,7 +14,6 @@
var ArrayList_init = Kotlin.kotlin.collections.ArrayList_init_ww73n8$; var ArrayList_init = Kotlin.kotlin.collections.ArrayList_init_ww73n8$;
var UInt_init = Kotlin.kotlin.UInt; var UInt_init = Kotlin.kotlin.UInt;
var ULong_init = Kotlin.kotlin.ULong; var ULong_init = Kotlin.kotlin.ULong;
var Unit = Kotlin.kotlin.Unit;
var encodeToByteArray = Kotlin.kotlin.text.encodeToByteArray_pdl1vz$; var encodeToByteArray = Kotlin.kotlin.text.encodeToByteArray_pdl1vz$;
var toList = Kotlin.kotlin.collections.toList_7wnvza$; var toList = Kotlin.kotlin.collections.toList_7wnvza$;
var UByte = Kotlin.kotlin.UByte; var UByte = Kotlin.kotlin.UByte;
@ -21,14 +21,7 @@
var toList_0 = Kotlin.kotlin.collections.toList_us0mfu$; var toList_0 = Kotlin.kotlin.collections.toList_us0mfu$;
var IllegalStateException_init = Kotlin.kotlin.IllegalStateException_init_pdl1vj$; var IllegalStateException_init = Kotlin.kotlin.IllegalStateException_init_pdl1vj$;
var until = Kotlin.kotlin.ranges.until_dqglrj$; var until = Kotlin.kotlin.ranges.until_dqglrj$;
var Kind_OBJECT = Kotlin.Kind.OBJECT;
var RuntimeException_init = Kotlin.kotlin.RuntimeException_init_pdl1vj$; var RuntimeException_init = Kotlin.kotlin.RuntimeException_init_pdl1vj$;
var COROUTINE_SUSPENDED = Kotlin.kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED;
var CoroutineImpl = Kotlin.kotlin.coroutines.CoroutineImpl;
var launch = $module$kotlinx_coroutines_core.kotlinx.coroutines.launch_s496o7$;
var Job = $module$kotlinx_coroutines_core.kotlinx.coroutines.Job_5dx9e$;
var coroutines = $module$kotlinx_coroutines_core.kotlinx.coroutines;
var CoroutineScope = $module$kotlinx_coroutines_core.kotlinx.coroutines.CoroutineScope_1fupul$;
var BigInteger = $module$bignum.com.ionspin.kotlin.bignum.integer.BigInteger; var BigInteger = $module$bignum.com.ionspin.kotlin.bignum.integer.BigInteger;
var Kind_CLASS = Kotlin.Kind.CLASS; var Kind_CLASS = Kotlin.Kind.CLASS;
var Array_0 = Array; var Array_0 = Array;
@ -41,9 +34,22 @@
var addAll = Kotlin.kotlin.collections.addAll_ipc267$; var addAll = Kotlin.kotlin.collections.addAll_ipc267$;
var emptyList = Kotlin.kotlin.collections.emptyList_287e2$; var emptyList = Kotlin.kotlin.collections.emptyList_287e2$;
var slice = Kotlin.kotlin.collections.slice_l0m14x$; var slice = Kotlin.kotlin.collections.slice_l0m14x$;
var Result = Kotlin.kotlin.Result; function Config() {
var intercepted = Kotlin.kotlin.coroutines.intrinsics.intercepted_f9mg25$; Config_instance = this;
var SafeContinuation_init = Kotlin.kotlin.coroutines.SafeContinuation_init_wj8d80$; this.DEBUG = false;
}
Config.$metadata$ = {
kind: Kind_OBJECT,
simpleName: 'Config',
interfaces: []
};
var Config_instance = null;
function Config_getInstance() {
if (Config_instance === null) {
new Config();
}
return Config_instance;
}
function Hash() { function Hash() {
} }
Hash.$metadata$ = { Hash.$metadata$ = {
@ -169,13 +175,6 @@
return copyToArray(it); return copyToArray(it);
}; };
}); });
function suspendCoroutine$lambda(closure$block) {
return function (c) {
var safe = SafeContinuation_init(intercepted(c));
closure$block(safe);
return safe.getOrThrow();
};
}
function Blake2b(key, hashLength) { function Blake2b(key, hashLength) {
Blake2b$Companion_getInstance(); Blake2b$Companion_getInstance();
if (key === void 0) if (key === void 0)
@ -184,8 +183,6 @@
hashLength = 64; hashLength = 64;
this.key = key; this.key = key;
this.hashLength = hashLength; this.hashLength = hashLength;
this.job = Job();
this.scope = CoroutineScope(coroutines.Dispatchers.Default.plus_1fupul$(this.job));
this.h = Blake2b$Companion_getInstance().iv_0.slice(); this.h = Blake2b$Companion_getInstance().iv_0.slice();
this.counter = BigInteger.Companion.ZERO; this.counter = BigInteger.Companion.ZERO;
this.bufferCounter = 0; this.bufferCounter = 0;
@ -232,26 +229,9 @@
this.R3 = 16; this.R3 = 16;
this.R4 = 63; this.R4 = 63;
} }
function Blake2b$Companion$mixRound$lambda$lambda(it) {
return it.toUpperCase();
}
Blake2b$Companion.prototype.mixRound_r29y2p$ = function (input, message, round) { Blake2b$Companion.prototype.mixRound_r29y2p$ = function (input, message, round) {
var v = input; var v = input;
var selectedSigma = this.sigma_0[round % 10]; var selectedSigma = this.sigma_0[round % 10];
var $receiver = v;
var destination = ArrayList_init($receiver.length);
var tmp$;
for (tmp$ = 0; tmp$ !== $receiver.length; ++tmp$) {
var item = $receiver[tmp$];
destination.add_11rb$(toString_0(item, 16));
}
var printout = chunked(destination, 3);
var tmp$_0;
tmp$_0 = printout.iterator();
while (tmp$_0.hasNext()) {
var element = tmp$_0.next();
println(joinToString(element, ' ', void 0, void 0, void 0, void 0, Blake2b$Companion$mixRound$lambda$lambda));
}
v = this.mix_0(v, 0, 4, 8, 12, message[selectedSigma[0]], message[selectedSigma[1]]); v = this.mix_0(v, 0, 4, 8, 12, message[selectedSigma[0]], message[selectedSigma[1]]);
v = this.mix_0(v, 1, 5, 9, 13, message[selectedSigma[2]], message[selectedSigma[3]]); v = this.mix_0(v, 1, 5, 9, 13, message[selectedSigma[2]], message[selectedSigma[3]]);
v = this.mix_0(v, 2, 6, 10, 14, message[selectedSigma[4]], message[selectedSigma[5]]); v = this.mix_0(v, 2, 6, 10, 14, message[selectedSigma[4]], message[selectedSigma[5]]);
@ -330,7 +310,7 @@
accumulator = acc; accumulator = acc;
} }
var m = accumulator; var m = accumulator;
println('m'); if (Config_getInstance().DEBUG) {
var destination = ArrayList_init(m.length); var destination = ArrayList_init(m.length);
var tmp$_3; var tmp$_3;
for (tmp$_3 = 0; tmp$_3 !== m.length; ++tmp$_3) { for (tmp$_3 = 0; tmp$_3 !== m.length; ++tmp$_3) {
@ -345,6 +325,7 @@
println(joinToString(element_0, ' ', void 0, void 0, void 0, void 0, Blake2b$Companion$compress$lambda$lambda)); println(joinToString(element_0, ' ', void 0, void 0, void 0, void 0, Blake2b$Companion$compress$lambda$lambda));
} }
println('Offset ' + offsetCounter); println('Offset ' + offsetCounter);
}
var $this_0 = v[12]; var $this_0 = v[12];
var other_0 = offsetCounter.ulongValue_6taknv$(); var other_0 = offsetCounter.ulongValue_6taknv$();
v[12] = new ULong_init($this_0.data.xor(other_0.data)); v[12] = new ULong_init($this_0.data.xor(other_0.data));
@ -553,7 +534,7 @@
} }
return Blake2b$Companion_instance; return Blake2b$Companion_instance;
} }
Blake2b.prototype.updateBlocking_ummv9a$ = function (array) { Blake2b.prototype.update_ummv9a$ = function (array) {
if (array.length === 0) { if (array.length === 0) {
throw RuntimeException_init('Updating with empty array is not allowed. If you need empty hash, just call digest without updating'); throw RuntimeException_init('Updating with empty array is not allowed. If you need empty hash, just call digest without updating');
} }
@ -613,7 +594,7 @@
} }
} }
}; };
Blake2b.prototype.updateBlocking_61zpoe$ = function (input) { Blake2b.prototype.update_61zpoe$ = function (input) {
var $receiver = encodeToByteArray(input); var $receiver = encodeToByteArray(input);
var destination = ArrayList_init($receiver.length); var destination = ArrayList_init($receiver.length);
var tmp$; var tmp$;
@ -621,7 +602,7 @@
var item = $receiver[tmp$]; var item = $receiver[tmp$];
destination.add_11rb$(new UByte(item)); destination.add_11rb$(new UByte(item));
} }
this.updateBlocking_ummv9a$(copyToArray(destination)); this.update_ummv9a$(copyToArray(destination));
}; };
Blake2b.prototype.appendToBuffer_0 = function (array, start) { Blake2b.prototype.appendToBuffer_0 = function (array, start) {
arrayCopy(array, this.buffer, start, 0, array.length); arrayCopy(array, this.buffer, start, 0, array.length);
@ -630,183 +611,12 @@
Blake2b.prototype.consumeBlock_0 = function (block) { Blake2b.prototype.consumeBlock_0 = function (block) {
this.h = Blake2b$Companion_getInstance().compress_c1cv33$(this.h, block, this.counter, false); this.h = Blake2b$Companion_getInstance().compress_c1cv33$(this.h, block, this.counter, false);
}; };
function Coroutine$Blake2b$update$lambda$lambda(closure$array_0, this$Blake2b_0, closure$it_0, $receiver_0, controller, continuation_0) {
CoroutineImpl.call(this, continuation_0);
this.$controller = controller;
this.exceptionState_0 = 1;
this.local$closure$array = closure$array_0;
this.local$this$Blake2b = this$Blake2b_0;
this.local$closure$it = closure$it_0;
}
Coroutine$Blake2b$update$lambda$lambda.$metadata$ = {
kind: Kotlin.Kind.CLASS,
simpleName: null,
interfaces: [CoroutineImpl]
};
Coroutine$Blake2b$update$lambda$lambda.prototype = Object.create(CoroutineImpl.prototype);
Coroutine$Blake2b$update$lambda$lambda.prototype.constructor = Coroutine$Blake2b$update$lambda$lambda;
Coroutine$Blake2b$update$lambda$lambda.prototype.doResume = function () {
do
try {
switch (this.state_0) {
case 0:
this.local$this$Blake2b.updateBlocking_ummv9a$(this.local$closure$array);
this.local$closure$it.resumeWith_tl1gpc$(new Result(Unit));
return Unit;
case 1:
throw this.exception_0;
default:this.state_0 = 1;
throw new Error('State Machine Unreachable execution');
}
}
catch (e) {
if (this.state_0 === 1) {
this.exceptionState_0 = this.state_0;
throw e;
}
else {
this.state_0 = this.exceptionState_0;
this.exception_0 = e;
}
}
while (true);
};
function Blake2b$update$lambda$lambda(closure$array_0, this$Blake2b_0, closure$it_0) {
return function ($receiver_0, continuation_0, suspended) {
var instance = new Coroutine$Blake2b$update$lambda$lambda(closure$array_0, this$Blake2b_0, closure$it_0, $receiver_0, this, continuation_0);
if (suspended)
return instance;
else
return instance.doResume(null);
};
}
function Blake2b$update$lambda(this$Blake2b, closure$array) {
return function (it) {
launch(this$Blake2b.scope, this$Blake2b.job, void 0, Blake2b$update$lambda$lambda(closure$array, this$Blake2b, it));
return Unit;
};
}
function Coroutine$update_ummv9a$($this, array_0, continuation_0) {
CoroutineImpl.call(this, continuation_0);
this.exceptionState_0 = 1;
this.$this = $this;
this.local$array = array_0;
}
Coroutine$update_ummv9a$.$metadata$ = {
kind: Kotlin.Kind.CLASS,
simpleName: null,
interfaces: [CoroutineImpl]
};
Coroutine$update_ummv9a$.prototype = Object.create(CoroutineImpl.prototype);
Coroutine$update_ummv9a$.prototype.constructor = Coroutine$update_ummv9a$;
Coroutine$update_ummv9a$.prototype.doResume = function () {
do
try {
switch (this.state_0) {
case 0:
this.state_0 = 2;
this.result_0 = suspendCoroutine$lambda(Blake2b$update$lambda(this.$this, this.local$array))(this);
if (this.result_0 === COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED;
continue;
case 1:
throw this.exception_0;
case 2:
this.result_0;
return this.result_0;
default:this.state_0 = 1;
throw new Error('State Machine Unreachable execution');
}
}
catch (e) {
if (this.state_0 === 1) {
this.exceptionState_0 = this.state_0;
throw e;
}
else {
this.state_0 = this.exceptionState_0;
this.exception_0 = e;
}
}
while (true);
};
Blake2b.prototype.update_ummv9a$ = function (array_0, continuation_0, suspended) {
var instance = new Coroutine$update_ummv9a$(this, array_0, continuation_0);
if (suspended)
return instance;
else
return instance.doResume(null);
};
function Coroutine$update_61zpoe$($this, input_0, continuation_0) {
CoroutineImpl.call(this, continuation_0);
this.exceptionState_0 = 1;
this.$this = $this;
this.local$input = input_0;
}
Coroutine$update_61zpoe$.$metadata$ = {
kind: Kotlin.Kind.CLASS,
simpleName: null,
interfaces: [CoroutineImpl]
};
Coroutine$update_61zpoe$.prototype = Object.create(CoroutineImpl.prototype);
Coroutine$update_61zpoe$.prototype.constructor = Coroutine$update_61zpoe$;
Coroutine$update_61zpoe$.prototype.doResume = function () {
do
try {
switch (this.state_0) {
case 0:
var $receiver = encodeToByteArray(this.local$input);
var destination = ArrayList_init($receiver.length);
var tmp$;
for (tmp$ = 0; tmp$ !== $receiver.length; ++tmp$) {
var item = $receiver[tmp$];
destination.add_11rb$(new UByte(item));
}
this.state_0 = 2;
this.result_0 = this.$this.update_ummv9a$(copyToArray(destination), this);
if (this.result_0 === COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED;
continue;
case 1:
throw this.exception_0;
case 2:
return;
default:this.state_0 = 1;
throw new Error('State Machine Unreachable execution');
}
}
catch (e) {
if (this.state_0 === 1) {
this.exceptionState_0 = this.state_0;
throw e;
}
else {
this.state_0 = this.exceptionState_0;
this.exception_0 = e;
}
}
while (true);
};
Blake2b.prototype.update_61zpoe$ = function (input_0, continuation_0, suspended) {
var instance = new Coroutine$update_61zpoe$(this, input_0, continuation_0);
if (suspended)
return instance;
else
return instance.doResume(null);
};
Blake2b.prototype.digest = function () { Blake2b.prototype.digest = function () {
var lastBlockPadded = Blake2b$Companion_getInstance().padToBlock_0(this.buffer); var lastBlockPadded = Blake2b$Companion_getInstance().padToBlock_0(this.buffer);
this.counter = this.counter.plus_za3lpa$(this.bufferCounter); this.counter = this.counter.plus_za3lpa$(this.bufferCounter);
Blake2b$Companion_getInstance().compress_c1cv33$(this.h, lastBlockPadded, this.counter, true); Blake2b$Companion_getInstance().compress_c1cv33$(this.h, lastBlockPadded, this.counter, true);
var result = Blake2b$Companion_getInstance().formatResult_0(this.h); var result = Blake2b$Companion_getInstance().formatResult_0(this.h);
var destination = ArrayList_init(result.length); this.reset_0();
var tmp$;
for (tmp$ = 0; tmp$ !== result.length; ++tmp$) {
var item = result[tmp$];
destination.add_11rb$(toString(item, 16));
}
println(joinToString(destination, ''));
return result; return result;
}; };
Blake2b.prototype.digestString = function () { Blake2b.prototype.digestString = function () {
@ -819,6 +629,18 @@
} }
return joinToString(destination, ''); return joinToString(destination, '');
}; };
Blake2b.prototype.reset_0 = function () {
this.h = Blake2b$Companion_getInstance().iv_0.slice();
this.counter = BigInteger.Companion.ZERO;
this.bufferCounter = 0;
var array = Array_0(128);
var tmp$;
tmp$ = array.length - 1 | 0;
for (var i = 0; i <= tmp$; i++) {
array[i] = new UByte(0);
}
this.buffer = array;
};
Blake2b.$metadata$ = { Blake2b.$metadata$ = {
kind: Kind_CLASS, kind: Kind_CLASS,
simpleName: 'Blake2b', simpleName: 'Blake2b',
@ -852,15 +674,6 @@
}); });
function Sha256() { function Sha256() {
Sha256$Companion_getInstance(); Sha256$Companion_getInstance();
this.h0 = new UInt_init(1779033703);
this.h1 = new UInt_init(-1150833019);
this.h2 = new UInt_init(1013904242);
this.h3 = new UInt_init(-1521486534);
this.h4 = new UInt_init(1359893119);
this.h5 = new UInt_init(-1694144372);
this.h6 = new UInt_init(528734635);
this.h7 = new UInt_init(1541459225);
this.k = [new UInt_init(1116352408), new UInt_init(1899447441), new UInt_init(-1245643825), new UInt_init(-373957723), new UInt_init(961987163), new UInt_init(1508970993), new UInt_init(-1841331548), new UInt_init(-1424204075), new UInt_init(-670586216), new UInt_init(310598401), new UInt_init(607225278), new UInt_init(1426881987), new UInt_init(1925078388), new UInt_init(-2132889090), new UInt_init(-1680079193), new UInt_init(-1046744716), new UInt_init(-459576895), new UInt_init(-272742522), new UInt_init(264347078), new UInt_init(604807628), new UInt_init(770255983), new UInt_init(1249150122), new UInt_init(1555081692), new UInt_init(1996064986), new UInt_init(-1740746414), new UInt_init(-1473132947), new UInt_init(-1341970488), new UInt_init(-1084653625), new UInt_init(-958395405), new UInt_init(-710438585), new UInt_init(113926993), new UInt_init(338241895), new UInt_init(666307205), new UInt_init(773529912), new UInt_init(1294757372), new UInt_init(1396182291), new UInt_init(1695183700), new UInt_init(1986661051), new UInt_init(-2117940946), new UInt_init(-1838011259), new UInt_init(-1564481375), new UInt_init(-1474664885), new UInt_init(-1035236496), new UInt_init(-949202525), new UInt_init(-778901479), new UInt_init(-694614492), new UInt_init(-200395387), new UInt_init(275423344), new UInt_init(430227734), new UInt_init(506948616), new UInt_init(659060556), new UInt_init(883997877), new UInt_init(958139571), new UInt_init(1322822218), new UInt_init(1537002063), new UInt_init(1747873779), new UInt_init(1955562222), new UInt_init(2024104815), new UInt_init(-2067236844), new UInt_init(-1933114872), new UInt_init(-1866530822), new UInt_init(-1538233109), new UInt_init(-1090935817), new UInt_init(-965641998)];
} }
function Sha256$Companion() { function Sha256$Companion() {
Sha256$Companion_instance = this; Sha256$Companion_instance = this;
@ -869,21 +682,29 @@
this.UINT_MASK = new UInt_init(-1); this.UINT_MASK = new UInt_init(-1);
this.BYTE_MASK_FROM_ULONG = new ULong_init(Kotlin.Long.fromInt(255)); this.BYTE_MASK_FROM_ULONG = new ULong_init(Kotlin.Long.fromInt(255));
this.BYTE_MASK_FROM_UINT = new UInt_init(255); this.BYTE_MASK_FROM_UINT = new UInt_init(255);
this.iv = [new UInt_init(1779033703), new UInt_init(-1150833019), new UInt_init(1013904242), new UInt_init(-1521486534), new UInt_init(1359893119), new UInt_init(-1694144372), new UInt_init(528734635), new UInt_init(1541459225)];
this.k = [new UInt_init(1116352408), new UInt_init(1899447441), new UInt_init(-1245643825), new UInt_init(-373957723), new UInt_init(961987163), new UInt_init(1508970993), new UInt_init(-1841331548), new UInt_init(-1424204075), new UInt_init(-670586216), new UInt_init(310598401), new UInt_init(607225278), new UInt_init(1426881987), new UInt_init(1925078388), new UInt_init(-2132889090), new UInt_init(-1680079193), new UInt_init(-1046744716), new UInt_init(-459576895), new UInt_init(-272742522), new UInt_init(264347078), new UInt_init(604807628), new UInt_init(770255983), new UInt_init(1249150122), new UInt_init(1555081692), new UInt_init(1996064986), new UInt_init(-1740746414), new UInt_init(-1473132947), new UInt_init(-1341970488), new UInt_init(-1084653625), new UInt_init(-958395405), new UInt_init(-710438585), new UInt_init(113926993), new UInt_init(338241895), new UInt_init(666307205), new UInt_init(773529912), new UInt_init(1294757372), new UInt_init(1396182291), new UInt_init(1695183700), new UInt_init(1986661051), new UInt_init(-2117940946), new UInt_init(-1838011259), new UInt_init(-1564481375), new UInt_init(-1474664885), new UInt_init(-1035236496), new UInt_init(-949202525), new UInt_init(-778901479), new UInt_init(-694614492), new UInt_init(-200395387), new UInt_init(275423344), new UInt_init(430227734), new UInt_init(506948616), new UInt_init(659060556), new UInt_init(883997877), new UInt_init(958139571), new UInt_init(1322822218), new UInt_init(1537002063), new UInt_init(1747873779), new UInt_init(1955562222), new UInt_init(2024104815), new UInt_init(-2067236844), new UInt_init(-1933114872), new UInt_init(-1866530822), new UInt_init(-1538233109), new UInt_init(-1090935817), new UInt_init(-965641998)];
} }
Sha256$Companion.$metadata$ = { Sha256$Companion.prototype.digest_61zpoe$ = function (message) {
kind: Kind_OBJECT, var $receiver = encodeToByteArray(message);
simpleName: 'Companion', var destination = ArrayList_init($receiver.length);
interfaces: []
};
var Sha256$Companion_instance = null;
function Sha256$Companion_getInstance() {
if (Sha256$Companion_instance === null) {
new Sha256$Companion();
}
return Sha256$Companion_instance;
}
Sha256.prototype.digest_ummv9a$ = function (message) {
var tmp$; var tmp$;
for (tmp$ = 0; tmp$ !== $receiver.length; ++tmp$) {
var item = $receiver[tmp$];
destination.add_11rb$(new UByte(item));
}
return this.digest_ummv9a$(copyToArray(destination));
};
Sha256$Companion.prototype.digest_ummv9a$ = function (message) {
var tmp$;
var h0 = {v: new UInt_init(1779033703)};
var h1 = {v: new UInt_init(-1150833019)};
var h2 = {v: new UInt_init(1013904242)};
var h3 = {v: new UInt_init(-1521486534)};
var h4 = {v: new UInt_init(1359893119)};
var h5 = {v: new UInt_init(-1694144372)};
var h6 = {v: new UInt_init(528734635)};
var h7 = {v: new UInt_init(1541459225)};
var originalMessageSizeInBits = message.length * 8 | 0; var originalMessageSizeInBits = message.length * 8 | 0;
var expandedRemainderOf512 = (originalMessageSizeInBits + 65 | 0) % 512; var expandedRemainderOf512 = (originalMessageSizeInBits + 65 | 0) % 512;
if (expandedRemainderOf512 === 0) if (expandedRemainderOf512 === 0)
@ -961,14 +782,14 @@
var other_2 = w[i_2 - 7 | 0]; var other_2 = w[i_2 - 7 | 0];
w[i_2] = new UInt_init((new UInt_init($this.data + other_2.data | 0)).data + s1.data | 0); w[i_2] = new UInt_init((new UInt_init($this.data + other_2.data | 0)).data + s1.data | 0);
} }
var a = this.h0; var a = h0.v;
var b = this.h1; var b = h1.v;
var c = this.h2; var c = h2.v;
var d = this.h3; var d = h3.v;
var e = this.h4; var e = h4.v;
var f = this.h5; var f = h5.v;
var g = this.h6; var g = h6.v;
var h = this.h7; var h = h7.v;
for (var i_3 = 0; i_3 < 64; i_3++) { for (var i_3 = 0; i_3 < 64; i_3++) {
var s1_0 = this.compressionSigma1_0(e); var s1_0 = this.compressionSigma1_0(e);
var ch = this.ch_0(e, f, g); var ch = this.ch_0(e, f, g);
@ -989,102 +810,91 @@
b = a; b = a;
a = new UInt_init(temp1.data + temp2.data | 0); a = new UInt_init(temp1.data + temp2.data | 0);
} }
var $this_2 = this.h0; var $this_2 = h0.v;
var other_5 = a; var other_5 = a;
this.h0 = new UInt_init($this_2.data + other_5.data | 0); h0.v = new UInt_init($this_2.data + other_5.data | 0);
var $this_3 = this.h1; var $this_3 = h1.v;
var other_6 = b; var other_6 = b;
this.h1 = new UInt_init($this_3.data + other_6.data | 0); h1.v = new UInt_init($this_3.data + other_6.data | 0);
var $this_4 = this.h2; var $this_4 = h2.v;
var other_7 = c; var other_7 = c;
this.h2 = new UInt_init($this_4.data + other_7.data | 0); h2.v = new UInt_init($this_4.data + other_7.data | 0);
var $this_5 = this.h3; var $this_5 = h3.v;
var other_8 = d; var other_8 = d;
this.h3 = new UInt_init($this_5.data + other_8.data | 0); h3.v = new UInt_init($this_5.data + other_8.data | 0);
var $this_6 = this.h4; var $this_6 = h4.v;
var other_9 = e; var other_9 = e;
this.h4 = new UInt_init($this_6.data + other_9.data | 0); h4.v = new UInt_init($this_6.data + other_9.data | 0);
var $this_7 = this.h5; var $this_7 = h5.v;
var other_10 = f; var other_10 = f;
this.h5 = new UInt_init($this_7.data + other_10.data | 0); h5.v = new UInt_init($this_7.data + other_10.data | 0);
var $this_8 = this.h6; var $this_8 = h6.v;
var other_11 = g; var other_11 = g;
this.h6 = new UInt_init($this_8.data + other_11.data | 0); h6.v = new UInt_init($this_8.data + other_11.data | 0);
var $this_9 = this.h7; var $this_9 = h7.v;
var other_12 = h; var other_12 = h;
this.h7 = new UInt_init($this_9.data + other_12.data | 0); h7.v = new UInt_init($this_9.data + other_12.data | 0);
} }
var $receiver_0 = this.toPaddedByteArray_1(this.h0); var $receiver_0 = this.toPaddedByteArray_1(h0.v);
var elements_0 = this.toPaddedByteArray_1(this.h1); var elements_0 = this.toPaddedByteArray_1(h1.v);
var $receiver_1 = $receiver_0.concat(elements_0); var $receiver_1 = $receiver_0.concat(elements_0);
var elements_1 = this.toPaddedByteArray_1(this.h2); var elements_1 = this.toPaddedByteArray_1(h2.v);
var $receiver_2 = $receiver_1.concat(elements_1); var $receiver_2 = $receiver_1.concat(elements_1);
var elements_2 = this.toPaddedByteArray_1(this.h3); var elements_2 = this.toPaddedByteArray_1(h3.v);
var $receiver_3 = $receiver_2.concat(elements_2); var $receiver_3 = $receiver_2.concat(elements_2);
var elements_3 = this.toPaddedByteArray_1(this.h4); var elements_3 = this.toPaddedByteArray_1(h4.v);
var $receiver_4 = $receiver_3.concat(elements_3); var $receiver_4 = $receiver_3.concat(elements_3);
var elements_4 = this.toPaddedByteArray_1(this.h5); var elements_4 = this.toPaddedByteArray_1(h5.v);
var $receiver_5 = $receiver_4.concat(elements_4); var $receiver_5 = $receiver_4.concat(elements_4);
var elements_5 = this.toPaddedByteArray_1(this.h6); var elements_5 = this.toPaddedByteArray_1(h6.v);
var $receiver_6 = $receiver_5.concat(elements_5); var $receiver_6 = $receiver_5.concat(elements_5);
var elements_6 = this.toPaddedByteArray_1(this.h7); var elements_6 = this.toPaddedByteArray_1(h7.v);
var digest = $receiver_6.concat(elements_6); var digest = $receiver_6.concat(elements_6);
this.reset_0();
return digest; return digest;
}; };
Sha256.prototype.reset_0 = function () { Sha256$Companion.prototype.scheduleSigma0_0 = function (value) {
this.h0 = new UInt_init(1779033703);
this.h1 = new UInt_init(-1150833019);
this.h2 = new UInt_init(1013904242);
this.h3 = new UInt_init(-1521486534);
this.h4 = new UInt_init(1359893119);
this.h5 = new UInt_init(-1694144372);
this.h6 = new UInt_init(528734635);
this.h7 = new UInt_init(1541459225);
};
Sha256.prototype.scheduleSigma0_0 = function (value) {
var $this = rotateRight(value, 7); var $this = rotateRight(value, 7);
var other = rotateRight(value, 18); var other = rotateRight(value, 18);
var tmp$ = new UInt_init($this.data ^ other.data); var tmp$ = new UInt_init($this.data ^ other.data);
var other_0 = new UInt_init(value.data >>> 3); var other_0 = new UInt_init(value.data >>> 3);
return new UInt_init(tmp$.data ^ other_0.data); return new UInt_init(tmp$.data ^ other_0.data);
}; };
Sha256.prototype.scheduleSigma1_0 = function (value) { Sha256$Companion.prototype.scheduleSigma1_0 = function (value) {
var $this = rotateRight(value, 17); var $this = rotateRight(value, 17);
var other = rotateRight(value, 19); var other = rotateRight(value, 19);
var tmp$ = new UInt_init($this.data ^ other.data); var tmp$ = new UInt_init($this.data ^ other.data);
var other_0 = new UInt_init(value.data >>> 10); var other_0 = new UInt_init(value.data >>> 10);
return new UInt_init(tmp$.data ^ other_0.data); return new UInt_init(tmp$.data ^ other_0.data);
}; };
Sha256.prototype.compressionSigma0_0 = function (a) { Sha256$Companion.prototype.compressionSigma0_0 = function (a) {
var $this = rotateRight(a, 2); var $this = rotateRight(a, 2);
var other = rotateRight(a, 13); var other = rotateRight(a, 13);
var $this_0 = new UInt_init($this.data ^ other.data); var $this_0 = new UInt_init($this.data ^ other.data);
var other_0 = rotateRight(a, 22); var other_0 = rotateRight(a, 22);
return new UInt_init($this_0.data ^ other_0.data); return new UInt_init($this_0.data ^ other_0.data);
}; };
Sha256.prototype.compressionSigma1_0 = function (e) { Sha256$Companion.prototype.compressionSigma1_0 = function (e) {
var $this = rotateRight(e, 6); var $this = rotateRight(e, 6);
var other = rotateRight(e, 11); var other = rotateRight(e, 11);
var $this_0 = new UInt_init($this.data ^ other.data); var $this_0 = new UInt_init($this.data ^ other.data);
var other_0 = rotateRight(e, 25); var other_0 = rotateRight(e, 25);
return new UInt_init($this_0.data ^ other_0.data); return new UInt_init($this_0.data ^ other_0.data);
}; };
Sha256.prototype.ch_0 = function (x, y, z) { Sha256$Companion.prototype.ch_0 = function (x, y, z) {
var tmp$ = new UInt_init(x.data & y.data); var tmp$ = new UInt_init(x.data & y.data);
var other = Sha256$Companion_getInstance().UINT_MASK; var other = this.UINT_MASK;
var other_0 = new UInt_init((new UInt_init(x.data ^ other.data)).data & z.data); var other_0 = new UInt_init((new UInt_init(x.data ^ other.data)).data & z.data);
return new UInt_init(tmp$.data ^ other_0.data); return new UInt_init(tmp$.data ^ other_0.data);
}; };
Sha256.prototype.maj_0 = function (x, y, z) { Sha256$Companion.prototype.maj_0 = function (x, y, z) {
var tmp$ = new UInt_init(x.data & y.data); var tmp$ = new UInt_init(x.data & y.data);
var other = new UInt_init(x.data & z.data); var other = new UInt_init(x.data & z.data);
var tmp$_0 = new UInt_init(tmp$.data ^ other.data); var tmp$_0 = new UInt_init(tmp$.data ^ other.data);
var other_0 = new UInt_init(y.data & z.data); var other_0 = new UInt_init(y.data & z.data);
return new UInt_init(tmp$_0.data ^ other_0.data); return new UInt_init(tmp$_0.data ^ other_0.data);
}; };
Sha256.prototype.toPaddedByteArray_0 = function ($receiver) { Sha256$Companion.prototype.toPaddedByteArray_0 = function ($receiver) {
var byteMask = Sha256$Companion_getInstance().BYTE_MASK_FROM_ULONG; var byteMask = this.BYTE_MASK_FROM_ULONG;
var array = Array_0(8); var array = Array_0(8);
var tmp$; var tmp$;
tmp$ = array.length - 1 | 0; tmp$ = array.length - 1 | 0;
@ -1124,8 +934,8 @@
} }
return array; return array;
}; };
Sha256.prototype.toPaddedByteArray_1 = function ($receiver) { Sha256$Companion.prototype.toPaddedByteArray_1 = function ($receiver) {
var byteMask = Sha256$Companion_getInstance().BYTE_MASK_FROM_UINT; var byteMask = this.BYTE_MASK_FROM_UINT;
var array = Array_0(4); var array = Array_0(4);
var tmp$; var tmp$;
tmp$ = array.length - 1 | 0; tmp$ = array.length - 1 | 0;
@ -1153,10 +963,22 @@
} }
return array; return array;
}; };
Sha256$Companion.$metadata$ = {
kind: Kind_OBJECT,
simpleName: 'Companion',
interfaces: []
};
var Sha256$Companion_instance = null;
function Sha256$Companion_getInstance() {
if (Sha256$Companion_instance === null) {
new Sha256$Companion();
}
return Sha256$Companion_instance;
}
Sha256.$metadata$ = { Sha256.$metadata$ = {
kind: Kind_CLASS, kind: Kind_CLASS,
simpleName: 'Sha256', simpleName: 'Sha256',
interfaces: [] interfaces: [Hash]
}; };
var chunked$lambda_1 = wrapFunction(function () { var chunked$lambda_1 = wrapFunction(function () {
var copyToArray = Kotlin.kotlin.collections.copyToArray; var copyToArray = Kotlin.kotlin.collections.copyToArray;
@ -1166,35 +988,34 @@
}); });
function Sha512() { function Sha512() {
Sha512$Companion_getInstance(); Sha512$Companion_getInstance();
this.h0 = new ULong_init(new Kotlin.Long(-205731576, 1779033703));
this.h1 = new ULong_init(new Kotlin.Long(-2067093701, -1150833019));
this.h2 = new ULong_init(new Kotlin.Long(-23791573, 1013904242));
this.h3 = new ULong_init(new Kotlin.Long(1595750129, -1521486534));
this.h4 = new ULong_init(new Kotlin.Long(-1377402159, 1359893119));
this.h5 = new ULong_init(new Kotlin.Long(725511199, -1694144372));
this.h6 = new ULong_init(new Kotlin.Long(-79577749, 528734635));
this.h7 = new ULong_init(new Kotlin.Long(327033209, 1541459225));
} }
function Sha512$Companion() { function Sha512$Companion() {
Sha512$Companion_instance = this; Sha512$Companion_instance = this;
this.BLOCK_SIZE = 1024; this.BLOCK_SIZE = 1024;
this.ULONG_MASK = new ULong_init(Kotlin.Long.NEG_ONE); this.ULONG_MASK = new ULong_init(Kotlin.Long.NEG_ONE);
this.k = [new ULong_init(new Kotlin.Long(-685199838, 1116352408)), new ULong_init(new Kotlin.Long(602891725, 1899447441)), new ULong_init(new Kotlin.Long(-330482897, -1245643825)), new ULong_init(new Kotlin.Long(-2121671748, -373957723)), new ULong_init(new Kotlin.Long(-213338824, 961987163)), new ULong_init(new Kotlin.Long(-1241133031, 1508970993)), new ULong_init(new Kotlin.Long(-1357295717, -1841331548)), new ULong_init(new Kotlin.Long(-630357736, -1424204075)), new ULong_init(new Kotlin.Long(-1560083902, -670586216)), new ULong_init(new Kotlin.Long(1164996542, 310598401)), new ULong_init(new Kotlin.Long(1323610764, 607225278)), new ULong_init(new Kotlin.Long(-704662302, 1426881987)), new ULong_init(new Kotlin.Long(-226784913, 1925078388)), new ULong_init(new Kotlin.Long(991336113, -2132889090)), new ULong_init(new Kotlin.Long(633803317, -1680079193)), new ULong_init(new Kotlin.Long(-815192428, -1046744716)), new ULong_init(new Kotlin.Long(-1628353838, -459576895)), new ULong_init(new Kotlin.Long(944711139, -272742522)), new ULong_init(new Kotlin.Long(-1953704523, 264347078)), new ULong_init(new Kotlin.Long(2007800933, 604807628)), new ULong_init(new Kotlin.Long(1495990901, 770255983)), new ULong_init(new Kotlin.Long(1856431235, 1249150122)), new ULong_init(new Kotlin.Long(-1119749164, 1555081692)), new ULong_init(new Kotlin.Long(-2096016459, 1996064986)), new ULong_init(new Kotlin.Long(-295247957, -1740746414)), new ULong_init(new Kotlin.Long(766784016, -1473132947)), new ULong_init(new Kotlin.Long(-1728372417, -1341970488)), new ULong_init(new Kotlin.Long(-1091629340, -1084653625)), new ULong_init(new Kotlin.Long(1034457026, -958395405)), new ULong_init(new Kotlin.Long(-1828018395, -710438585)), new ULong_init(new Kotlin.Long(-536640913, 113926993)), new ULong_init(new Kotlin.Long(168717936, 338241895)), new ULong_init(new Kotlin.Long(1188179964, 666307205)), new ULong_init(new Kotlin.Long(1546045734, 773529912)), new ULong_init(new Kotlin.Long(1522805485, 1294757372)), new ULong_init(new Kotlin.Long(-1651133473, 1396182291)), new ULong_init(new Kotlin.Long(-1951439906, 1695183700)), new ULong_init(new Kotlin.Long(1014477480, 1986661051)), new ULong_init(new Kotlin.Long(1206759142, -2117940946)), new ULong_init(new Kotlin.Long(344077627, -1838011259)), new ULong_init(new Kotlin.Long(1290863460, -1564481375)), new ULong_init(new Kotlin.Long(-1136513023, -1474664885)), new ULong_init(new Kotlin.Long(-789014639, -1035236496)), new ULong_init(new Kotlin.Long(106217008, -949202525)), new ULong_init(new Kotlin.Long(-688958952, -778901479)), new ULong_init(new Kotlin.Long(1432725776, -694614492)), new ULong_init(new Kotlin.Long(1467031594, -200395387)), new ULong_init(new Kotlin.Long(851169720, 275423344)), new ULong_init(new Kotlin.Long(-1194143544, 430227734)), new ULong_init(new Kotlin.Long(1363258195, 506948616)), new ULong_init(new Kotlin.Long(-544281703, 659060556)), new ULong_init(new Kotlin.Long(-509917016, 883997877)), new ULong_init(new Kotlin.Long(-976659869, 958139571)), new ULong_init(new Kotlin.Long(-482243893, 1322822218)), new ULong_init(new Kotlin.Long(2003034995, 1537002063)), new ULong_init(new Kotlin.Long(-692930397, 1747873779)), new ULong_init(new Kotlin.Long(1575990012, 1955562222)), new ULong_init(new Kotlin.Long(1125592928, 2024104815)), new ULong_init(new Kotlin.Long(-1578062990, -2067236844)), new ULong_init(new Kotlin.Long(442776044, -1933114872)), new ULong_init(new Kotlin.Long(593698344, -1866530822)), new ULong_init(new Kotlin.Long(-561857047, -1538233109)), new ULong_init(new Kotlin.Long(-1295615723, -1090935817)), new ULong_init(new Kotlin.Long(-479046869, -965641998)), new ULong_init(new Kotlin.Long(-366583396, -903397682)), new ULong_init(new Kotlin.Long(566280711, -779700025)), new ULong_init(new Kotlin.Long(-840897762, -354779690)), new ULong_init(new Kotlin.Long(-294727304, -176337025)), new ULong_init(new Kotlin.Long(1914138554, 116418474)), new ULong_init(new Kotlin.Long(-1563912026, 174292421)), new ULong_init(new Kotlin.Long(-1090974290, 289380356)), new ULong_init(new Kotlin.Long(320620315, 460393269)), new ULong_init(new Kotlin.Long(587496836, 685471733)), new ULong_init(new Kotlin.Long(1086792851, 852142971)), new ULong_init(new Kotlin.Long(365543100, 1017036298)), new ULong_init(new Kotlin.Long(-1676669620, 1126000580)), new ULong_init(new Kotlin.Long(-885112138, 1288033470)), new ULong_init(new Kotlin.Long(-60457430, 1501505948)), new ULong_init(new Kotlin.Long(987167468, 1607167915)), new ULong_init(new Kotlin.Long(1246189591, 1816402316))]; this.k = [new ULong_init(new Kotlin.Long(-685199838, 1116352408)), new ULong_init(new Kotlin.Long(602891725, 1899447441)), new ULong_init(new Kotlin.Long(-330482897, -1245643825)), new ULong_init(new Kotlin.Long(-2121671748, -373957723)), new ULong_init(new Kotlin.Long(-213338824, 961987163)), new ULong_init(new Kotlin.Long(-1241133031, 1508970993)), new ULong_init(new Kotlin.Long(-1357295717, -1841331548)), new ULong_init(new Kotlin.Long(-630357736, -1424204075)), new ULong_init(new Kotlin.Long(-1560083902, -670586216)), new ULong_init(new Kotlin.Long(1164996542, 310598401)), new ULong_init(new Kotlin.Long(1323610764, 607225278)), new ULong_init(new Kotlin.Long(-704662302, 1426881987)), new ULong_init(new Kotlin.Long(-226784913, 1925078388)), new ULong_init(new Kotlin.Long(991336113, -2132889090)), new ULong_init(new Kotlin.Long(633803317, -1680079193)), new ULong_init(new Kotlin.Long(-815192428, -1046744716)), new ULong_init(new Kotlin.Long(-1628353838, -459576895)), new ULong_init(new Kotlin.Long(944711139, -272742522)), new ULong_init(new Kotlin.Long(-1953704523, 264347078)), new ULong_init(new Kotlin.Long(2007800933, 604807628)), new ULong_init(new Kotlin.Long(1495990901, 770255983)), new ULong_init(new Kotlin.Long(1856431235, 1249150122)), new ULong_init(new Kotlin.Long(-1119749164, 1555081692)), new ULong_init(new Kotlin.Long(-2096016459, 1996064986)), new ULong_init(new Kotlin.Long(-295247957, -1740746414)), new ULong_init(new Kotlin.Long(766784016, -1473132947)), new ULong_init(new Kotlin.Long(-1728372417, -1341970488)), new ULong_init(new Kotlin.Long(-1091629340, -1084653625)), new ULong_init(new Kotlin.Long(1034457026, -958395405)), new ULong_init(new Kotlin.Long(-1828018395, -710438585)), new ULong_init(new Kotlin.Long(-536640913, 113926993)), new ULong_init(new Kotlin.Long(168717936, 338241895)), new ULong_init(new Kotlin.Long(1188179964, 666307205)), new ULong_init(new Kotlin.Long(1546045734, 773529912)), new ULong_init(new Kotlin.Long(1522805485, 1294757372)), new ULong_init(new Kotlin.Long(-1651133473, 1396182291)), new ULong_init(new Kotlin.Long(-1951439906, 1695183700)), new ULong_init(new Kotlin.Long(1014477480, 1986661051)), new ULong_init(new Kotlin.Long(1206759142, -2117940946)), new ULong_init(new Kotlin.Long(344077627, -1838011259)), new ULong_init(new Kotlin.Long(1290863460, -1564481375)), new ULong_init(new Kotlin.Long(-1136513023, -1474664885)), new ULong_init(new Kotlin.Long(-789014639, -1035236496)), new ULong_init(new Kotlin.Long(106217008, -949202525)), new ULong_init(new Kotlin.Long(-688958952, -778901479)), new ULong_init(new Kotlin.Long(1432725776, -694614492)), new ULong_init(new Kotlin.Long(1467031594, -200395387)), new ULong_init(new Kotlin.Long(851169720, 275423344)), new ULong_init(new Kotlin.Long(-1194143544, 430227734)), new ULong_init(new Kotlin.Long(1363258195, 506948616)), new ULong_init(new Kotlin.Long(-544281703, 659060556)), new ULong_init(new Kotlin.Long(-509917016, 883997877)), new ULong_init(new Kotlin.Long(-976659869, 958139571)), new ULong_init(new Kotlin.Long(-482243893, 1322822218)), new ULong_init(new Kotlin.Long(2003034995, 1537002063)), new ULong_init(new Kotlin.Long(-692930397, 1747873779)), new ULong_init(new Kotlin.Long(1575990012, 1955562222)), new ULong_init(new Kotlin.Long(1125592928, 2024104815)), new ULong_init(new Kotlin.Long(-1578062990, -2067236844)), new ULong_init(new Kotlin.Long(442776044, -1933114872)), new ULong_init(new Kotlin.Long(593698344, -1866530822)), new ULong_init(new Kotlin.Long(-561857047, -1538233109)), new ULong_init(new Kotlin.Long(-1295615723, -1090935817)), new ULong_init(new Kotlin.Long(-479046869, -965641998)), new ULong_init(new Kotlin.Long(-366583396, -903397682)), new ULong_init(new Kotlin.Long(566280711, -779700025)), new ULong_init(new Kotlin.Long(-840897762, -354779690)), new ULong_init(new Kotlin.Long(-294727304, -176337025)), new ULong_init(new Kotlin.Long(1914138554, 116418474)), new ULong_init(new Kotlin.Long(-1563912026, 174292421)), new ULong_init(new Kotlin.Long(-1090974290, 289380356)), new ULong_init(new Kotlin.Long(320620315, 460393269)), new ULong_init(new Kotlin.Long(587496836, 685471733)), new ULong_init(new Kotlin.Long(1086792851, 852142971)), new ULong_init(new Kotlin.Long(365543100, 1017036298)), new ULong_init(new Kotlin.Long(-1676669620, 1126000580)), new ULong_init(new Kotlin.Long(-885112138, 1288033470)), new ULong_init(new Kotlin.Long(-60457430, 1501505948)), new ULong_init(new Kotlin.Long(987167468, 1607167915)), new ULong_init(new Kotlin.Long(1246189591, 1816402316))];
this.iv = [new ULong_init(new Kotlin.Long(-205731576, 1779033703)), new ULong_init(new Kotlin.Long(-2067093701, -1150833019)), new ULong_init(new Kotlin.Long(-23791573, 1013904242)), new ULong_init(new Kotlin.Long(1595750129, -1521486534)), new ULong_init(new Kotlin.Long(-1377402159, 1359893119)), new ULong_init(new Kotlin.Long(725511199, -1694144372)), new ULong_init(new Kotlin.Long(-79577749, 528734635)), new ULong_init(new Kotlin.Long(327033209, 1541459225))];
} }
Sha512$Companion.$metadata$ = { Sha512$Companion.prototype.digest_61zpoe$ = function (message) {
kind: Kind_OBJECT, var $receiver = encodeToByteArray(message);
simpleName: 'Companion', var destination = ArrayList_init($receiver.length);
interfaces: []
};
var Sha512$Companion_instance = null;
function Sha512$Companion_getInstance() {
if (Sha512$Companion_instance === null) {
new Sha512$Companion();
}
return Sha512$Companion_instance;
}
Sha512.prototype.digest_ummv9a$ = function (message) {
var tmp$; var tmp$;
for (tmp$ = 0; tmp$ !== $receiver.length; ++tmp$) {
var item = $receiver[tmp$];
destination.add_11rb$(new UByte(item));
}
return this.digest_ummv9a$(copyToArray(destination));
};
Sha512$Companion.prototype.digest_ummv9a$ = function (message) {
var tmp$;
var h0 = {v: new ULong_init(new Kotlin.Long(-205731576, 1779033703))};
var h1 = {v: new ULong_init(new Kotlin.Long(-2067093701, -1150833019))};
var h2 = {v: new ULong_init(new Kotlin.Long(-23791573, 1013904242))};
var h3 = {v: new ULong_init(new Kotlin.Long(1595750129, -1521486534))};
var h4 = {v: new ULong_init(new Kotlin.Long(-1377402159, 1359893119))};
var h5 = {v: new ULong_init(new Kotlin.Long(725511199, -1694144372))};
var h6 = {v: new ULong_init(new Kotlin.Long(-79577749, 528734635))};
var h7 = {v: new ULong_init(new Kotlin.Long(327033209, 1541459225))};
var originalMessageSizeInBits = message.length * 8 | 0; var originalMessageSizeInBits = message.length * 8 | 0;
var expandedRemainderOf1024 = (originalMessageSizeInBits + 129 | 0) % 1024; var expandedRemainderOf1024 = (originalMessageSizeInBits + 129 | 0) % 1024;
if (expandedRemainderOf1024 === 0) if (expandedRemainderOf1024 === 0)
@ -1288,19 +1109,19 @@
var other_6 = w[i_2 - 7 | 0]; var other_6 = w[i_2 - 7 | 0];
w[i_2] = new ULong_init((new ULong_init($this_7.data.add(other_6.data))).data.add(s1.data)); w[i_2] = new ULong_init((new ULong_init($this_7.data.add(other_6.data))).data.add(s1.data));
} }
var a = this.h0; var a = h0.v;
var b = this.h1; var b = h1.v;
var c = this.h2; var c = h2.v;
var d = this.h3; var d = h3.v;
var e = this.h4; var e = h4.v;
var f = this.h5; var f = h5.v;
var g = this.h6; var g = h6.v;
var h = this.h7; var h = h7.v;
for (var i_3 = 0; i_3 < 80; i_3++) { for (var i_3 = 0; i_3 < 80; i_3++) {
var s1_0 = this.compressionSigma1_0(e); var s1_0 = this.compressionSigma1_0(e);
var ch = this.ch_0(e, f, g); var ch = this.ch_0(e, f, g);
var $this_8 = new ULong_init((new ULong_init(h.data.add(s1_0.data))).data.add(ch.data)); var $this_8 = new ULong_init((new ULong_init(h.data.add(s1_0.data))).data.add(ch.data));
var other_7 = Sha512$Companion_getInstance().k[i_3]; var other_7 = this.k[i_3];
var $this_9 = new ULong_init($this_8.data.add(other_7.data)); var $this_9 = new ULong_init($this_8.data.add(other_7.data));
var other_8 = w[i_3]; var other_8 = w[i_3];
var temp1 = new ULong_init($this_9.data.add(other_8.data)); var temp1 = new ULong_init($this_9.data.add(other_8.data));
@ -1316,101 +1137,90 @@
b = a; b = a;
a = new ULong_init(temp1.data.add(temp2.data)); a = new ULong_init(temp1.data.add(temp2.data));
} }
var $this_10 = this.h0; var $this_10 = h0.v;
var other_9 = a; var other_9 = a;
this.h0 = new ULong_init($this_10.data.add(other_9.data)); h0.v = new ULong_init($this_10.data.add(other_9.data));
var $this_11 = this.h1; var $this_11 = h1.v;
var other_10 = b; var other_10 = b;
this.h1 = new ULong_init($this_11.data.add(other_10.data)); h1.v = new ULong_init($this_11.data.add(other_10.data));
var $this_12 = this.h2; var $this_12 = h2.v;
var other_11 = c; var other_11 = c;
this.h2 = new ULong_init($this_12.data.add(other_11.data)); h2.v = new ULong_init($this_12.data.add(other_11.data));
var $this_13 = this.h3; var $this_13 = h3.v;
var other_12 = d; var other_12 = d;
this.h3 = new ULong_init($this_13.data.add(other_12.data)); h3.v = new ULong_init($this_13.data.add(other_12.data));
var $this_14 = this.h4; var $this_14 = h4.v;
var other_13 = e; var other_13 = e;
this.h4 = new ULong_init($this_14.data.add(other_13.data)); h4.v = new ULong_init($this_14.data.add(other_13.data));
var $this_15 = this.h5; var $this_15 = h5.v;
var other_14 = f; var other_14 = f;
this.h5 = new ULong_init($this_15.data.add(other_14.data)); h5.v = new ULong_init($this_15.data.add(other_14.data));
var $this_16 = this.h6; var $this_16 = h6.v;
var other_15 = g; var other_15 = g;
this.h6 = new ULong_init($this_16.data.add(other_15.data)); h6.v = new ULong_init($this_16.data.add(other_15.data));
var $this_17 = this.h7; var $this_17 = h7.v;
var other_16 = h; var other_16 = h;
this.h7 = new ULong_init($this_17.data.add(other_16.data)); h7.v = new ULong_init($this_17.data.add(other_16.data));
} }
var $receiver_0 = this.toPaddedByteArray_0(this.h0); var $receiver_0 = this.toPaddedByteArray_0(h0.v);
var elements_0 = this.toPaddedByteArray_0(this.h1); var elements_0 = this.toPaddedByteArray_0(h1.v);
var $receiver_1 = $receiver_0.concat(elements_0); var $receiver_1 = $receiver_0.concat(elements_0);
var elements_1 = this.toPaddedByteArray_0(this.h2); var elements_1 = this.toPaddedByteArray_0(h2.v);
var $receiver_2 = $receiver_1.concat(elements_1); var $receiver_2 = $receiver_1.concat(elements_1);
var elements_2 = this.toPaddedByteArray_0(this.h3); var elements_2 = this.toPaddedByteArray_0(h3.v);
var $receiver_3 = $receiver_2.concat(elements_2); var $receiver_3 = $receiver_2.concat(elements_2);
var elements_3 = this.toPaddedByteArray_0(this.h4); var elements_3 = this.toPaddedByteArray_0(h4.v);
var $receiver_4 = $receiver_3.concat(elements_3); var $receiver_4 = $receiver_3.concat(elements_3);
var elements_4 = this.toPaddedByteArray_0(this.h5); var elements_4 = this.toPaddedByteArray_0(h5.v);
var $receiver_5 = $receiver_4.concat(elements_4); var $receiver_5 = $receiver_4.concat(elements_4);
var elements_5 = this.toPaddedByteArray_0(this.h6); var elements_5 = this.toPaddedByteArray_0(h6.v);
var $receiver_6 = $receiver_5.concat(elements_5); var $receiver_6 = $receiver_5.concat(elements_5);
var elements_6 = this.toPaddedByteArray_0(this.h7); var elements_6 = this.toPaddedByteArray_0(h7.v);
var digest = $receiver_6.concat(elements_6); var digest = $receiver_6.concat(elements_6);
this.reset_0();
return digest; return digest;
}; };
Sha512.prototype.reset_0 = function () { Sha512$Companion.prototype.scheduleSigma0_0 = function (value) {
this.h0 = new ULong_init(new Kotlin.Long(-205731576, 1779033703));
this.h1 = new ULong_init(new Kotlin.Long(-2067093701, -1150833019));
this.h2 = new ULong_init(new Kotlin.Long(-23791573, 1013904242));
this.h3 = new ULong_init(new Kotlin.Long(1595750129, -1521486534));
this.h4 = new ULong_init(new Kotlin.Long(-1377402159, 1359893119));
this.h5 = new ULong_init(new Kotlin.Long(725511199, -1694144372));
this.h6 = new ULong_init(new Kotlin.Long(-79577749, 528734635));
this.h7 = new ULong_init(new Kotlin.Long(327033209, 1541459225));
};
Sha512.prototype.scheduleSigma0_0 = function (value) {
var $this = rotateRight_0(value, 1); var $this = rotateRight_0(value, 1);
var other = rotateRight_0(value, 8); var other = rotateRight_0(value, 8);
var tmp$ = new ULong_init($this.data.xor(other.data)); var tmp$ = new ULong_init($this.data.xor(other.data));
var other_0 = new ULong_init(value.data.shiftRightUnsigned(7)); var other_0 = new ULong_init(value.data.shiftRightUnsigned(7));
return new ULong_init(tmp$.data.xor(other_0.data)); return new ULong_init(tmp$.data.xor(other_0.data));
}; };
Sha512.prototype.scheduleSigma1_0 = function (value) { Sha512$Companion.prototype.scheduleSigma1_0 = function (value) {
var $this = rotateRight_0(value, 19); var $this = rotateRight_0(value, 19);
var other = rotateRight_0(value, 61); var other = rotateRight_0(value, 61);
var tmp$ = new ULong_init($this.data.xor(other.data)); var tmp$ = new ULong_init($this.data.xor(other.data));
var other_0 = new ULong_init(value.data.shiftRightUnsigned(6)); var other_0 = new ULong_init(value.data.shiftRightUnsigned(6));
return new ULong_init(tmp$.data.xor(other_0.data)); return new ULong_init(tmp$.data.xor(other_0.data));
}; };
Sha512.prototype.compressionSigma0_0 = function (e) { Sha512$Companion.prototype.compressionSigma0_0 = function (e) {
var $this = rotateRight_0(e, 28); var $this = rotateRight_0(e, 28);
var other = rotateRight_0(e, 34); var other = rotateRight_0(e, 34);
var $this_0 = new ULong_init($this.data.xor(other.data)); var $this_0 = new ULong_init($this.data.xor(other.data));
var other_0 = rotateRight_0(e, 39); var other_0 = rotateRight_0(e, 39);
return new ULong_init($this_0.data.xor(other_0.data)); return new ULong_init($this_0.data.xor(other_0.data));
}; };
Sha512.prototype.compressionSigma1_0 = function (a) { Sha512$Companion.prototype.compressionSigma1_0 = function (a) {
var $this = rotateRight_0(a, 14); var $this = rotateRight_0(a, 14);
var other = rotateRight_0(a, 18); var other = rotateRight_0(a, 18);
var $this_0 = new ULong_init($this.data.xor(other.data)); var $this_0 = new ULong_init($this.data.xor(other.data));
var other_0 = rotateRight_0(a, 41); var other_0 = rotateRight_0(a, 41);
return new ULong_init($this_0.data.xor(other_0.data)); return new ULong_init($this_0.data.xor(other_0.data));
}; };
Sha512.prototype.ch_0 = function (x, y, z) { Sha512$Companion.prototype.ch_0 = function (x, y, z) {
var tmp$ = new ULong_init(x.data.and(y.data)); var tmp$ = new ULong_init(x.data.and(y.data));
var other = Sha512$Companion_getInstance().ULONG_MASK; var other = this.ULONG_MASK;
var other_0 = new ULong_init((new ULong_init(x.data.xor(other.data))).data.and(z.data)); var other_0 = new ULong_init((new ULong_init(x.data.xor(other.data))).data.and(z.data));
return new ULong_init(tmp$.data.xor(other_0.data)); return new ULong_init(tmp$.data.xor(other_0.data));
}; };
Sha512.prototype.maj_0 = function (x, y, z) { Sha512$Companion.prototype.maj_0 = function (x, y, z) {
var tmp$ = new ULong_init(x.data.and(y.data)); var tmp$ = new ULong_init(x.data.and(y.data));
var other = new ULong_init(x.data.and(z.data)); var other = new ULong_init(x.data.and(z.data));
var tmp$_0 = new ULong_init(tmp$.data.xor(other.data)); var tmp$_0 = new ULong_init(tmp$.data.xor(other.data));
var other_0 = new ULong_init(y.data.and(z.data)); var other_0 = new ULong_init(y.data.and(z.data));
return new ULong_init(tmp$_0.data.xor(other_0.data)); return new ULong_init(tmp$_0.data.xor(other_0.data));
}; };
Sha512.prototype.toPaddedByteArray_0 = function ($receiver) { Sha512$Companion.prototype.toPaddedByteArray_0 = function ($receiver) {
var byteMask = new ULong_init(Kotlin.Long.fromInt(255)); var byteMask = new ULong_init(Kotlin.Long.fromInt(255));
var array = Array_0(8); var array = Array_0(8);
var tmp$; var tmp$;
@ -1452,7 +1262,7 @@
} }
return array; return array;
}; };
Sha512.prototype.toPadded128BitByteArray_0 = function ($receiver) { Sha512$Companion.prototype.toPadded128BitByteArray_0 = function ($receiver) {
var byteMask = new ULong_init(Kotlin.Long.fromInt(255)); var byteMask = new ULong_init(Kotlin.Long.fromInt(255));
var array = Array_0(16); var array = Array_0(16);
var tmp$; var tmp$;
@ -1494,15 +1304,30 @@
} }
return array; return array;
}; };
Sha512$Companion.$metadata$ = {
kind: Kind_OBJECT,
simpleName: 'Companion',
interfaces: []
};
var Sha512$Companion_instance = null;
function Sha512$Companion_getInstance() {
if (Sha512$Companion_instance === null) {
new Sha512$Companion();
}
return Sha512$Companion_instance;
}
Sha512.$metadata$ = { Sha512.$metadata$ = {
kind: Kind_CLASS, kind: Kind_CLASS,
simpleName: 'Sha512', simpleName: 'Sha512',
interfaces: [] interfaces: [Hash]
}; };
var package$com = _.com || (_.com = {}); var package$com = _.com || (_.com = {});
var package$ionspin = package$com.ionspin || (package$com.ionspin = {}); var package$ionspin = package$com.ionspin || (package$com.ionspin = {});
var package$kotlin = package$ionspin.kotlin || (package$ionspin.kotlin = {}); var package$kotlin = package$ionspin.kotlin || (package$ionspin.kotlin = {});
var package$crypto = package$kotlin.crypto || (package$kotlin.crypto = {}); var package$crypto = package$kotlin.crypto || (package$kotlin.crypto = {});
Object.defineProperty(package$crypto, 'Config', {
get: Config_getInstance
});
package$crypto.Hash = Hash; package$crypto.Hash = Hash;
package$crypto.UpdateableHash = UpdateableHash; package$crypto.UpdateableHash = UpdateableHash;
package$crypto.hexColumsPrint_mgx7ee$ = hexColumsPrint; package$crypto.hexColumsPrint_mgx7ee$ = hexColumsPrint;
@ -1528,6 +1353,6 @@
package$sha.Sha512 = Sha512; package$sha.Sha512 = Sha512;
Kotlin.defineModule('crypto-core', _); Kotlin.defineModule('crypto-core', _);
return _; return _;
}(module.exports, require('kotlin'), require('bignum'), require('kotlinx-coroutines-core'))); }(module.exports, require('kotlin'), require('bignum')));
//# sourceMappingURL=crypto-core.js.map //# sourceMappingURL=crypto-core.js.map

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
// Kotlin.kotlin_module_metadata(393729, "crypto-core", "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"); // Kotlin.kotlin_module_metadata(393729, "crypto-core", "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");

View File

@ -0,0 +1,26 @@
/*
* Copyright 2019 Ugljesa Jovanovic
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ionspin.kotlin.crypto
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 20-Jul-2019
*/
object Config {
const val DEBUG = false
}

View File

@ -28,7 +28,7 @@ import kotlinx.coroutines.Job
* ugljesa.jovanovic@ionspin.com * ugljesa.jovanovic@ionspin.com
* on 14-Jul-2019 * on 14-Jul-2019
*/ */
@ExperimentalStdlibApi
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : UpdateableHash { class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : UpdateableHash {
companion object : Hash { companion object : Hash {
@ -75,8 +75,6 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
internal fun mixRound(input: Array<ULong>, message: Array<ULong>, round: Int): Array<ULong> { internal fun mixRound(input: Array<ULong>, message: Array<ULong>, round: Int): Array<ULong> {
var v = input var v = input
val selectedSigma = sigma[round % 10] val selectedSigma = sigma[round % 10]
val printout = v.map { it.toString(16) }.chunked(3)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
v = mix(v, 0, 4, 8, 12, message[selectedSigma[0]], message[selectedSigma[1]]) v = mix(v, 0, 4, 8, 12, message[selectedSigma[0]], message[selectedSigma[1]])
v = mix(v, 1, 5, 9, 13, message[selectedSigma[2]], message[selectedSigma[3]]) v = mix(v, 1, 5, 9, 13, message[selectedSigma[2]], message[selectedSigma[3]])
v = mix(v, 2, 6, 10, 14, message[selectedSigma[4]], message[selectedSigma[5]]) v = mix(v, 2, 6, 10, 14, message[selectedSigma[4]], message[selectedSigma[5]])
@ -120,11 +118,11 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
acc[slot] = acc[slot] + (byte.toULong() shl ((position) * 8)) acc[slot] = acc[slot] + (byte.toULong() shl ((position) * 8))
acc acc
} }
if (Config.DEBUG) {
println("m")
val printout = m.map { it.toString(16) }.chunked(4) val printout = m.map { it.toString(16) }.chunked(4)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) } printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
println("Offset ${offsetCounter}") println("Offset ${offsetCounter}")
}
v[12] = v[12] xor offsetCounter.ulongValue() v[12] = v[12] xor offsetCounter.ulongValue()
v[13] = v[13] xor (offsetCounter shr BITS_IN_WORD).ulongValue() v[13] = v[13] xor (offsetCounter shr BITS_IN_WORD).ulongValue()
@ -144,7 +142,7 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
return h return h
} }
@ExperimentalStdlibApi
fun digest(inputString: String, key: String? = null): Array<UByte> { fun digest(inputString: String, key: String? = null): Array<UByte> {
val chunked = inputString.encodeToByteArray().map { it.toUByte() }.toList().chunked(BLOCK_BYTES) val chunked = inputString.encodeToByteArray().map { it.toUByte() }.toList().chunked(BLOCK_BYTES)
.map { it.toTypedArray() }.toTypedArray() .map { it.toTypedArray() }.toTypedArray()
@ -239,7 +237,7 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
} }
} }
@ExperimentalStdlibApi
constructor( constructor(
key: String?, key: String?,
requestedHashLenght: Int = 64 requestedHashLenght: Int = 64
@ -248,10 +246,6 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
requestedHashLenght requestedHashLenght
) )
var job = Job()
val scope = CoroutineScope(Dispatchers.Default + job)
var h = iv.copyOf() var h = iv.copyOf()
var counter = BigInteger.ZERO var counter = BigInteger.ZERO
var bufferCounter = 0 var bufferCounter = 0
@ -306,7 +300,7 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
} }
} }
@ExperimentalStdlibApi
fun update(input: String) { fun update(input: String) {
update(input.encodeToByteArray().map { it.toUByte() }.toTypedArray()) update(input.encodeToByteArray().map { it.toUByte() }.toTypedArray())
} }
@ -326,7 +320,7 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
compress(h, lastBlockPadded, counter, true) compress(h, lastBlockPadded, counter, true)
val result = formatResult(h) val result = formatResult(h)
println(result.map { it.toString(16) }.joinToString(separator = "")) reset()
return result return result
} }
@ -335,6 +329,13 @@ class Blake2b(val key: Array<UByte>? = null, val hashLength: Int = 64) : Updatea
return digest().map { it.toString(16) }.joinToString(separator = "") return digest().map { it.toString(16) }.joinToString(separator = "")
} }
private fun reset() {
h = iv.copyOf()
counter = BigInteger.ZERO
bufferCounter = 0
buffer = Array<UByte>(BLOCK_BYTES) { 0U }
}
} }

View File

@ -16,6 +16,7 @@
package com.ionspin.kotlin.crypto.sha package com.ionspin.kotlin.crypto.sha
import com.ionspin.kotlin.crypto.Hash
import com.ionspin.kotlin.crypto.chunked import com.ionspin.kotlin.crypto.chunked
import com.ionspin.kotlin.crypto.rotateRight import com.ionspin.kotlin.crypto.rotateRight
@ -26,8 +27,10 @@ import com.ionspin.kotlin.crypto.rotateRight
* on 17-Jul-2019 * on 17-Jul-2019
*/ */
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
class Sha256() { class Sha256() : Hash {
companion object { companion object {
const val BLOCK_SIZE = 512 const val BLOCK_SIZE = 512
const val W_SIZE = 64 const val W_SIZE = 64
@ -35,16 +38,16 @@ class Sha256() {
const val BYTE_MASK_FROM_ULONG = 0xFFUL const val BYTE_MASK_FROM_ULONG = 0xFFUL
const val BYTE_MASK_FROM_UINT = 0xFFU const val BYTE_MASK_FROM_UINT = 0xFFU
} val iv = arrayOf(
0x6a09e667U,
var h0 = 0x6a09e667U 0xbb67ae85U,
var h1 = 0xbb67ae85U 0x3c6ef372U,
var h2 = 0x3c6ef372U 0xa54ff53aU,
var h3 = 0xa54ff53aU 0x510e527fU,
var h4 = 0x510e527fU 0x9b05688cU,
var h5 = 0x9b05688cU 0x1f83d9abU,
var h6 = 0x1f83d9abU 0x5be0cd19U
var h7 = 0x5be0cd19U )
val k = arrayOf( val k = arrayOf(
0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
@ -57,8 +60,22 @@ class Sha256() {
0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U
) )
@ExperimentalStdlibApi
fun digest(message : String) : Array<UByte> {
return digest(message.encodeToByteArray().map { it.toUByte() }.toTypedArray())
}
fun digest(message: Array<UByte>) : Array<UByte> { fun digest(message: Array<UByte>) : Array<UByte> {
var h0 = 0x6a09e667U
var h1 = 0xbb67ae85U
var h2 = 0x3c6ef372U
var h3 = 0xa54ff53aU
var h4 = 0x510e527fU
var h5 = 0x9b05688cU
var h6 = 0x1f83d9abU
var h7 = 0x5be0cd19U
val originalMessageSizeInBits = message.size * 8 val originalMessageSizeInBits = message.size * 8
@ -141,21 +158,9 @@ class Sha256() {
h5.toPaddedByteArray() + h5.toPaddedByteArray() +
h6.toPaddedByteArray() + h6.toPaddedByteArray() +
h7.toPaddedByteArray() h7.toPaddedByteArray()
reset()
return digest return digest
} }
private fun reset() {
h0 = 0x6a09e667U
h1 = 0xbb67ae85U
h2 = 0x3c6ef372U
h3 = 0xa54ff53aU
h4 = 0x510e527fU
h5 = 0x9b05688cU
h6 = 0x1f83d9abU
h7 = 0x5be0cd19U
}
private fun scheduleSigma0(value: UInt): UInt { private fun scheduleSigma0(value: UInt): UInt {
return value.rotateRight(7) xor value.rotateRight(18) xor (value shr 3) return value.rotateRight(7) xor value.rotateRight(18) xor (value shr 3)
} }
@ -212,6 +217,10 @@ class Sha256() {
} }
} }
}

View File

@ -16,6 +16,7 @@
package com.ionspin.kotlin.crypto.sha package com.ionspin.kotlin.crypto.sha
import com.ionspin.kotlin.crypto.Hash
import com.ionspin.kotlin.crypto.chunked import com.ionspin.kotlin.crypto.chunked
import com.ionspin.kotlin.crypto.rotateRight import com.ionspin.kotlin.crypto.rotateRight
@ -26,31 +27,112 @@ import com.ionspin.kotlin.crypto.rotateRight
*/ */
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
class Sha512 { class Sha512 : Hash {
companion object { companion object {
const val BLOCK_SIZE = 1024 const val BLOCK_SIZE = 1024
const val ULONG_MASK = 0xFFFFFFFFFFFFFFFFUL const val ULONG_MASK = 0xFFFFFFFFFFFFFFFFUL
val k = arrayOf( val k = arrayOf(
0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, 0x3956c25bf348b538UL, 0x428a2f98d728ae22UL,
0x59f111f1b605d019UL, 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, 0x7137449123ef65cdUL,
0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, 0x9bdc06a725c71235UL, 0xb5c0fbcfec4d3b2fUL,
0xc19bf174cf692694UL, 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, 0xe9b5dba58189dbbcUL,
0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, 0x983e5152ee66dfabUL, 0x3956c25bf348b538UL,
0xa831c66d2db43210UL, 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, 0x59f111f1b605d019UL,
0x06ca6351e003826fUL, 0x142929670a0e6e70UL, 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, 0x4d2c6dfc5ac42aedUL, 0x923f82a4af194f9bUL,
0x53380d139d95b3dfUL, 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, 0xab1c5ed5da6d8118UL,
0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, 0xd192e819d6ef5218UL, 0xd807aa98a3030242UL,
0xd69906245565a910UL, 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, 0x12835b0145706fbeUL,
0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, 0x5b9cca4f7763e373UL, 0x243185be4ee4b28cUL,
0x682e6ff3d6b2b8a3UL, 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, 0x550c7dc3d5ffb4e2UL,
0x90befffa23631e28UL, 0xa4506cebde82bde9UL, 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, 0xca273eceea26619cUL, 0x72be5d74f27b896fUL,
0xd186b8c721c0c207UL, 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, 0x80deb1fe3b1696b1UL,
0x113f9804bef90daeUL, 0x1b710b35131c471bUL, 0x28db77f523047d84UL, 0x32caab7b40c72493UL, 0x3c9ebe0a15c9bebcUL, 0x9bdc06a725c71235UL,
0x431d67c49c100d4cUL, 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL 0xc19bf174cf692694UL,
0xe49b69c19ef14ad2UL,
0xefbe4786384f25e3UL,
0x0fc19dc68b8cd5b5UL,
0x240ca1cc77ac9c65UL,
0x2de92c6f592b0275UL,
0x4a7484aa6ea6e483UL,
0x5cb0a9dcbd41fbd4UL,
0x76f988da831153b5UL,
0x983e5152ee66dfabUL,
0xa831c66d2db43210UL,
0xb00327c898fb213fUL,
0xbf597fc7beef0ee4UL,
0xc6e00bf33da88fc2UL,
0xd5a79147930aa725UL,
0x06ca6351e003826fUL,
0x142929670a0e6e70UL,
0x27b70a8546d22ffcUL,
0x2e1b21385c26c926UL,
0x4d2c6dfc5ac42aedUL,
0x53380d139d95b3dfUL,
0x650a73548baf63deUL,
0x766a0abb3c77b2a8UL,
0x81c2c92e47edaee6UL,
0x92722c851482353bUL,
0xa2bfe8a14cf10364UL,
0xa81a664bbc423001UL,
0xc24b8b70d0f89791UL,
0xc76c51a30654be30UL,
0xd192e819d6ef5218UL,
0xd69906245565a910UL,
0xf40e35855771202aUL,
0x106aa07032bbd1b8UL,
0x19a4c116b8d2d0c8UL,
0x1e376c085141ab53UL,
0x2748774cdf8eeb99UL,
0x34b0bcb5e19b48a8UL,
0x391c0cb3c5c95a63UL,
0x4ed8aa4ae3418acbUL,
0x5b9cca4f7763e373UL,
0x682e6ff3d6b2b8a3UL,
0x748f82ee5defb2fcUL,
0x78a5636f43172f60UL,
0x84c87814a1f0ab72UL,
0x8cc702081a6439ecUL,
0x90befffa23631e28UL,
0xa4506cebde82bde9UL,
0xbef9a3f7b2c67915UL,
0xc67178f2e372532bUL,
0xca273eceea26619cUL,
0xd186b8c721c0c207UL,
0xeada7dd6cde0eb1eUL,
0xf57d4f7fee6ed178UL,
0x06f067aa72176fbaUL,
0x0a637dc5a2c898a6UL,
0x113f9804bef90daeUL,
0x1b710b35131c471bUL,
0x28db77f523047d84UL,
0x32caab7b40c72493UL,
0x3c9ebe0a15c9bebcUL,
0x431d67c49c100d4cUL,
0x4cc5d4becb3e42b6UL,
0x597f299cfc657e2aUL,
0x5fcb6fab3ad6faecUL,
0x6c44198c4a475817UL
) )
val iv = arrayOf(
0x6a09e667f3bcc908UL,
0xbb67ae8584caa73bUL,
0x3c6ef372fe94f82bUL,
0xa54ff53a5f1d36f1UL,
0x510e527fade682d1UL,
0x9b05688c2b3e6c1fUL,
0x1f83d9abfb41bd6bUL,
0x5be0cd19137e2179UL
)
@ExperimentalStdlibApi
fun digest(message: String): Array<UByte> {
return digest(message.encodeToByteArray().map { it.toUByte() }.toTypedArray())
} }
fun digest(message: Array<UByte>): Array<UByte> {
var h0 = 0x6a09e667f3bcc908UL var h0 = 0x6a09e667f3bcc908UL
var h1 = 0xbb67ae8584caa73bUL var h1 = 0xbb67ae8584caa73bUL
var h2 = 0x3c6ef372fe94f82bUL var h2 = 0x3c6ef372fe94f82bUL
@ -60,11 +142,6 @@ class Sha512 {
var h6 = 0x1f83d9abfb41bd6bUL var h6 = 0x1f83d9abfb41bd6bUL
var h7 = 0x5be0cd19137e2179UL var h7 = 0x5be0cd19137e2179UL
fun digest(message: Array<UByte>) : Array<UByte> {
val originalMessageSizeInBits = message.size * 8 val originalMessageSizeInBits = message.size * 8
@ -81,19 +158,20 @@ class Sha512 {
} }
} }
val chunks = (message + expansionArray + originalMessageSizeInBits.toULong().toPadded128BitByteArray()).chunked(128) val chunks =
(message + expansionArray + originalMessageSizeInBits.toULong().toPadded128BitByteArray()).chunked(128)
chunks.forEach { chunk -> chunks.forEach { chunk ->
val w = Array<ULong>(80) { val w = Array<ULong>(80) {
when (it) { when (it) {
in 0 until 16 -> { in 0 until 16 -> {
var collected = (chunk[(it * 8)].toULong() shl 56) + var collected = (chunk[(it * 8)].toULong() shl 56) +
(chunk[(it * 8) + 1].toULong() shl 48 ) + (chunk[(it * 8) + 1].toULong() shl 48) +
(chunk[(it * 8) + 2].toULong() shl 40 ) + (chunk[(it * 8) + 2].toULong() shl 40) +
(chunk[(it * 8) + 3].toULong() shl 32 ) + (chunk[(it * 8) + 3].toULong() shl 32) +
(chunk[(it * 8) + 4].toULong() shl 24 ) + (chunk[(it * 8) + 4].toULong() shl 24) +
(chunk[(it * 8) + 5].toULong() shl 16 ) + (chunk[(it * 8) + 5].toULong() shl 16) +
(chunk[(it * 8) + 6].toULong() shl 8 ) + (chunk[(it * 8) + 6].toULong() shl 8) +
(chunk[(it * 8) + 7].toULong()) (chunk[(it * 8) + 7].toULong())
collected collected
} }
@ -103,7 +181,7 @@ class Sha512 {
for (i in 16 until 80) { for (i in 16 until 80) {
val s0 = scheduleSigma0(w[i - 15]) val s0 = scheduleSigma0(w[i - 15])
val s1 = scheduleSigma1(w[i - 2]) val s1 = scheduleSigma1(w[i - 2])
w[i] = w[i-16] + s0 + w[i - 7] + s1 w[i] = w[i - 16] + s0 + w[i - 7] + s1
} }
var a = h0 var a = h0
@ -120,7 +198,7 @@ class Sha512 {
val ch = ch(e, f, g) val ch = ch(e, f, g)
val temp1 = h + s1 + ch + k[i] + w[i] val temp1 = h + s1 + ch + k[i] + w[i]
val s0 = compressionSigma0(a) val s0 = compressionSigma0(a)
val maj = maj(a,b,c) val maj = maj(a, b, c)
val temp2 = s0 + maj val temp2 = s0 + maj
h = g h = g
g = f g = f
@ -151,47 +229,34 @@ class Sha512 {
h5.toPaddedByteArray() + h5.toPaddedByteArray() +
h6.toPaddedByteArray() + h6.toPaddedByteArray() +
h7.toPaddedByteArray() h7.toPaddedByteArray()
reset()
return digest return digest
} }
private fun reset() {
h0 = 0x6a09e667f3bcc908UL
h1 = 0xbb67ae8584caa73bUL
h2 = 0x3c6ef372fe94f82bUL
h3 = 0xa54ff53a5f1d36f1UL
h4 = 0x510e527fade682d1UL
h5 = 0x9b05688c2b3e6c1fUL
h6 = 0x1f83d9abfb41bd6bUL
h7 = 0x5be0cd19137e2179UL
}
private fun scheduleSigma0(value: ULong): ULong { private fun scheduleSigma0(value: ULong): ULong {
return value.rotateRight(1) xor value.rotateRight(8) xor (value shr 7) return value.rotateRight(1) xor value.rotateRight(8) xor (value shr 7)
} }
private fun scheduleSigma1(value : ULong) : ULong { private fun scheduleSigma1(value: ULong): ULong {
return value.rotateRight(19) xor value.rotateRight(61) xor (value shr 6) return value.rotateRight(19) xor value.rotateRight(61) xor (value shr 6)
} }
private fun compressionSigma0(e : ULong) : ULong { private fun compressionSigma0(e: ULong): ULong {
return (e rotateRight 28) xor (e rotateRight 34) xor (e rotateRight 39) return (e rotateRight 28) xor (e rotateRight 34) xor (e rotateRight 39)
} }
private fun compressionSigma1(a : ULong) : ULong { private fun compressionSigma1(a: ULong): ULong {
return (a rotateRight 14) xor (a rotateRight 18) xor (a rotateRight 41) return (a rotateRight 14) xor (a rotateRight 18) xor (a rotateRight 41)
} }
private fun ch(x : ULong, y : ULong, z : ULong) : ULong { private fun ch(x: ULong, y: ULong, z: ULong): ULong {
return ((x and y) xor ((x xor ULONG_MASK) and z)) return ((x and y) xor ((x xor ULONG_MASK) and z))
} }
private fun maj(x : ULong, y : ULong, z : ULong) : ULong { private fun maj(x: ULong, y: ULong, z: ULong): ULong {
return ((x and y) xor (x and z) xor (y and z)) return ((x and y) xor (x and z) xor (y and z))
} }
private fun ULong.toPaddedByteArray(): Array<UByte> { private fun ULong.toPaddedByteArray(): Array<UByte> {
val byteMask = 0xFFUL val byteMask = 0xFFUL
//Ignore messages longer than 64 bits for now //Ignore messages longer than 64 bits for now
@ -227,5 +292,7 @@ class Sha512 {
} }
} }
} }
}
} }

View File

@ -0,0 +1,100 @@
/*
* Copyright 2019 Ugljesa Jovanovic
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ionspin.kotlin.crypto
import com.ionspin.kotlin.crypto.blake2b.Blake2b
import com.ionspin.kotlin.crypto.sha.Sha256
import com.ionspin.kotlin.crypto.sha.Sha512
import kotlin.test.Test
import kotlin.test.assertTrue
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 20-Jul-2019
*/
@ExperimentalUnsignedTypes
@ExperimentalStdlibApi
class ReadmeTest {
@Test
fun blake2bObjectExample() {
val input = "abc"
val result = Blake2b.digest(input)
//@formatter:off
val expectedResult = arrayOf<UByte>(
0xBAU,0x80U,0xA5U,0x3FU,0x98U,0x1CU,0x4DU,0x0DU,0x6AU,0x27U,0x97U,0xB6U,0x9FU,0x12U,0xF6U,0xE9U,
0x4CU,0x21U,0x2FU,0x14U,0x68U,0x5AU,0xC4U,0xB7U,0x4BU,0x12U,0xBBU,0x6FU,0xDBU,0xFFU,0xA2U,0xD1U,
0x7DU,0x87U,0xC5U,0x39U,0x2AU,0xABU,0x79U,0x2DU,0xC2U,0x52U,0xD5U,0xDEU,0x45U,0x33U,0xCCU,0x95U,
0x18U,0xD3U,0x8AU,0xA8U,0xDBU,0xF1U,0x92U,0x5AU,0xB9U,0x23U,0x86U,0xEDU,0xD4U,0x00U,0x99U,0x23U
)
//@formatter:on
assertTrue {
result.contentEquals(expectedResult)
}
}
@Test
fun blake2bInstanceExample() {
val test = "abc"
val key = "key"
val blake2b = Blake2b(key)
blake2b.update(test)
val result = blake2b.digest()
assertTrue {
result.isNotEmpty()
}
val expectedResult = ("5c6a9a4ae911c02fb7e71a991eb9aea371ae993d4842d206e" +
"6020d46f5e41358c6d5c277c110ef86c959ed63e6ecaaaceaaff38019a43264ae06acf73b9550b1")
.chunked(2).map { it.toUByte(16) }.toTypedArray()
assertTrue {
result.contentEquals(expectedResult)
}
}
@ExperimentalStdlibApi
@Test
fun sha256Example() {
val input ="abc"
val result = Sha256.digest(message = input)
val expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
assertTrue {
result.contentEquals(expectedResult.chunked(2).map { it.toUByte(16) }.toTypedArray())
}
}
@ExperimentalStdlibApi
@Test
fun sha512Example() {
val input ="abc"
val result = Sha512.digest(message = input.encodeToByteArray().map { it.toUByte() }.toTypedArray())
println(result.map {it.toString(16)})
val expectedResult = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
"2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"
assertTrue {
result.contentEquals(expectedResult.chunked(2).map { it.toUByte(16) }.toTypedArray())
}
}
}

View File

@ -44,7 +44,6 @@ class Blake2BTest {
"1234567890" + "1234567890" +
"1234567890" + "1234567890" +
"1234567890" "1234567890"
print("|$test|")
val result = Blake2b.digest(test) val result = Blake2b.digest(test)
//Generated with b2sum 8.31 //Generated with b2sum 8.31
@ -58,9 +57,6 @@ class Blake2BTest {
//@formatter:on //@formatter:on
) )
val printout = result.map { it.toString(16) }.chunked(16)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
assertTrue { assertTrue {
result.contentEquals(expectedResult) result.contentEquals(expectedResult)
} }
@ -79,7 +75,6 @@ class Blake2BTest {
"1234567890" + "1234567890" +
"1234567890" "1234567890"
print("|$test|")
val result = Blake2b.digest(test) val result = Blake2b.digest(test)
val expectedResultString = "800bb78cd4da18995c8074713bb674" + val expectedResultString = "800bb78cd4da18995c8074713bb674" +
@ -87,9 +82,6 @@ class Blake2BTest {
"4ce1935a76154d7ea7c410493557741d18ec3a08da75" "4ce1935a76154d7ea7c410493557741d18ec3a08da75"
val expectedResult = expectedResultString.chunked(2).map { it.toUByte(16) }.toTypedArray() val expectedResult = expectedResultString.chunked(2).map { it.toUByte(16) }.toTypedArray()
val printout = result.map { it.toString(16) }.chunked(16)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
assertTrue { assertTrue {
result.contentEquals(expectedResult) result.contentEquals(expectedResult)
} }
@ -111,9 +103,6 @@ class Blake2BTest {
//@formatter:on //@formatter:on
) )
val printout = result.map { it.toString(16) }.chunked(16)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
assertTrue { assertTrue {
result.contentEquals(expectedResult) result.contentEquals(expectedResult)
} }
@ -126,10 +115,6 @@ class Blake2BTest {
val key = "key" val key = "key"
val result = Blake2b.digest(test, key) val result = Blake2b.digest(test, key)
val printout = result.map { it.toString(16) }.chunked(16)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
assertTrue { assertTrue {
result.isNotEmpty() result.isNotEmpty()
@ -159,9 +144,6 @@ class Blake2BTest {
) )
//@formatter:on //@formatter:on
val printout = result.map { it.toString(16) }.chunked(16)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
assertTrue { assertTrue {
result.contentEquals(expectedResult) result.contentEquals(expectedResult)
} }
@ -290,9 +272,6 @@ class Blake2BTest {
val inputRound = mixChain[i] val inputRound = mixChain[i]
val round = i val round = i
val result = Blake2b.mixRound(inputRound, message, round) val result = Blake2b.mixRound(inputRound, message, round)
println("Result: ")
val printout = result.map { it.toString(16) }.chunked(3)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
val expectedResult = mixChain[i + 1] val expectedResult = mixChain[i + 1]
assertTrue { assertTrue {
result.contentEquals(expectedResult) result.contentEquals(expectedResult)

View File

@ -80,10 +80,6 @@ class Blake2bInstanceTest {
val blake2b = Blake2b(key) val blake2b = Blake2b(key)
blake2b.update(test) blake2b.update(test)
val result = blake2b.digest() val result = blake2b.digest()
val printout = result.map { it.toString(16) }.chunked(16)
printout.forEach { println(it.joinToString(separator = " ") { it.toUpperCase() }) }
assertTrue { assertTrue {
result.isNotEmpty() result.isNotEmpty()

View File

@ -30,10 +30,8 @@ class Sha256Test {
@ExperimentalStdlibApi @ExperimentalStdlibApi
@Test @Test
fun testWellKnownValue() { fun testWellKnownValue() {
val sha = Sha256()
val result = sha.digest(message = "abc".encodeToByteArray().map { it.toUByte() }.toTypedArray()) val result = Sha256.digest(message = "abc")
println(result.map {it.toString(16)})
val expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" val expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
assertTrue { assertTrue {
result.contentEquals(expectedResult.chunked(2).map { it.toUByte(16) }.toTypedArray()) result.contentEquals(expectedResult.chunked(2).map { it.toUByte(16) }.toTypedArray())
@ -45,9 +43,8 @@ class Sha256Test {
@ExperimentalStdlibApi @ExperimentalStdlibApi
@Test @Test
fun testWellKnownDoubleBlock() { fun testWellKnownDoubleBlock() {
val sha = Sha256()
val resultDoubleBlock = sha.digest(message = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".encodeToByteArray().map { it.toUByte() }.toTypedArray()) val resultDoubleBlock = Sha256.digest(message = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")
val expectedResultForDoubleBlock = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1" val expectedResultForDoubleBlock = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
assertTrue { assertTrue {
resultDoubleBlock.contentEquals(expectedResultForDoubleBlock.chunked(2).map { it.toUByte(16) }.toTypedArray()) resultDoubleBlock.contentEquals(expectedResultForDoubleBlock.chunked(2).map { it.toUByte(16) }.toTypedArray())

View File

@ -29,9 +29,8 @@ class Sha512Test {
@ExperimentalStdlibApi @ExperimentalStdlibApi
@Test @Test
fun testWellKnownValue() { fun testWellKnownValue() {
val sha = Sha512()
val result = sha.digest(message = "abc".encodeToByteArray().map { it.toUByte() }.toTypedArray()) val result = Sha512.digest(message = "abc".encodeToByteArray().map { it.toUByte() }.toTypedArray())
println(result.map {it.toString(16)}) println(result.map {it.toString(16)})
val expectedResult = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + val expectedResult = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
"2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"
@ -42,14 +41,13 @@ class Sha512Test {
} }
@ExperimentalUnsignedTypes
@ExperimentalStdlibApi @ExperimentalStdlibApi
@Test @Test
fun testWellKnownDoubleBlock() { fun testWellKnownDoubleBlock() {
val sha = Sha512()
val resultDoubleBlock = sha.digest(message = ("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" + val resultDoubleBlock = Sha512.digest(message = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" +
"hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu").encodeToByteArray().map { it.toUByte() }.toTypedArray()) "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu")
println(resultDoubleBlock.map {it.toString(16)})
val expectedResultForDoubleBlock = "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018" + val expectedResultForDoubleBlock = "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018" +
"501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909" "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909"
assertTrue { assertTrue {
@ -60,16 +58,11 @@ class Sha512Test {
@ExperimentalStdlibApi @ExperimentalStdlibApi
@Test @Test
fun testWellKnownLong() { fun testWellKnownLong() {
val sha = Sha512()
val inputBuilder = StringBuilder() val inputBuilder = StringBuilder()
for (i in 0 until 1000000) { for (i in 0 until 1000000) {
inputBuilder.append("a") inputBuilder.append("a")
if (i % 100000 == 0) {
println("$i / 1000000")
} }
} val resultDoubleBlock = Sha512.digest(message = (inputBuilder.toString()).encodeToByteArray().map { it.toUByte() }.toTypedArray())
val resultDoubleBlock = sha.digest(message = (inputBuilder.toString()).encodeToByteArray().map { it.toUByte() }.toTypedArray())
println(resultDoubleBlock.map {it.toString(16)})
val expectedResultForDoubleBlock = "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b" val expectedResultForDoubleBlock = "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"
assertTrue { assertTrue {
resultDoubleBlock.contentEquals(expectedResultForDoubleBlock.chunked(2).map { it.toUByte(16) }.toTypedArray()) resultDoubleBlock.contentEquals(expectedResultForDoubleBlock.chunked(2).map { it.toUByte(16) }.toTypedArray())