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); }
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); } }
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); } }
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); } }
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); } }
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))); }
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); } }
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)); }