Search in sources :

Example 1 with EAC1OutputType

use of iso.std.iso_iec._24727.tech.schema.EAC1OutputType in project open-ecard by ecsec.

the class AndroidMarshaller method marshal.

@Override
public synchronized Document marshal(Object o) throws MarshallingTypeException {
    Document document = documentBuilder.newDocument();
    document.setXmlStandalone(true);
    Element rootElement = null;
    if (o instanceof DestroyChannel) {
        DestroyChannel destroyChannel = (DestroyChannel) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        Element emSlotHandle = createElementIso(document, "SlotHandle");
        emSlotHandle.appendChild(document.createTextNode(ByteUtils.toHexString(destroyChannel.getSlotHandle())));
        rootElement.appendChild(emSlotHandle);
    } else if (o instanceof DestroyChannelResponse) {
        DestroyChannelResponse response = (DestroyChannelResponse) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        if (response.getProfile() != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(response.getProfile()));
            rootElement.appendChild(emProfile);
        }
        if (response.getRequestID() != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(response.getRequestID()));
            rootElement.appendChild(emRequest);
        }
        if (response.getResult() != null) {
            Element emResult = marshalResult(response.getResult(), document);
            rootElement.appendChild(emResult);
        }
    } else if (o instanceof EstablishChannel) {
        EstablishChannel establishChannel = (EstablishChannel) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        Element emSlotHandle = createElementIso(document, "SlotHandle");
        emSlotHandle.appendChild(document.createTextNode(ByteUtils.toHexString(establishChannel.getSlotHandle())));
        rootElement.appendChild(emSlotHandle);
        Element emAuthProtData = createElementIso(document, "AuthenticationProtocolData");
        emAuthProtData.setAttribute("Protocol", establishChannel.getAuthenticationProtocolData().getProtocol());
        for (Element e : establishChannel.getAuthenticationProtocolData().getAny()) {
            Element eClone = createElementIso(document, e.getLocalName());
            eClone.setTextContent(e.getTextContent());
            eClone.setAttribute("xmlns", "urn:iso:std:iso-iec:24727:tech:schema");
            emAuthProtData.appendChild(eClone);
        }
        if (establishChannel.getProfile() != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(establishChannel.getProfile()));
            rootElement.appendChild(emProfile);
        }
        if (establishChannel.getRequestID() != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(establishChannel.getRequestID()));
            rootElement.appendChild(emRequest);
        }
        rootElement.appendChild(emAuthProtData);
    } else if (o instanceof EstablishChannelResponse) {
        EstablishChannelResponse response = (EstablishChannelResponse) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        if (response.getProfile() != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(response.getProfile()));
            rootElement.appendChild(emProfile);
        }
        if (response.getRequestID() != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(response.getRequestID()));
            rootElement.appendChild(emRequest);
        }
        if (response.getResult() != null) {
            Element emResult = marshalResult(response.getResult(), document);
            rootElement.appendChild(emResult);
        }
        if (response.getAuthenticationProtocolData() != null) {
            Element emAuthProtData = createElementIso(document, "AuthenticationProtocolData");
            emAuthProtData.setAttribute("Protocol", response.getAuthenticationProtocolData().getProtocol());
            for (Element e : response.getAuthenticationProtocolData().getAny()) {
                Element eClone = createElementIso(document, e.getLocalName());
                eClone.setTextContent(e.getTextContent());
                eClone.setAttribute("xmlns", "urn:iso:std:iso-iec:24727:tech:schema");
                emAuthProtData.appendChild(eClone);
            }
        }
    } else if (o instanceof DIDAuthenticate) {
        DIDAuthenticate auth = (DIDAuthenticate) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        Element em;
        if (auth.getConnectionHandle() != null) {
            em = marshalConnectionHandle(auth.getConnectionHandle(), document);
            rootElement.appendChild(em);
        }
        if (auth.getDIDScope() != null) {
            em = createElementIso(document, "DIDScope");
            em.appendChild(document.createTextNode(auth.getDIDScope().value()));
            rootElement.appendChild(em);
        }
        if (auth.getDIDName() != null) {
            em = createElementIso(document, "DIDName");
            em.appendChild(document.createTextNode(auth.getDIDName()));
            rootElement.appendChild(em);
        }
        if (auth.getAuthenticationProtocolData() != null) {
            DIDAuthenticationDataType d = auth.getAuthenticationProtocolData();
            em = createElementIso(document, "AuthenticationProtocolData");
            em.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
            if (d instanceof EAC1OutputType) {
                em.setAttribute("xsi:type", "iso:EAC1OutputType");
            } else if (d instanceof EAC2OutputType) {
                em.setAttribute("xsi:type", "iso:EAC2OutputType");
            } else if (d instanceof EAC1InputType) {
                em.setAttribute("xsi:type", "iso:EAC1InputType");
            } else if (d instanceof EAC2InputType) {
                em.setAttribute("xsi:type", "iso:EAC2InputType");
            } else {
                String msg = "Marshalling a DIDAuthenticationDataType of " + d.getClass().getName() + " in DIDAuthentication is not supported";
                LOG.error(msg);
                throw new MarshallingTypeException(msg);
            }
            for (Element e : d.getAny()) {
                Element elemCopy = createElementIso(document, e.getLocalName());
                elemCopy.setTextContent(e.getTextContent());
                em.appendChild(elemCopy);
            }
            for (Map.Entry<QName, String> entry : d.getOtherAttributes().entrySet()) {
                em.setAttribute(entry.getKey().getNamespaceURI(), entry.getValue());
            }
            if (d.getProtocol() != null) {
                em.setAttribute("Protocol", d.getProtocol());
            }
            rootElement.appendChild(em);
        }
        if (auth.getSAMConnectionHandle() != null) {
            em = marshalConnectionHandle(auth.getSAMConnectionHandle(), document);
            rootElement.appendChild(em);
        }
        if (auth.getProfile() != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(auth.getProfile()));
            rootElement.appendChild(emProfile);
        }
        if (auth.getRequestID() != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(auth.getRequestID()));
            rootElement.appendChild(emRequest);
        }
    } else if (o instanceof DIDAuthenticateResponse) {
        DIDAuthenticateResponse didAuthenticateResponse = (DIDAuthenticateResponse) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        rootElement.appendChild(marshalResult(didAuthenticateResponse.getResult(), document));
        if (didAuthenticateResponse.getAuthenticationProtocolData() != null) {
            DIDAuthenticationDataType didAuthenticationDataType = didAuthenticateResponse.getAuthenticationProtocolData();
            Element elemEACOutput = createElementIso(document, "AuthenticationProtocolData");
            elemEACOutput.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
            if (didAuthenticationDataType instanceof EAC1OutputType) {
                elemEACOutput.setAttribute("xsi:type", "iso:EAC1OutputType");
            } else if (didAuthenticationDataType instanceof EAC2OutputType) {
                elemEACOutput.setAttribute("xsi:type", "iso:EAC2OutputType");
            } else {
                String msg = "Marshalling a DIDAuthenticationDataType of " + didAuthenticationDataType.getClass().getName() + " in DIDAuthentication is not supported";
                throw new MarshallingTypeException(msg);
            }
            for (Element e : didAuthenticationDataType.getAny()) {
                Element elemCopy = createElementIso(document, e.getLocalName());
                elemCopy.setTextContent(e.getTextContent());
                elemEACOutput.appendChild(elemCopy);
            }
            rootElement.appendChild(elemEACOutput);
        }
    // else only the result (with error) is returned
    } else if (o instanceof InitializeFrameworkResponse) {
        InitializeFrameworkResponse initializeFrameworkResponse = (InitializeFrameworkResponse) o;
        rootElement = createElementEcapi(document, o.getClass().getSimpleName());
        rootElement.appendChild(marshalResult(initializeFrameworkResponse.getResult(), document));
        Element emVersion = createElementEcapi(document, "Version");
        Element emMajor = createElementEcapi(document, "Major");
        emMajor.appendChild(document.createTextNode(initializeFrameworkResponse.getVersion().getMajor().toString()));
        emVersion.appendChild(emMajor);
        Element emMinor = createElementEcapi(document, "Minor");
        emMinor.appendChild(document.createTextNode(initializeFrameworkResponse.getVersion().getMinor().toString()));
        emVersion.appendChild(emMinor);
        Element emSubMinor = createElementEcapi(document, "SubMinor");
        emSubMinor.appendChild(document.createTextNode(initializeFrameworkResponse.getVersion().getSubMinor().toString()));
        emVersion.appendChild(emSubMinor);
        rootElement.appendChild(emVersion);
    } else if (o instanceof InternationalStringType) {
        InternationalStringType internationalStringType = (InternationalStringType) o;
        rootElement = marshalInternationStringType(internationalStringType, document, internationalStringType.getClass().getSimpleName());
    } else if (o instanceof Result) {
        Result r = (Result) o;
        rootElement = marshalResult(r, document);
    } else if (o instanceof iso.std.iso_iec._24727.tech.schema.StartPAOS) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        StartPAOS startPAOS = (StartPAOS) o;
        Element em = createElementIso(document, "SessionIdentifier");
        em.appendChild(document.createTextNode(startPAOS.getSessionIdentifier()));
        rootElement.appendChild(em);
        rootElement.appendChild(marshalConnectionHandle(startPAOS.getConnectionHandle().get(0), document));
    } else if (o instanceof TransmitResponse) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        TransmitResponse transmitResponsePOJO = (TransmitResponse) o;
        Element em = marshalResult(transmitResponsePOJO.getResult(), document);
        rootElement.appendChild(em);
        for (int i = 0; i < transmitResponsePOJO.getOutputAPDU().size(); i++) {
            em = createElementIso(document, "OutputAPDU");
            em.appendChild(document.createTextNode(ByteUtils.toHexString(transmitResponsePOJO.getOutputAPDU().get(i))));
            rootElement.appendChild(em);
        }
    } else if (o instanceof EstablishContext) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
    } else if (o instanceof EstablishContextResponse) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        EstablishContextResponse establishContextResponse = (EstablishContextResponse) o;
        Element em = createElementIso(document, "ContextHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(establishContextResponse.getContextHandle())));
        rootElement.appendChild(em);
        em = marshalResult(establishContextResponse.getResult(), document);
        rootElement.appendChild(em);
    } else if (o instanceof GetStatus) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        GetStatus getStatus = (GetStatus) o;
        Element em = createElementIso(document, "ContextHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(getStatus.getContextHandle())));
        rootElement.appendChild(em);
        if (getStatus.getIFDName() != null) {
            em = createElementIso(document, "IFDName");
            em.appendChild(document.createTextNode(getStatus.getIFDName()));
            rootElement.appendChild(em);
        }
    } else if (o instanceof Wait) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        Wait w = (Wait) o;
        Element em = createElementIso(document, "ContextHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(w.getContextHandle())));
        rootElement.appendChild(em);
        if (w.getTimeOut() != null) {
            em = createElementIso(document, "TimeOut");
            em.appendChild(document.createTextNode(w.getTimeOut().toString(16)));
            rootElement.appendChild(em);
        }
        if (w.getCallback() != null) {
            ChannelHandleType callback = w.getCallback();
            em = createElementIso(document, "Callback");
            if (callback.getBinding() != null) {
                Element em2 = createElementIso(document, "Binding");
                em2.appendChild(document.createTextNode(callback.getBinding()));
                em.appendChild(em2);
            }
            if (callback.getSessionIdentifier() != null) {
                Element em2 = createElementIso(document, "SessionIdentifier");
                em2.appendChild(document.createTextNode(callback.getSessionIdentifier()));
                em.appendChild(em2);
            }
            if (callback.getProtocolTerminationPoint() != null) {
                Element em2 = createElementIso(document, "ProtocolTerminationPoint");
                em2.appendChild(document.createTextNode(callback.getProtocolTerminationPoint()));
                em.appendChild(em2);
            }
            if (callback.getPathSecurity() != null) {
                PathSecurityType pathSecurityType = callback.getPathSecurity();
                Element em2 = createElementIso(document, "PathSecurity");
                Element em3 = createElementIso(document, "Protocol");
                em3.appendChild(document.createTextNode(pathSecurityType.getProtocol()));
                em2.appendChild(em3);
                if (pathSecurityType.getParameters() != null) {
                    em3 = createElementIso(document, "Parameters");
                    em3.appendChild(document.createTextNode(pathSecurityType.getParameters().toString()));
                    em2.appendChild(em3);
                }
                em.appendChild(em2);
            }
            rootElement.appendChild(em);
        }
    } else if (o instanceof Connect) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        Connect c = (Connect) o;
        Element em = createElementIso(document, "ContextHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(c.getContextHandle())));
        rootElement.appendChild(em);
        em = createElementIso(document, "IFDName");
        em.appendChild(document.createTextNode(c.getIFDName()));
        rootElement.appendChild(em);
        em = createElementIso(document, "Slot");
        em.appendChild(document.createTextNode(c.getSlot().toString()));
        rootElement.appendChild(em);
        if (c.isExclusive() != null) {
            em = createElementIso(document, "Exclusive");
            em.appendChild(document.createTextNode(c.isExclusive().toString()));
            rootElement.appendChild(em);
        }
    } else if (o instanceof ConnectResponse) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        ConnectResponse cr = (ConnectResponse) o;
        Element em = createElementIso(document, "SlotHandle");
        if (cr.getSlotHandle() != null) {
            em.appendChild(document.createTextNode(ByteUtils.toHexString(cr.getSlotHandle())));
            rootElement.appendChild(em);
        }
        em = marshalResult(cr.getResult(), document);
        rootElement.appendChild(em);
    } else if (o instanceof ListIFDs) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        ListIFDs c = (ListIFDs) o;
        Element em = createElementIso(document, "ContextHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(c.getContextHandle())));
        rootElement.appendChild(em);
    } else if (o instanceof ListIFDsResponse) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        ListIFDsResponse listIFDsResponse = (ListIFDsResponse) o;
        for (String s : listIFDsResponse.getIFDName()) {
            Element em = createElementIso(document, "IFDName");
            em.appendChild(document.createTextNode(s));
            rootElement.appendChild(em);
        }
        Element em = marshalResult(listIFDsResponse.getResult(), document);
        rootElement.appendChild(em);
    } else if (o instanceof Transmit) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        rootElement.setAttribute("xmlns:iso", "urn:iso:std:iso-iec:24727:tech:schema");
        Transmit t = (Transmit) o;
        Element em = createElementIso(document, "SlotHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(t.getSlotHandle())));
        rootElement.appendChild(em);
        for (int i = 0; i < t.getInputAPDUInfo().size(); i++) {
            em = createElementIso(document, "InputAPDUInfo");
            rootElement.appendChild(em);
            Element em2 = createElementIso(document, "InputAPDU");
            em2.appendChild(document.createTextNode(ByteUtils.toHexString(t.getInputAPDUInfo().get(i).getInputAPDU())));
            em.appendChild(em2);
            for (int y = 0; y < t.getInputAPDUInfo().get(i).getAcceptableStatusCode().size(); y++) {
                em2 = createElementIso(document, "AcceptableStatusCode");
                em2.appendChild(document.createTextNode(ByteUtils.toHexString(t.getInputAPDUInfo().get(i).getAcceptableStatusCode().get(y))));
                em.appendChild(em2);
            }
        }
    } else if (o instanceof RecognitionTree) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        RecognitionTree recognitionTree = (RecognitionTree) o;
        for (CardCall c : recognitionTree.getCardCall()) {
            rootElement.appendChild(marshalCardCall(c, document));
        }
    } else if (o instanceof CardCall) {
        CardCall c = (CardCall) o;
        rootElement = (Element) marshalCardCall(c, document);
    } else if (o instanceof Disconnect) {
        Disconnect d = (Disconnect) o;
        rootElement = createElementIso(document, d.getClass().getSimpleName());
        Element em = createElementIso(document, "SlotHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(d.getSlotHandle())));
        rootElement.appendChild(em);
        if (d.getAction() != null) {
            em = createElementIso(document, "Action");
            em.appendChild(document.createTextNode(d.getAction().value()));
        }
    } else if (o instanceof DisconnectResponse) {
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        DisconnectResponse response = (DisconnectResponse) o;
        String profile = response.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = response.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
        Element emResult = marshalResult(response.getResult(), document);
        rootElement.appendChild(emResult);
    } else if (o instanceof GetIFDCapabilities) {
        GetIFDCapabilities getIFDCapabilities = (GetIFDCapabilities) o;
        rootElement = createElementIso(document, o.getClass().getSimpleName());
        Element emContextHandle = createElementIso(document, "ContextHandle");
        emContextHandle.appendChild(document.createTextNode(ByteUtils.toHexString(getIFDCapabilities.getContextHandle())));
        rootElement.appendChild(emContextHandle);
        Element emIFDName = createElementIso(document, "IFDName");
        emIFDName.appendChild(document.createTextNode(getIFDCapabilities.getIFDName()));
        rootElement.appendChild(emIFDName);
    } else if (o instanceof GetIFDCapabilitiesResponse) {
        try {
            GetIFDCapabilitiesResponse response = (GetIFDCapabilitiesResponse) o;
            rootElement = createElementIso(document, o.getClass().getSimpleName());
            String profile = response.getProfile();
            if (profile != null) {
                Element emProfile = createElementIso(document, "Profile");
                emProfile.appendChild(document.createTextNode(profile));
                rootElement.appendChild(emProfile);
            }
            String requestID = response.getRequestID();
            if (requestID != null) {
                Element emRequest = createElementIso(document, "RequestID");
                emRequest.appendChild(document.createElement(requestID));
                rootElement.appendChild(emRequest);
            }
            Element emResult = marshalResult(response.getResult(), document);
            rootElement.appendChild(emResult);
            if (response.getIFDCapabilities() != null) {
                Element emIFDCaps = marshalIFDCapabilities(response.getIFDCapabilities(), document);
                rootElement.appendChild(emIFDCaps);
            }
        } catch (Exception ex) {
            LOG.error(ex.getMessage(), ex);
        }
    } else if (o instanceof TCTokenType) {
        TCTokenType tctoken = (TCTokenType) o;
        rootElement = document.createElement(o.getClass().getSimpleName());
        Element em = document.createElement("ServerAddress");
        em.appendChild(document.createTextNode(tctoken.getServerAddress()));
        rootElement.appendChild(em);
        em = document.createElement("SessionIdentifier");
        em.appendChild(document.createTextNode(tctoken.getSessionIdentifier()));
        rootElement.appendChild(em);
        em = document.createElement("RefreshAddress");
        em.appendChild(document.createTextNode(tctoken.getRefreshAddress()));
        rootElement.appendChild(em);
        // Optional element CommunicationErrorAddress
        String communicationErrorAddress = tctoken.getCommunicationErrorAddress();
        if (communicationErrorAddress != null) {
            em = document.createElement("CommunicationErrorAddress");
            em.appendChild(document.createTextNode(tctoken.getCommunicationErrorAddress()));
            rootElement.appendChild(em);
        }
        em = document.createElement("Binding");
        em.appendChild(document.createTextNode(tctoken.getBinding()));
        rootElement.appendChild(em);
        // Optional element PathSecurity-Protocol
        String pathSecurityProtocol = tctoken.getPathSecurityProtocol();
        if (pathSecurityProtocol != null) {
            em = document.createElement("PathSecurity-Protocol");
            em.appendChild(document.createTextNode(tctoken.getPathSecurityProtocol()));
            rootElement.appendChild(em);
        }
        // Optional element PathSecurity-Parameters
        TCTokenType.PathSecurityParameters pathSecurityParameters = tctoken.getPathSecurityParameters();
        if (pathSecurityParameters != null) {
            em = document.createElement("PSK");
            em.appendChild(document.createTextNode(ByteUtils.toHexString(pathSecurityParameters.getPSK())));
            Element em1 = document.createElement("PathSecurity-Parameters");
            em1.appendChild(em);
            rootElement.appendChild(em1);
        }
    } else if (o instanceof CardApplicationPath) {
        CardApplicationPath p = (CardApplicationPath) o;
        rootElement = createElementIso(document, "CardApplicationPath");
        Element em = createElementIso(document, "CardAppPathRequest");
        String profile = p.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = p.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
        // ChannelHandle
        ChannelHandleType h = p.getCardAppPathRequest().getChannelHandle();
        Element emChild = createElementIso(document, "ChannelHandle");
        em.appendChild(emChild);
        Element emChildOfCH;
        if (h.getProtocolTerminationPoint() != null) {
            emChildOfCH = createElementIso(document, "ProtocolTerminationPoint");
            emChildOfCH.appendChild(document.createTextNode(h.getProtocolTerminationPoint()));
            emChild.appendChild(emChildOfCH);
        }
        if (h.getSessionIdentifier() != null) {
            emChildOfCH = createElementIso(document, "SessionIdentifier");
            emChildOfCH.appendChild(document.createTextNode(h.getSessionIdentifier()));
            emChild.appendChild(emChildOfCH);
        }
        if (h.getBinding() != null) {
            emChildOfCH = createElementIso(document, "Binding");
            emChildOfCH.appendChild(document.createTextNode(h.getBinding()));
            emChild.appendChild(emChildOfCH);
        }
        PathSecurityType ps = h.getPathSecurity();
        if (ps != null) {
            emChildOfCH = createElementIso(document, "PathSecurity");
            Element emChildOfPS = createElementIso(document, "Protocol");
            emChildOfPS.appendChild(document.createTextNode(ps.getProtocol()));
            emChildOfCH.appendChild(emChildOfPS);
            // TODO here any type parsen
            LOG.error("AnyType of CardApplicationPath: " + ps.getParameters().toString());
            emChild.appendChild(emChildOfCH);
        }
        // context handle
        emChild = createElementIso(document, "ContextHandle");
        emChild.appendChild(document.createTextNode(ByteUtils.toHexString(p.getCardAppPathRequest().getContextHandle())));
        em.appendChild(emChild);
        // IFDName
        emChild = createElementIso(document, "IFDName");
        emChild.appendChild(document.createTextNode(p.getCardAppPathRequest().getIFDName()));
        em.appendChild(emChild);
        // SlotIndex
        emChild = createElementIso(document, "SlotIndex");
        emChild.appendChild(document.createTextNode(p.getCardAppPathRequest().getSlotIndex().toString()));
        em.appendChild(emChild);
        // Card Application
        emChild = createElementIso(document, "CardApplication");
        emChild.appendChild(document.createTextNode(ByteUtils.toHexString(p.getCardAppPathRequest().getCardApplication())));
        em.appendChild(emChild);
        rootElement.appendChild(em);
    } else if (o instanceof CardApplicationPathResponse) {
        CardApplicationPathResponse resp = (CardApplicationPathResponse) o;
        rootElement = createElementIso(document, "CardApplicationPathResponse");
        String profile = resp.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = resp.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
        Result result = resp.getResult();
        if (result != null) {
            Element emResult = marshalResult(resp.getResult(), document);
            rootElement.appendChild(emResult);
        }
        Element em = createElementIso(document, "CardAppPathResultSet");
        for (CardApplicationPathType path : resp.getCardAppPathResultSet().getCardApplicationPathResult()) {
            em.appendChild(marshalCardApplicationPathResult(path, document, "CardAppPathRequest"));
        }
        rootElement.appendChild(em);
    } else if (o instanceof BeginTransaction) {
        BeginTransaction t = (BeginTransaction) o;
        rootElement = createElementIso(document, "BeginTransaction");
        Element em = createElementIso(document, "SlotHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(t.getSlotHandle())));
        rootElement.appendChild(em);
    } else if (o instanceof BeginTransactionResponse) {
        BeginTransactionResponse response = (BeginTransactionResponse) o;
        rootElement = createElementIso(document, "BeginTransactionResponse");
        String profile = response.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = response.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
        Element emResult = marshalResult(response.getResult(), document);
        rootElement.appendChild(emResult);
    } else if (o instanceof EndTransaction) {
        EndTransaction end = (EndTransaction) o;
        rootElement = createElementIso(document, "EndTransaction");
        Element em = createElementIso(document, "SlotHandle");
        em.appendChild(document.createTextNode(ByteUtils.toHexString(end.getSlotHandle())));
        rootElement.appendChild(em);
    } else if (o instanceof EndTransactionResponse) {
        EndTransactionResponse response = (EndTransactionResponse) o;
        rootElement = createElementIso(document, "EndTransactionResponse");
        String profile = response.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = response.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
        Element emResult = marshalResult(response.getResult(), document);
        rootElement.appendChild(emResult);
    } else if (o instanceof CardApplicationConnect) {
        CardApplicationConnect c = (CardApplicationConnect) o;
        rootElement = createElementIso(document, "CardApplicationConnect");
        // Card Application Path
        rootElement.appendChild(marshalCardApplicationPathResult(c.getCardApplicationPath(), document, "CardApplicationPath"));
        Element em;
        if (c.getOutput() != null) {
            em = createElementIso(document, "Output");
            em.appendChild(marshalOutput(c.getOutput(), document));
            rootElement.appendChild(em);
        }
        // Exclusive Use
        if (c.isExclusiveUse() != null) {
            em = createElementIso(document, "ExclusiveUse");
            em.appendChild(document.createTextNode(Boolean.toString(c.isExclusiveUse())));
            rootElement.appendChild(em);
        }
    } else if (o instanceof CardApplicationConnectResponse) {
        CardApplicationConnectResponse resp = (CardApplicationConnectResponse) o;
        rootElement = createElementIso(document, "CardApplicationConnectResponse");
        appendResponseValues(resp.getProfile(), resp.getRequestID(), resp.getResult(), rootElement, document);
        ConnectionHandleType ch = resp.getConnectionHandle();
        if (ch != null) {
            Element em = marshalConnectionHandle(ch, document);
            rootElement.appendChild(em);
        }
    } else if (o instanceof CardApplicationDisconnect) {
        CardApplicationDisconnect c = (CardApplicationDisconnect) o;
        rootElement = createElementIso(document, "CardApplicationDisconnect");
        if (c.getConnectionHandle() != null) {
            rootElement.appendChild(marshalConnectionHandle(c.getConnectionHandle(), document));
        }
        if (c.getAction() != null) {
            Element em = createElementIso(document, "Action");
            em.appendChild(document.createTextNode(c.getAction().value()));
            rootElement.appendChild(em);
        }
        String profile = c.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = c.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
    } else if (o instanceof CardApplicationDisconnectResponse) {
        CardApplicationDisconnectResponse response = (CardApplicationDisconnectResponse) o;
        rootElement = createElementIso(document, "CardApplicationDisconnectResponse");
        String profile = response.getProfile();
        if (profile != null) {
            Element emProfile = createElementIso(document, "Profile");
            emProfile.appendChild(document.createTextNode(profile));
            rootElement.appendChild(emProfile);
        }
        String requestID = response.getRequestID();
        if (requestID != null) {
            Element emRequest = createElementIso(document, "RequestID");
            emRequest.appendChild(document.createElement(requestID));
            rootElement.appendChild(emRequest);
        }
        if (response.getResult() != null) {
            Element emResult = marshalResult(response.getResult(), document);
            rootElement.appendChild(emResult);
        }
    } else {
        throw new IllegalArgumentException("Cannot marshal " + o.getClass().getSimpleName());
    }
    document.appendChild(rootElement);
    return document;
}
Also used : TCTokenType(generated.TCTokenType) ConnectionHandleType(iso.std.iso_iec._24727.tech.schema.ConnectionHandleType) MarshallingTypeException(org.openecard.ws.marshal.MarshallingTypeException) LocalizedString(org.openecard.addon.manifest.LocalizedString) ChannelHandleType(iso.std.iso_iec._24727.tech.schema.ChannelHandleType) Document(org.w3c.dom.Document) StartPAOS(iso.std.iso_iec._24727.tech.schema.StartPAOS) StreamResult(javax.xml.transform.stream.StreamResult) Result(oasis.names.tc.dss._1_0.core.schema.Result) GetIFDCapabilities(iso.std.iso_iec._24727.tech.schema.GetIFDCapabilities) BeginTransaction(iso.std.iso_iec._24727.tech.schema.BeginTransaction) PathSecurityType(iso.std.iso_iec._24727.tech.schema.PathSecurityType) CardApplicationConnect(iso.std.iso_iec._24727.tech.schema.CardApplicationConnect) EstablishContext(iso.std.iso_iec._24727.tech.schema.EstablishContext) GetStatus(iso.std.iso_iec._24727.tech.schema.GetStatus) EndTransaction(iso.std.iso_iec._24727.tech.schema.EndTransaction) CardApplicationPathResponse(iso.std.iso_iec._24727.tech.schema.CardApplicationPathResponse) EstablishChannelResponse(iso.std.iso_iec._24727.tech.schema.EstablishChannelResponse) CardApplicationConnect(iso.std.iso_iec._24727.tech.schema.CardApplicationConnect) Connect(iso.std.iso_iec._24727.tech.schema.Connect) DIDAuthenticationDataType(iso.std.iso_iec._24727.tech.schema.DIDAuthenticationDataType) EstablishContextResponse(iso.std.iso_iec._24727.tech.schema.EstablishContextResponse) DestroyChannelResponse(iso.std.iso_iec._24727.tech.schema.DestroyChannelResponse) BeginTransactionResponse(iso.std.iso_iec._24727.tech.schema.BeginTransactionResponse) EstablishChannel(iso.std.iso_iec._24727.tech.schema.EstablishChannel) EAC2InputType(iso.std.iso_iec._24727.tech.schema.EAC2InputType) GetIFDCapabilitiesResponse(iso.std.iso_iec._24727.tech.schema.GetIFDCapabilitiesResponse) Wait(iso.std.iso_iec._24727.tech.schema.Wait) Map(java.util.Map) EAC2OutputType(iso.std.iso_iec._24727.tech.schema.EAC2OutputType) ListIFDs(iso.std.iso_iec._24727.tech.schema.ListIFDs) CardApplicationDisconnect(iso.std.iso_iec._24727.tech.schema.CardApplicationDisconnect) ConnectResponse(iso.std.iso_iec._24727.tech.schema.ConnectResponse) CardApplicationConnectResponse(iso.std.iso_iec._24727.tech.schema.CardApplicationConnectResponse) JAXBElement(javax.xml.bind.JAXBElement) Element(org.w3c.dom.Element) EndTransactionResponse(iso.std.iso_iec._24727.tech.schema.EndTransactionResponse) EAC1OutputType(iso.std.iso_iec._24727.tech.schema.EAC1OutputType) CardApplicationPathType(iso.std.iso_iec._24727.tech.schema.CardApplicationPathType) StartPAOS(iso.std.iso_iec._24727.tech.schema.StartPAOS) Disconnect(iso.std.iso_iec._24727.tech.schema.Disconnect) CardApplicationDisconnect(iso.std.iso_iec._24727.tech.schema.CardApplicationDisconnect) DisconnectResponse(iso.std.iso_iec._24727.tech.schema.DisconnectResponse) CardApplicationDisconnectResponse(iso.std.iso_iec._24727.tech.schema.CardApplicationDisconnectResponse) DestroyChannel(iso.std.iso_iec._24727.tech.schema.DestroyChannel) EAC1InputType(iso.std.iso_iec._24727.tech.schema.EAC1InputType) RecognitionTree(iso.std.iso_iec._24727.tech.schema.RecognitionTree) DIDAuthenticate(iso.std.iso_iec._24727.tech.schema.DIDAuthenticate) Transmit(iso.std.iso_iec._24727.tech.schema.Transmit) ListIFDsResponse(iso.std.iso_iec._24727.tech.schema.ListIFDsResponse) QName(javax.xml.namespace.QName) CardApplicationDisconnectResponse(iso.std.iso_iec._24727.tech.schema.CardApplicationDisconnectResponse) CardApplicationConnectResponse(iso.std.iso_iec._24727.tech.schema.CardApplicationConnectResponse) InternationalStringType(oasis.names.tc.dss._1_0.core.schema.InternationalStringType) DatatypeConfigurationException(javax.xml.datatype.DatatypeConfigurationException) MarshallingTypeException(org.openecard.ws.marshal.MarshallingTypeException) TransformerException(javax.xml.transform.TransformerException) IOException(java.io.IOException) RuntimeCryptoException(org.openecard.bouncycastle.crypto.RuntimeCryptoException) WSMarshallerException(org.openecard.ws.marshal.WSMarshallerException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) SAXException(org.xml.sax.SAXException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) SOAPException(org.openecard.ws.soap.SOAPException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) DIDAuthenticateResponse(iso.std.iso_iec._24727.tech.schema.DIDAuthenticateResponse) CardApplicationPath(iso.std.iso_iec._24727.tech.schema.CardApplicationPath) InitializeFrameworkResponse(de.bund.bsi.ecard.api._1.InitializeFrameworkResponse) TransmitResponse(iso.std.iso_iec._24727.tech.schema.TransmitResponse) CardCall(iso.std.iso_iec._24727.tech.schema.CardCall)

Example 2 with EAC1OutputType

use of iso.std.iso_iec._24727.tech.schema.EAC1OutputType in project open-ecard by ecsec.

the class AndroidMarshallerTest method testConversionOfDIDAuthenticateResponsePACE.

@Test
public void testConversionOfDIDAuthenticateResponsePACE() throws Exception {
    WSMarshaller m = new AndroidMarshaller();
    DIDAuthenticateResponse didAuthResponse = new DIDAuthenticateResponse();
    Result r = new Result();
    r.setResultMajor("major");
    r.setResultMinor("minor");
    InternationalStringType internationalStringType = new InternationalStringType();
    internationalStringType.setLang("en");
    internationalStringType.setValue("message");
    r.setResultMessage(internationalStringType);
    didAuthResponse.setResult(r);
    EAC1OutputType didAuthenticationDataType = new EAC1OutputType();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document d = builder.newDocument();
    Element e = d.createElementNS("urn:iso:std:iso-iec:24727:tech:schema", "RetryCounter");
    e.setTextContent("3");
    didAuthenticationDataType.getAny().add(e);
    e = d.createElementNS("urn:iso:std:iso-iec:24727:tech:schema", "CertificateHolderAuthorizationTemplate");
    e.setTextContent("7F4C12060904007F00070301020253050001009800");
    didAuthenticationDataType.getAny().add(e);
    e = d.createElementNS("urn:iso:std:iso-iec:24727:tech:schema", "CertificationAuthorityReference");
    e.setTextContent("ZZCVCAATA0001");
    didAuthenticationDataType.getAny().add(e);
    e = d.createElementNS("urn:iso:std:iso-iec:24727:tech:schema", "EFCardAccess");
    e.setTextContent("31820264300D060804007F0007020202020102300F060A04007F00070202030202020102300F060A04007F00070202040202020101302F060804007F0007020206162341775420655041202D2042447220476D6248202D20546573746B617274652076312E303081FE060904007F0007020203023081F0060B04007F00070101050202023081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537730440420A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E53740420662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04044104A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F42D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE022100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A70201013081FE060904007F0007020204023081F0060B04007F00070101050202023081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537730440420A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E53740420662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04044104A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F42D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE022100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7020101");
    didAuthenticationDataType.getAny().add(e);
    e = d.createElementNS("urn:iso:std:iso-iec:24727:tech:schema", "IDPICC");
    e.setTextContent("4F5311EC8F92D60040EA63365E2B06C832856CDE1CE5F8B3C7E7696DAD7628BD");
    didAuthenticationDataType.getAny().add(e);
    didAuthResponse.setAuthenticationProtocolData(didAuthenticationDataType);
    marshalLog(didAuthResponse);
    Document doc = m.marshal(didAuthResponse);
    String s = m.doc2str(doc);
    LOG.debug(s);
    StringReader sr = new StringReader(s);
    DIDAuthenticateResponse didaresp = JAXB.unmarshal(sr, DIDAuthenticateResponse.class);
    marshalLog(didaresp);
}
Also used : EAC1OutputType(iso.std.iso_iec._24727.tech.schema.EAC1OutputType) DIDAuthenticateResponse(iso.std.iso_iec._24727.tech.schema.DIDAuthenticateResponse) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) DocumentBuilder(javax.xml.parsers.DocumentBuilder) Element(org.w3c.dom.Element) StringReader(java.io.StringReader) WSMarshaller(org.openecard.ws.marshal.WSMarshaller) Document(org.w3c.dom.Document) InternationalStringType(oasis.names.tc.dss._1_0.core.schema.InternationalStringType) Result(oasis.names.tc.dss._1_0.core.schema.Result) Test(org.testng.annotations.Test)

