com.novosec.pkix.asn1.cmp.PKIHeader.java Source code

Java tutorial

Introduction

Here is the source code for com.novosec.pkix.asn1.cmp.PKIHeader.java

Source

// CMP implementation copyright (c) 2003 NOVOSEC AG (http://www.novosec.com)
//
// Author: Maik Stohn
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this 
// software and associated documentation files (the "Software"), to deal in the Software 
// without restriction, including without limitation the rights to use, copy, modify, merge, 
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
// to whom the Software is furnished to do so, subject to the following conditions: 
//
// The above copyright notice and this permission notice shall be included in all copies or 
// substantial portions of the Software. 
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

package com.novosec.pkix.asn1.cmp;

import java.util.Enumeration;
import java.util.Vector;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DEREncodable;
import org.bouncycastle.asn1.DERGeneralizedTime;
import org.bouncycastle.asn1.DERInteger;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.GeneralName;

/**
 * ASN.1 structure DER En/DeCoder.
 *
 * <pre>
 *  PKIHeader ::= SEQUENCE {
 *      pvno                INTEGER     { ietf-version2 (1) },
 *      sender              GeneralName,                        -- identifies the sender
 *      recipient           GeneralName,                        -- identifies the intended recipient
 *      messageTime     [0] GeneralizedTime         OPTIONAL,   -- time of production of this message
 *      protectionAlg   [1] AlgorithmIdentifier     OPTIONAL,   -- algorithm used for calculation of protection bits
 *      senderKID       [2] KeyIdentifier           OPTIONAL,   -- (OCTET STRING)
 *      recipKID        [3] KeyIdentifier           OPTIONAL,   -- (OCTET STRING) to identify specific keys used for protection
 *      transactionID   [4] OCTET STRING            OPTIONAL,   -- identifies the transaction; i.e., this will be the same in corresponding request, response and confirmation messages
 *      senderNonce     [5] OCTET STRING            OPTIONAL,
 *      recipNonce      [6] OCTET STRING            OPTIONAL,   -- nonces used to provide replay protection, senderNonce is inserted by the creator of this message; recipNonce is a nonce previously inserted in a related message by the intended recipient of this message
 *      freeText        [7] PKIFreeText             OPTIONAL,   -- this may be used to indicate context-specific instructions (this field is intended for human consumption)
 *      generalInfo     [8] SEQUENCE SIZE (1..MAX) OF
 *                             InfoTypeAndValue     OPTIONAL    -- this may be used to convey context-specific information (this field not primarily intended for human consumption)
 *  }     
 *
 * </pre>
 */
public class PKIHeader implements DEREncodable {
    DERInteger pvno;
    GeneralName sender;
    GeneralName recipient;
    DERGeneralizedTime messageTime;
    AlgorithmIdentifier protectionAlg;
    DEROctetString senderKID;
    DEROctetString recipKID;
    DEROctetString transactionID;
    DEROctetString senderNonce;
    DEROctetString recipNonce;
    PKIFreeText freeText;
    Vector generalInfos = new Vector();

    public static PKIHeader getInstance(ASN1TaggedObject obj, boolean explicit) {
        return getInstance(ASN1Sequence.getInstance(obj, explicit));
    }

    public static PKIHeader getInstance(Object obj) {
        if (obj instanceof PKIHeader) {
            return (PKIHeader) obj;
        } else if (obj instanceof ASN1Sequence) {
            return new PKIHeader((ASN1Sequence) obj);
        }

        throw new IllegalArgumentException("unknown object in factory");
    }

    public PKIHeader(ASN1Sequence seq) {
        Enumeration e = seq.getObjects();

        pvno = DERInteger.getInstance(e.nextElement());
        sender = GeneralName.getInstance(e.nextElement());
        recipient = GeneralName.getInstance(e.nextElement());

        while (e.hasMoreElements()) {
            ASN1TaggedObject tagObj = (ASN1TaggedObject) e.nextElement();

            switch (tagObj.getTagNo()) {
            case 0:
                messageTime = DERGeneralizedTime.getInstance(tagObj.getObject());
                break;
            case 1:
                protectionAlg = AlgorithmIdentifier.getInstance(tagObj.getObject());
                break;
            case 2:
                senderKID = (DEROctetString) DEROctetString.getInstance(tagObj);
                break;
            case 3:
                recipKID = (DEROctetString) DEROctetString.getInstance(tagObj);
                break;
            case 4:
                transactionID = (DEROctetString) DEROctetString.getInstance(tagObj);
                break;
            case 5:
                senderNonce = (DEROctetString) DEROctetString.getInstance(tagObj);
                break;
            case 6:
                recipNonce = (DEROctetString) DEROctetString.getInstance(tagObj);
                break;
            case 7:
                freeText = PKIFreeText.getInstance(tagObj.getObject());
                break;
            case 8:
                ASN1Sequence s = (ASN1Sequence) tagObj.getObject();
                for (int i = 0; i < s.size(); i++) {
                    generalInfos.addElement(InfoTypeAndValue.getInstance(s.getObjectAt(i)));
                }
                break;
            }
        }
    }

