dashmachine-crypto v1.0.0
Dashmachine crypto utility library
Cryptographic helper functions for use in Dash Platform Web Dapp Sample Messaging.
Note: this is an experimental library to support the web dapp sample investigation of Dash Platform usage - not for production use.
Breaking Changes From v1.0.0 DashJS is required as an external dependency in both browser and node.js versions
Prerequisites
To utilise the encryption & decryption by username The library requires DashJS as an external dependency, so this must be referenced BEFORE the Dashmachine Crypto library. In Node.js:
const Dash = require('dash');
const DashmachineCrypto = require('dashmachine-crypto');In the browser:
<script src="https://unpkg.com/dash"></script>
<script src="dashmachine-crypto-lib.js" type="text/javascript"></script>Please see the examples below for sample usage
Browser usage
Include the dashmachine-crypto-lib.js script file available from the releases page.
Nodejs usage
npm i dashmachine-cryptoDocumentation
Table of Contents
DashmachineCrypto
DashmachineCrypto performs ECIES encryption & decryption and Double SHA256 Hashing. Note the class contains only static methods so you do not have to call the contructor, i.e. use DashmachineCrypto.encrypt, not new DashmachineCrypto()
Examples
<!-- Usage in HTML file -->
<script src="https://unpkg.com/dash"></script>
<script src="dashmachine-crypto-lib.js" type="text/javascript"></script>
<script>
const vendorPrivateKey = '40148175614f062fb0b4e5c519be7b6f57b872ebb55ea719376322fd12547bff'
const message = 'hello';
const userPublicKey = 'A7GGInyvn7ExXkSVg+OFhbhVjEMhIFv0oyeJl03gFDRo'
const userPrivateKey = '219c8a8f9376750cee9f06e0409718f2a1b88df4acc61bf9ed9cf252c8602768'
const vendorPublicKey = 'A0/qSE6tis4l6BtQlTXB2PHW+WV+Iy0rpF5hAvX8hDRz'
console.log(`Encrypting message "${message}"...`);
const encrypted = DashmachineCrypto.encrypt(vendorPrivateKey, message, userPublicKey);
console.dir(encrypted.data);
console.log(`Decrypting result message "${message}"...`);
const decrypted = DashmachineCrypto.decrypt(userPrivateKey, encrypted.data, vendorPublicKey);
console.dir(decrypted);
console.log(`Hashing message "${message}"...`);
const digest = DashmachineCrypto.hash(message);
console.dir(digest.data);
console.log(`Verifying hash...`);
const verifies = DashmachineCrypto.verify(message, digest.data);
console.dir(verifies.success)
const entropy = DashmachineCrypto.generateEntropy();
console.log(`entropy: ${entropy}`);
const senderName = 'alice';
const senderMnemonic = 'uniform analyst paper father soldier toe lesson fetch exhaust jazz swim response';
const recipientName = 'bob';
const recipientMnemonic = 'liar fee island situate deal exotic flat direct save bag fiscal news';
const userMessage = `Hello ${recipientName}!`;
const dpnsContractId = '295xRRRMGYyAruG39XdAibaU9jMAzxhknkkAxFE7uVkW'
async function testUsernameEncryption() {
try {
console.log(`send message \"${userMessage}\" to user: ${recipientName}`)
const encrypted = await DashmachineCrypto.encryptForUsername(userMessage, senderName, recipientName, senderMnemonic, dpnsContractId);
console.log('encrypted:', encrypted.data);
const decrypted = await DashmachineCrypto.decryptForUsername(encrypted.data, recipientName, senderName, recipientMnemonic, dpnsContractId)
console.log('decrypted:', decrypted.data);
}
catch (e) {
console.log('error :', e);
}
}
(async () => { await testUsernameEncryption() })()
</script>//use in nodejs
const Dash = require('dash');
const DashmachineCrypto = require("dashmachine-crypto")
const vendorPrivateKey = '40148175614f062fb0b4e5c519be7b6f57b872ebb55ea719376322fd12547bff'
const message = 'hello';
const userPublicKey = 'A7GGInyvn7ExXkSVg+OFhbhVjEMhIFv0oyeJl03gFDRo'
const userPrivateKey = '219c8a8f9376750cee9f06e0409718f2a1b88df4acc61bf9ed9cf252c8602768'
const vendorPublicKey = 'A0/qSE6tis4l6BtQlTXB2PHW+WV+Iy0rpF5hAvX8hDRz'
console.log(`Encrypting message "${message}"...`);
const encrypted = DashmachineCrypto.encrypt(vendorPrivateKey, message, userPublicKey);
console.dir(encrypted.data);
console.log(`Decrypting result message "${message}"...`);
const decrypted = DashmachineCrypto.decrypt(userPrivateKey, encrypted.data, vendorPublicKey);
console.dir(decrypted);
console.log('decrypted', decrypted.data);
const entropy = DashmachineCrypto.generateEntropy();
console.log(`entropy: ${entropy}`);
const senderName = 'alice';
const senderMnemonic = 'uniform analyst paper father soldier toe lesson fetch exhaust jazz swim response';
const recipientName = 'bob';
const recipientMnemonic = 'liar fee island situate deal exotic flat direct save bag fiscal news';
const userMessage = `Hello ${recipientName}!`;
const dpnsContractId = '295xRRRMGYyAruG39XdAibaU9jMAzxhknkkAxFE7uVkW'
async function testUsernameEncryption() {
try {
console.log(`send message \"${userMessage}\" to user: ${recipientName}`)
const encrypted = await DashmachineCrypto.encryptForUsername(userMessage, senderName, recipientName, senderMnemonic, dpnsContractId);
console.log('encrypted:', encrypted.data);
const decrypted = await DashmachineCrypto.decryptForUsername(encrypted.data, recipientName, senderName, recipientMnemonic, dpnsContractId)
console.log('decrypted:', decrypted.data);
}
catch (e) {
console.log('error :', e);
}
}
(async () => { await testUsernameEncryption() })()encrypt
Parameters
senderPrivateKeystring The base64 repesentation of the HD private key of the Dash User sending the message, the result of calling client.account.getIdentityHDKey(0, 'user').privateKey where client is an instance of Dash.Clientmessagestring message to encryptrecipientPublicKeyobject The base64 repesentation of the public key for the Identity of the Dash User receiveing the message
Returns Object Either {success: true, data: encrypted message} or {error: true, message: error message}
decrypt
Parameters
recipientPrivateKeystring The base64 repesentation of the HD private key of the Dash User receiving the message, the result of calling client.account.getIdentityHDKey(0, 'user').privateKey where client is an instance of Dash.ClientencryptedMessagestring message to decrypt as a hex representation of the stringified JSON of the encryption result buffersenderPublicKeyobject The base64 repesentation of the public key for the Identity of the Dash User sending the message
Returns Object Either {success: true, data: decrypted message} or {error: true, message: error message}
hash
Parameters
messagestring full message to be hashed
Returns Object Either {success: true, data: digest} or {error: true, message: error message}
verify
Parameters
generateEntropy
Returns Object Either {success: true, data: generated entropy} or {error: true, message: error message}
encryptForUsername
Parameters
messagestring The message to encryptsenderNamestring DPNS username of senderrecipientNamestring DPNS username of recipientsenderMnemonicstring Account mnemonic of senderdpnsContractIdstring contractId for DPNS contract
Returns Object {success: true, data: encryptedMessage} | {Error}
decryptForUsername
Parameters
messagestring The message to decryptrecipientNamestring DPNS username of recipientsenderNamestring DPNS username of senderrecipientMnemonicstring Account mnemonic of recipientdpnsContractIdstring contractId for DPNS contract
Returns Object {success: true, data: encryptedMessage} or {Error}
License
Development
To develop this library:
- clone the repository and change to project directory
git clone https://github.com/dashmachine/dashmachine-crypto.git && cd dashmachine-cryptoThe source file is src/crypto.service.js
- build output
npm run build- test with webpack dev server
npm start- update documentation (requires npm documentation package installed globally:
npm i -g documentation)
Update the Documentation section of the README.md file
npm run docs:readme