Example 3 with EAC1OutputType

use of iso.std.iso_iec._24727.tech.schema.EAC1OutputType in project open-ecard by ecsec.

the class PACEStep method perform.

@Override
public DIDAuthenticateResponse perform(DIDAuthenticate request, Map<String, Object> internalData) {
    // get context to save values in
    DynamicContext dynCtx = DynamicContext.getInstance(TR03112Keys.INSTANCE_KEY);
    DIDAuthenticate didAuthenticate = request;
    DIDAuthenticateResponse response = new DIDAuthenticateResponse();
    ConnectionHandleType conHandle = (ConnectionHandleType) dynCtx.get(TR03112Keys.CONNECTION_HANDLE);
    try {
        ObjectSchemaValidator valid = (ObjectSchemaValidator) dynCtx.getPromise(EACProtocol.SCHEMA_VALIDATOR).deref();
        boolean messageValid = valid.validateObject(request);
        if (!messageValid) {
            String msg = "Validation of the EAC1InputType message failed.";
            LOG.error(msg);
            dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
            response.setResult(WSHelper.makeResultError(ECardConstants.Minor.App.INCORRECT_PARM, msg));
            return response;
        }
    } catch (ObjectValidatorException ex) {
        String msg = "Validation of the EAC1InputType message failed due to invalid input data.";
        LOG.error(msg, ex);
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
        response.setResult(WSHelper.makeResultError(ECardConstants.Minor.App.INT_ERROR, msg));
        return response;
    } catch (InterruptedException ex) {
        String msg = "Thread interrupted while waiting for schema validator instance.";
        LOG.error(msg, ex);
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
        response.setResult(WSHelper.makeResultError(ECardConstants.Minor.App.INT_ERROR, msg));
        return response;
    }
    if (!ByteUtils.compare(conHandle.getSlotHandle(), didAuthenticate.getConnectionHandle().getSlotHandle())) {
        String msg = "Invalid connection handle given in DIDAuthenticate message.";
        Result r = WSHelper.makeResultError(ECardConstants.Minor.SAL.UNKNOWN_HANDLE, msg);
        response.setResult(r);
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
        return response;
    }
    byte[] slotHandle = conHandle.getSlotHandle();
    dynCtx.put(EACProtocol.SLOT_HANDLE, slotHandle);
    dynCtx.put(EACProtocol.DISPATCHER, dispatcher);
    try {
        EAC1InputType eac1Input = new EAC1InputType(didAuthenticate.getAuthenticationProtocolData());
        EAC1OutputType eac1Output = eac1Input.getOutputType();
        AuthenticatedAuxiliaryData aad = new AuthenticatedAuxiliaryData(eac1Input.getAuthenticatedAuxiliaryData());
        byte pinID = PasswordID.valueOf(didAuthenticate.getDIDName()).getByte();
        final String passwordType = PasswordID.parse(pinID).getString();
        // determine PACE capabilities of the terminal
        boolean nativePace = genericPACESupport(conHandle);
        dynCtx.put(EACProtocol.IS_NATIVE_PACE, nativePace);
        // Certificate chain
        CardVerifiableCertificateChain certChain = new CardVerifiableCertificateChain(eac1Input.getCertificates());
        byte[] rawCertificateDescription = eac1Input.getCertificateDescription();
        CertificateDescription certDescription = CertificateDescription.getInstance(rawCertificateDescription);
        // put CertificateDescription into DynamicContext which is needed for later checks
        dynCtx.put(TR03112Keys.ESERVICE_CERTIFICATE_DESC, certDescription);
        // according to BSI-INSTANCE_KEY-7 we MUST perform some checks immediately after receiving the eService cert
        Result activationChecksResult = performChecks(certDescription, dynCtx);
        if (!ECardConstants.Major.OK.equals(activationChecksResult.getResultMajor())) {
            response.setResult(activationChecksResult);
            dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
            return response;
        }
        CHAT requiredCHAT = new CHAT(eac1Input.getRequiredCHAT());
        CHAT optionalCHAT = new CHAT(eac1Input.getOptionalCHAT());
        // get the PACEMarker
        CardStateEntry cardState = (CardStateEntry) internalData.get(EACConstants.IDATA_CARD_STATE_ENTRY);
        PACEMarkerType paceMarker = getPaceMarker(cardState, passwordType);
        dynCtx.put(EACProtocol.PACE_MARKER, paceMarker);
        // Verify that the certificate description matches the terminal certificate
        CardVerifiableCertificate taCert = certChain.getTerminalCertificate();
        CardVerifiableCertificateVerifier.verify(taCert, certDescription);
        // Verify that the required CHAT matches the terminal certificate's CHAT
        CHAT taCHAT = taCert.getCHAT();
        // an other role.
        if (taCHAT.getRole() != CHAT.Role.AUTHENTICATION_TERMINAL) {
            String msg = "Unsupported terminal type in Terminal Certificate referenced. Refernced terminal type is " + taCHAT.getRole().toString() + ".";
            response.setResult(WSHelper.makeResultError(ECardConstants.Minor.App.INCORRECT_PARM, msg));
            dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
            return response;
        }
        CHATVerifier.verfiy(taCHAT, requiredCHAT);
        // remove overlapping values from optional chat
        optionalCHAT.restrictAccessRights(taCHAT);
        // Prepare data in DIDAuthenticate for GUI
        final EACData eacData = new EACData();
        eacData.didRequest = didAuthenticate;
        eacData.certificate = certChain.getTerminalCertificate();
        eacData.certificateDescription = certDescription;
        eacData.rawCertificateDescription = rawCertificateDescription;
        eacData.transactionInfo = eac1Input.getTransactionInfo();
        eacData.requiredCHAT = requiredCHAT;
        eacData.optionalCHAT = optionalCHAT;
        eacData.selectedCHAT = requiredCHAT;
        eacData.aad = aad;
        eacData.pinID = pinID;
        eacData.passwordType = passwordType;
        dynCtx.put(EACProtocol.EAC_DATA, eacData);
        // get initial pin status
        InputAPDUInfoType input = new InputAPDUInfoType();
        input.setInputAPDU(new byte[] { (byte) 0x00, (byte) 0x22, (byte) 0xC1, (byte) 0xA4, (byte) 0x0F, (byte) 0x80, (byte) 0x0A, (byte) 0x04, (byte) 0x00, (byte) 0x7F, (byte) 0x00, (byte) 0x07, (byte) 0x02, (byte) 0x02, (byte) 0x04, (byte) 0x02, (byte) 0x02, (byte) 0x83, (byte) 0x01, (byte) 0x03 });
        input.getAcceptableStatusCode().addAll(EacPinStatus.getCodes());
        Transmit transmit = new Transmit();
        transmit.setSlotHandle(slotHandle);
        transmit.getInputAPDUInfo().add(input);
        TransmitResponse pinCheckResponse = (TransmitResponse) dispatcher.safeDeliver(transmit);
        WSHelper.checkResult(pinCheckResponse);
        byte[] output = pinCheckResponse.getOutputAPDU().get(0);
        CardResponseAPDU outputApdu = new CardResponseAPDU(output);
        byte[] status = outputApdu.getStatusBytes();
        dynCtx.put(EACProtocol.PIN_STATUS, EacPinStatus.fromCode(status));
        // define GUI depending on the PIN status
        final UserConsentDescription uc = new UserConsentDescription(LANG.translationForKey(TITLE));
        final CardMonitor cardMon;
        uc.setDialogType("EAC");
        // create GUI and init executor
        cardMon = new CardMonitor();
        CardRemovedFilter filter = new CardRemovedFilter(conHandle.getIFDName(), conHandle.getSlotIndex());
        eventDispatcher.add(cardMon, filter);
        CVCStep cvcStep = new CVCStep(eacData);
        cvcStep.setBackgroundTask(cardMon);
        CVCStepAction cvcStepAction = new CVCStepAction(cvcStep);
        cvcStep.setAction(cvcStepAction);
        uc.getSteps().add(cvcStep);
        uc.getSteps().add(CHATStep.createDummy());
        uc.getSteps().add(PINStep.createDummy(passwordType));
        ProcessingStep procStep = new ProcessingStep();
        ProcessingStepAction procStepAction = new ProcessingStepAction(procStep);
        procStep.setAction(procStepAction);
        uc.getSteps().add(procStep);
        Thread guiThread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // get context here because it is thread local
                    DynamicContext dynCtx = DynamicContext.getInstance(TR03112Keys.INSTANCE_KEY);
                    if (!uc.getSteps().isEmpty()) {
                        UserConsentNavigator navigator = gui.obtainNavigator(uc);
                        dynCtx.put(TR03112Keys.OPEN_USER_CONSENT_NAVIGATOR, navigator);
                        ExecutionEngine exec = new ExecutionEngine(navigator);
                        ResultStatus guiResult = exec.process();
                        dynCtx.put(EACProtocol.GUI_RESULT, guiResult);
                        if (guiResult == ResultStatus.CANCEL) {
                            Promise<Object> pPaceSuccessful = dynCtx.getPromise(EACProtocol.PACE_EXCEPTION);
                            if (!pPaceSuccessful.isDelivered()) {
                                pPaceSuccessful.deliver(WSHelper.createException(WSHelper.makeResultError(ECardConstants.Minor.SAL.CANCELLATION_BY_USER, "User canceled the PACE dialog.")));
                            }
                        }
                    }
                } finally {
                    if (cardMon != null) {
                        eventDispatcher.del(cardMon);
                    }
                }
            }
        }, "EAC-GUI");
        guiThread.start();
        // wait for PACE to finish
        Promise<Object> pPaceException = dynCtx.getPromise(EACProtocol.PACE_EXCEPTION);
        Object pPaceError = pPaceException.deref();
        if (pPaceError != null) {
            if (pPaceError instanceof WSHelper.WSException) {
                response.setResult(((WSHelper.WSException) pPaceError).getResult());
                return response;
            } else if (pPaceError instanceof DispatcherException | pPaceError instanceof InvocationTargetException) {
                String msg = "Internal error while PACE authentication.";
                Result r = WSHelper.makeResultError(ECardConstants.Minor.App.INT_ERROR, msg);
                response.setResult(r);
                return response;
            } else {
                String msg = "Unknown error while PACE authentication.";
                Result r = WSHelper.makeResultError(ECardConstants.Minor.App.UNKNOWN_ERROR, msg);
                response.setResult(r);
                return response;
            }
        }
        // get challenge from card
        TerminalAuthentication ta = new TerminalAuthentication(dispatcher, slotHandle);
        byte[] challenge = ta.getChallenge();
        // prepare DIDAuthenticationResponse
        DIDAuthenticationDataType data = eacData.paceResponse.getAuthenticationProtocolData();
        AuthDataMap paceOutputMap = new AuthDataMap(data);
        // int retryCounter = Integer.valueOf(paceOutputMap.getContentAsString(PACEOutputType.RETRY_COUNTER));
        byte[] efCardAccess = paceOutputMap.getContentAsBytes(PACEOutputType.EF_CARD_ACCESS);
        byte[] currentCAR = paceOutputMap.getContentAsBytes(PACEOutputType.CURRENT_CAR);
        byte[] previousCAR = paceOutputMap.getContentAsBytes(PACEOutputType.PREVIOUS_CAR);
        byte[] idpicc = paceOutputMap.getContentAsBytes(PACEOutputType.ID_PICC);
        // Store SecurityInfos
        SecurityInfos securityInfos = SecurityInfos.getInstance(efCardAccess);
        internalData.put(EACConstants.IDATA_SECURITY_INFOS, securityInfos);
        // Store additional data
        internalData.put(EACConstants.IDATA_AUTHENTICATED_AUXILIARY_DATA, aad);
        internalData.put(EACConstants.IDATA_CERTIFICATES, certChain);
        internalData.put(EACConstants.IDATA_CURRENT_CAR, currentCAR);
        internalData.put(EACConstants.IDATA_PREVIOUS_CAR, previousCAR);
        internalData.put(EACConstants.IDATA_CHALLENGE, challenge);
        // Create response
        // eac1Output.setRetryCounter(retryCounter);
        eac1Output.setCHAT(eacData.selectedCHAT.toByteArray());
        eac1Output.setCurrentCAR(currentCAR);
        eac1Output.setPreviousCAR(previousCAR);
        eac1Output.setEFCardAccess(efCardAccess);
        eac1Output.setIDPICC(idpicc);
        eac1Output.setChallenge(challenge);
        response.setResult(WSHelper.makeResultOK());
        response.setAuthenticationProtocolData(eac1Output.getAuthDataType());
    } catch (CertificateException ex) {
        LOG.error(ex.getMessage(), ex);
        String msg = ex.getMessage();
        response.setResult(WSHelper.makeResultError(ECardConstants.Minor.SAL.EAC.DOC_VALID_FAILED, msg));
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
    } catch (WSHelper.WSException e) {
        LOG.error(e.getMessage(), e);
        response.setResult(e.getResult());
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
    } catch (ElementParsingException ex) {
        LOG.error(ex.getMessage(), ex);
        response.setResult(WSHelper.makeResultError(ECardConstants.Minor.App.INCORRECT_PARM, ex.getMessage()));
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
    } catch (Exception e) {
        LOG.error(e.getMessage(), e);
        response.setResult(WSHelper.makeResultUnknownError(e.getMessage()));
        dynCtx.put(EACProtocol.AUTHENTICATION_FAILED, true);
    }
    return response;
}
Also used : ConnectionHandleType(iso.std.iso_iec._24727.tech.schema.ConnectionHandleType) PACEMarkerType(org.openecard.sal.protocol.eac.anytype.PACEMarkerType) ProcessingStepAction(org.openecard.sal.protocol.eac.gui.ProcessingStepAction) CertificateException(java.security.cert.CertificateException) CardMonitor(org.openecard.sal.protocol.eac.gui.CardMonitor) UserConsentNavigator(org.openecard.gui.UserConsentNavigator) Result(oasis.names.tc.dss._1_0.core.schema.Result) ObjectValidatorException(org.openecard.common.interfaces.ObjectValidatorException) ObjectSchemaValidator(org.openecard.common.interfaces.ObjectSchemaValidator) UserConsentDescription(org.openecard.gui.definition.UserConsentDescription) DispatcherException(org.openecard.common.interfaces.DispatcherException) DIDAuthenticationDataType(iso.std.iso_iec._24727.tech.schema.DIDAuthenticationDataType) InvocationTargetException(java.lang.reflect.InvocationTargetException) Promise(org.openecard.common.util.Promise) ExecutionEngine(org.openecard.gui.executor.ExecutionEngine) AuthenticatedAuxiliaryData(org.openecard.crypto.common.asn1.eac.AuthenticatedAuxiliaryData) CardVerifiableCertificate(org.openecard.crypto.common.asn1.cvc.CardVerifiableCertificate) AuthDataMap(org.openecard.common.anytype.AuthDataMap) CVCStepAction(org.openecard.sal.protocol.eac.gui.CVCStepAction) DynamicContext(org.openecard.common.DynamicContext) CardRemovedFilter(org.openecard.sal.protocol.eac.gui.CardRemovedFilter) CardStateEntry(org.openecard.common.sal.state.CardStateEntry) CVCStep(org.openecard.sal.protocol.eac.gui.CVCStep) CHAT(org.openecard.crypto.common.asn1.cvc.CHAT) InputAPDUInfoType(iso.std.iso_iec._24727.tech.schema.InputAPDUInfoType) ElementParsingException(org.openecard.sal.protocol.eac.anytype.ElementParsingException) EAC1OutputType(org.openecard.sal.protocol.eac.anytype.EAC1OutputType) CardResponseAPDU(org.openecard.common.apdu.common.CardResponseAPDU) CardVerifiableCertificateChain(org.openecard.crypto.common.asn1.cvc.CardVerifiableCertificateChain) EAC1InputType(org.openecard.sal.protocol.eac.anytype.EAC1InputType) WSHelper(org.openecard.common.WSHelper) DIDAuthenticate(iso.std.iso_iec._24727.tech.schema.DIDAuthenticate) Transmit(iso.std.iso_iec._24727.tech.schema.Transmit) ResultStatus(org.openecard.gui.ResultStatus) SecurityInfos(org.openecard.crypto.common.asn1.eac.SecurityInfos) CertificateDescription(org.openecard.crypto.common.asn1.cvc.CertificateDescription) ProcessingStep(org.openecard.sal.protocol.eac.gui.ProcessingStep) DispatcherException(org.openecard.common.interfaces.DispatcherException) ObjectValidatorException(org.openecard.common.interfaces.ObjectValidatorException) InvocationTargetException(java.lang.reflect.InvocationTargetException) ElementParsingException(org.openecard.sal.protocol.eac.anytype.ElementParsingException) MalformedURLException(java.net.MalformedURLException) CertificateException(java.security.cert.CertificateException) DIDAuthenticateResponse(iso.std.iso_iec._24727.tech.schema.DIDAuthenticateResponse) TransmitResponse(iso.std.iso_iec._24727.tech.schema.TransmitResponse)