    public PKIHeader(DERInteger pvno, GeneralName sender, GeneralName recipient) {
        this.pvno = pvno;
        this.sender = sender;
        this.recipient = recipient;
    }

    public DERInteger getPvno() {
        return pvno;
    }

    public GeneralName getSender() {
        return sender;
    }

    public GeneralName getRecipient() {
        return recipient;
    }

    public void setMessageTime(DERGeneralizedTime messageTime) {
        this.messageTime = messageTime;
    }

    public DERGeneralizedTime getMessageTime() {
        return messageTime;
    }

    public void setProtectionAlg(AlgorithmIdentifier protectionAlg) {
        this.protectionAlg = protectionAlg;
    }

    public AlgorithmIdentifier getProtectionAlg() {
        return protectionAlg;
    }

    public void setSenderKID(DEROctetString senderKID) {
        this.senderKID = senderKID;
    }

    public DEROctetString getSenderKID() {
        return senderKID;
    }

    public void setRecipKID(DEROctetString recipKID) {
        this.recipKID = recipKID;
    }

    public DEROctetString getRecipKID() {
        return recipKID;
    }

    public void setTransactionID(DEROctetString transactionID) {
        this.transactionID = transactionID;
    }

    public DEROctetString getTransactionID() {
        return transactionID;
    }

    public void setSenderNonce(DEROctetString senderNonce) {
        this.senderNonce = senderNonce;
    }

    public DEROctetString getSenderNonce() {
        return senderNonce;
    }

    public void setRecipNonce(DEROctetString recipNonce) {
        this.recipNonce = recipNonce;
    }

    public DEROctetString getRecipNonce() {
        return recipNonce;
    }

    public void setFreeText(PKIFreeText freeText) {
        this.freeText = freeText;
    }

    public PKIFreeText getFreeText() {
        return freeText;
    }

    public void addGeneralInfo(InfoTypeAndValue generalInfo) {
        this.generalInfos.addElement(generalInfo);
    }

    public InfoTypeAndValue getGeneralInfo(int nr) {
        if (generalInfos.size() > nr) {
            return (InfoTypeAndValue) generalInfos.elementAt(nr);
        }

        return null;
    }

    public DERObject getDERObject() {
        ASN1EncodableVector v = new ASN1EncodableVector();

        v.add(pvno);
        v.add(sender);
        v.add(recipient);

        if (messageTime != null) {
            v.add(new DERTaggedObject(true, 0, messageTime));
        }

        if (protectionAlg != null) {
            v.add(new DERTaggedObject(true, 1, protectionAlg));
        }

        if (senderKID != null) {
            v.add(new DERTaggedObject(true, 2, senderKID));
        }

        if (recipKID != null) {
            v.add(new DERTaggedObject(true, 3, recipKID));
        }

        if (transactionID != null) {
            v.add(new DERTaggedObject(true, 4, transactionID));
        }

        if (senderNonce != null) {
            v.add(new DERTaggedObject(true, 5, senderNonce));
        }

        if (recipNonce != null) {
            v.add(new DERTaggedObject(true, 6, recipNonce));
        }

        if (freeText != null) {
            v.add(new DERTaggedObject(true, 7, freeText));
        }

        if (generalInfos.size() > 0) {
            ASN1EncodableVector giv = new ASN1EncodableVector();

            for (int i = 0; i < generalInfos.size(); i++) {
                giv.add((InfoTypeAndValue) generalInfos.elementAt(i));
            }

            v.add(new DERTaggedObject(true, 8, new DERSequence(giv)));
        }

        return new DERSequence(v);
    }

    public String toString() {
        String s = "PKIHeader: ( pvno: " + pvno + ", sender: " + sender + ", recipient: " + recipient + ", ";

        if (messageTime != null) {
            s += "messageTime: " + messageTime + ", ";
        }

        if (protectionAlg != null) {
            s += "protectionAlg: " + protectionAlg + ", ";
        }

        if (senderKID != null) {
            s += "senderKID: " + senderKID + ", ";
        }

        if (recipKID != null) {
            s += "recipKID: " + recipKID + ", ";
        }

        if (transactionID != null) {
            s += "transactionID: " + transactionID + ", ";
        }

        if (senderNonce != null) {
            s += "senderNonce: " + senderNonce + ", ";
        }

        if (recipNonce != null) {
            s += "recipNonce: " + recipNonce + ", ";
        }

        if (freeText != null) {
            s += "freeText: " + freeText + ", ";
        }

        if (generalInfos.size() > 0) {
            s += "generalInfo: (";
            for (int i = 0; i < generalInfos.size(); i++) {
                s += generalInfos.elementAt(i) + ", ";
            }
            s += ")";
        }

        return s;
    }
}