Source: nem/KeyPair.js

const tweetnacl = require('./external/tweetnacl-nacl-fast-keccak');
const { PrivateKey, PublicKey, Signature } = require('../CryptoTypes');

/**
 * Represents an ED25519 private and public key.
 */
class KeyPair {
	/**
	 * Creates a key pair from a private key.
	 * @param {PrivateKey} privateKey Private key.
	 */
	constructor(privateKey) {
		this._privateKey = privateKey;

		const reversedPrivateKeyBytes = new Uint8Array([...privateKey.bytes]);
		reversedPrivateKeyBytes.reverse();
		this._keyPair = tweetnacl.sign.keyPair.fromSeed(reversedPrivateKeyBytes);
	}

	/**
	 * Gets the public key.
	 * @returns {PublicKey} Public key.
	 */
	get publicKey() {
		return new PublicKey(this._keyPair.publicKey);
	}

	/**
	 * Gets the private key.
	 * @returns {PrivateKey} Private key.
	 */
	get privateKey() {
		return new PrivateKey(this._privateKey.bytes);
	}

	/**
	 * Signs a message with the private key.
	 * @param {Uint8Array} message Message to sign.
	 * @returns {Signature} Message signature.
	 */
	sign(message) {
		return new Signature(tweetnacl.sign.detached(message, this._keyPair.secretKey));
	}
}

/**
 * Verifies signatures signed by a single key pair.
 */
class Verifier {
	/**
	 * Creates a verifier from a public key.
	 * @param {PublicKey} publicKey Public key.
	 */
	constructor(publicKey) {
		this.publicKey = publicKey;
	}

	/**
	 * Verifies a message signature.
	 * @param {Uint8Array} message Message to verify.
	 * @param {Signature} signature Signature to verify.
	 * @returns {boolean} true if the message signature verifies.
	 */
	verify(message, signature) {
		return tweetnacl.sign.detached.verify(message, signature.bytes, this.publicKey.bytes);
	}
}

module.exports = { KeyPair, Verifier };