Пример #1
0
        private void btnGenerateHmac_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] keyBytes = txtHmacKeyString.Text.ToAsciiBytes();
                txtHmacKeyAsciiBytes.Text = keyBytes.ToDisplayByteString();

                byte[] dataBytes = txtHmacDataString.Text.ToAsciiBytes();
                txtHmacDataAsciiBytes.Text = dataBytes.ToDisplayByteString();

                const int           blockSize = 64;
                Func <byte, byte[]> getPad    = padByte => Enumerable.Range(1, blockSize).Select(n => padByte).ToArray();

                // SHA-1

                byte[] sha1Key = keyBytes.Length > blockSize?Hasher.ComputeSHA1Hash(keyBytes) : keyBytes;

                byte[] sha1Opad = getPad(0x5c);
                txtHmacSha1Opad.Text = sha1Opad.ToDisplayByteString();

                byte[] sha1KeyXorOpad = sha1Key.Xor(sha1Opad);

                txtHmacSha1KeyXorOpad.Text = sha1KeyXorOpad.ToDisplayByteString();

                byte[] sha1Ipad = getPad(0x36);
                txtHmacSha1IpadBytes.Text = sha1Ipad.ToDisplayByteString();

                byte[] sha1KeyXorIpad = sha1Key.Xor(sha1Ipad);
                txtHmacSha1KeyXorIpad.Text = sha1KeyXorIpad.ToDisplayByteString();

                byte[] sha1TotalInnerToHash = ByteUtilities.ConcatBytes(sha1KeyXorIpad, dataBytes);
                byte[] sha1InnerHash        = Hasher.ComputeSHA1Hash(sha1TotalInnerToHash);

                txtHmacSha1InnerHash.Text = sha1InnerHash.ToDisplayByteString();

                byte[] sha1Hmac         = Hasher.ComputeSHA1Hash(ByteUtilities.ConcatBytes(sha1KeyXorOpad, sha1InnerHash));
                byte[] sha1ExpectedHmac = Hasher.ComputeSHA1Hmac(keyBytes, dataBytes);
                Debug.Assert(ByteUtilities.AreEqual(sha1ExpectedHmac, sha1Hmac));

                txtHmacSha1Result.Text = sha1Hmac.ToDisplayByteString();


                // MD5

                byte[] md5Key = keyBytes.Length > blockSize?Hasher.ComputeMD5(keyBytes) : keyBytes;

                byte[] md5Opad = getPad(0x5c);
                txtHmacMd5Opad.Text = md5Opad.ToDisplayByteString();

                byte[] md5KeyXorOpad = md5Key.Xor(md5Opad);

                txtHmacMd5KeyXorOpad.Text = md5KeyXorOpad.ToDisplayByteString();

                byte[] md5Ipad = getPad(0x36);
                txtHmacMd5IpadBytes.Text = md5Ipad.ToDisplayByteString();

                byte[] md5KeyXorIpad = md5Key.Xor(md5Ipad);
                txtHmacMd5KeyXorIpad.Text = md5KeyXorIpad.ToDisplayByteString();

                byte[] md5TotalInnerToHash = ByteUtilities.ConcatBytes(md5KeyXorIpad, dataBytes);
                byte[] md5InnerHash        = Hasher.ComputeMD5(md5TotalInnerToHash);

                txtHmacMd5InnerHash.Text = md5InnerHash.ToDisplayByteString();

                byte[] md5Hmac         = Hasher.ComputeMD5(ByteUtilities.ConcatBytes(md5KeyXorOpad, md5InnerHash));
                byte[] md5ExpectedHmac = Hasher.ComputeMD5Hmac(keyBytes, dataBytes);
                Debug.Assert(ByteUtilities.AreEqual(md5ExpectedHmac, md5Hmac));

                txtHmacMd5Result.Text = md5Hmac.ToDisplayByteString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }
