'use strict' const paillier = require('./paillier') const bignum = require('bignum') const { publicKey, privateKey } = paillier.generateRandomKeys(1024) // Change to at least 2048 bits in production state console.log('Modulus n has', publicKey.bitLength, 'bits') console.log('\n\nTesting additive homomorphism\n') const num1 = 5 const num2 = 2 const num3 = 13 let bn1 = bignum(num1).mod(publicKey.n) while (bn1.lt(0)) bn1 = bn1.add(publicKey.n) // bug in bignum? mod(n) of negative number returns .abs().mod(n). This should fix it let bn2 = bignum(num2).mod(publicKey.n) while (bn2.lt(0)) bn2 = bn2.add(publicKey.n) // bug in bignum? mod(n) of negative number returns .abs().mod(n). This should fix it let bn3 = bignum(num3).mod(publicKey.n) while (bn3.lt(0)) bn3 = bn3.add(publicKey.n) // bug in bignum? mod(n) of negative number returns .abs().mod(n). This should fix it const c1 = publicKey.encrypt(bn1) const c2 = publicKey.encrypt(bn2) const c3 = publicKey.encrypt(bn3) console.log('num1:', num1.toString()) console.log('c1:', c1.toString(16), '\n') console.log('num2:', num2.toString()) console.log('c2:', c2.toString(16), '\n') console.log('num3:', num3.toString()) console.log('c3:', c3.toString(16), '\n') const encryptedSum = publicKey.addition(c1, c2, c3) console.log('E(num1 + num2 + num3):', encryptedSum.toString(16), '\n') const sum = bn1.add(bn2).add(bn3).mod(publicKey.n) const decryptedSum = privateKey.decrypt(encryptedSum) console.log('Decrypted addition:', decryptedSum.toString()) console.log(`Expecting ${num1} + ${num2} + ${num3} mod n :`, sum.toString()) console.assert(sum.cmp(decryptedSum) === 0, 'Something went wrong!') console.log('\n\nTesting multiplication\n') const encryptedMul = publicKey.multiply(c1, bn2) console.log(`E(${num1})^${num2} mod n^2 = E(${num2}·${num1} mod n) = ` + encryptedMul.toString(16), '\n') const mul = privateKey.decrypt(encryptedMul) console.log('Decryption:', mul.toString()) console.log(`Expecting ${num2}·${num1} mod n :`, bn2.mul(bn1).mod(publicKey.n).toString())