package at.gv.util.demo; import iaik.security.ecc.interfaces.ECDSAParams; import iaik.security.ecc.interfaces.ECDSAPublicKey; import iaik.security.ecc.math.ecgroup.AffineCoordinate; import iaik.security.ecc.math.ecgroup.ECPoint; import iaik.security.ecc.provider.ECCProvider; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.math.BigInteger; import java.security.InvalidKeyException; import java.security.PublicKey; import java.security.interfaces.DSAParams; import java.security.interfaces.DSAPublicKey; import java.security.interfaces.ECPublicKey; import java.security.interfaces.RSAPublicKey; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Properties; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import javax.xml.transform.TransformerException; import org.apache.cxf.common.util.Base64Utility; import org.w3c.dom.Element; import at.gv.util.BpkUtil; import at.gv.util.DOMUtils; import at.gv.util.client.szr.SZRClient; import at.gv.util.client.ur_V5.URClient; import at.gv.util.client.ur_V5.URClient.URSearchResult; import at.gv.util.client.ur_V5.URClientException; import at.gv.util.config.EgovUtilPropertiesConfiguration; import at.gv.util.data.BPK; import at.gv.util.ex.EgovUtilException; import at.gv.util.wsdl.szr.SZRException; import at.gv.util.xsd.szr.GetIdentityLink; import at.gv.util.xsd.szr.IdentityLinkType; import at.gv.util.xsd.szr.PersonInfoType; import at.gv.util.xsd.szr.TravelDocumentType; import at.gv.util.xsd.szr.ecdsa.DomainParamsType; import at.gv.util.xsd.szr.ecdsa.ECDSAKeyValueType; import at.gv.util.xsd.szr.ecdsa.ECPointType; import at.gv.util.xsd.szr.ecdsa.NamedCurveType; import at.gv.util.xsd.szr.ecdsa.PrimeFieldElemType; import at.gv.util.xsd.szr.persondata.IdentificationType; import at.gv.util.xsd.szr.persondata.PersonNameType; import at.gv.util.xsd.szr.persondata.PhysicalPersonType; import at.gv.util.xsd.szr.xmldsig.DSAKeyValueType; import at.gv.util.xsd.szr.xmldsig.KeyValueType; import at.gv.util.xsd.szr.xmldsig.RSAKeyValueType; public class Clienttests { public static String XFN_NAME = "Firmenbuchnummer"; public static String XFN_VALUE = "urn:publicid:gv.at:baseid+XFN"; public static String XFN_URT = "FBN"; public static String XZVR_NAME = "ZVR-Zahl"; public static String XZVR_VALUE = "urn:publicid:gv.at:baseid+XZVR"; public static String XZVR_URT = "ZVR"; public static String XERSB_NAME = "ERsB Ordnungsnummer"; public static String XERSB_VALUE = "urn:publicid:gv.at:baseid+XERSB"; public static String XERSB_URT = "ERJ"; public static List UR_TYPES = Arrays.asList(XFN_URT, XZVR_URT, XERSB_URT); public static HashSet ERSB_KEYS = new HashSet(); public static final String SSPIN_PREFIX = "urn:publicid:gv.at:cdid+"; private final static byte[] DEFAULT_PUBL_KEY = new byte[] {48, -127, -97, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 1, 5, 0, 3, -127, -115, 0, 48, -127, -119, 2, -127, -127, 0, -106, 114, -113, -1, -84, 116, 35, 3, 70, -81, 81, -110, -10, -59, 114, 4, -109, 86, 127, -50, 125, 47, 4, 80, 79, 53, 117, -36, 15, -16, -61, 110, 39, 89, 29, -43, 37, -127, 80, -109, -38, 65, 125, -119, 44, -111, -21, 47, -98, 38, -112, -24, 107, -110, 17, -10, 51, -4, -36, -72, -28, -18, -14, 117, -67, 76, -31, 32, 92, 104, -21, 68, 31, -12, 30, -104, -104, 42, -107, 126, 84, 50, 85, -117, 44, -100, -4, 102, -100, 52, -68, 77, -32, 9, -16, -30, -104, -90, 107, -88, 7, 97, -94, 72, -61, -40, 80, -112, -65, -25, -72, -19, -95, -54, 31, 15, 24, -105, 123, -81, 23, -123, 92, -103, -101, 47, 47, -105, 2, 3, 1, 0, 1}; public static final String DOCUMENT_TYPE = "ELEKTR_DOKUMENT"; public static final String ERnB_ISSUEDATE = "2014-01-01"; public static final String ERnB_ISSUINGAUTHORITY = "SZR-Gateway"; @SuppressWarnings("unused") public static void main(String[] args) throws IOException { String propertiesFileLocation = System.getProperty("mis.configuration"); if (propertiesFileLocation == null) { System.out.println("No system properties found. Cannot load default configuration."); throw new IOException("Cannot load default configuration. Please specify first mis.configuration location in system properties."); } File propertiesFile = new File(propertiesFileLocation); FileInputStream fis = new FileInputStream(propertiesFile); String configDir = propertiesFile.getParentFile().getAbsolutePath(); Properties props = new Properties(); props.load(fis); EgovUtilPropertiesConfiguration egovUtilConfiguration = new EgovUtilPropertiesConfiguration(props, configDir); ERSB_KEYS.add("136"); ERSB_KEYS.add("137"); ERSB_KEYS.add("138"); ERSB_KEYS.add("139"); ERSB_KEYS.add("140"); try { SZRClient szrClient = new SZRClient(egovUtilConfiguration); URClient urClient = new URClient(egovUtilConfiguration, UR_TYPES, ERSB_KEYS, false, false); PersonInfoType personInfo = new PersonInfoType(); PhysicalPersonType person = new PhysicalPersonType(); personInfo.setPerson(person); PersonNameType personName = new PersonNameType(); person.setName(personName ); IdentificationType id = new IdentificationType(); // id.setType(SSPIN_PREFIX + "ZP"); // id.setValue("U/wThc0XOTZp9Tvsxrh8DhGTXsU="); // person.setIdentification(id); personName.setFamilyName("Karning"); personName.setGivenName("Bernhard"); person.setDateOfBirth("1976-01-15"); String baseID = szrClient.getStammzahl(personInfo ); BPK zpBpk = BpkUtil.createBPK(baseID, "ZP"); String encryptedbPK = szrClient.transformBPK(personInfo, zpBpk.getBpk(), SSPIN_PREFIX + "ZP", SSPIN_PREFIX + "WT-UR", "BBA-STA"); // GetIdentityLink idlReq = createGetIdentityLink(); // // String baseIDResp = szrClient.getStammzahl(personInfo); // // IdentityLinkType idlResp = szrClient.getIdentityLink( // idlReq.getPersonInfo(), // idlReq.getKeyValue(), // false); // Element idl = (Element)idlResp.getAssertion(); // System.out.println(DOMUtils.serializeNode(idl)); List urResult = urClient.searchByBpk(encryptedbPK); System.out.println("Finish"); } catch (EgovUtilException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SZRException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static GetIdentityLink createGetIdentityLink(){ // set parameter GetIdentityLink getIdentityLink = new GetIdentityLink(); // generate PersonData PersonNameType personName = new PersonNameType(); personName.setFamilyName("Janez Vzorec"); personName.setGivenName("Janez Vzorec"); PhysicalPersonType physicalPerson = new PhysicalPersonType(); SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd"); String birthday = "1998-12-06"; if (birthday != null) physicalPerson.setDateOfBirth(birthday); physicalPerson.setName(personName); PersonInfoType personInfo = new PersonInfoType(); personInfo.setPerson(physicalPerson); // add Traveldocument TravelDocumentType trvlDoc = new TravelDocumentType(); // parse STORK-eID to his components //ERnB allows only eIDs with a maximum length of 54 signs trvlDoc.setDocumentNumber("33333333"); trvlDoc.setIssuingCountry("SI"); trvlDoc.setDocumentType(DOCUMENT_TYPE); //set default values from SZR because certificate for mandator natural person is not //available in case of authentication with electronic mandates. trvlDoc.setIssueDate(ERnB_ISSUEDATE); trvlDoc.setIssuingAuthority(ERnB_ISSUINGAUTHORITY); JAXBElement jaxbtrvlDoc = personInfo.getTravelDocument(); if (jaxbtrvlDoc == null) jaxbtrvlDoc = new JAXBElement(new QName("urn:SZRServices", "TravelDocument"), TravelDocumentType.class, trvlDoc); else jaxbtrvlDoc.setValue(trvlDoc); //personInfo.setTravelDocument(jaxbtrvlDoc); // Personendaten setzen getIdentityLink.setPersonInfo(personInfo); // add Keys PublicKey pb; List keyvalueList = getIdentityLink.getKeyValue(); if (keyvalueList == null) keyvalueList = new ArrayList(); try { pb = new iaik.security.rsa.RSAPublicKey(DEFAULT_PUBL_KEY); List keys = getKeyValueTypes(pb); keyvalueList.addAll(keys); } catch (InvalidKeyException e) { e.printStackTrace(); } // set Insert ERnP flag getIdentityLink.setInsertERnP(false); // Constants.DATA_LOGGER.debug("Person wird im SZR und ERnP gesucht bzw. gegebenenfalls im ERnP eingetragen: " // + natPerson.getFamilyName() + " " + natPerson.getGivenName() + " " + natPerson.getBirthday() // + " eID=" + natPerson.geteID() , tid); return getIdentityLink; } /** * Returns the according key value types from the given public key * @param pb * @return * @throws SZRGWException */ private static List getKeyValueTypes(PublicKey pb) { List keys = new ArrayList(); ECCProvider.addAsProvider(); //System.out.println(pb); if (pb instanceof RSAPublicKey) { //System.out.println("Is a RSAPublicKey"); //Extract key data RSAPublicKey rsapb = (RSAPublicKey)pb; BigInteger modulus = rsapb.getModulus(); BigInteger exponent = rsapb.getPublicExponent(); //System.out.println("Modulus: " + modulus); //System.out.println("PublicExponent: " + exponent); // set key values RSAKeyValueType rsa = new RSAKeyValueType(); ; rsa.setExponent(Base64Utility.encode(exponent.toByteArray())); rsa.setModulus(Base64Utility.encode(modulus.toByteArray())); KeyValueType key = new KeyValueType(); key.setRSAKeyValue(rsa); keys.add(key); } if (pb instanceof DSAPublicKey) { //System.out.println("Is a DSAPublicKey"); // extract key data DSAPublicKey dsapb = (DSAPublicKey) pb; BigInteger y = dsapb.getY(); DSAParams param = dsapb.getParams(); BigInteger g = param.getG(); BigInteger p = param.getP(); BigInteger q = param.getQ(); // System.out.println("Y: " + y); // System.out.println("G: " + g); // System.out.println("P: " + p); // System.out.println("Q: " + q); // //set key values DSAKeyValueType dsa = new DSAKeyValueType(); if (y != null) dsa.setY(y.toString()); if (g != null) dsa.setG(g.toString()); if (p != null) dsa.setP(p.toString()); if (q != null) dsa.setQ(q.toString()); KeyValueType key = new KeyValueType(); key.setDSAKeyValue(dsa); keys.add(key); } if (pb instanceof ECDSAPublicKey) { //Extract key data ECDSAPublicKey ecdsapb= (ECDSAPublicKey)pb; ECDSAParams params = ecdsapb.getParameter(); //EllipticCurve curve = params.getG().getCurve(); String oid = params.getOID(); //String name = ObjectID.getRegisteredName(oid); ECPoint w = ecdsapb.getW(); AffineCoordinate coordinate = (AffineCoordinate) w.getCoordinates().toAffine(); String x = coordinate.getX().toBigInt().toString(); String y = coordinate.getY().toBigInt().toString(); ECDSAKeyValueType ecdsa = new ECDSAKeyValueType(); DomainParamsType paramstype = new DomainParamsType(); NamedCurveType namedCurve = new NamedCurveType(); namedCurve.setURN("urn:oid:" + oid); paramstype.setNamedCurve(namedCurve); ecdsa.setDomainParameters(paramstype); ECPointType ecpointtype = new ECPointType(); PrimeFieldElemType xElem = new PrimeFieldElemType(); xElem.setValue(x); PrimeFieldElemType yElem = new PrimeFieldElemType(); yElem.setValue(y); ecpointtype.setX(xElem); ecpointtype.setY(yElem); ecdsa.setPublicKey(ecpointtype); KeyValueType key = new KeyValueType(); key.setECDSAKeyValue(ecdsa); keys.add(key); //throw new SZRGWException("Certificate enthält einen ECDSAPublicKey. Dieser wird momentan noch nicht unterstützt."); } if (pb instanceof ECPublicKey) { //System.out.println("Is a ECPublicKey"); // throw new SZRGWException("Certificate enthält einen ECPublicKey. Dieser wird momentan noch nicht unterstützt."); // ECPublicKey ecpb = (ECPublicKey) pb; // // System.out.println(ecpb.toString()); // // ECParameterSpec params = ecpb.getParams(); // EllipticCurve curve = params.getCurve(); // // ECDSAKeyValueType ecdsa = new ECDSAKeyValueType(); // DomainParamsType domainparams = new DomainParamsType(); // NamedCurveType curvetype = new NamedCurveType(); // curvetype.setURN("P-192"); // domainparams.setNamedCurve(curvetype); // ecdsa.setDomainParameters(domainparams); // ECPointType publicKey = new ECPointType(); // PrimeFieldElemType x = new PrimeFieldElemType(); // x.setValue("12345x"); // publicKey.setX(x); // PrimeFieldElemType y = new PrimeFieldElemType(); // y.setValue("12345y"); // publicKey.setY(y); // ecdsa.setPublicKey(publicKey); // keys[0].setECDSAKeyValue(ecdsa); } return keys; } }