Пример #2
0
        private void btnCalculateCertificateInformation_Click(object sender, EventArgs e)
        {
            try
            {
                // Get moduli ahead of time since they'll be needed in a chained fashion
                byte[]     amazonModulusBytes = txtAmazonModulus.Text.FromWireshark();
                BigInteger amazonModulus      = new BigInteger(amazonModulusBytes);
                txtAmazonModulusBase10.Text = amazonModulus.ToDisplayString();
                byte[] amazonPublicExponentBytes = txtAmazonPublicExponent.Text.FromWireshark();


                byte[]     verisignClass3SecureServerModulusBytes = txtVerisignClass3SecureServerModulus.Text.FromWireshark();
                BigInteger verisignClass3SecureServerModulus      = new BigInteger(verisignClass3SecureServerModulusBytes);
                txtVerisignClass3SecureServerModulusBase10.Text = verisignClass3SecureServerModulus.ToDisplayString();
                byte[] verisignClass3SecureServerPublicExponentBytes = txtVerisignClass3SecureServerPublicExponent.Text.FromWireshark();

                byte[]     verisignClass3PrimaryCertificationAuthorityModulusBytes = txtVerisignClass3PrimaryCertificationAuthorityModulus.Text.FromWireshark();
                BigInteger verisignClass3PrimaryCertificationAuthorityModulus      = new BigInteger(verisignClass3PrimaryCertificationAuthorityModulusBytes);
                txtVerisignClass3PrimaryCertificationAuthorityModulusBase10.Text = verisignClass3PrimaryCertificationAuthorityModulus.ToDisplayString();
                byte[] verisignClass3PrimaryCertificationAuthorityPublicExponentBytes = txtVerisignClass3PrimaryCertificationAuthorityPublicExponent.Text.FromWireshark();

                byte[] amazonSignedCertificateBytes  = txtAmazonSignatureValue.Text.FromWireshark();
                byte[] amazonDecryptedSignatureBytes = RsaUtilities.GetSignedOriginalValue(amazonSignedCertificateBytes, verisignClass3SecureServerPublicExponentBytes, verisignClass3SecureServerModulusBytes);
                txtAmazonDecryptedSignature.Text = amazonDecryptedSignatureBytes.ToDisplayByteString(16);

                const int sha1HashSize         = 20; // bytes
                byte[]    amazonHashValueBytes = amazonDecryptedSignatureBytes.SubBytes(amazonDecryptedSignatureBytes.Length - sha1HashSize);

                Debug.Assert(ByteUtilities.AreEqual(Hasher.ComputeSHA1Hash(txtAmazonSignedCertificate.Text.FromWireshark()), amazonHashValueBytes));

                txtAmazonHashValue.Text = amazonHashValueBytes.ToDisplayByteString();

                // For algorithm info, see http://tools.ietf.org/html/rfc3447#page-43
                const int algorithmIdSize        = 15; // bytes
                byte[]    amazonAlgorithmIdBytes = amazonDecryptedSignatureBytes.SubBytes(amazonDecryptedSignatureBytes.Length - sha1HashSize - algorithmIdSize, algorithmIdSize);
                txtAmazonHashAlgorithmId.Text = amazonAlgorithmIdBytes.ToDisplayByteString();

                byte[] verisignClass3SecureServerSignatureValueBytes     = txtVerisignClass3SecureServerSignatureValue.Text.FromWireshark();
                byte[] verisignClass3SecureServerDecryptedSignatureBytes = RsaUtilities.GetSignedOriginalValue(verisignClass3SecureServerSignatureValueBytes, verisignClass3PrimaryCertificationAuthorityPublicExponentBytes, verisignClass3PrimaryCertificationAuthorityModulusBytes);
                txtVerisignClass3SecureServerDecryptedSignature.Text = verisignClass3SecureServerDecryptedSignatureBytes.ToDisplayByteString(16);
                byte[] verisignClass3SecureServerHashValueBytes = verisignClass3SecureServerDecryptedSignatureBytes.SubBytes(verisignClass3SecureServerDecryptedSignatureBytes.Length - sha1HashSize);

                Debug.Assert(ByteUtilities.AreEqual(Hasher.ComputeSHA1Hash(txtVersignClass3SecureServerSignedCertificate.Text.FromWireshark()), verisignClass3SecureServerHashValueBytes));

                txtVerisignClass3SecureServerHashValue.Text = verisignClass3SecureServerHashValueBytes.ToDisplayByteString();
                byte[] verisignClass3SecureServerAlgorithmIdBytes = verisignClass3SecureServerDecryptedSignatureBytes.SubBytes(verisignClass3SecureServerDecryptedSignatureBytes.Length - sha1HashSize - algorithmIdSize, algorithmIdSize);
                txtVerisignClass3SecureServerHashAlgorithmId.Text = verisignClass3SecureServerAlgorithmIdBytes.ToDisplayByteString();

                byte[] verisignClass3PrimaryCertificationAuthoritySignatureValueBytes     = txtVerisignClass3PrimaryCertificationAuthoritySignatureValue.Text.FromWireshark();
                byte[] verisignClass3PrimaryCertificationAuthorityDecryptedSignatureBytes = RsaUtilities.GetSignedOriginalValue(verisignClass3PrimaryCertificationAuthoritySignatureValueBytes, verisignClass3PrimaryCertificationAuthorityPublicExponentBytes, verisignClass3PrimaryCertificationAuthorityModulusBytes);
                txtVerisignClass3PrimaryCertificationAuthorityDecryptedSignature.Text = verisignClass3PrimaryCertificationAuthorityDecryptedSignatureBytes.ToDisplayByteString(16);

                const int md2HashSize        = 16; // bytes
                int       md2AlgorithmIdSize = algorithmIdSize + 3;
                byte[]    verisignClass3PrimaryCertificationAuthorityHashValueBytes = verisignClass3SecureServerDecryptedSignatureBytes.SubBytes(verisignClass3SecureServerDecryptedSignatureBytes.Length - md2HashSize);
                txtVerisignClass3PrimaryCertificationAuthorityHashValue.Text = verisignClass3PrimaryCertificationAuthorityHashValueBytes.ToDisplayByteString();
                byte[] verisignClass3PrimaryCertificationAuthorityAlgorithmIdBytes = verisignClass3PrimaryCertificationAuthorityDecryptedSignatureBytes.SubBytes(verisignClass3PrimaryCertificationAuthorityDecryptedSignatureBytes.Length - md2HashSize - md2AlgorithmIdSize, md2AlgorithmIdSize);
                txtVerisignClass3PrimaryCertificationAuthorityHashAlgorithmId.Text = verisignClass3PrimaryCertificationAuthorityAlgorithmIdBytes.ToDisplayByteString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }
Пример #3
0
        private void btnGo_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] preMasterSecret = FirefoxSslDebugFileUtilities.GetPremasterSecretKey(txtPremasterSecret.Text);
                string label           = txtMasterSecretLabel.Text;

                byte[] serverHelloRandom = txtServerRandomBytes.Text.FromWireshark();
                byte[] clientHelloRandom = txtClientRandomBytes.Text.FromWireshark();

                byte[] clientHelloAndServerHello = ByteUtilities.ConcatBytes(clientHelloRandom, serverHelloRandom);

                byte[] masterSecret = Prf10.GenerateBytes(preMasterSecret, label, clientHelloAndServerHello, 48);

                txtMasterSecret.Text = masterSecret.ToDisplayByteString();

                byte[] serverHelloAndClientHello = ByteUtilities.ConcatBytes(serverHelloRandom, clientHelloRandom);

                byte[] keyBlock = Prf10.GenerateBytes(masterSecret, txtKeyExpansionLabel.Text, serverHelloAndClientHello, 96);

                byte[] client_write_MAC_secret = new byte[16];
                byte[] server_write_MAC_secret = new byte[16];
                byte[] client_write_key        = new byte[16];
                byte[] server_write_key        = new byte[16];
                byte[] client_write_IV         = new byte[16];
                byte[] server_write_IV         = new byte[16];

                Buffer.BlockCopy(keyBlock, 0, client_write_MAC_secret, 0, 16);
                txtClientWriteMacKey.Text = client_write_MAC_secret.ToDisplayByteString();

                Buffer.BlockCopy(keyBlock, 16, server_write_MAC_secret, 0, 16);
                txtServerWriteMacKey.Text = server_write_MAC_secret.ToDisplayByteString();

                Buffer.BlockCopy(keyBlock, 32, client_write_key, 0, 16);
                txtClientWriteKey.Text = client_write_key.ToDisplayByteString();

                Buffer.BlockCopy(keyBlock, 48, server_write_key, 0, 16);
                txtServerWriteKey.Text = server_write_key.ToDisplayByteString();

                Buffer.BlockCopy(keyBlock, 64, client_write_IV, 0, 16);
                txtClientIV.Text = client_write_IV.ToDisplayByteString();

                Buffer.BlockCopy(keyBlock, 80, server_write_IV, 0, 16);
                txtServerIV.Text = server_write_IV.ToDisplayByteString();

                byte[] clientHello                = txtClientHello.Text.FromWireshark();
                byte[] serverHello                = txtServerHello.Text.FromWireshark();
                byte[] certificate                = txtServerHelloCertificate.Text.FromWireshark();
                byte[] serverHelloDone            = txtServerHelloDone.Text.FromWireshark();
                byte[] clientKeyExchangeEncrypted = txtClientKeyExchange.Text.FromWireshark();

                byte[] handshakeMessages = ByteUtilities.ConcatBytes(clientHello, serverHello, certificate, serverHelloDone, clientKeyExchangeEncrypted);
                txtHandshakeMessages.Text = handshakeMessages.ToDisplayByteString(16);

                var md5Handshake = Hasher.ComputeMD5(handshakeMessages);
                txtMd5HandshakeMessages.Text = md5Handshake.ToDisplayByteString();

                var sha1Handshake = Hasher.ComputeSHA1Hash(handshakeMessages);
                txtSha1HandshakeMessages.Text = sha1Handshake.ToDisplayByteString();

                byte[] clientVerifyData = Prf10.GenerateBytes(masterSecret, txtClientFinishedLabel.Text, ByteUtilities.ConcatBytes(md5Handshake, sha1Handshake), 12);
                txtClientFinishedVerifyData.Text = clientVerifyData.ToDisplayByteString();

                var clientFinishedHeaderBytes = txtClientFinishedHeader.Text.FromWireshark();
                var clientFinishedHash        = Hasher.ComputeTlsMD5Hmac(client_write_MAC_secret, 0x16, 0, ByteUtilities.ConcatBytes(clientFinishedHeaderBytes, clientVerifyData));
                txtClientFinishedHmacMd5.Text = clientFinishedHash.ToDisplayByteString();
                var  clientFinishedHeaderAndVerify = ByteUtilities.ConcatBytes(clientFinishedHeaderBytes, clientVerifyData);
                var  clientFinishedDecrypted       = ByteUtilities.ConcatBytes(clientFinishedHeaderBytes, clientVerifyData, clientFinishedHash);
                Arc4 clientWriteArc4         = new Arc4(client_write_key);
                var  clientFinishedEncrypted = clientWriteArc4.Encrypt(clientFinishedDecrypted);

                var expectedClientFinishedEncrypted = txtClientEncryptedFinishedMessage.Text.FromWireshark();
                Debug.Assert(ByteUtilities.AreEqual(expectedClientFinishedEncrypted, clientFinishedEncrypted));

                byte[] clientApplicationData = txtClientApplicationDataInput.Text.FromWireshark();
                byte[] decryptedBytes        = clientWriteArc4.Encrypt(clientApplicationData);
                byte[] plainTextBytes        = new byte[decryptedBytes.Length - 16];
                Buffer.BlockCopy(decryptedBytes, 0, plainTextBytes, 0, plainTextBytes.Length);

                string plainText = ASCIIEncoding.ASCII.GetString(plainTextBytes);
                txtDecryptedClientApplicationData.Text = plainText;

                byte[] hmacClientBytesReceived = new byte[16];
                Buffer.BlockCopy(decryptedBytes, plainTextBytes.Length, hmacClientBytesReceived, 0, 16);
                txtClientApplicationDataHmac.Text = hmacClientBytesReceived.ToDisplayByteString();

                var hmacFirstClientPacket = Hasher.ComputeTlsMD5Hmac(client_write_MAC_secret, 23, 1, plainTextBytes);
                Debug.Assert(ByteUtilities.AreEqual(hmacFirstClientPacket, hmacClientBytesReceived));

                // get server reply
                var serverHandshakeMessages = ByteUtilities.ConcatBytes(handshakeMessages, clientFinishedHeaderAndVerify);
                var serverFinishedHeader    = txtServerFinishedHeader.Text.FromWireshark();
                md5Handshake  = Hasher.ComputeMD5(serverHandshakeMessages);
                sha1Handshake = Hasher.ComputeSHA1Hash(serverHandshakeMessages);
                var serverVerifyData = Prf10.GenerateBytes(masterSecret, txtServerFinishedLabel.Text, ByteUtilities.ConcatBytes(md5Handshake, sha1Handshake), 12);
                txtServerFinishedVerifyData.Text = serverVerifyData.ToDisplayByteString();
                var serverFirstHash = Hasher.ComputeTlsMD5Hmac(server_write_MAC_secret, 0x16, 0, ByteUtilities.ConcatBytes(serverFinishedHeader, serverVerifyData));
                txtServerFinishedHmacMd5.Text = serverFirstHash.ToDisplayByteString();

                var serverArc4 = new Arc4(server_write_key);

                var serverFinishedMessage          = ByteUtilities.ConcatBytes(serverFinishedHeader, serverVerifyData, serverFirstHash);
                var encryptedServerFinishedMessage = serverArc4.Encrypt(serverFinishedMessage);

                Debug.Assert(ByteUtilities.AreEqual(encryptedServerFinishedMessage, txtServerEncryptedHandshakeMessage.Text.FromWireshark()));

                var serverApplicationDataBytes          = txtServerApplicationDataInput.Text.FromWireshark();
                var decryptedServerApplicationDataBytes = serverArc4.Encrypt(serverApplicationDataBytes);

                var serverPlainTextBytes = new byte[decryptedServerApplicationDataBytes.Length - 16];
                Buffer.BlockCopy(decryptedServerApplicationDataBytes, 0, serverPlainTextBytes, 0, serverPlainTextBytes.Length);

                var hmacServerFirstPacketReceived = new byte[16];
                Buffer.BlockCopy(decryptedServerApplicationDataBytes, serverPlainTextBytes.Length, hmacServerFirstPacketReceived, 0, 16);

                txtDecryptedServerApplicationData.Text = ASCIIEncoding.ASCII.GetString(serverPlainTextBytes);
                var hmacServerFirstPacketComputed = Hasher.ComputeTlsMD5Hmac(server_write_MAC_secret, 23, 1, serverPlainTextBytes);
                txtServerApplicationDataHmac.Text = hmacServerFirstPacketComputed.ToDisplayByteString();

                Debug.Assert(ByteUtilities.AreEqual(hmacServerFirstPacketComputed, hmacServerFirstPacketComputed));
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error calculating derived handshake info: " + ex.Message);
            }
        }