1package org.bouncycastle.asn1.x509; 2 3import org.bouncycastle.asn1.ASN1Choice; 4import org.bouncycastle.asn1.ASN1Encodable; 5import org.bouncycastle.asn1.ASN1TaggedObject; 6import org.bouncycastle.asn1.DERGeneralizedTime; 7import org.bouncycastle.asn1.DERObject; 8import org.bouncycastle.asn1.DERUTCTime; 9 10import java.text.ParseException; 11import java.text.SimpleDateFormat; 12import java.util.Date; 13import java.util.SimpleTimeZone; 14 15public class Time 16 extends ASN1Encodable 17 implements ASN1Choice 18{ 19 DERObject time; 20 21 public static Time getInstance( 22 ASN1TaggedObject obj, 23 boolean explicit) 24 { 25 return getInstance(obj.getObject()); // must be explicitly tagged 26 } 27 28 public Time( 29 DERObject time) 30 { 31 if (!(time instanceof DERUTCTime) 32 && !(time instanceof DERGeneralizedTime)) 33 { 34 throw new IllegalArgumentException("unknown object passed to Time"); 35 } 36 37 this.time = time; 38 } 39 40 /** 41 * creates a time object from a given date - if the date is between 1950 42 * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime 43 * is used. 44 */ 45 public Time( 46 Date date) 47 { 48 SimpleTimeZone tz = new SimpleTimeZone(0, "Z"); 49 SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss"); 50 51 dateF.setTimeZone(tz); 52 53 String d = dateF.format(date) + "Z"; 54 int year = Integer.parseInt(d.substring(0, 4)); 55 56 if (year < 1950 || year > 2049) 57 { 58 time = new DERGeneralizedTime(d); 59 } 60 else 61 { 62 time = new DERUTCTime(d.substring(2)); 63 } 64 } 65 66 public static Time getInstance( 67 Object obj) 68 { 69 if (obj == null || obj instanceof Time) 70 { 71 return (Time)obj; 72 } 73 else if (obj instanceof DERUTCTime) 74 { 75 return new Time((DERUTCTime)obj); 76 } 77 else if (obj instanceof DERGeneralizedTime) 78 { 79 return new Time((DERGeneralizedTime)obj); 80 } 81 82 throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); 83 } 84 85 public String getTime() 86 { 87 if (time instanceof DERUTCTime) 88 { 89 return ((DERUTCTime)time).getAdjustedTime(); 90 } 91 else 92 { 93 return ((DERGeneralizedTime)time).getTime(); 94 } 95 } 96 97 public Date getDate() 98 { 99 try 100 { 101 if (time instanceof DERUTCTime) 102 { 103 return ((DERUTCTime)time).getAdjustedDate(); 104 } 105 else 106 { 107 return ((DERGeneralizedTime)time).getDate(); 108 } 109 } 110 catch (ParseException e) 111 { // this should never happen 112 throw new IllegalStateException("invalid date string: " + e.getMessage()); 113 } 114 } 115 116 /** 117 * Produce an object suitable for an ASN1OutputStream. 118 * <pre> 119 * Time ::= CHOICE { 120 * utcTime UTCTime, 121 * generalTime GeneralizedTime } 122 * </pre> 123 */ 124 public DERObject toASN1Object() 125 { 126 return time; 127 } 128 129 public String toString() 130 { 131 return getTime(); 132 } 133} 134