public void TestECDSAImportExport()
        {
            var key       = ECDsaHelper.CreateECDsaCng256();
            var expPubKey = key.ExportPublicKeyRaw();

            var impPubKey = ECDsaHelper.ImportPublicKey(expPubKey);

            Assert.NotNull(impPubKey);

            var expPriKey = key.ExportPrivateKeyRaw();
            var impPriKey = ECDsaHelper.ImportPrivateKey(expPubKey, expPriKey);

            Assert.NotNull(impPriKey);
        }
Exemple #2
0
        private void SignAndVerify(byte[] publicKeyRaw, byte[] privateKeyRaw)
        {
            var privateKey = ECDsaHelper.ImportPrivateKey(publicKeyRaw, privateKeyRaw);

            Assert.NotNull(privateKey);

            var nonce       = ByteHelper.GetRandom(32);
            var nonceSigned = privateKey.SignData(nonce);

            var publicKey = ECDsaHelper.ImportPublicKey(publicKeyRaw);

            Assert.NotNull(publicKey);
            Assert.IsTrue(publicKey.VerifyData(nonce, nonceSigned));
        }
Exemple #3
0
        public bool GetServerProofOfIdentity(byte[] encryptedClientProofOfIdentity, out byte[] serverProofOfIdentity)
        {
            serverProofOfIdentity = null;

            // Decrypt Client Finished message signed with symmetric key
            var ivOffset = encryptedClientProofOfIdentity.Extract(0, 16);
            var clientProofOfIdentity = EncryptionMode == ScpConfig.EncryptionMode.AESCTR
                ? encryptedClientProofOfIdentity.Extract(16).AesCtrDecrypt(Session.SymmetricKey, ivOffset)
                : encryptedClientProofOfIdentity.Extract(16).AesGcmDecryptWithOffset(Session.SymmetricKey, ivOffset);

            if (!ClientProofOfIdentity.Parse(clientProofOfIdentity, out ClientProofOfIdentity cpoi))
            {
                return(false);
            }

            // Verify eph pub key
            if (!cpoi.ephDHKey.SequenceEqual(Session.ClientEphDHPubKey))
            {
                return(false);
            }

            // Verify signature
            var clientsECDsaCng = ECDsaHelper.ImportPublicKey(cpoi.publicKey);

            if (!clientsECDsaCng.VerifyData(cpoi.nonce, cpoi.nonceSigned))
            {
                return(false);
            }

            Session.ClientPubKey = cpoi.publicKey;

            // Prepare answer
            var nonce  = ByteHelper.GetRandom(32);
            var msg    = "Hey you! Welcome to Secretarium!".ToBytes();
            var signed = SecretariumKey.SignData(ByteHelper.Combine(nonce, msg));

            // Generate a random IV offset
            ivOffset = ByteHelper.GetRandom(16);

            // Encrypt
            var combined  = ByteHelper.Combine(nonce, signed);
            var encrypted = EncryptionMode == ScpConfig.EncryptionMode.AESCTR
                ? combined.AesCtrEncrypt(Session.SymmetricKey, ivOffset)
                : combined.AesGcmEncryptWithOffset(Session.SymmetricKey, ivOffset);

            serverProofOfIdentity = ByteHelper.Combine(ivOffset, encrypted);

            return(true);
        }
