Exemplo n.º 1
0
        internal static void EncryptInternal(Stream input, Stream output, byte[] secretKey, EncryptInternalParameter parameter = null)
        {
            byte[] secretInformationEncryptedData = null;
            if (parameter?.Filename != null)
            {
                var secretInformation = new SecretInformation
                {
                    Filename = parameter.Filename,
                };

                secretInformationEncryptedData = secretInformation.ToEncyptedData(secretKey);
            }
            var metaInformation = new MetaInformation
            {
                PasswordDerivationSettings         = parameter?.PasswordDerivationSettings,
                SecretInformationEncrypted         = secretInformationEncryptedData,
                EllipticCurveEncryptionInformation = parameter?.EllipticCurveEncryptionInformation,
            };

            RawFileAccessor.Init(output);
            RawFileAccessor.WriteMeta(output, metaInformation);
            RawFileAccessor.SeekToMainData(output);

            var result = EncryptRaw(input, output, secretKey, parameter?.Progress, parameter?.IsCanceled);

            RawFileAccessor.Write(output, result.iv, RawFileAccessor.Field.InitializationVector);
            RawFileAccessor.Write(output, result.hmacHash, RawFileAccessor.Field.Hmac);

            output.Dispose();
        }
Exemplo n.º 2
0
        internal static DecryptInfo DecryptInternal(Stream input, Stream output, byte[] secret, string password, DecryptInternalParameter parameter)
        {
            if (!RawFileAccessor.Verify(input))
            {
                throw new CryptographicException("File signature is wrong");
            }

            var fileCargo = RawFileAccessor.ReadMeta(input);

            if (password != null)
            {
                secret = Hasher.CreateAesKeyFromPassword(password, fileCargo.PasswordDerivationSettings.Salt, fileCargo.PasswordDerivationSettings.Iterations);
            }

            if (parameter?.EllipticCurveDeriveKeyAction != null)
            {
                secret = parameter?.EllipticCurveDeriveKeyAction(fileCargo.EllipticCurveEncryptionInformation);
            }

            SecretInformation decryptedSecretInfo = null;

            if (fileCargo.SecretInformationEncrypted != null)
            {
                var memoryStream = new MemoryStream();
                DecryptInternal(new MemoryStream(fileCargo.SecretInformationEncrypted), memoryStream, secret, null, null);
                decryptedSecretInfo = SecretInformation.FromProtoBufData(memoryStream.ToArray());
            }

            var iv   = RawFileAccessor.Read(input, RawFileAccessor.Field.InitializationVector);
            var hmac = RawFileAccessor.Read(input, RawFileAccessor.Field.Hmac);

            (byte[] hmac, byte[] iv)param = (hmac, iv);

            RawFileAccessor.SeekToMainData(input);
            DecryptRaw(input, output, secret, param, parameter?.Progress, parameter?.IsCanceled);

            return(new DecryptInfo
            {
                FileName = decryptedSecretInfo?.Filename,
            });
        }