OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-note / test / unit / anproto.test.js

62 lines · javascript ref:
import test from 'brittle'
import { ANProto } from '../../lib/anproto.js'

test('ANProto - generate keypair', (t) => {
  const kp = ANProto.gen()
  t.ok(kp.publicKey, 'has publicKey buffer')
  t.ok(kp.secretKey, 'has secretKey buffer')
  t.is(kp.publicKey.length, 32, 'publicKey is 32 bytes')
  t.is(kp.secretKey.length, 64, 'secretKey is 64 bytes')
  t.is(kp.keypair.length, 132, 'keypair string is 132 chars (44+88)')
})

test('ANProto - load keypair from string', (t) => {
  const kp = ANProto.gen()
  const loaded = ANProto.loadKeypair(kp.keypair)
  t.alike(loaded.publicKey, kp.publicKey, 'loaded publicKey matches')
  t.alike(loaded.secretKey, kp.secretKey, 'loaded secretKey matches')
})

test('ANProto - load keypair rejects invalid length', (t) => {
  t.exception(() => ANProto.loadKeypair('tooshort'), /Invalid keypair length/)
})

test('ANProto - sign and verify round-trip', (t) => {
  const kp = ANProto.gen()
  const challenge = 'test-challenge-' + Date.now()
  const signature = ANProto.sign(challenge, kp)

  t.is(signature.length, 88, 'signature is 88 chars base64')

  const pubKeyB64 = kp.keypair.substring(0, 44)
  const valid = ANProto.verify(challenge, signature, pubKeyB64)
  t.ok(valid, 'valid signature verifies')
})

test('ANProto - wrong challenge rejected', (t) => {
  const kp = ANProto.gen()
  const signature = ANProto.sign('original-challenge', kp)
  const pubKeyB64 = kp.keypair.substring(0, 44)

  const valid = ANProto.verify('different-challenge', signature, pubKeyB64)
  t.absent(valid, 'wrong challenge fails verification')
})

test('ANProto - wrong key rejected', (t) => {
  const kp1 = ANProto.gen()
  const kp2 = ANProto.gen()
  const challenge = 'shared-challenge'
  const signature = ANProto.sign(challenge, kp1)
  const pubKeyB64 = kp2.keypair.substring(0, 44)

  const valid = ANProto.verify(challenge, signature, pubKeyB64)
  t.absent(valid, 'wrong key fails verification')
})

test('ANProto - getPublicKey extracts from keypair', (t) => {
  const kp = ANProto.gen()
  const pubKey = ANProto.getPublicKey(kp.keypair)
  t.is(pubKey.length, 44, 'extracted public key is 44 chars')
  t.is(pubKey, kp.keypair.substring(0, 44), 'matches expected substring')
})