DERGeneralizedTime.java revision b61a96e7ef1a78acf013bbf08fe537e5b5f129ca
1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.text.ParseException; 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.text.SimpleDateFormat; 6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Date; 7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.SimpleTimeZone; 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/** 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Generalized time object. 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERGeneralizedTime 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam extends DERObject 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String time; 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return a generalized time from the passed in object 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERGeneralizedTime getInstance( 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof DERGeneralizedTime) 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (DERGeneralizedTime)obj; 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj instanceof ASN1OctetString) 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new DERGeneralizedTime(((ASN1OctetString)obj).getOctets()); 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return a Generalized Time object from a tagged object. 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERGeneralizedTime getInstance( 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return getInstance(obj.getObject()); 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * The correct format for this is YYYYMMDDHHMMSSZ, or without the Z 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * for local time, or Z+-HHMM on the end, for difference between local 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * time and UTC time. 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <p> 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param time the time string. 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERGeneralizedTime( 63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String time) 64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.time = time; 66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * base constructer from a java.util.date object 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERGeneralizedTime( 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Date time) 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam dateF.setTimeZone(new SimpleTimeZone(0,"Z")); 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.time = dateF.format(time); 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DERGeneralizedTime( 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes) 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // explicitly convert to characters 86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam char[] dateC = new char[bytes.length]; 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam for (int i = 0; i != dateC.length; i++) 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam dateC[i] = (char)(bytes[i] & 0xff); 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.time = new String(dateC); 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return the time - always in the form of 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm). 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <p> 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Normally in a certificate we would expect "Z" rather than "GMT", 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * however adding the "GMT" means we can just use: 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre> 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * dateF = new SimpleDateFormat("yyyyMMddHHmmssz"); 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre> 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * To read in the time and get a date which is compatible with our local 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * time zone. 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String getTime() 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // standardise the format. 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (time.charAt(time.length() - 1) == 'Z') 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return time.substring(0, time.length() - 1) + "GMT+00:00"; 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int signPos = time.length() - 5; 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam char sign = time.charAt(signPos); 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (sign == '-' || sign == '+') 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return time.substring(0, signPos) 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + "GMT" 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + time.substring(signPos, signPos + 3) 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + ":" 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + time.substring(signPos + 3); 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam signPos = time.length() - 3; 133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam sign = time.charAt(signPos); 134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (sign == '-' || sign == '+') 135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return time.substring(0, signPos) 137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + "GMT" 138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + time.substring(signPos) 139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + ":00"; 140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return time; 145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public Date getDate() 148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws ParseException 149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam SimpleDateFormat dateF; 151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (time.indexOf('.') == 14) 153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam dateF = new SimpleDateFormat("yyyyMMddHHmmss.SSS'Z'"); 155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else 157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); 159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam dateF.setTimeZone(new SimpleTimeZone(0, "Z")); 162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return dateF.parse(time); 164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private byte[] getOctets() 167b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 168b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam char[] cs = time.toCharArray(); 169b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bs = new byte[cs.length]; 170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 171b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam for (int i = 0; i != cs.length; i++) 172b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 173b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bs[i] = (byte)cs[i]; 174b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 175b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 176b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return bs; 177b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 178b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 179b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 180b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 181b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DEROutputStream out) 182b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 183b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 184b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam out.writeEncoded(GENERALIZED_TIME, this.getOctets()); 185b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 186b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 187b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public boolean equals( 188b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object o) 189b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 190b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if ((o == null) || !(o instanceof DERGeneralizedTime)) 191b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 192b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 193b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 194b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 195b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return time.equals(((DERGeneralizedTime)o).time); 196b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 197b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 198b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 199b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 200b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return time.hashCode(); 201b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 202b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 203