siphash24-stream
Version:
siphash24 mac signing and verification as streams
95 lines (60 loc) • 3.2 kB
Markdown
[](http://travis-ci.org/chiefbiiko/siphash24-stream) [](https://ci.appveyor.com/project/chiefbiiko/siphash24-stream) [](./security.md)
**SipHash24** *sign* and *verify* streams powered by [a seedable keystream](https://github.com/chiefbiiko/seed-bytes).
***
```
npm install --save siphash24-stream
```
***
Create both *signing* and *verifying* streams by supplying a variable-length symmetric key that is used for seeding an internal keystream.
Run `node ./usage.js`:
``` js
var crypto = require('crypto')
var stream = require('stream')
var sip = require('siphash24-stream')
var DELIMITER = Buffer.from([ 0, 4, 1, 9, 4, 1, 9, 0 ])
var NSA = Buffer.concat([ // pac
crypto.randomBytes(8), // bad mac
Buffer.from('nsa pac'), // msg
DELIMITER
])
var shared = '419' // shared secret, symmetric key
var opts = { algo: 'alea', delimiter: DELIMITER } // default options
var alice = sip.createSigningStream(shared, opts) // alice signs
var bob = sip.createVerifyingStream(shared, opts) // bob verifies
var thru = new stream.PassThrough() // some sort of socket
function onpac (info, chunk) {
console.log(info, chunk.toString())
}
alice.pipe(thru).pipe(bob) // alice writes, bob reads
thru.on('data', onpac.bind(null, 'bob input:'))
bob.on('data', onpac.bind(null, 'bob ok:'))
bob.on('dropping', onpac.bind(null, 'bob dropping:'))
alice.write('push all dirty money overseas')
thru.write(NSA) // being intercepted
alice.end('and buy uzis')
```
Note that only legit msg packs pass thru the verifying end, in this case `bob`.
***
Create a transform stream that signs all its throughput with a SipHash24 mac. `init` is the seed for a random byte generator used as key stream.
Options default to:
``` js
{
algo: 'alea',
delimiter: Buffer.from([ 0, 4, 1, 9, 4, 1, 9, 0 ])
}
```
`opts.algo` indicates the algorithm to use for the internal random number generator. Check out [`seedrandom`](https://github.com/davidbau/seedrandom#other-fast-prng-algorithms) for a list of supported algorithms. `opts.delimiter` is the message delimiter, must be a buffer.
Create a transform stream that verifies all its throughput against a SipHash24 mac. Bad chunks are rejected and not passed on, not pushed any further, but emitted with the `dropping` event.
Create a SipHash24 *sign* and *verify* stream duplet.
Emitted with every chunk that will not be pushed further. Use this if you wish to check dropouts. Calling back like `ondropping(chunk)`.
***
[](./license.md)