UNPKG

@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
"use strict"; 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;