opusdev/vector-similarity-api
1
1import * as crypto from 'crypto';2 3type AES256Callback = (key: Buffer, iv: Buffer, input: Buffer, output: Buffer) => number | Error;4 5export function makeAES256Hook(6 method: 'createCipheriv' | 'createDecipheriv',7 mode: 'aes-256-cbc' | 'aes-256-ctr'8): AES256Callback {9 return function (key: Buffer, iv: Buffer, input: Buffer, output: Buffer): number | Error {10 let result;11 12 try {13 const cipher = crypto[method](mode, key, iv);14 cipher.setAutoPadding(false);15 result = cipher.update(input);16 const final = cipher.final();17 if (final.length > 0) {18 result = Buffer.concat([result, final]);19 }20 } catch (e) {21 return e;22 }23 24 result.copy(output);25 return result.length;26 };27}28 29export function randomHook(buffer: Buffer, count: number): number | Error {30 try {31 crypto.randomFillSync(buffer, 0, count);32 } catch (e) {33 return e;34 }35 return count;36}37 38export function sha256Hook(input: Buffer, output: Buffer): number | Error {39 let result;40 try {41 result = crypto.createHash('sha256').update(input).digest();42 } catch (e) {43 return e;44 }45 46 result.copy(output);47 return result.length;48}49 50type HMACHook = (key: Buffer, input: Buffer, output: Buffer) => number | Error;51export function makeHmacHook(algorithm: 'sha512' | 'sha256'): HMACHook {52 return (key: Buffer, input: Buffer, output: Buffer): number | Error => {53 let result;54 try {55 result = crypto.createHmac(algorithm, key).update(input).digest();56 } catch (e) {57 return e;58 }59 60 result.copy(output);61 return result.length;62 };63}64 65export function signRsaSha256Hook(key: Buffer, input: Buffer, output: Buffer): number | Error {66 let result;67 try {68 const signer = crypto.createSign('sha256WithRSAEncryption');69 const privateKey = Buffer.from(70 `-----BEGIN PRIVATE KEY-----\n${key.toString('base64')}\n-----END PRIVATE KEY-----\n`71 );72 73 result = signer.update(input).end().sign(privateKey);74 } catch (e) {75 return e;76 }77 78 result.copy(output);79 return result.length;80}81 82export const aes256CbcEncryptHook = makeAES256Hook('createCipheriv', 'aes-256-cbc');83export const aes256CbcDecryptHook = makeAES256Hook('createDecipheriv', 'aes-256-cbc');84export const aes256CtrEncryptHook = makeAES256Hook('createCipheriv', 'aes-256-ctr');85export const aes256CtrDecryptHook = makeAES256Hook('createDecipheriv', 'aes-256-ctr');86export const hmacSha512Hook = makeHmacHook('sha512');87export const hmacSha256Hook = makeHmacHook('sha256');88 