Program: 48143
Project: 48143
Buggy source:
/** 
 * Test for the Sign Step of the Generic Cryptography protocol. After we connected to the ESIGN application of the eGK, we use DIDList to get a List of DIDs that support the compute signature function. For each DID we let the card compute a signature. If the result is OK we're satisfied.
 * @throws Exception when something in this test went unexpectedly wrong
 */
@Test public void testSign() throws Exception {
  CardApplicationPath cardApplicationPath=new CardApplicationPath();
  CardApplicationPathType cardApplicationPathType=new CardApplicationPathType();
  cardApplicationPathType.setCardApplication(cardApplication);
  cardApplicationPath.setCardAppPathRequest(cardApplicationPathType);
  CardApplicationPathResponse cardApplicationPathResponse=instance.cardApplicationPath(cardApplicationPath);
  WSHelper.checkResult(cardApplicationPathResponse);
  CardApplicationConnect parameters=new CardApplicationConnect();
  CardAppPathResultSet cardAppPathResultSet=cardApplicationPathResponse.getCardAppPathResultSet();
  parameters.setCardApplicationPath(cardAppPathResultSet.getCardApplicationPathResult().get(0));
  CardApplicationConnectResponse result=instance.cardApplicationConnect(parameters);
  WSHelper.checkResult(result);
  assertEquals(ECardConstants.Major.OK,result.getResult().getResultMajor());
  DIDList didList=new DIDList();
  didList.setConnectionHandle(result.getConnectionHandle());
  DIDQualifierType didQualifier=new DIDQualifierType();
  didQualifier.setApplicationIdentifier(cardApplication);
  didQualifier.setObjectIdentifier(ECardConstants.Protocol.GENERIC_CRYPTO);
  didQualifier.setApplicationFunction("String_Node_Str");
  didList.setFilter(didQualifier);
  DIDListResponse didListResponse=instance.didList(didList);
  assertTrue(didListResponse.getDIDNameList().getDIDName().size() > 0);
  WSHelper.checkResult(didListResponse);
  DIDAuthenticate didAthenticate=new DIDAuthenticate();
  didAthenticate.setDIDName("String_Node_Str");
  PinCompareDIDAuthenticateInputType didAuthenticationData=new PinCompareDIDAuthenticateInputType();
  didAthenticate.setAuthenticationProtocolData(didAuthenticationData);
  didAthenticate.setConnectionHandle(result.getConnectionHandle());
  didAthenticate.getConnectionHandle().setCardApplication(cardApplication_ROOT);
  didAuthenticationData.setProtocol(ECardConstants.Protocol.PIN_COMPARE);
  didAthenticate.setAuthenticationProtocolData(didAuthenticationData);
  DIDAuthenticateResponse didAuthenticateResult=instance.didAuthenticate(didAthenticate);
  WSHelper.checkResult(didAuthenticateResult);
  assertEquals(didAuthenticateResult.getAuthenticationProtocolData().getProtocol(),ECardConstants.Protocol.PIN_COMPARE);
  assertEquals(didAuthenticateResult.getAuthenticationProtocolData().getAny().size(),0);
  assertEquals(ECardConstants.Major.OK,didAuthenticateResult.getResult().getResultMajor());
  for (int numOfDIDs=0; numOfDIDs < didListResponse.getDIDNameList().getDIDName().size(); numOfDIDs++) {
    String didName=didListResponse.getDIDNameList().getDIDName().get(numOfDIDs);
    System.out.println(didName);
    DIDGet didGet=new DIDGet();
    didGet.setDIDName(didName);
    didGet.setDIDScope(DIDScopeType.LOCAL);
    didGet.setConnectionHandle(result.getConnectionHandle());
    didGet.getConnectionHandle().setCardApplication(cardApplication);
    DIDGetResponse didGetResponse=instance.didGet(didGet);
    org.openecard.common.sal.anytype.CryptoMarkerType cryptoMarker=new org.openecard.common.sal.anytype.CryptoMarkerType((CryptoMarkerType)didGetResponse.getDIDStructure().getDIDMarker());
    Sign sign=new Sign();
    byte[] message=StringUtils.toByteArray("String_Node_Str");
    String algorithm=cryptoMarker.getAlgorithmInfo().getAlgorithmIdentifier().getAlgorithm();
    if (algorithm.equals(GenericCryptoObjectIdentifier.sigS_ISO9796_2rnd)) {
      continue;
    }
    sign.setMessage(message);
    sign.setConnectionHandle(result.getConnectionHandle());
    sign.getConnectionHandle().setCardApplication(cardApplication);
    sign.setDIDName(didName);
    sign.setDIDScope(DIDScopeType.LOCAL);
    SignResponse signResponse=instance.sign(sign);
    WSHelper.checkResult(signResponse);
    assertTrue(signResponse.getSignature() != null);
  }
}

