PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/sodium-native/test

Просмотр файла: core_ed25519.js

var test = require('tape')
var sodium = require('..')

const nonCanonicalP = Buffer.from([
  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
])

const nonCanonicalInvalidP = Buffer.from([
  0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
])

const maxCanonicalP = Buffer.from([
  0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
])

function addP (S) {
  const P = Buffer.from([
    0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
  ])

  sodium.sodium_add(S, P)
}

function addL64 (S) {
  const l = Buffer.alloc(sodium.crypto_core_ed25519_NONREDUCEDSCALARBYTES)
  l.set([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
    0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

  sodium.sodium_add(S, l)
}

test('ported libsodium test', function (assert) {
  var h
  var p, p2, p3
  var sc, sc2, sc3
  var sc64
  var i, j

  h = sodium.sodium_malloc(sodium.crypto_core_ed25519_UNIFORMBYTES)
  p = sodium.sodium_malloc(sodium.crypto_core_ed25519_BYTES)
  for (i = 0; i < 1000; i++) {
    sodium.randombytes_buf(h.subarray(0, sodium.crypto_core_ed25519_UNIFORMBYTES))
    sodium.crypto_core_ed25519_from_uniform(p, h)
    if (sodium.crypto_core_ed25519_is_valid_point(p) === false) {
      assert.fail('crypto_core_ed25519_from_uniform() returned an invalid point')
    }
  }

  p2 = sodium.sodium_malloc(sodium.crypto_core_ed25519_BYTES)
  p3 = sodium.sodium_malloc(sodium.crypto_core_ed25519_BYTES)
  sodium.randombytes_buf(h.subarray(0, sodium.crypto_core_ed25519_UNIFORMBYTES))
  sodium.crypto_core_ed25519_from_uniform(p2, h)

  j = 1 + sodium.randombytes_uniform(100)
  p.copy(p3, 0, 0, sodium.crypto_core_ed25519_BYTES)
  for (i = 0; i < j; i++) {
    sodium.crypto_core_ed25519_add(p, p, p2)
    if (sodium.crypto_core_ed25519_is_valid_point(p) === false) {
      assert.fail('crypto_core_add() returned an invalid point\n')
    }
  }

  assert.notOk(sodium.sodium_memcmp(p.subarray(0, sodium.crypto_core_ed25519_BYTES), p3), 'crypto_core_add() failed')
  for (i = 0; i < j; i++) {
    sodium.crypto_core_ed25519_sub(p, p, p2)
  }
  assert.ok(sodium.sodium_memcmp(p.subarray(0, sodium.crypto_core_ed25519_BYTES), p3))
  sc = sodium.sodium_malloc(sodium.crypto_scalarmult_ed25519_SCALARBYTES)
  sc.fill(0, 0, sodium.crypto_scalarmult_ed25519_SCALARBYTES)
  sc[0] = 8
  p.copy(p2, 0, 0, sodium.crypto_core_ed25519_BYTES)
  p.copy(p3, 0, 0, sodium.crypto_core_ed25519_BYTES)

  for (i = 0; i < 254; i++) {
    sodium.crypto_core_ed25519_add(p2, p2, p2)
  }
  for (i = 0; i < 8; i++) {
    sodium.crypto_core_ed25519_add(p2, p2, p)
  }
  sodium.crypto_scalarmult_ed25519(p3, sc, p)
  assert.ok(sodium.sodium_memcmp(p2.subarray(0, sodium.crypto_core_ed25519_BYTES), p3))

  assert.ok(sodium.crypto_core_ed25519_is_valid_point(p))

  p.fill(0, 0, sodium.crypto_core_ed25519_BYTES)
  assert.notOk(sodium.crypto_core_ed25519_is_valid_point(p))

  p[0] = 1
  assert.notOk(sodium.crypto_core_ed25519_is_valid_point(p))

  p[0] = 2
  assert.notOk(sodium.crypto_core_ed25519_is_valid_point(p))

  p[0] = 9
  assert.ok(sodium.crypto_core_ed25519_is_valid_point(p))

  assert.ok(sodium.crypto_core_ed25519_is_valid_point(maxCanonicalP))
  assert.notOk(sodium.crypto_core_ed25519_is_valid_point(nonCanonicalInvalidP))
  assert.notOk(sodium.crypto_core_ed25519_is_valid_point(nonCanonicalP))

  p.copy(p2, 0, 0, sodium.crypto_core_ed25519_BYTES)
  addP(p2)
  sodium.crypto_core_ed25519_add(p3, p2, p2)
  sodium.crypto_core_ed25519_sub(p3, p3, p2)
  assert.notOk(sodium.sodium_memcmp(p2.subarray(0, sodium.crypto_core_ed25519_BYTES), p))
  assert.ok(sodium.sodium_memcmp(p3.subarray(0, sodium.crypto_core_ed25519_BYTES), p))

  p[0] = 2
  assert.throws(() => sodium.crypto_core_ed25519_add(p3, p2, p))
  sodium.crypto_core_ed25519_add(p3, p2, nonCanonicalP)
  assert.throws(() => sodium.crypto_core_ed25519_add(p3, p2, nonCanonicalInvalidP))
  assert.throws(() => sodium.crypto_core_ed25519_add(p3, p, p3))
  sodium.crypto_core_ed25519_add(p3, nonCanonicalP, p3)
  assert.throws(() => sodium.crypto_core_ed25519_add(p3, nonCanonicalInvalidP, p3))

  assert.throws(() => sodium.crypto_core_ed25519_sub(p3, p2, p))
  sodium.crypto_core_ed25519_sub(p3, p2, nonCanonicalP)
  assert.throws(() => sodium.crypto_core_ed25519_sub(p3, p2, nonCanonicalInvalidP))
  assert.throws(() => sodium.crypto_core_ed25519_sub(p3, p, p3))
  sodium.crypto_core_ed25519_sub(p3, nonCanonicalP, p3)
  assert.throws(() => sodium.crypto_core_ed25519_sub(p3, nonCanonicalInvalidP, p3))

  for (i = 0; i < 1000; i++) {
    sodium.randombytes_buf(h.subarray(0, sodium.crypto_core_ed25519_UNIFORMBYTES))
    sodium.crypto_core_ed25519_from_uniform(p, h)
    sodium.crypto_core_ed25519_scalar_random(sc)
    sodium.crypto_scalarmult_ed25519_noclamp(p2, sc, p)
    if (!sodium.crypto_core_ed25519_is_valid_point(p2)) assert.fail()
    sodium.crypto_core_ed25519_scalar_invert(sc, sc)
    sodium.crypto_scalarmult_ed25519_noclamp(p3, sc, p2)
    if (sodium.sodium_memcmp(p3.subarray(0, sodium.crypto_core_ed25519_BYTES), p) === false) assert.fail()
  }

  sc64 = sodium.sodium_malloc(64)
  sodium.crypto_core_ed25519_scalar_random(sc)
  sc.copy(sc64, 0, 0, sodium.crypto_core_ed25519_BYTES)
  sc64.fill(0, sodium.crypto_core_ed25519_BYTES)
  i = sodium.randombytes_uniform(100)
  do {
    addL64(sc64)
  } while (i-- > 0)
  const reduced = sodium.sodium_malloc(sodium.crypto_core_ed25519_SCALARBYTES)
  sodium.crypto_core_ed25519_scalar_reduce(reduced, sc64)
  assert.ok(sodium.sodium_memcmp(reduced, sc))

  sodium.randombytes_buf(h.subarray(0, sodium.crypto_core_ed25519_UNIFORMBYTES))
  sodium.crypto_core_ed25519_from_uniform(p, h)
  p.copy(p2, 0, 0, sodium.crypto_core_ed25519_BYTES)
  sodium.crypto_core_ed25519_scalar_random(sc)
  sodium.crypto_scalarmult_ed25519_noclamp(p, sc, p)
  sodium.crypto_core_ed25519_scalar_complement(sc, sc)
  sodium.crypto_scalarmult_ed25519_noclamp(p2, sc, p2)
  sodium.crypto_core_ed25519_add(p3, p, p2)
  sodium.crypto_core_ed25519_from_uniform(p, h)
  sodium.crypto_core_ed25519_sub(p, p, p3)
  if (p[0] !== 0x01) assert.fail()
  for (i = 1; i < sodium.crypto_core_ed25519_BYTES; i++) {
    if (p[i] !== 0) assert.fail()
  }

  sodium.randombytes_buf(h.subarray(0, sodium.crypto_core_ed25519_UNIFORMBYTES))
  sodium.crypto_core_ed25519_from_uniform(p, h)
  p.copy(p2, 0, 0, sodium.crypto_core_ed25519_BYTES)
  sodium.crypto_core_ed25519_scalar_random(sc)
  sodium.crypto_scalarmult_ed25519_noclamp(p, sc, p)
  sodium.crypto_core_ed25519_scalar_negate(sc, sc)
  sodium.crypto_scalarmult_ed25519_noclamp(p2, sc, p2)
  sodium.crypto_core_ed25519_add(p, p, p2)
  if (p[0] !== 0x01) assert.fail()
  for (i = 1; i < sodium.crypto_core_ed25519_BYTES; i++) {
    if (p[i] !== 0) assert.fail()
  }

  for (i = 0; i < sodium.crypto_core_ed25519_SCALARBYTES; i++) {
    sc[i] = 255 - i
  }
  sodium.crypto_core_ed25519_scalar_invert(sc, sc)
  assert.equal(sc.toString('hex'), '5858cdec40a044b1548b3bb08f8ce0d71103d1f887df84ebc502643dac4df40b', 'inv1')
  sodium.crypto_core_ed25519_scalar_invert(sc, sc)
  assert.equal(sc.toString('hex'), '09688ce78a8ff8273f636b0bc748c0cceeeeedecebeae9e8e7e6e5e4e3e2e100', 'inv2')
  for (i = 0; i < sodium.crypto_core_ed25519_SCALARBYTES; i++) {
    sc[i] = 32 - i
  }
  sodium.crypto_core_ed25519_scalar_invert(sc, sc)

  assert.equal(sc.toString('hex'), 'f70b4f272b47bd6a1015a511fb3c9fc1b9c21ca4ca2e17d5a225b4c410b9b60d', 'inv3')
  sodium.crypto_core_ed25519_scalar_invert(sc, sc)
  assert.equal(sc.toString('hex'), '201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201', 'inv4')

  for (i = 0; i < sodium.crypto_core_ed25519_SCALARBYTES; i++) {
    sc[i] = 255 - i
  }
  sodium.crypto_core_ed25519_scalar_negate(sc, sc)
  assert.equal(sc.toString('hex'), 'e46b69758fd3193097398c9717b11e48111112131415161718191a1b1c1d1e0f', 'neg1')
  sodium.crypto_core_ed25519_scalar_negate(sc, sc)
  assert.equal(sc.toString('hex'), '09688ce78a8ff8273f636b0bc748c0cceeeeedecebeae9e8e7e6e5e4e3e2e100', 'neg2')
  for (i = 0; i < sodium.crypto_core_ed25519_SCALARBYTES; i++) {
    sc[i] = 32 - i
  }
  sodium.crypto_core_ed25519_scalar_negate(sc, sc)
  assert.equal(sc.toString('hex'), 'cdb4d73ffe47f83ebe85e18dcae6cc03f0f0f1f2f3f4f5f6f7f8f9fafbfcfd0e', 'neg3')
  sodium.crypto_core_ed25519_scalar_negate(sc, sc)
  assert.equal(sc.toString('hex'), '201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201', 'neg4')

  for (i = 0; i < sodium.crypto_core_ed25519_SCALARBYTES; i++) {
    sc[i] = 255 - i
  }
  sodium.crypto_core_ed25519_scalar_complement(sc, sc)
  assert.equal(sc.toString('hex'), 'e56b69758fd3193097398c9717b11e48111112131415161718191a1b1c1d1e0f', 'comp1')
  sodium.crypto_core_ed25519_scalar_complement(sc, sc)
  assert.equal(sc.toString('hex'), '09688ce78a8ff8273f636b0bc748c0cceeeeedecebeae9e8e7e6e5e4e3e2e100', 'comp2')
  for (i = 0; i < sodium.crypto_core_ed25519_SCALARBYTES; i++) {
    sc[i] = 32 - i
  }
  sodium.crypto_core_ed25519_scalar_complement(sc, sc)
  assert.equal(sc.toString('hex'), 'ceb4d73ffe47f83ebe85e18dcae6cc03f0f0f1f2f3f4f5f6f7f8f9fafbfcfd0e', 'comp3')
  sodium.crypto_core_ed25519_scalar_complement(sc, sc)
  assert.equal(sc.toString('hex'), '201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201', 'comp4')

  sc2 = sodium.sodium_malloc(sodium.crypto_core_ed25519_SCALARBYTES)
  sc3 = sodium.sodium_malloc(sodium.crypto_core_ed25519_SCALARBYTES)
  for (i = 0; i < 1000; i++) {
    sodium.randombytes_buf(sc.subarray(0, sodium.crypto_core_ed25519_SCALARBYTES))
    sodium.randombytes_buf(sc2.subarray(0, sodium.crypto_core_ed25519_SCALARBYTES))
    sc[sodium.crypto_core_ed25519_SCALARBYTES - 1] &= 0x7f
    sc2[sodium.crypto_core_ed25519_SCALARBYTES - 1] &= 0x7f
    sodium.crypto_core_ed25519_scalar_add(sc3, sc, sc2)
    if (sodium.sodium_is_zero(sc, sodium.crypto_core_ed25519_SCALARBYTES)) assert.fail()
    sodium.crypto_core_ed25519_scalar_sub(sc3, sc3, sc2)
    if (sodium.sodium_is_zero(sc, sodium.crypto_core_ed25519_SCALARBYTES)) assert.fail()
    sodium.crypto_core_ed25519_scalar_sub(sc3, sc3, sc)
    if (!sodium.sodium_is_zero(sc3, sodium.crypto_core_ed25519_SCALARBYTES)) assert.fail()
  }

  sc.fill(0x69, 0, sodium.crypto_core_ed25519_UNIFORMBYTES)
  sc2.fill(0x42, 0, sodium.crypto_core_ed25519_UNIFORMBYTES)
  sodium.crypto_core_ed25519_scalar_add(sc, sc, sc2)
  sodium.crypto_core_ed25519_scalar_add(sc, sc2, sc)
  assert.equal(sc.toString('hex'), 'f7567cd87c82ec1c355a6304c143bcc9ecedededededededededededededed0d', 'add1')

  sodium.crypto_core_ed25519_scalar_sub(sc, sc2, sc)
  sodium.crypto_core_ed25519_scalar_sub(sc, sc, sc2)
  assert.equal(sc.toString('hex'), 'f67c79849de0253ba142949e1db6224b13121212121212121212121212121202', 'sub1')

  sc.fill(0xcd, 0, sodium.crypto_core_ed25519_UNIFORMBYTES)
  sc2.fill(0x42, 0, sodium.crypto_core_ed25519_UNIFORMBYTES)
  sodium.crypto_core_ed25519_scalar_add(sc, sc, sc2)
  sodium.crypto_core_ed25519_scalar_add(sc, sc2, sc)
  assert.equal(sc.toString('hex'), 'b02e8581ce62f69922427c23f970f7e951525252525252525252525252525202', 'add2')

  sodium.crypto_core_ed25519_scalar_sub(sc, sc2, sc)
  sodium.crypto_core_ed25519_scalar_sub(sc, sc, sc2)
  assert.equal(sc.toString('hex'), '3da570db4b001cbeb35a7b7fe588e72aaeadadadadadadadadadadadadadad0d', 'sub2')

  // sodium-native: We're hardcoding these in just so we can see if they change
  assert.ok(sodium.crypto_core_ed25519_BYTES === 32)
  assert.ok(sodium.crypto_core_ed25519_SCALARBYTES === 32)
  assert.ok(sodium.crypto_core_ed25519_NONREDUCEDSCALARBYTES === 64)
  assert.ok(sodium.crypto_core_ed25519_NONREDUCEDSCALARBYTES >= sodium.crypto_core_ed25519_SCALARBYTES)
  assert.ok(sodium.crypto_core_ed25519_UNIFORMBYTES === 32)
  assert.ok(sodium.crypto_core_ed25519_UNIFORMBYTES >= sodium.crypto_core_ed25519_BYTES)
  assert.end()
})

Выполнить команду


Для локальной разработки. Не используйте в интернете!