generated from garrettmills/template-npm-typescript
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.2 KiB
36 lines
1.2 KiB
import {Cryptor} from './Cryptor'
|
|
import {Awaitable, DecodedValue, EncodedValue} from '../types'
|
|
import * as crypto from 'crypto'
|
|
import { Buffer } from 'buffer'
|
|
|
|
/**
|
|
* AES 256 implementation of a Cryptor.
|
|
*/
|
|
export class AES256Cryptor extends Cryptor {
|
|
encode(value: DecodedValue): Awaitable<EncodedValue> {
|
|
const hash = crypto.createHash('sha256')
|
|
hash.update(this.key)
|
|
|
|
const vector = crypto.randomBytes(16)
|
|
const cipher = crypto.createCipheriv('aes-256-ctr', hash.digest(), vector)
|
|
const input = Buffer.from(value)
|
|
const cipherText = cipher.update(input)
|
|
|
|
const encoded = Buffer.concat([vector, cipherText, cipher.final()])
|
|
return encoded.toString('base64')
|
|
}
|
|
|
|
decode(payload: EncodedValue): Awaitable<DecodedValue> {
|
|
const hash = crypto.createHash('sha256')
|
|
hash.update(this.key)
|
|
|
|
const input = Buffer.from(payload, 'base64')
|
|
const vector = input.slice(0, 16)
|
|
const decipher = crypto.createDecipheriv('aes-256-ctr', hash.digest(), vector)
|
|
const cipherText = input.slice(16)
|
|
|
|
const decoded = Buffer.concat([decipher.update(cipherText), decipher.final()])
|
|
return decoded.toString()
|
|
}
|
|
}
|