public static byte[] Decrypt(byte[] data, C25519Key key)
        {
            var size         = data[1] & 127;
            var sizeLength   = 0;
            var hasFieldSize = (data[1] & 128) != 0;

            if (hasFieldSize)
            {
                sizeLength = size;
                size       = (int)new BigInteger(data.Skip(2).Take(sizeLength).ToArray(), true, true);
            }
            var step = 2 + sizeLength;

            var asymmetricCipher = data.Skip(step).Take(32 * 3).ToArray();

            var asymmetricPlain = key.Decrypt(asymmetricCipher);

            step += AsymmetricSize;

            if (size == 200)
            {
                return(UnPad32(asymmetricPlain));
            }

            var symmetricKey = AesSherableKey.Parse(asymmetricPlain);

            return(symmetricKey.Decrypt(data.Skip(step).ToArray()));
        }
        public static byte[] Encrypt(byte[] buffer, ulong tag, C25519Key key)
        {
            var toAsymmetricEncrypt = Pad32(buffer);
            var bufferSymmetric     = new byte[0];

            if (buffer.Length > 32)
            {
                var secret = new AesSherableKey();
                bufferSymmetric     = secret.Encrypt(buffer);
                toAsymmetricEncrypt = secret.ToByteArray();
            }

            var bufferAsymmetric = key.Encrypt(toAsymmetricEncrypt).ToByteArray();
            var tagBuffer        = BitConverter.GetBytes(tag);
            var signature        = key.Sign(bufferAsymmetric.Concat(tagBuffer).ToArray()).PadLeft(32 * 3);

            var size =
                bufferAsymmetric.Length +
                tagBuffer.Length +
                signature.Length +
                bufferSymmetric.Length;
            var dimension = DimensionBuffer(size);

            var all = new byte[1 + dimension.Length + size];

            all[0] = 1; // version #

            dimension.CopyTo(all, 1);
            var step = dimension.Length + 1;

            bufferAsymmetric.CopyTo(all, step);
            step += bufferAsymmetric.Length;

            tagBuffer.CopyTo(all, step);
            step += tagBuffer.Length;

            signature.CopyTo(all, step);
            step += signature.Length;

            bufferSymmetric.CopyTo(all, step);
            return(all);
        }
Beispiel #3
0
 public AesSherableKey GenKey(AesKey key) => AesSherableKey.Parse(key.Hash(ToByteArray()));