/**
* Simple class to interface an IRMA token
* into the IRMA add-on of Future ID.
*/
package org.openecard.sal.protocol.irmaprover;
import iso.std.iso_iec._24727.tech.schema.ConnectionHandleType;
import iso.std.iso_iec._24727.tech.schema.DIDAuthenticate;
import iso.std.iso_iec._24727.tech.schema.DIDAuthenticateResponse;
import iso.std.iso_iec._24727.tech.schema.DIDAuthenticationDataType;
import iso.std.iso_iec._24727.tech.schema.DIDScopeType;
import iso.std.iso_iec._24727.tech.schema.DIDStructureType;
import iso.std.iso_iec._24727.tech.schema.DifferentialIdentityServiceActionName;
import iso.std.iso_iec._24727.tech.schema.InputUnitType;
import iso.std.iso_iec._24727.tech.schema.PasswordAttributesType;
import iso.std.iso_iec._24727.tech.schema.PinInputType;
import iso.std.iso_iec._24727.tech.schema.Transmit;
import iso.std.iso_iec._24727.tech.schema.TransmitResponse;
import iso.std.iso_iec._24727.tech.schema.VerifyUser;
import iso.std.iso_iec._24727.tech.schema.VerifyUserResponse;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Map;
import java.util.Vector;
import java.util.HashMap;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import org.openecard.addon.sal.FunctionType;
import org.openecard.addon.sal.ProtocolStep;
import org.openecard.common.ECardException;
import org.openecard.common.WSHelper;
import org.openecard.common.apdu.common.CardResponseAPDU;
import org.openecard.common.interfaces.Dispatcher;
import org.openecard.common.sal.Assert;
import org.openecard.common.sal.state.CardStateEntry;
import org.openecard.common.sal.util.SALUtils;
import org.openecard.common.util.PINUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ibm.zurich.idmx.issuance.Issuer;
import com.ibm.zurich.idmx.issuance.Message;
import com.ibm.zurich.idmx.showproof.Proof;
import com.ibm.zurich.idmx.showproof.Verifier;
import com.ibm.zurich.idmx.showproof.predicates.CLPredicate;
import com.ibm.zurich.idmx.showproof.predicates.Predicate;
import com.ibm.zurich.idmx.showproof.predicates.Predicate.PredicateType;
import com.ibm.zurich.idmx.utils.Constants;
import com.ibm.zurich.idmx.utils.SystemParameters;
import org.irmacard.credentials.Attributes;
import org.irmacard.credentials.BaseCredentials;
import org.irmacard.credentials.CredentialsException;
import org.irmacard.credentials.Nonce;
import org.irmacard.credentials.idemix.IdemixCredentials;
import org.irmacard.credentials.idemix.IdemixNonce;
import org.irmacard.credentials.idemix.IdemixPrivateKey;
import org.irmacard.credentials.idemix.spec.IdemixIssueSpecification;
import org.irmacard.credentials.idemix.spec.IdemixVerifySpecification;
import org.irmacard.credentials.idemix.util.CredentialInformation;
import org.irmacard.credentials.idemix.util.IssueCredentialInformation;
import org.irmacard.credentials.idemix.util.VerifyCredentialInformation;
import org.irmacard.idemix.util.IdemixLogEntry;
import org.irmacard.credentials.info.CredentialDescription;
import org.irmacard.credentials.info.DescriptionStore;
import org.irmacard.credentials.info.InfoException;
import org.irmacard.idemix.IdemixService;
import org.irmacard.idemix.IdemixSmartcard;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
import net.sourceforge.scuba.smartcards.TerminalCardService;
import net.sourceforge.scuba.smartcards.CardService;
import net.sourceforge.scuba.smartcards.CardServiceException;
import net.sourceforge.scuba.smartcards.CommandAPDU;
import net.sourceforge.scuba.smartcards.ProtocolCommand;
import net.sourceforge.scuba.smartcards.ProtocolCommands;
import net.sourceforge.scuba.smartcards.ProtocolResponses;
import net.sourceforge.scuba.smartcards.ResponseAPDU;
import com.ibm.zurich.idmx.utils.Utils;
import java.util.TreeMap;
import java.util.List;
import java.util.ArrayList;
import com.google.gson.Gson;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class ProofGenerator {
private String serialPolicy;
private String generationScript;
private String generationScriptPath;
private URI core;
private VerifyCredentialInformation vci;
private IdemixVerifySpecification spec;
private CardTerminal terminal;
private IdemixService service;
private IdemixCredentials ic;
public ProofGenerator(String pathToConfiguration) {
try {
URI core = new File(System
.getProperty("user.dir")).toURI()
.resolve(pathToConfiguration);
CredentialInformation.setCoreLocation(core);
DescriptionStore.setCoreLocation(core);
DescriptionStore.getInstance();
} catch (Exception e) {
/* TODO */
}
}
public void configureIRMA(boolean abc4trustPolicy, String policy) {
if (!abc4trustPolicy) {
try {
VerifyCredentialInformation vci = new VerifyCredentialInformation("FutureID", "eID", "FutureID", "0000");
spec = vci.getIdemixVerifySpecification();
terminal = TerminalFactory.getDefault().terminals().list().get(0);
service = new IdemixService(new TerminalCardService(terminal));
ic = new IdemixCredentials(new TerminalCardService(terminal));
service.open();
spec.setCardVersion(service.getCardVersion());
} catch (Exception e) {
/* TODO */
}
} else {
try {
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(policy));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("Message");
/* Get nonce from policy
Element nonce_element = (Element) nodes.item(0);
NodeList name = nonce_element.getElementsByTagName("Nonce");
Element line = (Element) name.item(0);
System.out.println("Nonce: " + getCharacterDataFromElement(line));
*/
nodes = doc.getElementsByTagName("DisclosedAttribute");
for (int i = 0; i < nodes.getLength(); i++) {
Element disclosure_element = (Element) nodes.item(i);
System.out.println(disclosure_element.getAttribute("AttributeType"));
}
/* TODO: Translate the disclosure policy into the right configuration
for IRMA */
} catch (Exception e) {
/* TODO */
}
}
}
public String generateProof(Nonce nonce) {
Gson gson = null;
ProtocolResponses protocolResponses = null;
Proof proof = null;
boolean verified = false;
try {
IdemixNonce n = (IdemixNonce)nonce;
protocolResponses = service.execute(ic.requestProofCommands(spec, nonce));
gson = new Gson();
} catch(Exception e) {
/* TODO */
}
if (gson != null)
return gson.toJson(protocolResponses);
else
return null;
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}
}