hsencrypt

Encrypt and decrypt strings using handshake names and their associated keys.

Usage no npm install needed!

<script type="module">
  import hsencrypt from 'https://cdn.skypack.dev/hsencrypt';
</script>

README

hsencrypt

nodejs library to encrypt or decrypt messages using handshake names

hsencrypt uses handshake names, a handshake node, and a handshake wallet to encrypt and decrypt names.

How to use

npm install hsencrypt
encrypt(wallet, node, passphrase, name, target, message) 
decrypt(wallet, node, passphrase, name, sender, ciphertext)
** encrypt()
**   wallet     - Wallet from hsd
**   node       - Node from hsd
**   passphrase - passphrase for wallet
**   name       - my name
**   target     - recipient's name
**   message    - the message to encrypt
**
**   returns pubKey+ciphertext
**     pubKey     - an ephemeral public key
**     ciphertext - an AEAD encrypted message (chacha20 x poly1305)
**     or null
** decrypt()
**   wallet          - Wallet from hsd
**   node            - Node from hsd
**   passphrase      - passphrase for wallet
**   name            - my name
**   sender          - sender's name
**   ciphertext      - ephemeralPubKey + the ciphertext
**
**   returns
**     string containing the decrypted message
**     or null

Example

You can see it in action in zmsg.

Also, feel free to try the following example which assumes a folder keys includes files node and wallet with the associated api keys inside them. It also, of course, requires hsd, hs-client and consoleinout npms.

#!/usr/bin/env node
const {encrypt, decrypt} = require("hsencrypt");
const {WalletClient, NodeClient} = require('hs-client');
const {Network} = require('hsd');
const fs = require('fs');
const network = Network.get('main');
const ConsoleIO = new (require("consoleinout"))(console);

const nodeOptions = {
  network: network.type,
  port: network.rpcPort,
  apiKey: fs.readFileSync("keys/node").toString().trim()
}
const walletOptions = {
  port: network.walletPort,
  apiKey: fs.readFileSync("keys/wallet").toString().trim()
}
const nodeClient = new NodeClient(nodeOptions);
const _walletClient = new WalletClient(walletOptions);
let walletClient;

(async function() {
  const argv=process.argv;
  const argc=argv.length;

  if(argc!=6 && argc!=7) {
    console.log("Encrypt Usage: ",argv[1],"<wallet>","<from>","<to>","\"<msg>\"");
    console.log("");
    console.log("Decrypt Usage: ",argv[1],"<wallet>","<from>","<to>","\"<encrypted-msg>\"", "\"d\"");
    process.exit();
  }
  walletClient = _walletClient.wallet(argv[2]);
  if(!walletClient) {
    console.log("Wallet ",argv[2],"not found");
    process.exit(0);
  }

  console.output("Enter Password: ");
  const password = await console.input(true);

  if(argc==7) {
    let decrypted=await decrypt(walletClient, nodeClient, password, argv[4], argv[3], argv[5]);
    console.log("Decrypted: ",decrypted);
    process.exit(0);
  }
  else if(argc==6) {
    let encrypted=await encrypt(walletClient, nodeClient, password, argv[3], argv[4], argv[5]);
    console.log(encrypted);
    process.exit(0);
  }
})()

Learn More

Discord

Github

License

Copyright (c) 2022 Publius Federalist All Rights Reserved

MIT Licensed