196 lines
6.2 KiB
TypeScript
196 lines
6.2 KiB
TypeScript
import { expect } from '@wdio/globals';
|
|
|
|
import {
|
|
veilidCoreInitConfig,
|
|
veilidCoreStartupConfig,
|
|
} from './utils/veilid-config';
|
|
|
|
import { veilidClient, veilidCrypto } from 'veilid-wasm';
|
|
import { textEncoder, unmarshallBytes } from './utils/marshalling-utils';
|
|
|
|
describe('veilidCrypto', () => {
|
|
before('veilid startup', async () => {
|
|
veilidClient.initializeCore(veilidCoreInitConfig);
|
|
await veilidClient.startupCore((_update) => {
|
|
// if (_update.kind === 'Log') {
|
|
// console.log(_update.message);
|
|
// }
|
|
}, JSON.stringify(veilidCoreStartupConfig));
|
|
});
|
|
|
|
after('veilid shutdown', async () => {
|
|
await veilidClient.shutdownCore();
|
|
});
|
|
|
|
it('should list crypto kinds', () => {
|
|
const kinds = veilidCrypto.validCryptoKinds();
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
|
|
expect(typeof bestKind).toBe('string');
|
|
expect(kinds.includes(bestKind)).toBe(true);
|
|
});
|
|
|
|
it('should generate key pair', () => {
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
const keypair = veilidCrypto.generateKeyPair(bestKind);
|
|
expect(typeof keypair).toBe('string');
|
|
|
|
const [publicKey, secretKey] = keypair.split(':');
|
|
expect(unmarshallBytes(publicKey).length).toBe(32);
|
|
expect(unmarshallBytes(secretKey).length).toBe(32);
|
|
|
|
const isValid = veilidCrypto.validateKeyPair(
|
|
bestKind,
|
|
publicKey,
|
|
secretKey
|
|
);
|
|
expect(isValid).toBe(true);
|
|
});
|
|
|
|
it('should generate random bytes', () => {
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
const bytes = veilidCrypto.randomBytes(bestKind, 64);
|
|
expect(bytes instanceof Uint8Array).toBe(true);
|
|
expect(bytes.length).toBe(64);
|
|
});
|
|
|
|
it('should hash data and validate hash', () => {
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
const data = textEncoder.encode('this is my data🚀');
|
|
const hash = veilidCrypto.generateHash(bestKind, data);
|
|
|
|
expect(hash).toBeDefined();
|
|
expect(typeof hash).toBe('string');
|
|
|
|
const isValid = veilidCrypto.validateHash(bestKind, data, hash);
|
|
expect(isValid).toBe(true);
|
|
});
|
|
|
|
it('should hash and validate password', () => {
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
|
|
const password = textEncoder.encode('this is my data🚀');
|
|
const saltLength = veilidCrypto.defaultSaltLength(bestKind);
|
|
expect(saltLength).toBeGreaterThan(0);
|
|
|
|
const salt = veilidCrypto.randomBytes(bestKind, saltLength);
|
|
expect(salt instanceof Uint8Array).toBe(true);
|
|
expect(salt.length).toBe(saltLength);
|
|
|
|
const hash = veilidCrypto.hashPassword(bestKind, password, salt);
|
|
expect(hash).toBeDefined();
|
|
expect(typeof hash).toBe('string');
|
|
|
|
const isValid = veilidCrypto.verifyPassword(bestKind, password, hash);
|
|
expect(isValid).toBe(true);
|
|
});
|
|
|
|
it('should aead encrypt and decrypt', () => {
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
const body = textEncoder.encode(
|
|
'This is an encoded body with my secret data in it🔥'
|
|
);
|
|
const ad = textEncoder.encode(
|
|
'This is data associated with my secret data👋'
|
|
);
|
|
|
|
const nonce = veilidCrypto.randomNonce(bestKind);
|
|
expect(typeof nonce).toBe('string');
|
|
|
|
const sharedSecred = veilidCrypto.randomSharedSecret(bestKind);
|
|
expect(typeof sharedSecred).toBe('string');
|
|
|
|
const encBody = veilidCrypto.encryptAead(
|
|
bestKind,
|
|
body,
|
|
nonce,
|
|
sharedSecred,
|
|
ad
|
|
);
|
|
expect(encBody instanceof Uint8Array).toBe(true);
|
|
|
|
const overhead = veilidCrypto.aeadOverhead(bestKind);
|
|
expect(encBody.length - body.length).toBe(overhead);
|
|
|
|
const decBody = veilidCrypto.decryptAead(
|
|
bestKind,
|
|
encBody,
|
|
nonce,
|
|
sharedSecred,
|
|
ad
|
|
);
|
|
expect(decBody instanceof Uint8Array).toBe(true);
|
|
expect(body).toEqual(decBody);
|
|
});
|
|
|
|
it('should sign and verify', () => {
|
|
const bestKind = veilidCrypto.bestCryptoKind();
|
|
const keypair = veilidCrypto.generateKeyPair(bestKind);
|
|
const data = textEncoder.encode(
|
|
'This is some data I am signing with my key 🔑'
|
|
);
|
|
expect(typeof keypair).toBe('string');
|
|
|
|
const [publicKey, secretKey] = keypair.split(':');
|
|
|
|
const sig = veilidCrypto.sign(bestKind, publicKey, secretKey, data);
|
|
expect(typeof sig).toBe('string');
|
|
|
|
expect(() => {
|
|
const res = veilidCrypto.verify(bestKind, publicKey, data, sig);
|
|
expect(res).toBeUndefined();
|
|
}).not.toThrow();
|
|
});
|
|
|
|
describe('contants', () => {
|
|
it('CRYPTO_KEY_LENGTH', () => {
|
|
expect(typeof veilidCrypto.CRYPTO_KEY_LENGTH).toBe('number');
|
|
});
|
|
it('CRYPTO_KEY_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.CRYPTO_KEY_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('HASH_DIGEST_LENGTH', () => {
|
|
expect(typeof veilidCrypto.HASH_DIGEST_LENGTH).toBe('number');
|
|
});
|
|
it('HASH_DIGEST_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.HASH_DIGEST_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('NONCE_LENGTH', () => {
|
|
expect(typeof veilidCrypto.NONCE_LENGTH).toBe('number');
|
|
});
|
|
it('NONCE_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.NONCE_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('PUBLIC_KEY_LENGTH', () => {
|
|
expect(typeof veilidCrypto.PUBLIC_KEY_LENGTH).toBe('number');
|
|
});
|
|
it('PUBLIC_KEY_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.PUBLIC_KEY_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('ROUTE_ID_LENGTH', () => {
|
|
expect(typeof veilidCrypto.ROUTE_ID_LENGTH).toBe('number');
|
|
});
|
|
it('ROUTE_ID_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.ROUTE_ID_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('SECRET_KEY_LENGTH', () => {
|
|
expect(typeof veilidCrypto.SECRET_KEY_LENGTH).toBe('number');
|
|
});
|
|
it('SECRET_KEY_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.SECRET_KEY_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('SHARED_SECRET_LENGTH', () => {
|
|
expect(typeof veilidCrypto.SHARED_SECRET_LENGTH).toBe('number');
|
|
});
|
|
it('SHARED_SECRET_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.SHARED_SECRET_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
it('SIGNATURE_LENGTH', () => {
|
|
expect(typeof veilidCrypto.SIGNATURE_LENGTH).toBe('number');
|
|
});
|
|
it('SIGNATURE_LENGTH_ENCODED', () => {
|
|
expect(typeof veilidCrypto.SIGNATURE_LENGTH_ENCODED).toBe('number');
|
|
});
|
|
});
|
|
});
|