DERUTCTime.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:4k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1;
  2. import java.io.*;
  3. import java.util.*;
  4. import java.io.*;
  5. import java.text.*;
  6. /**
  7.  * UTC time object.
  8.  */
  9. public class DERUTCTime
  10.     extends DERObject
  11. {
  12.     String      time;
  13.     /**
  14.      * return an UTC Time from the passed in object.
  15.      *
  16.      * @exception IllegalArgumentException if the object cannot be converted.
  17.      */
  18.     public static DERUTCTime getInstance(
  19.         Object  obj)
  20.     {
  21.         if (obj == null || obj instanceof DERUTCTime)
  22.         {
  23.             return (DERUTCTime)obj;
  24.         }
  25.         if (obj instanceof ASN1OctetString)
  26.         {
  27.             return new DERUTCTime(((ASN1OctetString)obj).getOctets());
  28.         }
  29.         throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
  30.     }
  31.     /**
  32.      * return an UTC Time from a tagged object.
  33.      *
  34.      * @param obj the tagged object holding the object we want
  35.      * @param explicit true if the object is meant to be explicitly
  36.      *              tagged false otherwise.
  37.      * @exception IllegalArgumentException if the tagged object cannot
  38.      *               be converted.
  39.      */
  40.     public static DERUTCTime getInstance(
  41.         ASN1TaggedObject obj,
  42.         boolean          explicit)
  43.     {
  44.         return getInstance(obj.getObject());
  45.     }
  46.     
  47.     /**
  48.      * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were
  49.      * never encoded. When you're creating one of these objects from scratch, that's
  50.      * what you want to use, otherwise we'll try to deal with whatever gets read from
  51.      * the input stream... (this is why the input format is different from the getTime()
  52.      * method output).
  53.      * <p>
  54.      *
  55.      * @param time the time string.
  56.      */
  57.     public DERUTCTime(
  58.         String  time)
  59.     {
  60.         this.time = time;
  61.     }
  62.     /**
  63.      * base constructer from a java.util.date object
  64.      */
  65.     public DERUTCTime(
  66.        Date time)
  67.     {
  68.         SimpleDateFormat dateF = new SimpleDateFormat("yyMMddHHmmss'Z'");
  69.         dateF.setTimeZone(new SimpleTimeZone(0,"Z"));
  70.         this.time = dateF.format(time);
  71.     }
  72.     DERUTCTime(
  73.         byte[]  bytes)
  74.     {
  75.         //
  76.         // explicitly convert to characters
  77.         //
  78.         char[]  dateC = new char[bytes.length];
  79.         for (int i = 0; i != dateC.length; i++)
  80.         {
  81.             dateC[i] = (char)(bytes[i] & 0xff);
  82.         }
  83.         this.time = new String(dateC);
  84.     }
  85.     /**
  86.      * return the time - always in the form of 
  87.      *  YYMMDDhhmmssGMT(+hh:mm|-hh:mm).
  88.      * <p>
  89.      * Normally in a certificate we would expect "Z" rather than "GMT",
  90.      * however adding the "GMT" means we can just use:
  91.      * <pre>
  92.      *     dateF = new SimpleDateFormat("yyMMddHHmmssz");
  93.      * </pre>
  94.      * To read in the time and get a date which is compatible with our local
  95.      * time zone.
  96.      * <p>
  97.      * <b>Note:</b> In some cases, due to the local date processing, this
  98.      * may lead to unexpected results. If you want to stick the normal
  99.      * convention of 1950 to 2049 use the getAdjustedTime() method.
  100.      */
  101.     public String getTime()
  102.     {
  103.         //
  104.         // standardise the format.
  105.         //
  106.         if (time.length() == 11)
  107.         {
  108.             return time.substring(0, 10) + "00GMT+00:00";
  109.         }
  110.         else if (time.length() == 13)
  111.         {
  112.             return time.substring(0, 12) + "GMT+00:00";
  113.         }
  114.         else if (time.length() == 17)
  115.         {
  116.             return time.substring(0, 12) + "GMT" + time.substring(12, 15) + ":" + time.substring(15, 17);
  117.         }
  118.         return time;
  119.     }
  120.     /**
  121.      * return the time as an adjusted date with a 4 digit year. This goes
  122.      * in the range of 1950 - 2049.
  123.      */
  124.     public String getAdjustedTime()
  125.     {
  126.         String   d = this.getTime();
  127.         if (d.charAt(0) < '5')
  128.         {
  129.             return "20" + d;
  130.         }
  131.         else
  132.         {
  133.             return "19" + d;
  134.         }
  135.     }
  136.     private byte[] getOctets()
  137.     {
  138.         char[]  cs = time.toCharArray();
  139.         byte[]  bs = new byte[cs.length];
  140.         for (int i = 0; i != cs.length; i++)
  141.         {
  142.             bs[i] = (byte)cs[i];
  143.         }
  144.         return bs;
  145.     }
  146.     void encode(
  147.         DEROutputStream  out)
  148.         throws IOException
  149.     {
  150.         out.writeEncoded(UTC_TIME, this.getOctets());
  151.     }
  152.     
  153.     public boolean equals(
  154.         Object  o)
  155.     {
  156.         if ((o == null) || !(o instanceof DERUTCTime))
  157.         {
  158.             return false;
  159.         }
  160.         return time.equals(((DERUTCTime)o).time);
  161.     }
  162. }