JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 5
  • Score
    100M100P100Q31016F
  • License ISC

JavaScript port of soatok/dhole-cryptography from PHP

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

Support on Patreon Travis CI npm version

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.0 is released, please don't deploy this library in any production systems. I'll tag v1.0.0 when I'm confident in the correctness and security of the implementation.

Installation

npm install dhole-crypto

Usage

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.