/** * Constant-time byte[] comparison. * @param b a byte[] * @param c a byte[] * @return 1 if b and c are equal, 0 otherwise. */ public static int equal(byte[] b, byte[] c) { int result = 0; for (int i = 0; i < 32; i++) { result |= b[i] ^ c[i]; } return equal(result, 0); }
/** * Gets a value indicating whether or not the field element is non-zero. * * @return 1 if it is non-zero, 0 otherwise. */ public boolean isNonZero() { final byte[] s = toByteArray(); return Utils.equal(s, ZERO) == 0; }
@Override public boolean equals(Object obj) { if (!(obj instanceof Ed25519FieldElement)) return false; Ed25519FieldElement fe = (Ed25519FieldElement) obj; return 1==Utils.equal(toByteArray(), fe.toByteArray()); }
.cmov(this.precmp[pos][0], Utils.equal(babs, 1)) .cmov(this.precmp[pos][1], Utils.equal(babs, 2)) .cmov(this.precmp[pos][2], Utils.equal(babs, 3)) .cmov(this.precmp[pos][3], Utils.equal(babs, 4)) .cmov(this.precmp[pos][4], Utils.equal(babs, 5)) .cmov(this.precmp[pos][5], Utils.equal(babs, 6)) .cmov(this.precmp[pos][6], Utils.equal(babs, 7)) .cmov(this.precmp[pos][7], Utils.equal(babs, 8));
/** * Test method for {@link net.i2p.crypto.eddsa.Utils#equal(byte[], byte[])}. */ @Test public void testByteArrayEqual() { byte[] zero = new byte[32]; byte[] one = new byte[32]; one[0] = 1; assertThat(Utils.equal(zero, zero), is(1)); assertThat(Utils.equal(one, one), is(1)); assertThat(Utils.equal(one, zero), is(0)); assertThat(Utils.equal(zero, one), is(0)); }
/** * Test method for {@link net.i2p.crypto.eddsa.Utils#equal(int, int)}. */ @Test public void testIntEqual() { assertThat(Utils.equal(0, 0), is(1)); assertThat(Utils.equal(1, 1), is(1)); assertThat(Utils.equal(1, 0), is(0)); assertThat(Utils.equal(1, 127), is(0)); assertThat(Utils.equal(-127, 127), is(0)); assertThat(Utils.equal(-42, -42), is(1)); assertThat(Utils.equal(255, 255), is(1)); assertThat(Utils.equal(-255, -256), is(0)); }
@Test public void equalsReturnsZeroForUnequalByteArrays() { final SecureRandom random = new SecureRandom(); final byte[] bytes1 = new byte[32]; final byte[] bytes2 = new byte[32]; random.nextBytes(bytes1); for (int i=0; i<32; i++) { System.arraycopy(bytes1, 0, bytes2, 0, 32); bytes2[i] = (byte)(bytes2[i] ^ 0xff); Assert.assertThat(Utils.equal(bytes1, bytes2), IsEqual.equalTo(0)); } }
@Test public void equalsReturnsOneForEqualByteArrays() { final SecureRandom random = new SecureRandom(); final byte[] bytes1 = new byte[32]; final byte[] bytes2 = new byte[32]; for (int i=0; i<100; i++) { random.nextBytes(bytes1); System.arraycopy(bytes1, 0, bytes2, 0, 32); Assert.assertThat(Utils.equal(bytes1, bytes2), IsEqual.equalTo(1)); } }
/** * Constant-time byte[] comparison. * @param b a byte[] * @param c a byte[] * @return 1 if b and c are equal, 0 otherwise. */ public static int equal(byte[] b, byte[] c) { int result = 0; for (int i = 0; i < 32; i++) { result |= b[i] ^ c[i]; } return equal(result, 0); }
/** * Gets a value indicating whether or not the field element is non-zero. * * @return 1 if it is non-zero, 0 otherwise. */ public boolean isNonZero() { final byte[] s = toByteArray(); return Utils.equal(s, ZERO) == 0; }
@Override public boolean equals(Object obj) { if (!(obj instanceof Ed25519FieldElement)) return false; Ed25519FieldElement fe = (Ed25519FieldElement) obj; return 1==Utils.equal(toByteArray(), fe.toByteArray()); }
.cmov(this.precmp[pos][0], Utils.equal(babs, 1)) .cmov(this.precmp[pos][1], Utils.equal(babs, 2)) .cmov(this.precmp[pos][2], Utils.equal(babs, 3)) .cmov(this.precmp[pos][3], Utils.equal(babs, 4)) .cmov(this.precmp[pos][4], Utils.equal(babs, 5)) .cmov(this.precmp[pos][5], Utils.equal(babs, 6)) .cmov(this.precmp[pos][6], Utils.equal(babs, 7)) .cmov(this.precmp[pos][7], Utils.equal(babs, 8));
public void init(byte[] blob, int start, int len) throws SshException { ByteArrayReader bar = new ByteArrayReader(blob, start, len); try { String name = bar.readString(); if(!name.equals(ALGORITHM_NAME)) { throw new SshException("The encoded key is not ed25519", SshException.INTERNAL_ERROR); } byte[] pub = bar.readBinaryString(); EdDSAPublicKeySpec spec = new EdDSAPublicKeySpec(pub, EdDSANamedCurveTable.getByName("Ed25519")); publicKey = new EdDSAPublicKey(spec); if(Utils.equal(publicKey.getAbyte(), pub)==0) { throw new IOException("Not sure how to encode yet"); } } catch (IOException ioe) { throw new SshException("Failed to read encoded key data", SshException.INTERNAL_ERROR); } finally { bar.close(); } }