const persistence = require("../persistence/persistence"); const cryptoUtil = require("../cryptoUtil"); module.exports.registration = function(challenge, registerationRequest) { persistence().LoadDB() .then(db => { // TODO validate lock definition has all the parameters we need // TODO: validate serviceExtendedPublicKey const verification = cryptoUtil.verifyChallenge( registerationRequest.serviceExtendedPublicKey, challenge ); if(verification) { return db.ExtendedPublicKey.findOne({ where: { xpub: challenge.xpub }, include: [ { association: db.ExtendedPublicKey.Key // TODO: update this to wallet } ] }).then(extendedPublicKey => { if (extendedPublicKey) { const encryptedKey = extendedPublicKey.key.encryptedPrivateKey; const iv = extendedPublicKey.key.iv; const password = "vanished"; const walletXpriv = cryptoUtil.decrypt(encryptedKey, password, iv); var challengeDerivationPath = `${extendedPublicKey.derivationPath}/${challenge.derivationPath.split("c/")[1]}`; const signature = cryptoUtil.signMessage(walletXpriv, challengeDerivationPath, challenge.message) // TODO: save lock return db.Lock.create({ userIdentifier: registerationRequest.userIdentifier, url: registerationRequest.url, serviceExtendedPublicKey: registerationRequest.serviceExtendedPublicKey, signature: signature.toString('hex'), message: challenge.message, extendedPublicKeyId: extendedPublicKey.id }) } else { console.error("Sorry we can't create a lock with xpub: ", challenge.xpub); return null; } }).then(lock => { if(lock) { console.log("Lock: ", lock.id); console.log("Signature: ", lock.signature); } else { console.error("Failed to create the lock."); } }) } else { console.error("Challenge not signed by service"); } }) }