Time.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpackage org.bouncycastle.asn1.cms;
241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport java.text.ParseException;
441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport java.text.SimpleDateFormat;
541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport java.util.Date;
641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport java.util.SimpleTimeZone;
741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport org.bouncycastle.asn1.ASN1Choice;
941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport org.bouncycastle.asn1.ASN1Object;
1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport org.bouncycastle.asn1.ASN1Primitive;
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport org.bouncycastle.asn1.ASN1TaggedObject;
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport org.bouncycastle.asn1.DERGeneralizedTime;
1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgimport org.bouncycastle.asn1.DERUTCTime;
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic class Time
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    extends ASN1Object
1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    implements ASN1Choice
1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org{
1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    ASN1Primitive time;
2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public static Time getInstance(
2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        ASN1TaggedObject obj,
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        boolean          explicit)
2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        return getInstance(obj.getObject());
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public Time(
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        ASN1Primitive   time)
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (!(time instanceof DERUTCTime)
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            && !(time instanceof DERGeneralizedTime))
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            throw new IllegalArgumentException("unknown object passed to Time");
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        this.time = time;
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    /**
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * creates a time object from a given date - if the date is between 1950
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * is used.
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     */
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public Time(
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        Date    date)
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        SimpleTimeZone      tz = new SimpleTimeZone(0, "Z");
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        SimpleDateFormat    dateF = new SimpleDateFormat("yyyyMMddHHmmss");
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        dateF.setTimeZone(tz);
5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        String  d = dateF.format(date) + "Z";
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        int     year = Integer.parseInt(d.substring(0, 4));
5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (year < 1950 || year > 2049)
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            time = new DERGeneralizedTime(d);
5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        else
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            time = new DERUTCTime(d.substring(2));
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public static Time getInstance(
6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        Object  obj)
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (obj == null || obj instanceof Time)
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            return (Time)obj;
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        else if (obj instanceof DERUTCTime)
7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            return new Time((DERUTCTime)obj);
7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        else if (obj instanceof DERGeneralizedTime)
7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            return new Time((DERGeneralizedTime)obj);
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public String getTime()
8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (time instanceof DERUTCTime)
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            return ((DERUTCTime)time).getAdjustedTime();
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        else
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            return ((DERGeneralizedTime)time).getTime();
9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public Date getDate()
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        try
10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {
10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            if (time instanceof DERUTCTime)
10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            {
10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                return ((DERUTCTime)time).getAdjustedDate();
10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            }
10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            else
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            {
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                return ((DERGeneralizedTime)time).getDate();
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            }
10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        catch (ParseException e)
11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        {         // this should never happen
11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            throw new IllegalStateException("invalid date string: " + e.getMessage());
11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    /**
11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * Produce an object suitable for an ASN1OutputStream.
11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * <pre>
11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * Time ::= CHOICE {
12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     *             utcTime        UTCTime,
12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     *             generalTime    GeneralizedTime }
12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     * </pre>
12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org     */
12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    public ASN1Primitive toASN1Primitive()
12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    {
12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        return time;
12741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
12841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
12941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org