org.bouncycastle.bcpg.SignatureSubpacket.java Source code

Java tutorial

Introduction

Here is the source code for org.bouncycastle.bcpg.SignatureSubpacket.java

Source

package org.bouncycastle.bcpg;

import java.io.IOException;
import java.io.OutputStream;

/**
 * Basic type for a PGP Signature sub-packet.
 */
public class SignatureSubpacket {
    int type;
    boolean critical;
    boolean isLongLength;
    protected byte[] data;

    protected SignatureSubpacket(int type, boolean critical, boolean isLongLength, byte[] data) {
        this.type = type;
        this.critical = critical;
        this.isLongLength = isLongLength;
        this.data = data;
    }

    public int getType() {
        return type;
    }

    public boolean isCritical() {
        return critical;
    }

    public boolean isLongLength() {
        return isLongLength;
    }

    /**
     * return the generic data making up the packet.
     */
    public byte[] getData() {
        return data;
    }

    public void encode(OutputStream out) throws IOException {
        int bodyLen = data.length + 1;

        if (isLongLength) {
            out.write(0xff);
            out.write((byte) (bodyLen >> 24));
            out.write((byte) (bodyLen >> 16));
            out.write((byte) (bodyLen >> 8));
            out.write((byte) bodyLen);
        } else {
            if (bodyLen < 192) {
                out.write((byte) bodyLen);
            } else if (bodyLen <= 8383) {
                bodyLen -= 192;

                out.write((byte) (((bodyLen >> 8) & 0xff) + 192));
                out.write((byte) bodyLen);
            } else {
                out.write(0xff);
                out.write((byte) (bodyLen >> 24));
                out.write((byte) (bodyLen >> 16));
                out.write((byte) (bodyLen >> 8));
                out.write((byte) bodyLen);
            }
        }

        if (critical) {
            out.write(0x80 | type);
        } else {
            out.write(type);
        }

        out.write(data);
    }
}