Newer
Older
KeeperJerry_Launcher / Launcher / source / serialize / signed / SignedBytesHolder.java
package launcher.serialize.signed;

import java.io.IOException;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Arrays;

import launcher.LauncherAPI;
import launcher.helper.SecurityHelper;
import launcher.serialize.HInput;
import launcher.serialize.HOutput;
import launcher.serialize.stream.StreamObject;

public class SignedBytesHolder extends StreamObject {
	protected final byte[] bytes;
	private final byte[] sign;

	@LauncherAPI
	public SignedBytesHolder(HInput input, RSAPublicKey publicKey) throws IOException, SignatureException {
		this(input.readByteArray(0), input.readByteArray(-SecurityHelper.RSA_KEY_LENGTH), publicKey);
	}

	@LauncherAPI
	public SignedBytesHolder(byte[] bytes, byte[] sign, RSAPublicKey publicKey) throws SignatureException {
		SecurityHelper.verifySign(bytes, sign, publicKey);
		this.bytes = Arrays.copyOf(bytes, bytes.length);
		this.sign = Arrays.copyOf(sign, sign.length);
	}

	@LauncherAPI
	public SignedBytesHolder(byte[] bytes, RSAPrivateKey privateKey) {
		this.bytes = Arrays.copyOf(bytes, bytes.length);
		sign = SecurityHelper.sign(bytes, privateKey);
	}

	@Override
	public final void write(HOutput output) throws IOException {
		output.writeByteArray(bytes, 0);
		output.writeByteArray(sign, -SecurityHelper.RSA_KEY_LENGTH);
	}

	@LauncherAPI
	public final byte[] getBytes() {
		return Arrays.copyOf(bytes, bytes.length);
	}

	@LauncherAPI
	public final byte[] getSign() {
		return Arrays.copyOf(sign, sign.length);
	}
}