X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fhelpers%2Fpeertube-crypto.ts;h=95e78a9048ec34a0f31d6cb86ea0be579417f635;hb=d3fcf1c57ab898e18654910e880875a911fbd128;hp=1d9cab2ce282e86b5f7095098524e608fc0a5eb8;hpb=5d7cb63ede7c4bba93954c0586f589ad9748d5ea;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/peertube-crypto.ts b/server/helpers/peertube-crypto.ts index 1d9cab2ce..95e78a904 100644 --- a/server/helpers/peertube-crypto.ts +++ b/server/helpers/peertube-crypto.ts @@ -1,11 +1,12 @@ import { compare, genSalt, hash } from 'bcrypt' -import { createSign, createVerify } from 'crypto' +import { createCipheriv, createDecipheriv, createSign, createVerify } from 'crypto' import { Request } from 'express' import { cloneDeep } from 'lodash' +import { promisify1, promisify2 } from '@shared/core-utils' import { sha256 } from '@shared/extra-utils' -import { BCRYPT_SALT_SIZE, HTTP_SIGNATURE, PRIVATE_RSA_KEY_SIZE } from '../initializers/constants' +import { BCRYPT_SALT_SIZE, ENCRYPTION, HTTP_SIGNATURE, PRIVATE_RSA_KEY_SIZE } from '../initializers/constants' import { MActor } from '../types/models' -import { generateRSAKeyPairPromise, promisify1, promisify2 } from './core-utils' +import { generateRSAKeyPairPromise, randomBytesPromise, scryptPromise } from './core-utils' import { jsonld } from './custom-jsonld-signature' import { logger } from './logger' @@ -21,9 +22,13 @@ function createPrivateAndPublicKeys () { return generateRSAKeyPairPromise(PRIVATE_RSA_KEY_SIZE) } +// --------------------------------------------------------------------------- // User password checks +// --------------------------------------------------------------------------- function comparePassword (plainPassword: string, hashPassword: string) { + if (!plainPassword) return Promise.resolve(false) + return bcryptComparePromise(plainPassword, hashPassword) } @@ -33,7 +38,9 @@ async function cryptPassword (password: string) { return bcryptHashPromise(password, salt) } +// --------------------------------------------------------------------------- // HTTP Signature +// --------------------------------------------------------------------------- function isHTTPSignatureDigestValid (rawBody: Buffer, req: Request): boolean { if (req.headers[HTTP_SIGNATURE.HEADER_NAME] && req.headers['digest']) { @@ -62,7 +69,9 @@ function parseHTTPSignature (req: Request, clockSkew?: number) { return parsed } +// --------------------------------------------------------------------------- // JSONLD +// --------------------------------------------------------------------------- function isJsonLDSignatureVerified (fromActor: MActor, signedDocument: any): Promise { if (signedDocument.signature.type === 'RsaSignature2017') { @@ -112,12 +121,42 @@ async function signJsonLDObject (byActor: MActor, data: T) { return Object.assign(data, { signature }) } +// --------------------------------------------------------------------------- + function buildDigest (body: any) { const rawBody = typeof body === 'string' ? body : JSON.stringify(body) return 'SHA-256=' + sha256(rawBody, 'base64') } +// --------------------------------------------------------------------------- +// Encryption +// --------------------------------------------------------------------------- + +async function encrypt (str: string, secret: string) { + const iv = await randomBytesPromise(ENCRYPTION.IV) + + const key = await scryptPromise(secret, ENCRYPTION.SALT, 32) + const cipher = createCipheriv(ENCRYPTION.ALGORITHM, key, iv) + + let encrypted = iv.toString(ENCRYPTION.ENCODING) + ':' + encrypted += cipher.update(str, 'utf8', ENCRYPTION.ENCODING) + encrypted += cipher.final(ENCRYPTION.ENCODING) + + return encrypted +} + +async function decrypt (encryptedArg: string, secret: string) { + const [ ivStr, encryptedStr ] = encryptedArg.split(':') + + const iv = Buffer.from(ivStr, 'hex') + const key = await scryptPromise(secret, ENCRYPTION.SALT, 32) + + const decipher = createDecipheriv(ENCRYPTION.ALGORITHM, key, iv) + + return decipher.update(encryptedStr, ENCRYPTION.ENCODING, 'utf8') + decipher.final('utf8') +} + // --------------------------------------------------------------------------- export { @@ -129,18 +168,20 @@ export { comparePassword, createPrivateAndPublicKeys, cryptPassword, - signJsonLDObject + signJsonLDObject, + + encrypt, + decrypt } // --------------------------------------------------------------------------- function hashObject (obj: any): Promise { - return jsonld.promises - .normalize(obj, { - algorithm: 'URDNA2015', - format: 'application/n-quads' - }) - .then(res => sha256(res)) + return jsonld.promises.normalize(obj, { + safe: false, + algorithm: 'URDNA2015', + format: 'application/n-quads' + }).then(res => sha256(res)) } function createSignatureHash (signature: any) {