@hellocoop/helper-server
Version:
Hellō helper functions for server
117 lines (112 loc) • 4.6 kB
JavaScript
;
// Chat-GPT generated code -- tested with its test suite
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkSecret = void 0;
exports.encryptObj = encryptObj;
exports.decryptObj = decryptObj;
const crypto = __importStar(require("crypto"));
// Function to convert a Uint8Array to a URL-safe base64 string
function uint8ArrayToUrlSafeBase64(uint8Array) {
const base64String = Buffer.from(uint8Array).toString('base64');
return base64String.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
}
// Function to convert a URL-safe base64 string to a Uint8Array
function urlSafeBase64ToUint8Array(base64String) {
const base64 = base64String.replace(/-/g, '+').replace(/_/g, '/');
const padding = '='.repeat((4 - (base64.length % 4)) % 4);
const binaryString = Buffer.from(base64 + padding, 'base64').toString('binary');
const uint8Array = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
uint8Array[i] = binaryString.charCodeAt(i);
}
return uint8Array;
}
// Function to encrypt a JavaScript object and return a URL-safe base64 string
async function encryptObj(obj, secret) {
const textEncoder = new TextEncoder();
const encodedData = textEncoder.encode(JSON.stringify(obj));
const iv = crypto.randomBytes(12);
const key = Buffer.from(secret, 'hex');
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
const ciphertext = Buffer.concat([iv, cipher.update(encodedData), cipher.final()]);
const tag = cipher.getAuthTag();
const encryptedData = Buffer.concat([ciphertext, tag]);
return uint8ArrayToUrlSafeBase64(new Uint8Array(encryptedData));
}
// Function to decrypt an encrypted string and return the JavaScript object
async function decryptObj(encryptedStr, secret) {
try {
const encryptedData = urlSafeBase64ToUint8Array(encryptedStr);
const iv = encryptedData.slice(0, 12);
const tag = encryptedData.slice(-16);
const ciphertext = encryptedData.slice(12, -16);
const key = Buffer.from(secret, 'hex');
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
decipher.setAuthTag(tag);
const decryptedData = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
const decryptedText = new TextDecoder().decode(decryptedData);
return JSON.parse(decryptedText);
}
catch (error) {
console.error('decryption error - old cookie?');
// console.error('Decryption error:', error);
return null;
}
}
const checkSecret = (secret) => {
const key = Buffer.from(secret, 'hex');
return (Buffer.byteLength(key) == 32);
};
exports.checkSecret = checkSecret;
/***** test code
// Example usage:
const secretKey = 'YourSecretKey';
const originalObj = {
username: 'JohnDoe',
email: 'johndoe@example.com',
};
encryptObj(originalObj, secretKey)
.then((encryptedString) => {
console.log('Encrypted String:', encryptedString);
return decryptObj(encryptedString, secretKey);
})
.then((decryptedObj) => {
console.log('Decrypted Object:', decryptedObj);
})
.catch((error) => {
console.error('Error:', error);
});
****/