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