Esempio n. 1
0
        public EGBuildRequestRecord(BufLen dest, BuildRequestRecord src, I2PIdentHash topeer, I2PPublicKey key)
        {
            Data = dest;
            var writer = new BufRefLen(Data);

            writer.Write(topeer.Hash16);

            var datastart = new BufLen(writer);

            ElGamalCrypto.Encrypt(writer, src.Data, key, false);
        }
Esempio n. 2
0
        public void TestElGamal()
        {
            for (int i = 0; i < 20; ++i)
            {
                var data     = new BufLen(BufUtils.RandomBytes(222));
                var origdata = data.Clone();

                var enc = new BufLen(ElGamalCrypto.Encrypt(data, Public, true));

                var decryptdata = ElGamalCrypto.Decrypt(enc, Private, true);

                Assert.IsTrue(decryptdata == origdata);
            }
        }
Esempio n. 3
0
        public void TestElGamalNoPad()
        {
            for (int i = 0; i < 20; ++i)
            {
                var egdata = new BufLen(new byte[512]);
                var writer = new BufRefLen(egdata);
                var data   = new BufLen(egdata, 0, 222);

                data.Randomize();
                var origdata = data.Clone();

                ElGamalCrypto.Encrypt(writer, data, Public, false);

                var decryptdata = ElGamalCrypto.Decrypt(new BufLen(egdata, 0, 512), Private, false);

                Assert.IsTrue(decryptdata == origdata);
            }
        }
Esempio n. 4
0
        public void TestElGamal2()
        {
            var buf = new byte[514];

            for (int i = 0; i < 20; ++i)
            {
                var data     = new BufLen(BufUtils.RandomBytes(222));
                var origdata = data.Clone();

                var start  = new BufRefLen(buf);
                var writer = new BufRefLen(buf);
                ElGamalCrypto.Encrypt(writer, data, Public, true);
                var enc = new BufLen(start, 0, writer - start);

                var decryptdata = ElGamalCrypto.Decrypt(enc, Private, true);

                Assert.IsTrue(decryptdata == origdata);
            }
        }
Esempio n. 5
0
        public void TestElGamal()
        {
            for (int i = 0; i < 20; ++i)
            {
                var egdata = new BufLen(new byte[514]);
                var writer = new BufRefLen(egdata);
                var data   = new BufLen(egdata, 0, 222);

                data.Randomize();
                var origdata = data.Clone();

                var eg = new ElGamalCrypto(Public);
                eg.Encrypt(writer, data, true);

                var decryptdata = ElGamalCrypto.Decrypt(egdata, Private, true);

                Assert.IsTrue(decryptdata == origdata);
            }
        }
Esempio n. 6
0
        public static GarlicMessage EGEncryptGarlic(
            Garlic msg,
            I2PPublicKey pubkey,
            I2PSessionKey sessionkey,
            List <I2PSessionTag> newtags)
        {
            var cipher = new CbcBlockCipher(new AesEngine());

            var payload = msg.ToByteArray();
            var dest    = new BufLen(new byte[65536]);
            // Reserve header + 4 bytes for GarlicMessageLength
            var writer = new BufRefLen(dest, I2NPMaxHeaderSize + 4);

            // ElGamal block
            var egbuf         = new BufLen(new byte[222]);
            var sessionkeybuf = new BufLen(egbuf, 0, 32);
            var preivbuf      = new BufLen(egbuf, 32, 32);
            var egpadding     = new BufLen(egbuf, 64, 158);

            egpadding.Randomize();
            preivbuf.Randomize();
            sessionkeybuf.Poke(sessionkey.Key, 0);

            var iv = new BufLen(I2PHashSHA256.GetHash(preivbuf), 0, 16);

            ElGamalCrypto.Encrypt(writer, egbuf, pubkey, true);

            // AES block
            var aesstart = new BufLen(writer);
            var aesblock = new GarlicAESBlock(writer, newtags, null, new BufRefLen(payload));

            cipher.Init(true, sessionkey.Key.ToParametersWithIV(iv));
            cipher.ProcessBytes(aesblock.DataBuf);

            var length = writer - dest;

            dest.PokeFlip32((uint)(length - 4), I2NPMaxHeaderSize);

            return(new GarlicMessage(new BufRefLen(dest, I2NPMaxHeaderSize, length)));
        }
