signal-desktop/ts/updater/curve.ts

59 lines
1.3 KiB
TypeScript

import { randomBytes } from 'crypto';
const g = global as any;
// Because curve wrapper will populate this
g.Internal = {};
// Because curve wrapper uses 'Module' to get at curve-provided functionality
// tslint:disable-next-line
g.Module = require('../../js/curve/curve25519_compiled');
// tslint:disable-next-line
require('../../js/curve/curve25519_wrapper');
export type BinaryType = Uint8Array | Buffer;
interface CurveType {
keyPair: (
privateKey: BinaryType
) => {
pubKey: BinaryType;
privKey: BinaryType;
};
sign: (privateKey: BinaryType, message: BinaryType) => BinaryType;
verify: (
publicKey: BinaryType,
message: BinaryType,
signature: BinaryType
) => boolean;
}
const {
keyPair: internalKeyPair,
sign: internalSign,
verify: internalVerify,
} = g.Internal.curve25519 as CurveType;
export function keyPair() {
const privateKey = randomBytes(32);
const { pubKey, privKey } = internalKeyPair(privateKey);
return {
publicKey: pubKey,
privateKey: privKey,
};
}
export function sign(privateKey: BinaryType, message: BinaryType) {
return internalSign(privateKey, message);
}
export function verify(
publicKey: BinaryType,
message: BinaryType,
signature: BinaryType
) {
const failed = internalVerify(publicKey, message, signature);
return !failed;
}