package io.airlift.airship.coordinator.auth.ssh; import com.google.common.base.Throwables; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigInteger; public class DerWriter { private final ByteArrayOutputStream out = new ByteArrayOutputStream(); public DerWriter writeEntry(DerType tag, byte[] data) { try { out.write(tag.getValue()); writeLength(data.length); out.write(data); return this; } catch (IOException e) { throw Throwables.propagate(e); } } public DerWriter writeInteger(BigInteger data) { return writeInteger(data.toByteArray()); } public DerWriter writeInteger(byte[] data) { return writeEntry(DerType.INTEGER, data); } public byte[] toByteArray() { return out.toByteArray(); } private void writeLength(int length) { if (length < (1 << 7) && length >= 0) { // single byte (no length) out.write((byte) length); } else if (length < (1 << 8) && length > 0) { // length + one byte number out.write((byte) 0x81); out.write((byte) length); } else if (length < (1 << 16) && length > 0) { // length + two byte number out.write((byte) 0x82); out.write((byte) (length >>> 8)); out.write((byte) length); } else if (length < (1 << 24) && length > 0) { // length + three byte number out.write((byte) 0x83); out.write((byte) (length >>> 16)); out.write((byte) (length >>> 8)); out.write((byte) length); } else { // length + four byte number out.write((byte) 0x84); out.write((byte) (length >>> 24)); out.write((byte) (length >>> 16)); out.write((byte) (length >>> 8)); out.write((byte) length); } } }