org.bouncycastle.asn1.DERGeneralizedTime Maven / Gradle / Ivy
Show all versions of bcprov-jdk15to18 Show documentation
package org.bouncycastle.asn1;
import java.io.IOException;
import java.util.Date;
import org.bouncycastle.util.Strings;
/**
* DER Generalized time object.
* 11: Restrictions on BER employed by both CER and DER
* 11.7 GeneralizedTime
*
* 11.7.1 The encoding shall terminate with a "Z",
* as described in the ITU-T Rec. X.680 | ISO/IEC 8824-1 clause on
* GeneralizedTime.
*
* 11.7.2 The seconds element shall always be present.
*
*
* 11.7.3 The fractional-seconds elements, if present,
* shall omit all trailing zeros; if the elements correspond to 0,
* they shall be wholly omitted, and the decimal point element also
* shall be omitted.
*/
public class DERGeneralizedTime
extends ASN1GeneralizedTime
{
public DERGeneralizedTime(byte[] time)
{
super(time);
}
public DERGeneralizedTime(Date time)
{
super(time);
}
public DERGeneralizedTime(String time)
{
super(time);
}
private byte[] getDERTime()
{
if (time[time.length - 1] == 'Z')
{
if (!hasMinutes())
{
byte[] derTime = new byte[time.length + 4];
System.arraycopy(time, 0, derTime, 0, time.length - 1);
System.arraycopy(Strings.toByteArray("0000Z"), 0, derTime, time.length - 1, 5);
return derTime;
}
else if (!hasSeconds())
{
byte[] derTime = new byte[time.length + 2];
System.arraycopy(time, 0, derTime, 0, time.length - 1);
System.arraycopy(Strings.toByteArray("00Z"), 0, derTime, time.length - 1, 3);
return derTime;
}
else if (hasFractionalSeconds())
{
int ind = time.length - 2;
while (ind > 0 && time[ind] == '0')
{
ind--;
}
if (time[ind] == '.')
{
byte[] derTime = new byte[ind + 1];
System.arraycopy(time, 0, derTime, 0, ind);
derTime[ind] = (byte)'Z';
return derTime;
}
else
{
byte[] derTime = new byte[ind + 2];
System.arraycopy(time, 0, derTime, 0, ind + 1);
derTime[ind + 1] = (byte)'Z';
return derTime;
}
}
else
{
return time;
}
}
else
{
return time; // TODO: is there a better way?
}
}
int encodedLength()
{
int length = getDERTime().length;
return 1 + StreamUtil.calculateBodyLength(length) + length;
}
void encode(ASN1OutputStream out, boolean withTag) throws IOException
{
out.writeEncoded(withTag, BERTags.GENERALIZED_TIME, getDERTime());
}
ASN1Primitive toDERObject()
{
return this;
}
ASN1Primitive toDLObject()
{
return this;
}
}