/*
* Copyright 2011 by Graz University of Technology, Austria
* MOCCA has been developed by the E-Government Innovation Center EGIZ, a joint
* initiative of the Federal Chancellery Austria and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
package at.gv.egiz.idlink.asn1;
import iaik.asn1.ASN1Object;
import iaik.asn1.ASN1Type;
import iaik.asn1.BIT_STRING;
import iaik.asn1.CON_SPEC;
import iaik.asn1.CodingException;
import iaik.asn1.DerCoder;
import iaik.asn1.INTEGER;
import iaik.asn1.SEQUENCE;
import iaik.asn1.UTF8String;
/**
* This class impelments an ASN.1 representation of the compressed IdentiyLink
.
*
PersonenBindung ::= SEQUENCE { version INTEGER, issuerTemplate UTF8String, assertionID UTF8String, issueInstant UTF8String, personData PersonData, citizenPublicKey SEQUENCE SIZE (1..MAX) OF CitizenPublicKey, signatureValue BIT STRING, referenceDigest [0] BIT STRING OPTIONAL, referenceManifestDigest [1] BIT STRING OPTIONAL, manifestReferenceDigest [2] BIT STRING OPTIONAL }* * @author mivkovic@egiz.gv.at, mcentner@egiz.gv.at */ public class IdentityLink implements ASN1Type { private int version = 1; // INTEGER private String issuerTemplate; // UTF8String private String assertionID; // UTF8String private String issueInstant; // UTF8String private PersonData personData; // PersonData private CitizenPublicKey[] citizenPublicKeys; // SEQUENCE SIZE (1..MAX) OF private byte[] signatureValue; // BIT STRING private byte[] referenceDigest; // BIT STRING OPTIONAL private byte[] referenceManifestDigest; // BIT STRING OPTIONAL private byte[] manifestReferenceDigest; // BIT STRING OPTIONAL /** * Creates a new
IdentityLink
with the given
* issuerTemplate
, assertionID
,
* issueInstant
, personData
,
* citizenPublicKeys
and signatureValue
.
*
* @param issuerTemplate
* @param assertionID
* @param issueInstant
* @param personData
* @param citizenPublicKeys
* @param signatureValue
*/
public IdentityLink(String issuerTemplate, String assertionID,
String issueInstant, PersonData personData,
CitizenPublicKey[] citizenPublicKeys, byte[] signatureValue) {
this.issuerTemplate = issuerTemplate;
this.assertionID = assertionID;
this.issueInstant = issueInstant;
this.personData = personData;
this.citizenPublicKeys = citizenPublicKeys;
this.signatureValue = signatureValue;
}
/**
* Create a new IdentityLink from an ASN1Object.
*
* @param identiyLink
* @throws CodingException
*/
public IdentityLink(ASN1Object identiyLink) throws CodingException {
decode(identiyLink);
}
@Override
public void decode(ASN1Object obj) throws CodingException {
issuerTemplate = (String) ((ASN1Object) obj.getComponentAt(1)).getValue();
assertionID = (String) ((ASN1Object) obj.getComponentAt(2)).getValue();
issueInstant = (String) ((ASN1Object) obj.getComponentAt(3)).getValue();
if (((CON_SPEC) obj.getComponentAt(4)).getAsnType().getTag() == 0)
personData = new PersonData((ASN1Object) obj.getComponentAt(4).getValue());
else {
throw new CodingException("CorporateBodyData currently not supported.");
}
SEQUENCE publicKeySequence = (SEQUENCE) obj.getComponentAt(5);
int anz = publicKeySequence.countComponents();
citizenPublicKeys = new CitizenPublicKey[anz];
for (int i = 0; i < citizenPublicKeys.length; i++) {
CON_SPEC tmp = (CON_SPEC) publicKeySequence.getComponentAt(i);
if (tmp.getAsnType().getTag() == 0) {
citizenPublicKeys[i] = new CitizenPublicKey((ASN1Object) tmp.getValue());
} else {
throw new CodingException(
"Currently only PublicKeys on token are supported.");
}
}
signatureValue = (byte[]) ((ASN1Object) obj.getComponentAt(6)).getValue();
for (int i = 7; i < obj.countComponents(); i++) {
CON_SPEC tmp = (CON_SPEC) obj.getComponentAt(i);
switch (tmp.getAsnType().getTag()) {
case 0:
referenceDigest = (byte[]) ((BIT_STRING) tmp.getValue()).getValue();
break;
case 1:
referenceManifestDigest = (byte[]) ((BIT_STRING) tmp.getValue())
.getValue();
break;
case 2:
manifestReferenceDigest = (byte[]) ((BIT_STRING) tmp.getValue())
.getValue();
break;
}
}
}
@Override
public ASN1Object toASN1Object() {
SEQUENCE pb = new SEQUENCE();
pb.addComponent(new INTEGER(version));
pb.addComponent(new UTF8String(issuerTemplate));
pb.addComponent(new UTF8String(assertionID));
pb.addComponent(new UTF8String(issueInstant));
pb.addComponent(new CON_SPEC(0, personData.toASN1Object()));
SEQUENCE seq = new SEQUENCE();
for (int i = 0; i < citizenPublicKeys.length; i++) {
seq.addComponent(new CON_SPEC(0, citizenPublicKeys[i].toASN1Object()));
}
pb.addComponent(seq);
pb.addComponent(new BIT_STRING(signatureValue));
if (referenceDigest != null)
pb.addComponent(new CON_SPEC(0, new BIT_STRING(referenceDigest)));
if (referenceManifestDigest != null)
pb.addComponent(new CON_SPEC(1, new BIT_STRING(referenceManifestDigest)));
if (manifestReferenceDigest != null)
pb.addComponent(new CON_SPEC(2, new BIT_STRING(manifestReferenceDigest)));
return pb;
}
/**
* Returns the DER encoding of this IdentityLink
.
*
* @return the DER encoding of this IdentityLink
*/
public byte[] toByteArray() {
return DerCoder.encode(toASN1Object());
}
/**
* @return the version
*/
public int getVersion() {
return version;
}
/**
* @param version the version to set
*/
public void setVersion(int version) {
this.version = version;
}
/**
* @return the issuerTemplate
*/
public String getIssuerTemplate() {
return issuerTemplate;
}
/**
* @param issuerTemplate the issuerTemplate to set
*/
public void setIssuerTemplate(String issuerTemplate) {
this.issuerTemplate = issuerTemplate;
}
/**
* @return the assertionID
*/
public String getAssertionID() {
return assertionID;
}
/**
* @param assertionID the assertionID to set
*/
public void setAssertionID(String assertionID) {
this.assertionID = assertionID;
}
/**
* @return the issueInstant
*/
public String getIssueInstant() {
return issueInstant;
}
/**
* @param issueInstant the issueInstant to set
*/
public void setIssueInstant(String issueInstant) {
this.issueInstant = issueInstant;
}
/**
* @return the personData
*/
public PersonData getPersonData() {
return personData;
}
/**
* @param personData the personData to set
*/
public void setPersonData(PersonData personData) {
this.personData = personData;
}
/**
* @return the citizenPublicKeys
*/
public CitizenPublicKey[] getCitizenPublicKeys() {
return citizenPublicKeys;
}
/**
* @param citizenPublicKeys the citizenPublicKeys to set
*/
public void setCitizenPublicKeys(CitizenPublicKey[] citizenPublicKeys) {
this.citizenPublicKeys = citizenPublicKeys;
}
/**
* @return the signatureValue
*/
public byte[] getSignatureValue() {
return signatureValue;
}
/**
* @param signatureValue the signatureValue to set
*/
public void setSignatureValue(byte[] signatureValue) {
this.signatureValue = signatureValue;
}
/**
* @return the referenceDigest
*/
public byte[] getReferenceDigest() {
return referenceDigest;
}
/**
* @param referenceDigest the referenceDigest to set
*/
public void setReferenceDigest(byte[] referenceDigest) {
this.referenceDigest = referenceDigest;
}
/**
* @return the referenceManifestDigest
*/
public byte[] getReferenceManifestDigest() {
return referenceManifestDigest;
}
/**
* @param referenceManifestDigest the referenceManifestDigest to set
*/
public void setReferenceManifestDigest(byte[] referenceManifestDigest) {
this.referenceManifestDigest = referenceManifestDigest;
}
/**
* @return the manifestReferenceDigest
*/
public byte[] getManifestReferenceDigest() {
return manifestReferenceDigest;
}
/**
* @param manifestReferenceDigest the manifestReferenceDigest to set
*/
public void setManifestReferenceDigest(byte[] manifestReferenceDigest) {
this.manifestReferenceDigest = manifestReferenceDigest;
}
}