pgpainless/pgpainless-core/src/main/java/org/pgpainless/decryption_verification/DecryptionStream.java

66 lines
2.2 KiB
Java
Raw Normal View History

2021-10-07 15:48:52 +02:00
// SPDX-FileCopyrightText: 2018 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.decryption_verification;
2018-06-11 01:33:49 +02:00
import java.io.IOException;
import java.io.InputStream;
2021-04-26 13:38:12 +02:00
import javax.annotation.Nonnull;
2018-06-11 01:33:49 +02:00
import org.bouncycastle.util.io.Streams;
2020-08-24 14:55:06 +02:00
/**
* Decryption Stream that handles updating and verification of detached signatures,
* as well as verification of integrity-protected input streams once the stream gets closed.
*/
public class DecryptionStream extends CloseForResultInputStream {
2018-06-11 01:33:49 +02:00
private final InputStream inputStream;
private final IntegrityProtectedInputStream integrityProtectedInputStream;
private final InputStream armorStream;
2018-06-11 01:33:49 +02:00
/**
* Create an input stream that handles decryption and - if necessary - integrity protection verification.
*
* @param wrapped underlying input stream
* @param resultBuilder builder for decryption metadata like algorithms, recipients etc.
* @param integrityProtectedInputStream in case of data encrypted using SEIP packet close this stream to check integrity
* @param armorStream armor stream to verify CRC checksums
*/
DecryptionStream(@Nonnull InputStream wrapped,
@Nonnull OpenPgpMetadata.Builder resultBuilder,
IntegrityProtectedInputStream integrityProtectedInputStream,
InputStream armorStream) {
super(resultBuilder);
2018-06-11 01:33:49 +02:00
this.inputStream = wrapped;
this.integrityProtectedInputStream = integrityProtectedInputStream;
this.armorStream = armorStream;
2018-06-11 01:33:49 +02:00
}
@Override
public void close() throws IOException {
if (armorStream != null) {
Streams.drain(armorStream);
}
2018-06-11 01:33:49 +02:00
inputStream.close();
if (integrityProtectedInputStream != null) {
integrityProtectedInputStream.close();
2021-02-17 21:04:05 +01:00
}
super.close();
2018-06-11 01:33:49 +02:00
}
@Override
public int read() throws IOException {
int r = inputStream.read();
return r;
2018-06-11 01:33:49 +02:00
}
@Override
public int read(@Nonnull byte[] bytes, int offset, int length) throws IOException {
int read = inputStream.read(bytes, offset, length);
return read;
}
2018-06-11 01:33:49 +02:00
}