Package Exports
- dhole-crypto
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (dhole-crypto) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
DholeCrypto.js
JavaScript port of Dhole Cryptography (PHP).
Libsodium wrapper for Soatok's JavaScript projects. Released under the very permissive ISC license.
Important: Until version
v1.0.0is released, please don't deploy this library in any production systems. I'll tagv1.0.0when I'm confident in the correctness and security of the implementation.
Installation
npm install dhole-cryptoUsage
Asymmetric Cryptography
Digital Signatures
const {
Asymmetric,
AsymmetricSecretKey
} = require('dhole-crypto');
let wolfSecret = AsymmetricSecretKey.generate();
let wolfPublic = wolfSecret.getPublicKey();
let message = "Your $350 awoo fine has been paid UwU";
let signature = Asymmetric.sign(message, wolfSecret);
if (!Asymmetric.verify(message, wolfPublic, signature)) {
console.log("Invalid signature. Awoo not authorized.");
}Authenticated Public-Key Encryption
const {
Asymmetric,
AsymmetricSecretKey
} = require('dhole-crypto');
let foxSecret = AsymmetricSecretKey.generate();
let foxPublic = foxSecret.getPublicKey();
let wolfSecret = AsymmetricSecretKey.generate();
let wolfPublic = wolfSecret.getPublicKey();
let message = "Encrypt me UwU";
let encrypted = Asymmetric.encrypt(message, foxPublic, wolfSecret);
let decrypted = Asymmetric.decrypt(encrypted, foxSecret, wolfPublic);
console.log(decrypted); // "Encrypt me UwU"Anonymous Public-Key Encryption
const {
Asymmetric,
AsymmetricSecretKey
} = require('dhole-crypto');
let foxSecret = AsymmetricSecretKey.generate();
let foxPublic = foxSecret.getPublicKey();
let message = "Encrypt me UwU";
let encrypted = Asymmetric.seal(message, foxPublic);
let decrypted = Asymmetric.unseal(encrypted, foxSecret);
console.log(decrypted); // "Encrypt me UwU"Symmetric Cryptography
Encryption
const {
Symmetric,
SymmetricKey
} = require('dhole-crypto');
let symmetricKey = SymmetricKey.generate();
let message = "Encrypt me UwU";
let encrypted = Symmetric.encrypt(message, symmetricKey);
let decrypted = Symmetric.decrypt(encrypted, symmetricKey);
console.log(decrypted); // "Encrypt me UwU"Encryption with Additional Data
const {
Symmetric,
SymmetricKey
} = require('dhole-crypto');
let symmetricKey = SymmetricKey.generate();
let message = "Encrypt me UwU";
let publicData = "OwO? UwU";
let encrypted = Symmetric.encryptWithAd(message, symmetricKey, publicData);
let decrypted = Symmetric.decryptWithAd(encrypted, symmetricKey, publicData);
console.log(decrypted); // "Encrypt me UwU"Unencrypted Message Authentication
const {
Symmetric,
SymmetricKey
} = require('dhole-crypto');
let symmetricKey = SymmetricKey.generate();
let message = "AWOOOOOOOOOOOO";
let mac = Symmetric.auth(message, symmetricKey);
if (!Symmetric.verify(message, mac, symmetricKey)) {
console.log("Unauthorized Awoo. $350 fine incoming");
}Password Storage
const {
Password,
SymmetricKey
} = require('dhole-crypto');
let symmetricKey = SymmetricKey.generate();
let pwHandler = new Password(symmetricKey);
let password = 'cowwect howse battewy staple UwU';
let pwhash = pwHandler.hash(password);
if (!pwHandler.verify(password, pwhash)) {
console.log("access denied");
}Keyring
You can serialize any key by using the Keyring class.
const {
AsymmetricSecretKey,
Keyring,
SymmetricKey
} = require('dhole-crypto');
let foxSecret = AsymmetricSecretKey.generate();
let foxPublic = foxSecret.getPublicKey();
let symmetric = SymmetricKey.generate();
// Load a serializer
let ring = new Keyring();
// Serialize to string
let sk = ring.save(foxSecret);
let pk = ring.save(foxPublic);
let key = ring.save(symmetric);
// Load from string
let loadSk = ring.load(sk);
let loadPk = ring.load(pk);
let loadSym = ring.load(key);The Keyring class also supports keywrap. Simply pass a separate SymmetricKey
instance to the constructor to get wrapped keys.
const {
AsymmetricSecretKey,
Keyring,
SymmetricKey
} = require('dhole-crypto');
// Keywrap key...
let wrap = SymemtricKey.generate();
let foxSecret = AsymmetricSecretKey.generate();
let foxPublic = foxSecret.getPublicKey();
let symmetric = SymmetricKey.generate();
// Load a serializer
let ring = new Keyring(wrap);
// Serialize to string
let sk = ring.save(foxSecret);
let pk = ring.save(foxPublic);
let key = ring.save(symmetric);
// Load from string
let loadSk = ring.load(sk);
let loadPk = ring.load(pk);
let loadSym = ring.load(key);Support
If you run into any trouble using this library, or something breaks, feel free to file a Github issue.
If you need help with integration, Soatok is available for freelance work.