1 /*
2  * @(#) $Id: Extensions.java,v 1.3 2003/07/08 08:13:53 pankaj Exp $
3  *
4  * Copyright (c) 2002-03 by Pankaj Kumar (http://www.pankaj-k.net). 
5  * All rights reserved.
6  *
7  * The license governing the use of this file can be found in the 
8  * root directory of the containing software.
9  */
10package org.jstk.pki;
11
12import java.io.IOException;
13import java.util.Vector;
14import org.jstk.asn1.*;
15
16/*
17 * Extensions := SEQUENCE SIZE (1..MAX) OF Extension
18 */
19public class Extensions extends ASN1Type {
20    private ASN1Seq extensions = new ASN1Seq();
21    static class Extension extends ASN1Seq {
22        ASN1Oid         extnID = new ASN1Oid();
23        //ASN1Boolean       critical = new ASN1Boolean();
24        ASN1OctetString extnValue = new ASN1OctetString();
25        Extension(){
26            super();
27            add(extnID);
28            //add(critical);
29            add(extnValue);
30        }
31        public String toString(){
32            StringBuffer sb = new StringBuffer();
33            sb.append("Extension-SEQ(" + extnID.toString() + ", " + extnValue.toString() + ")");
34            return sb.toString();
35        }
36    }
37    public Extensions(byte tagClass, int taggingMethod, int tagNumber){
38        super(tagClass, taggingMethod, tagNumber, 0);
39        consMask = CONSTRUCTED;
40    }
41
42    public void decode(ASN1PullParser parser) throws ASN1PullParserException, IOException {
43        int event = parser.next();
44
45        if ((event != tagNumber) || (parser.getTagClass() != tagClass)){
46            parser.prev();      //skip
47            return;
48        }
49        if (parser.next() != ASN1PullParser.START_SEQ)
50            throw new ASN1PullParserException("unexpected type");
51        length = parser.getLength();
52        while ((event = parser.next()) != ASN1PullParser.END_SEQ){
53            parser.prev();
54            Extension extension = new Extension();
55            extension.decode(parser);
56            extensions.add(extension);
57        }
58    }
59
60    public byte[] encode(){
61        logger.entering(getClass().getName(), "encode");
62        byte[] bytes = null;
63        if (extensions.size() > 0){
64            bytes = extensions.encode();
65            value = bytes;
66            length = bytes.length;
67            bytes = encode1();
68            logger.fine("extensions encoded");
69        } else {
70            logger.fine("extensions NOT encoded");
71        }
72        logger.exiting(getClass().getName(), "encode");
73        return bytes;
74    }
75
76    public String toString(){
77        StringBuffer sb = new StringBuffer();
78        sb.append("Extensions-SEQ(");
79        for (int i = 0; i < extensions.size(); i++){
80            ASN1Type elem = (ASN1Type)extensions.elementAt(i);
81            if (i > 0)
82                sb.append(", ");
83            sb.append(elem.toString());
84        }
85        sb.append(")");
86        return sb.toString();
87    }
88}
89
90