Aggregations

DIDAuthenticateResponse (iso.std.iso_iec._24727.tech.schema.DIDAuthenticateResponse)3 Result (oasis.names.tc.dss._1_0.core.schema.Result)3 ConnectionHandleType (iso.std.iso_iec._24727.tech.schema.ConnectionHandleType)2 DIDAuthenticate (iso.std.iso_iec._24727.tech.schema.DIDAuthenticate)2 DIDAuthenticationDataType (iso.std.iso_iec._24727.tech.schema.DIDAuthenticationDataType)2 EAC1OutputType (iso.std.iso_iec._24727.tech.schema.EAC1OutputType)2 Transmit (iso.std.iso_iec._24727.tech.schema.Transmit)2 TransmitResponse (iso.std.iso_iec._24727.tech.schema.TransmitResponse)2 InternationalStringType (oasis.names.tc.dss._1_0.core.schema.InternationalStringType)2 Document (org.w3c.dom.Document)2 Element (org.w3c.dom.Element)2 InitializeFrameworkResponse (de.bund.bsi.ecard.api._1.InitializeFrameworkResponse)1 TCTokenType (generated.TCTokenType)1 BeginTransaction (iso.std.iso_iec._24727.tech.schema.BeginTransaction)1 BeginTransactionResponse (iso.std.iso_iec._24727.tech.schema.BeginTransactionResponse)1 CardApplicationConnect (iso.std.iso_iec._24727.tech.schema.CardApplicationConnect)1 CardApplicationConnectResponse (iso.std.iso_iec._24727.tech.schema.CardApplicationConnectResponse)1 CardApplicationDisconnect (iso.std.iso_iec._24727.tech.schema.CardApplicationDisconnect)1 CardApplicationDisconnectResponse (iso.std.iso_iec._24727.tech.schema.CardApplicationDisconnectResponse)1 CardApplicationPath (iso.std.iso_iec._24727.tech.schema.CardApplicationPath)1