59 lines
1.3 KiB
TypeScript
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;
|
|
}
|