Esempio n. 7
0
        public void TestEGCompatibilityEncode()
        {
            var priv = new I2PPrivateKey(
                new BufRefLen(FreenetBase64.Decode(PRIVATE_KEY)),
                new I2PCertificate());

            var pub = new I2PPublicKey(
                new BufRefLen(FreenetBase64.Decode(PUBLIC_KEY)),
                new I2PCertificate());

            for (int i = 0; i < ENCRYPTED.Length; ++i)
            {
                var clear = new BufLen(Encoding.UTF8.GetBytes(UNENCRYPTED[i]));
                var encr  = new BufLen(ElGamalCrypto.Encrypt(clear, pub, true));

                Assert.IsTrue(encr.Length == 514);

                var decr = ElGamalCrypto.Decrypt(encr, priv, true);

                Assert.IsTrue(decr == clear);
            }
        }
Esempio n. 8
0
        GarlicCreationInfo GenerateNewSessionTags(uint trackingid, GarlicCloveDelivery[] cloves)
        {
            var newtags = new List <I2PSessionTag>();

            for (int i = 0; i < 50; ++i)
            {
                newtags.Add(new I2PSessionTag());
            }

            lock ( SessionTags )
            {
                SessionTags.AddRange(newtags);
            }

            // Add a ACK message
            DeliveryStatusMessage ackmsg;
            var msg = AddExplAck(cloves, out ackmsg);

            var payload = msg.ToByteArray();
            var dest    = new BufLen(new byte[61000]);
            var writer  = new BufRefLen(dest, 4);  // Reserve 4 bytes for GarlicMessageLength

            // ElGamal block
            var egbuf         = new BufLen(writer, 0, 222);
            var sessionkeybuf = new BufLen(egbuf, 0, 32);
            var preivbuf      = new BufLen(egbuf, 32, 32);
            var egpadding     = new BufLen(egbuf, 64);

            sessionkeybuf.Poke(SessionKey.Key, 0);
            preivbuf.Randomize();
            egpadding.Randomize();

            var preiv = preivbuf.Clone();

            var eg = new ElGamalCrypto(Destination.PublicKey);

            eg.Encrypt(writer, egbuf, true);

            // AES block
            var aesstart = new BufLen(writer);
            var aesblock = new GarlicAESBlock(writer, newtags, null, new BufRefLen(payload));

            var pivh = I2PHashSHA256.GetHash(preiv);

            Cipher.Init(true, SessionKey.Key.ToParametersWithIV(new BufLen(pivh, 0, 16)));
            Cipher.ProcessBytes(aesblock.DataBuf);

            var length = writer - dest;

            dest.PokeFlip32((uint)(length - 4), 0);

            LatestEGAckMessageId = ackmsg.MessageId;

#if LOG_ALL_TUNNEL_TRANSFER
            Logging.LogDebug(() => string.Format(
                                 "DestinationSession: Garlic generated with ElGamal encryption, {0} cloves. {1} tags available. Ack MessageId: {2}.",
                                 msg.Cloves.Count, SessionTags.Count, LatestEGAckMessageId));
#endif

            return(new GarlicCreationInfo(
                       Destination.IdentHash,
                       cloves,
                       new EGGarlic(new BufRefLen(dest, 0, length)),
                       GarlicCreationInfo.KeyUsed.ElGamal,
                       SessionTags.Count(),
                       trackingid,
                       ackmsg.MessageId,
                       LatestEGAckMessageId));
        }