Beispiel #1
0
        public static void Encrypt(BufRef dest, BufLen data, I2PPublicKey key, bool zeropad)
        {
            if (data == null || data.Length > ClearTextLength)
            {
                throw new InvalidParameterException($"ElGamal data must be {ClearTextLength} bytes or less!");
            }

            var k  = new BigInteger(I2PConstants.ElGamalFullExponentBits, Rnd);
            var a  = I2PConstants.ElGamalG.ModPow(k, I2PConstants.ElGamalP);
            var b1 = key.ToBigInteger().ModPow(k, I2PConstants.ElGamalP);

            var start  = new BufLen(new byte[EGBlockLength]);
            var writer = new BufRefLen(start, 1);

            start[0] = 0xFF;

            writer.Write(I2PHashSHA256.GetHash(data));
            writer.Write(data);
            var egblock = new BufLen(start, 0, writer - start);
            var egint   = egblock.ToBigInteger();

            var b = b1.Multiply(egint).Mod(I2PConstants.ElGamalP);

            var targetlen = zeropad
                    ? EncryptedPaddedLength / 2
                    : EncryptedShortLength / 2;

            WriteToDest(dest, a, targetlen);
            WriteToDest(dest, b, targetlen);
        }
Beispiel #2
0
        public void Encrypt(BufRef dest, BufLen data, bool zeropad)
        {
            if (data == null || data.Length > 222)
            {
                throw new InvalidParameterException("ElGamal data length can max be 222 bytes!");
            }

            var hashbuf = new BufRefLen(new byte[255]);

            hashbuf.Write8(0xFF);
            hashbuf.Write(I2PHashSHA256.GetHash(data));
            hashbuf.Write(data);
            hashbuf.Reset();

            var b = b1.Multiply(new BigInteger(1, hashbuf.ToByteArray())).Mod(I2PConstants.ElGamalP);

            if (zeropad)
            {
                dest.Write8(0);
                dest.Write(a.ToByteArray(256));
                dest.Write8(0);
                dest.Write(b.ToByteArray(256));
            }
            else
            {
                dest.Write(a.ToByteArray(256));
                dest.Write(b.ToByteArray(256));
            }
        }
Beispiel #3
0
        public BufRef ReadBufRef(int length)
        {
            PreReadCheck(length);

            var result = new BufRef(this, 0);

            Seek(length);
            return(result);
        }
Beispiel #4
0
        private static void WriteToDest(BufRef dest, BigInteger v, int targetlen)
        {
            var vba = v.ToByteArray();

            if (vba.Length < targetlen)
            {
                dest.Write(new byte[targetlen - vba.Length]);
            }

            if (vba.Length > targetlen)
            {
                dest.Write(new BufLen(vba, vba.Length - targetlen));
            }
            else
            {
                dest.Write(vba);
            }
        }