@hypernetlabs/common-crypto-utils
Version:
Crypto utils, ready for injection, using Neverthrow
97 lines • 4.83 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CryptoUtils = void 0;
const crypto_1 = __importDefault(require("crypto"));
const common_objects_1 = require("@hypernetlabs/common-objects");
const objects_1 = require("@hypernetlabs/objects");
const argon2_1 = __importDefault(require("argon2"));
const ethers_1 = require("ethers");
const inversify_1 = require("inversify");
const neverthrow_1 = require("neverthrow");
let CryptoUtils = class CryptoUtils {
constructor() {
this.cipherAlgorithm = "aes-256-cbc";
}
getNonce(nonceSize = 64) {
return (0, neverthrow_1.okAsync)(crypto_1.default.randomBytes(nonceSize)
.toString("base64")
.slice(0, nonceSize));
}
createAESKey() {
return (0, neverthrow_1.okAsync)((0, common_objects_1.AESKey)(crypto_1.default.randomBytes(32).toString("base64")));
}
createEthereumPrivateKey() {
return (0, neverthrow_1.okAsync)((0, common_objects_1.EthereumPrivateKey)(crypto_1.default.randomBytes(32).toString("hex")));
}
getEthereumAccountAddressFromPrivateKey(privateKey) {
const wallet = new ethers_1.ethers.Wallet(privateKey);
return (0, objects_1.EthereumAccountAddress)(wallet.address);
}
verifySignature(message, signature) {
const address = (0, objects_1.EthereumAccountAddress)(ethers_1.ethers.utils.verifyMessage(message, signature));
return (0, neverthrow_1.okAsync)(address);
}
verifyTypedData(domain, types, value, signature) {
return (0, neverthrow_1.okAsync)((0, objects_1.EthereumAccountAddress)(ethers_1.ethers.utils.verifyTypedData(domain, types, value, signature)));
}
encryptString(secret, encryptionKey) {
return this.getNonce(16).map((nonce) => {
const iv = (0, common_objects_1.InitializationVector)(nonce);
const cipher = crypto_1.default.createCipheriv(this.cipherAlgorithm, Buffer.from(encryptionKey, "base64"), iv);
// Encrypt the message
let encryptedData = cipher.update(secret, "utf-8", "base64");
encryptedData += cipher.final("base64");
return new common_objects_1.AESEncryptedString((0, common_objects_1.EncryptedString)(encryptedData), iv);
});
}
decryptAESEncryptedString(encrypted, encryptionKey) {
// The decipher function
const decipher = crypto_1.default.createDecipheriv(this.cipherAlgorithm, Buffer.from(encryptionKey, "base64"), encrypted.initializationVector);
// decrypt the message
let decryptedData = decipher.update(encrypted.data, "base64", "utf-8");
decryptedData += decipher.final("utf8");
return (0, neverthrow_1.okAsync)(decryptedData);
}
// public generateKeyPair(): ResultAsync<void, never> {
// const { publicKey, privateKey } = Crypto.generateKeyPairSync("rsa", {
// // The standard secure default length for RSA keys is 2048 bits
// modulusLength: 2048,
// });
// console.log(publicKey);
// return okAsync(undefined);
// }
signMessage(message, privateKey) {
const wallet = new ethers_1.ethers.Wallet(privateKey);
return neverthrow_1.ResultAsync.fromSafePromise(wallet.signMessage(message)).map((signature) => {
return (0, objects_1.Signature)(signature);
});
}
hashStringSHA256(message) {
const hash = crypto_1.default.createHash("sha256")
.update(message)
.digest("base64");
return (0, neverthrow_1.okAsync)((0, common_objects_1.SHA256Hash)(hash));
}
hashStringArgon2(message) {
return neverthrow_1.ResultAsync.fromSafePromise(argon2_1.default.hash(message)).map((hash) => {
return (0, common_objects_1.Argon2Hash)(hash);
});
}
verifyHashArgon2(hash, message) {
return neverthrow_1.ResultAsync.fromSafePromise(argon2_1.default.verify(hash, message));
}
};
CryptoUtils = __decorate([
(0, inversify_1.injectable)()
], CryptoUtils);
exports.CryptoUtils = CryptoUtils;
//# sourceMappingURL=CryptoUtils.js.map