constant time comparison
This commit is contained in:
parent
4956fcc1ee
commit
a2595b35e7
|
@ -59,7 +59,7 @@ dependencies {
|
||||||
testCompile(files("../jcardsim/jcardsim-3.0.5-SNAPSHOT.jar"))
|
testCompile(files("../jcardsim/jcardsim-3.0.5-SNAPSHOT.jar"))
|
||||||
testCompile('org.web3j:core:2.3.1')
|
testCompile('org.web3j:core:2.3.1')
|
||||||
testCompile('org.bitcoinj:bitcoinj-core:0.14.5')
|
testCompile('org.bitcoinj:bitcoinj-core:0.14.5')
|
||||||
testCompile('com.github.status-im.status-keycard-java:desktop:64aece4')
|
testCompile('com.github.status-im.status-keycard-java:desktop:15a61e1')
|
||||||
testCompile('org.bouncycastle:bcprov-jdk15on:1.65')
|
testCompile('org.bouncycastle:bcprov-jdk15on:1.65')
|
||||||
testCompile("org.junit.jupiter:junit-jupiter-api:5.1.1")
|
testCompile("org.junit.jupiter:junit-jupiter-api:5.1.1")
|
||||||
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.1.1")
|
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.1.1")
|
||||||
|
|
|
@ -4,5 +4,5 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'com.github.status-im.status-keycard-java:desktop:64aece4'
|
compile 'com.github.status-im.status-keycard-java:desktop:15a61e1'
|
||||||
}
|
}
|
|
@ -89,11 +89,7 @@ public class Crypto {
|
||||||
|
|
||||||
addm256(output, outOff, data, dataOff, SECP256k1.SECP256K1_R, (short) 0, output, outOff);
|
addm256(output, outOff, data, dataOff, SECP256k1.SECP256K1_R, (short) 0, output, outOff);
|
||||||
|
|
||||||
if (isZero256(output, outOff)) {
|
return !isZero256(output, outOff);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -202,17 +198,22 @@ public class Crypto {
|
||||||
* @return the comparison result
|
* @return the comparison result
|
||||||
*/
|
*/
|
||||||
private short ucmp256(byte[] a, short aOff, byte[] b, short bOff) {
|
private short ucmp256(byte[] a, short aOff, byte[] b, short bOff) {
|
||||||
short ai, bi;
|
short gt = 0;
|
||||||
|
short eq = 1;
|
||||||
|
|
||||||
for (short i = 0 ; i < 32; i++) {
|
for (short i = 0 ; i < 32; i++) {
|
||||||
ai = (short)(a[(short)(aOff + i)] & 0x00ff);
|
short l = (short)(a[(short)(aOff + i)] & 0x00ff);
|
||||||
bi = (short)(b[(short)(bOff + i)] & 0x00ff);
|
short r = (short)(b[(short)(bOff + i)] & 0x00ff);
|
||||||
|
short d = (short)(r - l);
|
||||||
|
short l_xor_r = (short)(l ^ r);
|
||||||
|
short l_xor_d = (short)(l ^ d);
|
||||||
|
short d_xored = (short)(d ^ (short)(l_xor_r & l_xor_d));
|
||||||
|
|
||||||
if (ai != bi) {
|
gt |= (d_xored >>> 15) & eq;
|
||||||
return (short)(ai - bi);
|
eq &= ((short)(l_xor_r - 1) >>> 15);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return (short) ((gt + gt + eq) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -223,16 +224,13 @@ public class Crypto {
|
||||||
* @return true if a is 0, false otherwise
|
* @return true if a is 0, false otherwise
|
||||||
*/
|
*/
|
||||||
private boolean isZero256(byte[] a, short aOff) {
|
private boolean isZero256(byte[] a, short aOff) {
|
||||||
boolean isZero = true;
|
byte acc = 0;
|
||||||
|
|
||||||
for (short i = 0; i < (byte) 32; i++) {
|
for (short i = 0; i < 32; i++) {
|
||||||
if (a[(short)(aOff + i)] != 0) {
|
acc |= a[(short)(aOff + i)];
|
||||||
isZero = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return isZero;
|
return acc == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue