https://github.com/paragonie/xchacha20-js
JavaScript implementation of ChaCha20, HChaCha20, and XChaCha20
https://github.com/paragonie/xchacha20-js
Last synced: about 1 year ago
JSON representation
JavaScript implementation of ChaCha20, HChaCha20, and XChaCha20
- Host: GitHub
- URL: https://github.com/paragonie/xchacha20-js
- Owner: paragonie
- Created: 2019-04-25T20:14:10.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2022-02-15T21:49:17.000Z (over 4 years ago)
- Last Synced: 2024-11-08T12:51:03.597Z (over 1 year ago)
- Language: JavaScript
- Size: 14.6 KB
- Stars: 12
- Watchers: 5
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# XChaCha20 (JavaScript)
[](https://travis-ci.org/paragonie/xchacha20-js)
[](https://npm.im/xchacha20-js)
This is a pure JavaScript implementation of XChaCha20 (and therefore ChaCha20
and HChaCha20), for use in polyfill libraries.
# Important Security Warning
This library provides [unauthenticated encryption](https://tonyarcieri.com/all-the-crypto-code-youve-ever-written-is-probably-broken).
**You shouldn't use it directly.** It's meant to be a building block for other,
high-level protocols.
**Use [sodium-native](https://github.com/mafintosh/sodium-native) instead!**
## Installing this Library
```
npm install xchacha20-js
```
## Using this Library
Usage is straightforward.
```javascript
const XChaCha20 = require('xchacha20-js');
let xcha20 = new XChaCha20;
let message = "test message";
let key = Buffer.from('808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f', 'hex');
let nonce = Buffer.from('404142434445464748494a4b4c4d4e4f5051525354555658', 'hex');
let blockCounter = 1; // Optional, defaults to 1 per the RFC
xcha20.encrypt(message, nonce, key, blockCounter).then(
function (ciphertext) {
xcha20.decrypt(ciphertext, nonce, key, blockCounter).then(
function (plaintext) {
console.log(plaintext.toString() === message); // true
}
)
}
);
```
Alternatively. using `async` / `await`...
```javascript
const XChaCha20 = require('xchacha20-js');
let xcha20 = new XChaCha20;
let message = "test message";
let key = Buffer.from('808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f', 'hex');
let nonce = Buffer.from('404142434445464748494a4b4c4d4e4f5051525354555658', 'hex');
(async function(){
let blockCounter = 1; // Optional, defaults to 1 per the RFC
let ciphertext = await xcha20.encrypt(message, nonce, key, blockCounter);
let plaintext = await xcha20.decrypt(ciphertext, nonce, key, blockCounter);
console.log(plaintext.toString() === message); // true
})();
```