resolve darcs stupidity
[org.ibex.core.git] / src / org / bouncycastle / asn1 / DERUTCTime.java
index 061bf54..0be2a44 100644 (file)
@@ -1,8 +1,8 @@
 package org.bouncycastle.asn1;
 
-import java.io.*;
 import java.util.*;
 import java.io.*;
+import java.text.*;
 
 /**
  * UTC time object.
@@ -13,21 +13,49 @@ public class DERUTCTime
     String      time;
 
     /**
+     * return an UTC Time from the passed in object.
+     *
+     * @exception IllegalArgumentException if the object cannot be converted.
+     */
+    public static DERUTCTime getInstance(
+        Object  obj)
+    {
+        if (obj == null || obj instanceof DERUTCTime)
+        {
+            return (DERUTCTime)obj;
+        }
+
+        if (obj instanceof ASN1OctetString)
+        {
+            return new DERUTCTime(((ASN1OctetString)obj).getOctets());
+        }
+
+        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+    }
+
+    /**
+     * return an UTC Time from a tagged object.
+     *
+     * @param obj the tagged object holding the object we want
+     * @param explicit true if the object is meant to be explicitly
+     *              tagged false otherwise.
+     * @exception IllegalArgumentException if the tagged object cannot
+     *               be converted.
+     */
+    public static DERUTCTime getInstance(
+        ASN1TaggedObject obj,
+        boolean          explicit)
+    {
+        return getInstance(obj.getObject());
+    }
+    
+    /**
      * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were
      * never encoded. When you're creating one of these objects from scratch, that's
      * what you want to use, otherwise we'll try to deal with whatever gets read from
      * the input stream... (this is why the input format is different from the getTime()
      * method output).
      * <p>
-     * You can generate a Java date string in the right format by using:
-     * <pre>
-     *      dateF = new SimpleDateFormat("yyMMddHHmmss");
-     *      tz = new SimpleTimeZone(0, "Z");
-     *     
-     *      dateF.setTimeZone(tz);
-     *
-     *      utcTime = new DERUTCTime(dateF.format(new Date()) + "Z");
-     * </pre>
      *
      * @param time the time string.
      */
@@ -38,6 +66,35 @@ public class DERUTCTime
     }
 
     /**
+     * base constructer from a java.util.date object
+     */
+    public DERUTCTime(
+       Date time)
+    {
+        SimpleDateFormat dateF = new SimpleDateFormat("yyMMddHHmmss'Z'");
+
+        dateF.setTimeZone(new SimpleTimeZone(0,"Z"));
+
+        this.time = dateF.format(time);
+    }
+
+    DERUTCTime(
+        byte[]  bytes)
+    {
+        //
+        // explicitly convert to characters
+        //
+        char[]  dateC = new char[bytes.length];
+
+        for (int i = 0; i != dateC.length; i++)
+        {
+            dateC[i] = (char)(bytes[i] & 0xff);
+        }
+
+        this.time = new String(dateC);
+    }
+
+    /**
      * return the time - always in the form of 
      *  YYMMDDhhmmssGMT(+hh:mm|-hh:mm).
      * <p>
@@ -48,6 +105,10 @@ public class DERUTCTime
      * </pre>
      * To read in the time and get a date which is compatible with our local
      * time zone.
+     * <p>
+     * <b>Note:</b> In some cases, due to the local date processing, this
+     * may lead to unexpected results. If you want to stick the normal
+     * convention of 1950 to 2049 use the getAdjustedTime() method.
      */
     public String getTime()
     {
@@ -70,10 +131,52 @@ public class DERUTCTime
         return time;
     }
 
+    /**
+     * return the time as an adjusted date with a 4 digit year. This goes
+     * in the range of 1950 - 2049.
+     */
+    public String getAdjustedTime()
+    {
+        String   d = this.getTime();
+
+        if (d.charAt(0) < '5')
+        {
+            return "20" + d;
+        }
+        else
+        {
+            return "19" + d;
+        }
+    }
+
+    private byte[] getOctets()
+    {
+        char[]  cs = time.toCharArray();
+        byte[]  bs = new byte[cs.length];
+
+        for (int i = 0; i != cs.length; i++)
+        {
+            bs[i] = (byte)cs[i];
+        }
+
+        return bs;
+    }
+
     void encode(
         DEROutputStream  out)
         throws IOException
     {
-        out.writeEncoded(UTC_TIME, time.getBytes());
+        out.writeEncoded(UTC_TIME, this.getOctets());
+    }
+    
+    public boolean equals(
+        Object  o)
+    {
+        if ((o == null) || !(o instanceof DERUTCTime))
+        {
+            return false;
+        }
+
+        return time.equals(((DERUTCTime)o).time);
     }
 }