blob: dfee3c76396714b04da0b3fd9b2ee42e71e0141c [file] [log] [blame]
package org.bouncycastle.asn1.icao;
import java.util.Enumeration;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
/**
* The LDSSecurityObject object (V1.8).
* <pre>
* LDSSecurityObject ::= SEQUENCE {
* version LDSSecurityObjectVersion,
* hashAlgorithm DigestAlgorithmIdentifier,
* dataGroupHashValues SEQUENCE SIZE (2..ub-DataGroups) OF DataHashGroup,
* ldsVersionInfo LDSVersionInfo OPTIONAL
* -- if present, version MUST be v1 }
*
* DigestAlgorithmIdentifier ::= AlgorithmIdentifier,
*
* LDSSecurityObjectVersion :: INTEGER {V0(0)}
* </pre>
*/
public class LDSSecurityObject
extends ASN1Object
implements ICAOObjectIdentifiers
{
public static final int ub_DataGroups = 16;
private ASN1Integer version = new ASN1Integer(0);
private AlgorithmIdentifier digestAlgorithmIdentifier;
private DataGroupHash[] datagroupHash;
private LDSVersionInfo versionInfo;
public static LDSSecurityObject getInstance(
Object obj)
{
if (obj instanceof LDSSecurityObject)
{
return (LDSSecurityObject)obj;
}
else if (obj != null)
{
return new LDSSecurityObject(ASN1Sequence.getInstance(obj));
}
return null;
}
private LDSSecurityObject(
ASN1Sequence seq)
{
if (seq == null || seq.size() == 0)
{
throw new IllegalArgumentException("null or empty sequence passed.");
}
Enumeration e = seq.getObjects();
// version
version = ASN1Integer.getInstance(e.nextElement());
// digestAlgorithmIdentifier
digestAlgorithmIdentifier = AlgorithmIdentifier.getInstance(e.nextElement());
ASN1Sequence datagroupHashSeq = ASN1Sequence.getInstance(e.nextElement());
if (version.getValue().intValue() == 1)
{
versionInfo = LDSVersionInfo.getInstance(e.nextElement());
}
checkDatagroupHashSeqSize(datagroupHashSeq.size());
datagroupHash = new DataGroupHash[datagroupHashSeq.size()];
for (int i = 0; i < datagroupHashSeq.size(); i++)
{
datagroupHash[i] = DataGroupHash.getInstance(datagroupHashSeq.getObjectAt(i));
}
}
public LDSSecurityObject(
AlgorithmIdentifier digestAlgorithmIdentifier,
DataGroupHash[] datagroupHash)
{
this.version = new ASN1Integer(0);
this.digestAlgorithmIdentifier = digestAlgorithmIdentifier;
this.datagroupHash = copy(datagroupHash);
checkDatagroupHashSeqSize(datagroupHash.length);
}
public LDSSecurityObject(
AlgorithmIdentifier digestAlgorithmIdentifier,
DataGroupHash[] datagroupHash,
LDSVersionInfo versionInfo)
{
this.version = new ASN1Integer(1);
this.digestAlgorithmIdentifier = digestAlgorithmIdentifier;
this.datagroupHash = copy(datagroupHash);
this.versionInfo = versionInfo;
checkDatagroupHashSeqSize(datagroupHash.length);
}
private void checkDatagroupHashSeqSize(int size)
{
if ((size < 2) || (size > ub_DataGroups))
{
throw new IllegalArgumentException("wrong size in DataGroupHashValues : not in (2.." + ub_DataGroups + ")");
}
}
public int getVersion()
{
return version.getValue().intValue();
}
public AlgorithmIdentifier getDigestAlgorithmIdentifier()
{
return digestAlgorithmIdentifier;
}
public DataGroupHash[] getDatagroupHash()
{
return copy(datagroupHash);
}
public LDSVersionInfo getVersionInfo()
{
return versionInfo;
}
public ASN1Primitive toASN1Primitive()
{
ASN1EncodableVector seq = new ASN1EncodableVector();
seq.add(version);
seq.add(digestAlgorithmIdentifier);
ASN1EncodableVector seqname = new ASN1EncodableVector();
for (int i = 0; i < datagroupHash.length; i++)
{
seqname.add(datagroupHash[i]);
}
seq.add(new DERSequence(seqname));
if (versionInfo != null)
{
seq.add(versionInfo);
}
return new DERSequence(seq);
}
private DataGroupHash[] copy(DataGroupHash[] dgHash)
{
DataGroupHash[] rv = new DataGroupHash[dgHash.length];
System.arraycopy(dgHash, 0, rv, 0, rv.length);
return rv;
}
}