2020-04-12 19:30:08 +02:00
fast-srp-hap
2020-04-12 16:38:19 +02:00
===
2015-09-07 16:16:48 +02:00
2020-04-12 19:34:36 +02:00
![NPM-Version ](https://badgen.net/npm/v/fast-srp-hap )
![NPM-Downloads ](https://badgen.net/npm/dt/fast-srp-hap )
![Node-CI ](https://github.com/homebridge/fast-srp/workflows/Node-CI/badge.svg )
2020-04-26 18:26:56 +02:00
[![Coverage Status ](https://coveralls.io/repos/github/homebridge/fast-srp/badge.svg?branch=master )](https://coveralls.io/github/homebridge/fast-srp?branch=master)
2020-04-12 19:34:36 +02:00
2015-09-07 16:16:48 +02:00
Is a pure [NodeJS ](https://nodejs.org/ ) implementation of the [SRP6a protocol ](http://srp.stanford.edu/ ).
It's a derived work of [Jed Parson ](http://jedparsons.com/ )'s [node-srp ](https://github.com/jedp/node-srp ) and [Tom Wu ](http://www-cs-students.stanford.edu/~tjw/ )'s [jsbn ](http://www-cs-students.stanford.edu/~tjw/jsbn/ ).
2020-05-04 15:20:55 +02:00
Full documentation can be found [here ](https://developers.homebridge.io/fast-srp/globals.html ).
2020-04-12 21:02:16 +02:00
2020-04-12 16:38:19 +02:00
Creating the Verifier
---
2015-09-10 10:59:14 +02:00
2020-04-12 16:38:19 +02:00
```ts
2020-04-12 19:01:18 +02:00
import { SRP } from 'fast-srp-hap';
2015-09-07 16:26:55 +02:00
2015-09-07 16:33:11 +02:00
/**
* Computes the verifier of a user. Only needed to add the user to the auth system.
*
2020-04-12 16:38:19 +02:00
* @param {string} I Username to compute verifier
* @param {string} P Password
* @return {Promise< {salt: Buffer, verifier: Buffer}>}
2015-09-07 16:33:11 +02:00
*/
2020-04-12 16:38:19 +02:00
async function srp6a_create_user(I: string, P: string) {
2020-04-12 19:01:18 +02:00
const salt = await SRP.genKey(32);
2020-04-12 16:38:19 +02:00
return {
// The salt is required for authenticating the user later
salt,
2020-04-12 19:01:18 +02:00
verifier: SRP.computeVerifier(SRP.params[4096], salt, Buffer.from(I), Buffer.from(P)),
2020-04-12 16:38:19 +02:00
};
2015-09-07 16:26:55 +02:00
}
2020-04-12 16:38:19 +02:00
await srp6a_create_user('Zarmack Tanen', '*****').then(({salt, verifier}) => {
console.log('SRP6a verifier and salt of Zarmack Tanen user is %s and %s',
verifier.toString('hex'), salt.toString('hex'));
2015-09-07 16:26:55 +02:00
});
```
2020-04-12 16:38:19 +02:00
Server
---
```ts
2020-04-12 19:01:18 +02:00
import {SRP, SrpServer} from 'fast-srp-hap';
2020-04-12 16:38:19 +02:00
(async () => {
// Get the user details from somewhere
const user = {
username: 'username', // Or a Buffer
// If we have the plaintext password
2020-04-12 19:01:18 +02:00
salt: await SRP.genKey(32),
2020-04-12 16:38:19 +02:00
password: 'password', // Or a Buffer
// If we have a saved verifier
salt: Buffer.from('...'),
verifier: Buffer.from('...'),
};
// Generate a secret key
2020-04-12 19:01:18 +02:00
const secret = await SRP.genKey(32);
2020-04-12 16:38:19 +02:00
2020-04-12 19:01:18 +02:00
const server = new SrpServer(SRP.params[3076], user, secret); // For Apple SRP use params.hap
2020-04-12 16:38:19 +02:00
// ...
})();
```