]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/peertube-crypto.js
Server: remove encryption when seending requests to other pods
[github/Chocobozzz/PeerTube.git] / server / helpers / peertube-crypto.js
1 'use strict'
2
3 const bcrypt = require('bcrypt')
4 const crypto = require('crypto')
5 const fs = require('fs')
6 const openssl = require('openssl-wrapper')
7 const ursa = require('ursa')
8
9 const constants = require('../initializers/constants')
10 const logger = require('./logger')
11
12 const algorithm = 'aes-256-ctr'
13
14 const peertubeCrypto = {
15 checkSignature,
16 comparePassword,
17 createCertsIfNotExist,
18 cryptPassword,
19 sign
20 }
21
22 function checkSignature (publicKey, rawData, hexSignature) {
23 const crt = ursa.createPublicKey(publicKey)
24 const isValid = crt.hashAndVerify('sha256', new Buffer(rawData).toString('hex'), hexSignature, 'hex')
25 return isValid
26 }
27
28 function comparePassword (plainPassword, hashPassword, callback) {
29 bcrypt.compare(plainPassword, hashPassword, function (err, isPasswordMatch) {
30 if (err) return callback(err)
31
32 return callback(null, isPasswordMatch)
33 })
34 }
35
36 function createCertsIfNotExist (callback) {
37 certsExist(function (exist) {
38 if (exist === true) {
39 return callback(null)
40 }
41
42 createCerts(function (err) {
43 return callback(err)
44 })
45 })
46 }
47
48 function cryptPassword (password, callback) {
49 bcrypt.genSalt(constants.BCRYPT_SALT_SIZE, function (err, salt) {
50 if (err) return callback(err)
51
52 bcrypt.hash(password, salt, function (err, hash) {
53 return callback(err, hash)
54 })
55 })
56 }
57
58 function sign (data) {
59 const myKey = ursa.createPrivateKey(fs.readFileSync(constants.CONFIG.STORAGE.CERT_DIR + 'peertube.key.pem'))
60 const signature = myKey.hashAndSign('sha256', data, 'utf8', 'hex')
61
62 return signature
63 }
64
65 // ---------------------------------------------------------------------------
66
67 module.exports = peertubeCrypto
68
69 // ---------------------------------------------------------------------------
70
71 function certsExist (callback) {
72 fs.exists(constants.CONFIG.STORAGE.CERT_DIR + 'peertube.key.pem', function (exists) {
73 return callback(exists)
74 })
75 }
76
77 function createCerts (callback) {
78 certsExist(function (exist) {
79 if (exist === true) {
80 const string = 'Certs already exist.'
81 logger.warning(string)
82 return callback(new Error(string))
83 }
84
85 logger.info('Generating a RSA key...')
86
87 let options = {
88 'out': constants.CONFIG.STORAGE.CERT_DIR + 'peertube.key.pem',
89 '2048': false
90 }
91 openssl.exec('genrsa', options, function (err) {
92 if (err) {
93 logger.error('Cannot create private key on this pod.')
94 return callback(err)
95 }
96 logger.info('RSA key generated.')
97
98 options = {
99 'in': constants.CONFIG.STORAGE.CERT_DIR + 'peertube.key.pem',
100 'pubout': true,
101 'out': constants.CONFIG.STORAGE.CERT_DIR + 'peertube.pub'
102 }
103 logger.info('Manage public key...')
104 openssl.exec('rsa', options, function (err) {
105 if (err) {
106 logger.error('Cannot create public key on this pod.')
107 return callback(err)
108 }
109
110 logger.info('Public key managed.')
111 return callback(null)
112 })
113 })
114 })
115 }
116
117 function generatePassword (callback) {
118 crypto.randomBytes(32, function (err, buf) {
119 if (err) return callback(err)
120
121 callback(null, buf.toString('utf8'))
122 })
123 }