1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 20 package org.apache.harmony.security.x509.tsp; 21 22 import java.math.BigInteger; 23 24 import org.apache.harmony.security.asn1.ASN1Boolean; 25 import org.apache.harmony.security.asn1.ASN1Implicit; 26 import org.apache.harmony.security.asn1.ASN1Integer; 27 import org.apache.harmony.security.asn1.ASN1Oid; 28 import org.apache.harmony.security.asn1.ASN1Sequence; 29 import org.apache.harmony.security.asn1.ASN1Type; 30 import org.apache.harmony.security.asn1.BerInputStream; 31 import org.apache.harmony.security.asn1.ObjectIdentifier; 32 import org.apache.harmony.security.x509.Extensions; 33 34 /** 35 * As defined in Time-Stamp Protocol (TSP) 36 * (http://www.ietf.org/rfc/rfc3161.txt) 37 * 38 * TimeStampReq ::= SEQUENCE { 39 * version INTEGER { v1(1) }, 40 * messageImprint MessageImprint, 41 * --a hash algorithm OID and the hash value of the data to be 42 * --time-stamped 43 * reqPolicy TSAPolicyId OPTIONAL, 44 * nonce INTEGER OPTIONAL, 45 * certReq BOOLEAN DEFAULT FALSE, 46 * extensions [0] IMPLICIT Extensions OPTIONAL 47 * } 48 * 49 * TSAPolicyId ::= OBJECT IDENTIFIER 50 */ 51 public class TimeStampReq { 52 private final int version; 53 54 private final MessageImprint messageImprint; 55 56 private final String reqPolicy; 57 58 private final BigInteger nonce; 59 60 private final Boolean certReq; 61 62 private final Extensions extensions; 63 64 private byte [] encoding; 65 66 public TimeStampReq(int version, MessageImprint messageImprint, 67 String reqPolicy, BigInteger nonce, Boolean certReq, 68 Extensions extensions) { 69 this.version = version; 70 this.messageImprint = messageImprint; 71 this.reqPolicy = reqPolicy; 72 this.nonce = nonce; 73 this.certReq = certReq; 74 this.extensions = extensions; 75 } 76 77 private TimeStampReq(int version, MessageImprint messageImprint, 78 String reqPolicy, BigInteger nonce, Boolean certReq, 79 Extensions extensions, byte [] encoding) { 80 this (version, messageImprint, reqPolicy, nonce, certReq, extensions); 81 this.encoding = encoding; 82 } 83 84 public String toString() { 85 StringBuilder res = new StringBuilder(); 86 res.append("-- TimeStampReq:"); 87 res.append("\nversion : "); 88 res.append(version); 89 res.append("\nmessageImprint: "); 90 res.append(messageImprint); 91 res.append("\nreqPolicy: "); 92 res.append(reqPolicy); 93 res.append("\nnonce: "); 94 res.append(nonce); 95 res.append("\ncertReq: "); 96 res.append(certReq); 97 res.append("\nextensions: "); 98 res.append(extensions); 99 res.append("\n-- TimeStampReq End\n"); 100 return res.toString(); 101 } 102 103 /** 104 * Returns ASN.1 encoded form of this TimeStampReq. 105 * @return a byte array containing ASN.1 encoded form. 106 */ 107 public byte [] getEncoded(){ 108 if (encoding == null) { 109 encoding = ASN1.encode(this); 110 } 111 return encoding; 112 } 113 114 /** 115 * @return Returns the certReq. 116 */ 117 public Boolean getCertReq() { 118 return certReq; 119 } 120 121 /** 122 * @return Returns the extensions. 123 */ 124 public Extensions getExtensions() { 125 return extensions; 126 } 127 128 /** 129 * @return Returns the messageImprint. 130 */ 131 public MessageImprint getMessageImprint() { 132 return messageImprint; 133 } 134 135 /** 136 * @return Returns the nonce. 137 */ 138 public BigInteger getNonce() { 139 return nonce; 140 } 141 142 /** 143 * @return Returns the reqPolicy. 144 */ 145 public String getReqPolicy() { 146 return reqPolicy; 147 } 148 149 /** 150 * @return Returns the version. 151 */ 152 public int getVersion() { 153 return version; 154 } 155 156 public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] { 157 ASN1Integer.getInstance(), // version 158 MessageImprint.ASN1, // messageImprint 159 ASN1Oid.getInstance(), // reqPolicy 160 ASN1Integer.getInstance(), // nonce 161 ASN1Boolean.getInstance(), // certReq 162 new ASN1Implicit(0, Extensions.ASN1)}) {// extensions 163 164 { 165 setDefault(Boolean.FALSE, 4); 166 setOptional(2); 167 setOptional(3); 168 setOptional(5); 169 } 170 171 protected Object getDecodedObject(BerInputStream in) { 172 Object[] values = (Object[]) in.content; 173 174 String objID = (values[2] == null) ? null : ObjectIdentifier 175 .toString((int[]) values[2]); 176 BigInteger nonce = (values[3] == null) ? null : new BigInteger( 177 (byte[]) values[3]); 178 179 if (values[5] == null) { 180 return new TimeStampReq( 181 ASN1Integer.toIntValue(values[0]), 182 (MessageImprint) values[1], 183 objID, 184 nonce, 185 (Boolean) values[4], 186 null, 187 in.getEncoded() 188 ); 189 } else { 190 return new TimeStampReq( 191 ASN1Integer.toIntValue(values[0]), 192 (MessageImprint) values[1], 193 objID, 194 nonce, 195 (Boolean) values[4], 196 (Extensions) values[5], 197 in.getEncoded() 198 ); 199 } 200 } 201 202 protected void getValues(Object object, Object[] values) { 203 TimeStampReq req = (TimeStampReq) object; 204 values[0] = ASN1Integer.fromIntValue(req.version); 205 values[1] = req.messageImprint; 206 values[2] = (req.reqPolicy == null) ? null : ObjectIdentifier 207 .toIntArray(req.reqPolicy); 208 values[3] = (req.nonce == null) ? null : req.nonce.toByteArray(); 209 values[4] = (req.certReq == null) ? Boolean.FALSE : req.certReq; 210 values[5] = req.extensions; 211 } 212 }; 213 214 } 215 216