Fix Javascript shared-secret & proxy forging private key code

This commit is contained in:
catbref 2019-05-21 12:38:54 +01:00
parent 748dddcc32
commit 4279ad0673
4 changed files with 107 additions and 44 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,46 @@
<!doctype html>
<html>
<head>
<script src="Base58.js"></script>
<script src="nacl_factory.js"></script>
<script>
nacl_factory.instantiate(function (nacl) {
var mintingAccountPrk = Base58.decode('A9MNsATgQgruBUjxy2rjWY36Yf19uRioKZbiLFT2P7c6');
var recipientAccountPuk = Base58.decode('2sbcMmVKke5inS4yrbeoG6Cyw2mZCptQNjyWgnY4YHaF');
// var mintingX25519KeyPair = nacl.crypto_box_keypair_from_raw_sk(mintingAccountPrk);
var mintingEd25519KeyPair = nacl.crypto_sign_seed_keypair(mintingAccountPrk);
var mintingX25519KeyPair = nacl.crypto_box_keypair_from_sign_sk(mintingEd25519KeyPair.signSk);
// Expecting: 2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP as we explicitly use Ed25519 ("sign") keypair here
var mintingAccountPuk = mintingEd25519KeyPair.signPk;
console.log("minting public key for confirmation (Ed25519): " + Base58.encode(mintingAccountPuk));
recipientAccountPukX25519 = nacl.crypto_box_pk_from_sign_pk(recipientAccountPuk)
console.log("recipient public key (X25519): " + Base58.encode(recipientAccountPukX25519));
var sharedSecret = nacl.crypto_scalarmult(mintingX25519KeyPair.boxSk, recipientAccountPukX25519);
console.log("shared secret (for debugging): " + Base58.encode(sharedSecret));
// Data to be hashed: shared secret (32 bytes) + minting public key (32 bytes) + recipient public key (32 bytes)
// or, in general terms: shared secret (32 bytes) + public key from private key (32 bytes) + other party's public key (32 bytes)
var proxyHashData = new Uint8Array(sharedSecret.length + mintingAccountPuk.length + recipientAccountPuk.length);
// copy shared secret into array, starting at index 0
proxyHashData.set(sharedSecret);
// copy minting account public key into array, starting at index 32
proxyHashData.set(mintingAccountPuk, sharedSecret.length);
// copy recipient account public key into array, starting at index 64 (32 + 32)
proxyHashData.set(recipientAccountPuk, sharedSecret.length + mintingAccountPuk.length);
// Proxy PRIVATE key is SHA256 of data above
var proxyPrivateKey = nacl.crypto_hash_sha256(proxyHashData)
console.log("proxy private key: " + Base58.encode(proxyPrivateKey));
var proxyKeyPair = nacl.crypto_sign_seed_keypair(proxyPrivateKey);
console.log("proxy public key: " + Base58.encode(proxyKeyPair.signPk));
});
</script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,32 @@
<!doctype html>
<html>
<head>
<script src="Base58.js"></script>
<script src="nacl_factory.js"></script>
<script>
nacl_factory.instantiate(function (nacl) {
var mintingAccountPrk = Base58.decode('A9MNsATgQgruBUjxy2rjWY36Yf19uRioKZbiLFT2P7c6');
var recipientAccountPuk = Base58.decode('C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry');
var mintingEd25519KeyPair = nacl.crypto_sign_seed_keypair(mintingAccountPrk);
var mintingX25519KeyPair = nacl.crypto_box_keypair_from_sign_sk(mintingEd25519KeyPair.signSk);
var recipientAccountX25519Puk = nacl.crypto_box_pk_from_sign_pk(recipientAccountPuk);
var sharedSecret = nacl.crypto_scalarmult(mintingX25519KeyPair.boxSk, recipientAccountX25519Puk);
console.log("shared secret (minting private + recipient public): " + Base58.encode(sharedSecret));
var recipientAccountPrk = Base58.decode('AdTd9SUEYSdTW8mgK3Gu72K97bCHGdUwi2VvLNjUohot');
var mintingAccountPuk = Base58.decode('2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP');
var recipientEd25519KeyPair = nacl.crypto_sign_seed_keypair(recipientAccountPrk);
var recipientX25519KeyPair = nacl.crypto_box_keypair_from_sign_sk(recipientEd25519KeyPair.signSk);
var mintingAccountX25519Puk = nacl.crypto_box_pk_from_sign_pk(mintingAccountPuk);
sharedSecret = nacl.crypto_scalarmult(recipientX25519KeyPair.boxSk, mintingAccountX25519Puk);
console.log("shared secret (recipient private + minting public): " + Base58.encode(sharedSecret));
});
</script>
</head>
<body>
</body>
</html>

View File

@ -1,37 +0,0 @@
<!doctype html>
<html>
<head>
<script src="Base58.js"></script>
<script src="nacl_factory.js"></script>
<script>
nacl_factory.instantiate(function (nacl) {
var mintingAccountPrk = 'A9MNsATgQgruBUjxy2rjWY36Yf19uRioKZbiLFT2P7c6';
// var recipientAccountPuk = 'C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry';
var recipientAccountPuk = '2sbcMmVKke5inS4yrbeoG6Cyw2mZCptQNjyWgnY4YHaF';
mintingAccountPrk = Base58.decode(mintingAccountPrk);
recipientAccountPuk = Base58.decode(recipientAccountPuk);
var mintingKeyPair = nacl.crypto_box_keypair_from_raw_sk(mintingAccountPrk);
// Expecting: A9MNsATgQgruBUjxy2rjWY36Yf19uRioKZbiLFT2P7c6
console.log("minting private key (for confirmation): " + Base58.encode(mintingKeyPair.boxSk));
// This WILL NOT be: 2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP because this is an X25519 keypair, not Ed25519 keypair?
// console.log("minting PUBLIC key: " + Base58.encode(mintingKeyPair.boxPk));
var sharedSecret = nacl.crypto_scalarmult(mintingKeyPair.boxSk, recipientAccountPuk);
console.log("shared secret (for debugging): " + Base58.encode(sharedSecret));
console.log(sharedSecret); // log as Uint8Array
var proxyPrivateKey = nacl.crypto_hash_sha256(sharedSecret)
console.log("proxy private key: " + Base58.encode(proxyPrivateKey));
var proxyKeyPair = nacl.crypto_sign_seed_keypair(proxyPrivateKey);
console.log("proxy public key: " + Base58.encode(proxyKeyPair.signPk));
});
</script>
</head>
<body>
</body>
</html>