Exemple #4
0
        private bool FullProtocolFromX509(ScpConfig.EncryptionMode encryptionMode, out byte[] symmetricKey, out MockedSecretarium secretarium)
        {
            // Client keys
            Assert.IsTrue(ScpConfigHelper.TryLoad("test.x509.json", out ScpConfig config));
            Assert.IsTrue(config.TryGetECDsaKey(out ECDsaCng clientECDsaKeyCng, "SecretariumTestClient256"));
            var clientPub = clientECDsaKeyCng.ExportPublicKeyRaw();

            // Client Hello
            var clientEph    = ECDHHelper.CreateCngKey();
            var clientEphCng = ECDHHelper.CreateECDiffieHellmanCngSha256(clientEph);
            var clientEphPub = clientEphCng.PublicKey();
            var clientHello  = clientEphPub;

            Assert.IsTrue(ClientHello.Parse(clientHello, out ClientHello clientHelloObj));

            // Server Hello
            secretarium = new MockedSecretarium(encryptionMode);
            secretarium.GetServerHello(clientHello, out byte[] serverHello);
            Assert.IsTrue(ServerHello.Parse(serverHello, 18, out ServerHello serverHelloObj));

            // Client ClientProofOfWork
            Assert.IsTrue(DiffieHellmanHelper.ComputeProofOfWork(serverHelloObj.proofOfWorkDetails, out byte[] proofOfWork));
            var clientProofOfWork = ByteHelper.Combine(proofOfWork.ExtendTo(32), MockedSecretarium.GenesisPubKey);

            Assert.IsTrue(ClientProofOfWork.Parse(clientProofOfWork, out ClientProofOfWork clientProofOfWorkObj));

            // Server Identity
            secretarium.GetServerIdentity(clientProofOfWork, out byte[] serverIdentity);
            Assert.IsTrue(ServerIdentity.Parse(serverIdentity, out ServerIdentity serverIdentityObj));

            // Client computes symmetric key
            symmetricKey = DiffieHellmanHelper.GetSymmetricKey(
                clientEphCng, serverIdentityObj.ephDHKey, serverIdentityObj.preMasterSecret);

            // Client Proof Of Identity
            var nonce                 = ByteHelper.GetRandom(32);
            var nonceSigned           = clientECDsaKeyCng.SignData(nonce);
            var clientProofOfIdentity = ByteHelper.Combine(nonce, clientEphPub, clientPub, nonceSigned);

            Assert.IsTrue(ClientProofOfIdentity.Parse(clientProofOfIdentity, out ClientProofOfIdentity clientProofOfIdentityObj));

            // Client Encrypts Client Proof Of Identity
            var ivOffset = ByteHelper.GetRandom(16);
            var encryptedClientProofOfIdentity = encryptionMode == ScpConfig.EncryptionMode.AESCTR
                ? clientProofOfIdentity.AesCtrEncrypt(symmetricKey, ivOffset)
                : clientProofOfIdentity.AesGcmEncryptWithOffset(symmetricKey, ivOffset);
            var encryptedClientProofOfIdentityWithIvOffset = ByteHelper.Combine(ivOffset, encryptedClientProofOfIdentity);

            // Server Checks And Sends Proof Of Identity
            Assert.IsTrue(secretarium.GetServerProofOfIdentity(
                              encryptedClientProofOfIdentityWithIvOffset, out byte[] encryptedServerProofOfIdentity));

            // Client Decrypts Server Proof Of Identity
            ivOffset = encryptedServerProofOfIdentity.Extract(0, 16);
            var serverProofOfIdentity = encryptionMode == ScpConfig.EncryptionMode.AESCTR
                ? encryptedServerProofOfIdentity.Extract(16).AesCtrDecrypt(symmetricKey, ivOffset)
                : encryptedServerProofOfIdentity.Extract(16).AesGcmDecryptWithOffset(symmetricKey, ivOffset);

            Assert.IsTrue(ServerProofOfIdentity.Parse(serverProofOfIdentity, out ServerProofOfIdentity serverProofOfIdentityObj));

            // Client Checks Server Proof Of Idendity
            var msg = "Hey you! Welcome to Secretarium!".ToBytes();
            var secretariumECDsaCng = ECDsaHelper.ImportPublicKey(serverIdentityObj.publicKey);

            Assert.IsTrue(secretariumECDsaCng.VerifyData(
                              ByteHelper.Combine(serverProofOfIdentityObj.nonce, msg), serverProofOfIdentityObj.welcomeSigned));

            return(true);
        }