epir
Version:
EllipticPIR client library (Node.js / TypeScript bindings).
107 lines (97 loc) • 3.67 kB
text/typescript
import crypto from 'crypto';
import { SCALAR_SIZE } from '../types';
import {
time, arrayBufferConcat, arrayBufferCompare, arrayBufferToHex, hexToArrayBuffer, checkIsHex,
getRandomBytes, isCanonical, getRandomScalar, getRandomScalars, getRandomScalarsConcat
} from '../util';
let getRandomValues: ((buf: Uint8Array) => void) = (buf: Uint8Array) => {
for(let i=0; i<buf.length; i++) {
buf[i] = 0;
}
};
test('time', () => {
expect(time()).toBeLessThanOrEqual(Date.now());
});
describe('ArrayBuffer', () => {
test('arrayBufferConcat', () => {
const concat = arrayBufferConcat([new Uint8Array([0]).buffer, new Uint8Array([1]).buffer]);
expect(new Uint8Array(concat)).toEqual(new Uint8Array([0, 1]));
});
test('arrayBufferCompare', () => {
const a = new Uint8Array([0, 1, 2, 3]).buffer;
const b = new Uint8Array([1, 2, 3, 4]).buffer;
expect(arrayBufferCompare(a, 1, b, 0, 3)).toBe(0);
expect(arrayBufferCompare(a, 0, b, 0, 4)).toBeLessThan(0);
expect(arrayBufferCompare(b, 0, a, 0, 4)).toBeGreaterThan(0);
});
test('arrayBufferToHex', () => {
const a = new Uint8Array([0x00, 0x01, 0xfe, 0xff]).buffer;
expect(arrayBufferToHex(a)).toBe('0001feff');
});
test('hexToArrayBuffer (null)', () => {
expect(new Uint8Array(hexToArrayBuffer(''))).toEqual(new Uint8Array([]));
});
test('hexToArrayBuffer (0x0001feff)', () => {
expect(new Uint8Array(hexToArrayBuffer('0001feff'))).toEqual(new Uint8Array([0x00, 0x01, 0xfe, 0xff]));
});
test('checkIsHex', () => {
expect(checkIsHex('0123456789abcdefABCDEF')).toBe(true);
expect(checkIsHex('0123456789abcdefABCDEF', 11)).toBe(true);
expect(checkIsHex('0123456789abcdefABCDEF', 12)).toBe(false);
expect(checkIsHex('x')).toBe(false);
});
});
const zero = new Uint8Array([
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
]);
const one = new Uint8Array([
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
]);
const notCanonical = new Uint8Array([
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
]);
describe('isCanonical', () => {
test('true', () => {
expect(isCanonical(zero)).toBe(true);
});
test('false', () => {
expect(isCanonical(notCanonical)).toBe(false);
});
});
describe('Random', () => {
test('getRandomBytes', () => {
expect(getRandomBytes(256).byteLength).toBe(256);
});
test('getRandomScalar', async () => {
expect(getRandomScalar().byteLength).toBe(SCALAR_SIZE);
});
test('getRandomScalar (fail for first)', async () => {
let i = 0;
const randoms: Uint8Array[] = [zero, one];
getRandomValues = global.self.crypto.getRandomValues;
Object.defineProperty(global.self.crypto, 'getRandomValues', {
value: (buf: Uint8Array) => buf.set(randoms[i++]),
});
expect(new Uint8Array(getRandomScalar())).toEqual(one);
Object.defineProperty(global.self.crypto, 'getRandomValues', {
value: getRandomValues,
});
});
test('getRandomScalars', async () => {
getRandomValues = (buf: Uint8Array) => buf.set(crypto.randomBytes(buf.length));
expect(getRandomScalars(256)).toHaveLength(256);
});
test('getRandomScalarsConcat', async () => {
getRandomValues = (buf: Uint8Array) => buf.set(crypto.randomBytes(buf.length));
expect(getRandomScalarsConcat(256).byteLength).toBe(256 * SCALAR_SIZE);
});
});