Beispiel #1
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 #2
0
        public static byte[] Decode(string data)
        {
            if (data.Length < 4 || data.Length % 4 != 0)
            {
                throw new FormatException("FreenetBase64 string needs to be padded to 4 byte align!");
            }
            var size = 3 * (data.Length / 4);

            if (data[data.Length - 1] == '=')
            {
                --size;
            }
            if (data[data.Length - 2] == '=')
            {
                --size;
            }
            if (data[data.Length - 3] == '=')
            {
                --size;
            }
            var result = new byte[size];

            if (Codomain == null)
            {
                Codomain = new int[256];
                for (int i = 0; i < 256; ++i)
                {
                    Codomain[i] = -1;
                }
                for (int i = 0; i < 64; ++i)
                {
                    Codomain[(byte)Domain[i]] = i;
                }
                Codomain[(byte)'='] = 0;
            }

            byte v1, v2;
            var  reader = data.GetEnumerator();

            reader.MoveNext();
            var writer = new BufRefLen(result);

            for (int i = 0; i < data.Length / 4; ++i)
            {
                v1   = Lookup(reader);
                v2   = Lookup(reader);
                v1 <<= 2;
                v1  |= (byte)(v2 >> 4);
                writer.Write8(v1);
                if (writer.Length == 0)
                {
                    break;
                }
                v2 <<= 4;
                v1   = Lookup(reader);
                v2  |= (byte)(v1 >> 2);
                writer.Write8(v2);
                if (writer.Length == 0)
                {
                    break;
                }
                v2  = Lookup(reader);
                v2 |= (byte)(v1 << 6);
                writer.Write8(v2);
                if (writer.Length == 0)
                {
                    break;
                }
            }

            return(result);
        }