Fixed version (ground truth):
/** 
 * Test for the Sign Step of the Generic Cryptography protocol. After we connected to the ESIGN application of the eGK, we use DIDList to get a List of DIDs that support the compute signature function. For each DID we let the card compute a signature. If the result is OK we're satisfied.
 * @throws Exception when something in this test went unexpectedly wrong
 */
@Test public void testSign() throws Exception {
  CardApplicationPath cardApplicationPath=new CardApplicationPath();
  CardApplicationPathType cardApplicationPathType=new CardApplicationPathType();
  cardApplicationPathType.setCardApplication(cardApplication);
  cardApplicationPath.setCardAppPathRequest(cardApplicationPathType);
  CardApplicationPathResponse cardApplicationPathResponse=instance.cardApplicationPath(cardApplicationPath);
  WSHelper.checkResult(cardApplicationPathResponse);
  CardApplicationConnect parameters=new CardApplicationConnect();
  CardAppPathResultSet cardAppPathResultSet=cardApplicationPathResponse.getCardAppPathResultSet();
  parameters.setCardApplicationPath(cardAppPathResultSet.getCardApplicationPathResult().get(0));
  CardApplicationConnectResponse result=instance.cardApplicationConnect(parameters);
  WSHelper.checkResult(result);
  assertEquals(ECardConstants.Major.OK,result.getResult().getResultMajor());
  DIDList didList=new DIDList();
  didList.setConnectionHandle(result.getConnectionHandle());
  DIDQualifierType didQualifier=new DIDQualifierType();
  didQualifier.setApplicationIdentifier(cardApplication);
  didQualifier.setObjectIdentifier(ECardConstants.Protocol.GENERIC_CRYPTO);
  didQualifier.setApplicationFunction("String_Node_Str");
  didList.setFilter(didQualifier);
  DIDListResponse didListResponse=instance.didList(didList);
  assertTrue(didListResponse.getDIDNameList().getDIDName().size() > 0);
  WSHelper.checkResult(didListResponse);
  DIDAuthenticate didAthenticate=new DIDAuthenticate();
  didAthenticate.setDIDName("String_Node_Str");
  PinCompareDIDAuthenticateInputType didAuthenticationData=new PinCompareDIDAuthenticateInputType();
  didAthenticate.setAuthenticationProtocolData(didAuthenticationData);
  didAthenticate.setConnectionHandle(result.getConnectionHandle());
  didAthenticate.getConnectionHandle().setCardApplication(cardApplication_ROOT);
  didAuthenticationData.setProtocol(ECardConstants.Protocol.PIN_COMPARE);
  didAthenticate.setAuthenticationProtocolData(didAuthenticationData);
  DIDAuthenticateResponse didAuthenticateResult=instance.didAuthenticate(didAthenticate);
  WSHelper.checkResult(didAuthenticateResult);
  assertEquals(didAuthenticateResult.getAuthenticationProtocolData().getProtocol(),ECardConstants.Protocol.PIN_COMPARE);
  assertEquals(didAuthenticateResult.getAuthenticationProtocolData().getAny().size(),0);
  assertEquals(ECardConstants.Major.OK,didAuthenticateResult.getResult().getResultMajor());
  for (int numOfDIDs=0; numOfDIDs < didListResponse.getDIDNameList().getDIDName().size(); numOfDIDs++) {
    String didName=didListResponse.getDIDNameList().getDIDName().get(numOfDIDs);
    System.out.println(didName);
    DIDGet didGet=new DIDGet();
    didGet.setDIDName(didName);
    didGet.setDIDScope(DIDScopeType.LOCAL);
    didGet.setConnectionHandle(result.getConnectionHandle());
    didGet.getConnectionHandle().setCardApplication(cardApplication);
    DIDGetResponse didGetResponse=instance.didGet(didGet);
    org.openecard.crypto.common.sal.CryptoMarkerType cryptoMarker=new org.openecard.crypto.common.sal.CryptoMarkerType((CryptoMarkerType)didGetResponse.getDIDStructure().getDIDMarker());
    Sign sign=new Sign();
    byte[] message=StringUtils.toByteArray("String_Node_Str");
    String algorithm=cryptoMarker.getAlgorithmInfo().getAlgorithmIdentifier().getAlgorithm();
    if (algorithm.equals(GenericCryptoObjectIdentifier.sigS_ISO9796_2rnd)) {
      continue;
    }
    sign.setMessage(message);
    sign.setConnectionHandle(result.getConnectionHandle());
    sign.getConnectionHandle().setCardApplication(cardApplication);
    sign.setDIDName(didName);
    sign.setDIDScope(DIDScopeType.LOCAL);
    SignResponse signResponse=instance.sign(sign);
    WSHelper.checkResult(signResponse);
    assertTrue(signResponse.getSignature() != null);
  }
}