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')
})