@sebastianp265/safe-server-side-storage-client
Version:
Library for Confidential Server-Side Message Storage Using the Labyrinth Protocol
74 lines (73 loc) • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PublicKey = exports.PrivateKey = void 0;
exports.generateKeyPair = generateKeyPair;
const ed25519_1 = require("@noble/curves/ed25519");
const key_derivation_1 = require("./key-derivation");
const utils_1 = require("./utils");
const BytesSerializer_1 = require("../BytesSerializer");
function generateKeyPair() {
const privateKey = PrivateKey.generate();
const publicKey = privateKey.getPublicKey();
return { privateKey, publicKey };
}
class PrivateKey {
// ed25519 private key
ed25519PrivateKey;
constructor(ed25519PrivateKey) {
(0, utils_1.cryptoAssert)(ed25519PrivateKey.length === key_derivation_1.KEY_LENGTH_BYTES);
this.ed25519PrivateKey = ed25519PrivateKey;
}
static generate() {
return new PrivateKey(ed25519_1.ed25519.utils.randomPrivateKey());
}
getPublicKey() {
return new PublicKey(ed25519_1.ed25519.getPublicKey(this.ed25519PrivateKey));
}
// used for persistence only
serialize() {
return BytesSerializer_1.bytesSerializerProvider.bytesSerializer.serialize(this.ed25519PrivateKey);
}
// used for persistence only
static deserialize(serialized) {
return new PrivateKey(BytesSerializer_1.bytesSerializerProvider.bytesSerializer.deserialize(serialized));
}
sign(useCaseByte, data) {
(0, utils_1.cryptoAssert)(useCaseByte.length === 1);
return ed25519_1.ed25519.sign((0, utils_1.concat)(useCaseByte, data), this.ed25519PrivateKey);
}
agree(otherKey) {
const x25519PrivateKey = (0, ed25519_1.edwardsToMontgomeryPriv)(this.ed25519PrivateKey);
const x25519OtherPublicKey = otherKey.getX25519PublicKeyBytes();
return ed25519_1.x25519.getSharedSecret(x25519PrivateKey, x25519OtherPublicKey);
}
}
exports.PrivateKey = PrivateKey;
class PublicKey {
ed25519PublicKey;
constructor(ed25519PublicKey) {
(0, utils_1.cryptoAssert)(ed25519PublicKey.length === key_derivation_1.KEY_LENGTH_BYTES);
this.ed25519PublicKey = ed25519PublicKey;
}
serialize() {
return BytesSerializer_1.bytesSerializerProvider.bytesSerializer.serialize(this.ed25519PublicKey);
}
static deserialize(serialized) {
return new PublicKey(BytesSerializer_1.bytesSerializerProvider.bytesSerializer.deserialize(serialized));
}
getEd25519PublicKeyBytes() {
return this.ed25519PublicKey;
}
getX25519PublicKeyBytes() {
const x25519PublicKey = (0, ed25519_1.edwardsToMontgomeryPub)(this.ed25519PublicKey);
(0, utils_1.cryptoAssert)(x25519PublicKey.length === key_derivation_1.KEY_LENGTH_BYTES);
return x25519PublicKey;
}
verify(signature, useCaseByte, data) {
return ed25519_1.ed25519.verify(signature, (0, utils_1.concat)(useCaseByte, data), this.ed25519PublicKey);
}
equals(otherKey) {
return (0, utils_1.bytes_equal)(this.getX25519PublicKeyBytes(), otherKey.getX25519PublicKeyBytes());
}
}
exports.PublicKey = PublicKey;