1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 'use strict';
- const crypto = require('crypto');
- const ece = require('http_ece');
- const encrypt = function(userPublicKey, userAuth, payload, contentEncoding) {
- if (!userPublicKey) {
- throw new Error('No user public key provided for encryption.');
- }
- if (typeof userPublicKey !== 'string') {
- throw new Error('The subscription p256dh value must be a string.');
- }
- if (Buffer.from(userPublicKey, 'base64url').length !== 65) {
- throw new Error('The subscription p256dh value should be 65 bytes long.');
- }
- if (!userAuth) {
- throw new Error('No user auth provided for encryption.');
- }
- if (typeof userAuth !== 'string') {
- throw new Error('The subscription auth key must be a string.');
- }
- if (Buffer.from(userAuth, 'base64url').length < 16) {
- throw new Error('The subscription auth key should be at least 16 '
- + 'bytes long');
- }
- if (typeof payload !== 'string' && !Buffer.isBuffer(payload)) {
- throw new Error('Payload must be either a string or a Node Buffer.');
- }
- if (typeof payload === 'string' || payload instanceof String) {
- payload = Buffer.from(payload);
- }
- const localCurve = crypto.createECDH('prime256v1');
- const localPublicKey = localCurve.generateKeys();
- const salt = crypto.randomBytes(16).toString('base64url');
- const cipherText = ece.encrypt(payload, {
- version: contentEncoding,
- dh: userPublicKey,
- privateKey: localCurve,
- salt: salt,
- authSecret: userAuth
- });
- return {
- localPublicKey: localPublicKey,
- salt: salt,
- cipherText: cipherText
- };
- };
- module.exports = {
- encrypt: encrypt
- };
|