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.
50 lines
2.0 KiB
50 lines
2.0 KiB
// crypto.ts
|
|
// Copyright (C) 2020 Dwayne Harris
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
import { hash, compare } from 'bcryptjs'
|
|
import { randomBytes } from 'crypto'
|
|
import jwt, { SignOptions, VerifyOptions } from 'jsonwebtoken'
|
|
|
|
export const hashPassword = async (password: string) => await hash(password, 8)
|
|
export const comparePassword = async (password: string, hash: string) => await compare(password, hash)
|
|
export const generateString = (length: number) => randomBytes(Math.max(Math.round(length / 2), 5)).toString('hex')
|
|
|
|
export namespace JWT {
|
|
export interface JWTData {
|
|
sub?: string
|
|
exp?: number
|
|
}
|
|
|
|
export function sign(data: JWTData, options: SignOptions = {}): Promise<string> {
|
|
return new Promise<string>((resolve, reject) => {
|
|
jwt.sign(data, process.env.TOKEN_SECRET!, options, (err, token) => {
|
|
if (err) return reject(err)
|
|
resolve(token)
|
|
})
|
|
})
|
|
}
|
|
|
|
export function verify(token: string, options?: VerifyOptions): Promise<JWTData> {
|
|
return new Promise<JWTData>((resolve, reject) => {
|
|
jwt.verify(token, process.env.TOKEN_SECRET!, options, (err, decoded: JWTData | string) => {
|
|
if (err) return reject(err)
|
|
if (typeof decoded === 'string') return reject('Invalid token')
|
|
|
|
resolve(decoded)
|
|
})
|
|
})
|
|
}
|
|
}
|