Code Monkey home page Code Monkey logo

as2-lib's Introduction

as2-lib

Maven Central javadoc CodeCov

AS2 is a transport protocol specified in RFC 4130. AS2 version 1.1 adding compression is specified in RFC 5402. The MDN is specified in RFC 3798. Algorithm names are defined in RFC 5751 (S/MIME 3.2) which supersedes RFC 3851 (S/MIME 3.1);

See the Wiki for all details. It also contains License details.

This library is a fork of OpenAS2 which did not release updates since 2010 (as per August 2015 they are on GitHub at https://github.com/OpenAS2/OpenAs2App). I then split the project into a common library part (the "as2-lib" submodule) and a server part (the "as2-server" submodule) which contains a stand alone (socket) server. The library project also contains a simple AS2 client which can be used to send messages to other AS2 servers (as part of "as2-lib").


My personal Coding Styleguide | It is appreciated if you star the GitHub project if you like it.

as2-lib's People

Contributors

dependabot[bot] avatar gitter-badger avatar jochenberger avatar maurice-betzel avatar niranjanghule avatar phax avatar rklyne avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

as2-lib's Issues

Create a basic receival servlet

Based on as2-peppol-servlet a simple non-peppol servlet component should be extracted. It should handle incoming documents like the server does.
This servlet should than be used by as2-peppol-servlet as well....

No failure if `AS2SenderModule._resend` fails

If I create a partnership with a wrong AS2 url and try to send a request, the handler logs some errors but returns instead of throwing an exception.
The logs contain

14:03:44.172 [qtp596512129-61] ERROR c.h.a.p.sender.AS2SenderModule - Error URL 'http://as2test:8080/as2/brokenurl' - HTTP 404 Not Found
14:03:44.172 [qtp596512129-61] ERROR c.h.a.p.sender.AS2SenderModule - Http Response Error Not Found
14:03:44.172 [qtp596512129-61] INFO  c.h.a.exception.OpenAS2Exception - OpenAS2Exception terminated: Not Found

Maybe AS2SenderModule._resend(IMessage, OpenAS2Exception, int) should rethrow the exception.

Stack overflow caused by retries

I have this setup

      final AS2Session as2Session = new AS2Session();
      as2Session.setCertificateFactory(new KeyStoreServiceCertificateFactory(keyStoreService));
      as2Session.setPartnershipFactory(partnershipFactory);

      DefaultMessageProcessor processor = new DefaultMessageProcessor();
      processor.stopActiveModules();
      processor.initDynamicComponent(as2Session, new StringMap());

      ImmediateResenderModule resender = new ImmediateResenderModule();
      resender.initDynamicComponent(as2Session, new StringMap());
      processor.addModule(resender);

      final AS2SenderModule aSender = new AS2SenderModule();
      aSender.initDynamicComponent(as2Session, new StringMap());
      processor.addModule(aSender);

      as2Session.setMessageProcessor(processor);
      processor.startActiveModules();

Furthermore (in a specific test) the partnership config specifies 3 retries; and I am sending to an URL where there is no(!) server listening (I was trying to verify that retries are working by delaying listener startup).
While working on that the test fails like this:

    at com.helger.as2lib.processor.sender.AS2SenderModule._sendViaHTTP(AS2SenderModule.java:566)
    at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:647)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
    at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
    at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
    at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
    at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)

The lowest line is from the actual call to "send"; the chain of bouncing from resender -> message-processor -> sender -> ... gets longer.

This seems to be caused by AbstractSenderModule::getRetryCount. The value passed via aOptions is ignored if checking aPartnership yields a result; I assume aOptions should
have priority, otherwise decrementing the counter in the resender module has no effect?

This seems to work for me:

    List<Integer> retryValues = new ArrayList<>();

    if (aPartnership != null)
    {
      // Get from partnership
      final String sTriesLeft = aPartnership.getAttribute (IProcessorResenderModule.OPTION_RETRIES);
      if (sTriesLeft != null) {
        retryValues.add(Integer.parseInt(sTriesLeft));
      }
    }

    if ((aOptions != null) && (aOptions.get(IProcessorResenderModule.OPTION_RETRIES) != null))
    {
      // Provided in the options?
      final String  sTriesLeft = (String) aOptions.get (IProcessorResenderModule.OPTION_RETRIES);
      retryValues.add(Integer.parseInt(sTriesLeft));
    }

    final String fromAttr = getAttributeAsString(IProcessorResenderModule.OPTION_RETRIES);
    if (fromAttr != null)
    {
      // No. Provided as an attribute?
      retryValues.add(Integer.parseInt(fromAttr));
    }

    if (retryValues.isEmpty())
    {
      // Not provided. Use default.
      return IProcessorResenderModule.DEFAULT_RETRIES;
    }

    // Avoid returning negative values
    return retryValues.stream()
            .filter((v) -> v >= 0)
            .min(Comparator.naturalOrder()).orElse(0); 

Retries cause OOM when creating stacktrace

This is similar to #16; the scenario is repeated failure to send a message.

The final exception isn't too interesting; but anyway:

java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at com.helger.as2lib.processor.ProcessorException._getMessage(ProcessorException.java:63)
    at com.helger.as2lib.processor.ProcessorException.<init>(ProcessorException.java:74)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:151)
    at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
    at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
    at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:148)
    at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:731)

The problem seems to be the recursive chain of calls: AS2SenderModule -> DefaultMessageProcessor -> ResenderModule -> DefaultMessageProcessor -> AS2SenderModule -> ....

Each time the exception is caught in AS2SenderModule, wrapped, stashed and rethrown if the next attempt (doResend) fails again; then caught again in DefaultMessageProcessor and rethrown as a ProcessorException.

This is the length of getStackAsString() in ProcessorException::_getMessage:

trace length: 11065
trace length: 20294
trace length: 40436
trace length: 80638
trace length: 161126
trace length: 322018
trace length: 643886
trace length: 1287538
trace length: 2574926
trace length: 5149618
trace length: 10299086
trace length: 20597938
trace length: 41195726
trace length: 82391218
trace length: 164782286

I don't see a "good" way to avoid the geometric increase; for our usage the following works, but aborting early might not be correct in the general case.

--- a/as2-lib/src/main/java/com/helger/as2lib/processor/DefaultMessageProcessor.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/processor/DefaultMessageProcessor.java
@@ -141,6 +141,9 @@ public class DefaultMessageProcessor extends AbstractMessageProcessor
           bModuleFound = true;
           aModule.handle (sAction, aMsg, aOptions);
         }
+        catch (final ProcessorException ex) {
+          throw ex;
+        }
         catch (final OpenAS2Exception ex)
         {
           aCauses.add (ex);

AS2 Client - https

I see as2 client support https but cannot find any api, please advise any example thanks

v2.2.8 - 2016-05-09
Improved AS2 client https customization and API

Using FIPS

Hi Philip, We will need to use the FIPS version of BC package. For this, we need to give a different provider name. I thought to add to ph-bc a static function to allow the user to change the provider to FIPS, and add a function to get the provider name, as it is needed in BCCryptoHelper.java:403.
What do you think?
Thanks, Ziv

Insecure SSL configuration in AbstractHttpSenderModule

I've noticed that the SSL configuration in AbstractHttpSenderModule is insecure, in that it does not verify certificates or hostames (using DoNothingTrustManager and HostnameVerifierAlwaysTrue).
Moreover, there seem to be no obvious way to override these when used from AS2ClientBuilder / AS2Client, since AS2Client.sendSynchronous() does instantiate an insecure AS2SenderModule directly, without any factory or configuration point.
Is this by design? Would you accept a pull request that made the AS2SenderModule configurable?

Cheers

Proxy question

How can i make connection to the endpoints using a proxy?

I cannot set the proxy at JVM level, because not all http connection must go through the same proxy.

After a little bot of digging in the classes i found in

AbstractHttpSenderModule.getConnection( ....)

the line

final HttpURLConnection aConn = (HttpURLConnection) aUrlObj.openConnection ();

I know i can add a proxy object to the openConnection method.

Is there an elegant way of overriding this method?
Are there more places where this method is used (the openconnection) one?

encrypted base64-encoded

hi, I'm not sure if this is an issue or a misunderstanding on my part.

I've created a signed and encrypted AS/2 request message with openssl (pem files manually extracted from the certs.p12 keystore)

  1. Create signed s/mime message:
    openssl smime -sign -in GETMSG.msg -out GETMSG_SIGNED.msg -signer openas2a_private.pem

  2. Encrypt s/mime message
    openssl smime -encrypt -in GETMSG_SIGNED.msg -out GETMSG_ENC.msg -des3 openas2b_public.pem

  3. The GETMSG_ENC.msg now contains HTTP headers and signed base64 content - manually remove the headers.

  4. Send with cURL

curl -i -X POST \
     -H "Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=\"smime.p7m\"" \
         -H "Content-Disposition: attachment; filename=\"smime.p7m\""  \
         -H "Content-Transfer-Encoding: base64" \
         -H "MIME-Version: 1.0" \
         -H "AS2-TO: openas2a_alias"  \
         -H "AS2-FROM: openas2b_alias" \
         -H "AS2-VERSION: 1.1" \
         -H "MESSAGE-ID: <OpenPEPPOL-20102017154649+0200-9154@openas2a_alias_openas2b_alias>" \
         -H "Disposition-Notification-To: dummy" \
         -H "DISPOSITION-NOTIFICATION-OPTIONS: signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=required, sha1" \
         --data-binary @GETMSG_ENC.msg \
         http://localhost:8080/as2ReaderService-1.0-SNAPSHOT/as2

The result hits a problem in BCCryptoHelper.decrypt(...) , when creating the new SMIMEEnveloped

org.bouncycastle.cms.CMSException: Malformed content.
        at org.bouncycastle.cms.CMSUtils.readContentInfo(Unknown Source)
        at org.bouncycastle.cms.CMSUtils.readContentInfo(Unknown Source)
        at org.bouncycastle.cms.CMSEnvelopedData.<init>(Unknown Source)
        at org.bouncycastle.mail.smime.SMIMEEnveloped.<init>(Unknown Source)
        at com.helger.as2lib.crypto.BCCryptoHelper.decrypt(BCCryptoHelper.java:413)
        at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.decrypt(AS2ReceiverHandler.java:168)
        at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.handleIncomingMessage(AS2ReceiverHandler.java:476)
        at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.handeIncomingMessage(AbstractAS2ReceiveXServletHandler.java:180)
        at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.onRequest(AbstractAS2ReceiveXServletHandler.java:217)
        at com.helger.xservlet.AbstractXServlet._invokeHandler(AbstractXServlet.java:344)
        at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:524)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:579)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DERApplicationSpecific
        at org.bouncycastle.asn1.ASN1Sequence.getInstance(Unknown Source)
        at org.bouncycastle.asn1.cms.ContentInfo.getInstance(Unknown Source)
        ... 35 more
Exception in SMIMEEnveloped:Malformed content.
cause:java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DERApplicationSpecific

It seems that the code has passed the base64-encoded content directly into the SMIMEEnveloped method, while it expect the content to already base64-decoded.

Is there an extra HTTP header that I need to provide on the cURL call to ensure the content is decoded before sending to SMIMEEnveloped ?

RSSBUS partner test

Hello Philip,

first of, great work on this project!

I hope you can help me with a problem I encountered.
I have been testing your library against another AS2 product called RSSBUS. This product comes default with 4 test files of which 1 causes a "org.bouncycastle.cms.CMSSignerDigestMismatchException: message-digest attribute value does not match calculated value" authentication error every time. The other 3 default test files are processed fine.
I reproduced the issue in your latest standalone server version (2.2.3-SNAPSHOT) and used the default (certs.p12) certificates for the test. It seems that any uploaded test file that has linefeeds without carriage returns causes this exception.
I am running as2-server in an IDE on Windows.

Any help would be appreciated.

Kind regards,
Martijn

You cannot *not* request an MDN

Version: AS2-LIB 4.1.1-SNAPSHOT from 'master'

In AS2Client in the buildPartnership the AS2MDNTo is always set, so an MDN is always requested. You cannot unset it or populate the partnership in a different way

aPartnership.setAS2MDNTo (aSettings.getSenderAS2ID ());

So it is effectively impossible to not request an MDN (Yes, I know it is strange but there is one case configured like that live with a customer (yes for a test system, but still)

If I comment out the line above in the code

Maybe an additional method where the partnership is explicitly passed on, not via the settings would be a good addition.

Need clarification regarding mdnoptions - signed/unsigned mdn

Hi Philip,
I would like to know what the correct value for mdnoptions when mdn needs to be signed and not signed.
In my code when mdn not signed I set the protocol algorithm to null and set protocol imprtance and mic algorithm importance to optional while in signed mdn I set all importance to required and set the protocol algorithm.
Is it the correct behaviour?
Thanks,
Itay

It should be easier to override the catch-all behavior in AS2SenderModule

If an exception occurs while receiving an MDN, the error is just logged but not thrown out of the module. The calling code has no way to know that there was an error.
I suggest extracting the relevant code (AS2SenderModule, lines 659-664) into a protected method. or calling an overridable no-op method from the catch block.

Do a "reverse" partnership lookup when receiving a message?

This is a question rather than an actual issue.
I have created a custom IPartnershipFactory that stores partnerships in a MongoDB collection. (I could contribute the code if you're interested).
I have noticed that for a local station L and a remote station R, I need two partnerships, one with sender L and recipient R and one with the parameters exchanged.
I have implemented getPartnershipByID(IStringMap, IStringMap) to use a reverse query and create the Partnership object in the "wrong" direction. I wonder if that should be done somewhere within the library code. because the library knows whether the message is incoming or outgoing.

Inconsistent API in Partnership

This is a very minor issue, but it somehow feels strange this way.
Partnership.getAllAttributes() returns IStringMap whereas getAllSenderIDs() and getAllReceiverIDs return StringMap. I'd say they should all return IStringMap.
But maybe the methods should be deprecated altogether and replaced by getters and setters for each property, but I guess that's a separate issue.

Ensure Content-Transfer-Encoding binary as the default for MDN's

I'm currently investigating if our home build AS2 software (written in C, not well maintained but which used to be Drummond Certified) can be replaced by some other piece of java based software. AS2-lib being one of the options (running/changing OpenAS2 into running on a servlet container instead of monolithic being the other)

I tried to setup a partnership with our existing AS2 environment to see if at least that would work. Exchanging messages without MDN's works, with non-signed MDN's too, but when sending signed MDN's from AS2-lib to our server, I got "Integrity check failed" errors, after due investigation, I came to the conclusion that there is a very close relation to #13.

The signed MDN contains a Content-Transfer-Encoding of "7bit" which is a difference with the MDN's I got from our production environment, where in most cases the CTE is just absent.

------=_Part_2_1271687676.1532374720099
Content-Type: multipart/report; report-type=disposition-notification;
        boundary="----=_Part_0_900626805.1532374720037"

------=_Part_0_900626805.1532374720037
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

The message sent to Recipient KukelsAS2ID on Mon, 23 Jul 2018 19:38:35 GMT with Subject Goodmorning New AS2 has been received, the EDI Interchange was successfully decrypted and it's integrity was verified. In addition, the sender of the message, Sender ealxs00149 at Location 10.19.26.51 was authenticated as the originator of the message.  An error occurred while storing the data to the file system.
Processor 'DefaultMessageProcessor' threw exception:
com.helger.peppol.sbdh.read.PeppolSBDHDocumentReadException: [invalid-sender-authority] The "Sender/Identifier/Authority" attribute has an invalid value: EAN.UCC
...
  [34 elements omitted -- com.helger.as2lib.processor.AbstractMessageProcessor.executeAction(AbstractMessageProcessor.java:160)]

------=_Part_0_900626805.1532374720037
Content-Type: message/disposition-notification
Content-Transfer-Encoding: 7bit

Reporting-UA: ph-OpenAS2 [email protected]:8080
Original-Recipient: rfc822; KukelsAS2ID
Final-Recipient: rfc822; KukelsAS2ID
Original-Message-ID: <[email protected]>
Disposition: automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error
Received-Content-MIC: 3o35W1rw8RtitY+FH1uLVC2alh8=, sha1


------=_Part_0_900626805.1532374720037--

------=_Part_2_1271687676.1532374720099
Content-Type: application/pkcs7-signature; name=smime.p7s; smime-type=signed-data
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIAwggOsMIIC
...
Py7xs78B6moSz0E/UvASr7mc9QAAAAAAAA==
------=_Part_2_1271687676.1532374720099--

Since the specs only menion a CTE being absent or set to 8bit or binary, I tried finding where the 7bit was set. The bodyparts are created and added to the parent MimePart in

Both do not have a Content-Transfer-Encoding set at that time, but in the resulting signed bodypart, they do, with a value of "7bit". Debugging where this came from I found that java-mail is adding the CTE based on the actual content

In javax.mail.internet.MimeBodyPart the DataHandler is passed on and used to retrieve the enconding from it.

		if (part.getHeader("Content-Transfer-Encoding") == null)
	    setEncoding(part, MimeUtility.getEncoding(dh));

And in MimeUtility.getEncoding(...)

	/*
 * Try to pick the most efficient means of determining the
 * encoding.  If this DataHandler was created using a DataSource,
 * the getEncoding(DataSource) method is typically faster.  If
 * the DataHandler was created with an object, this method is
 * much faster.  To distinguish the two cases, we use a heuristic.
 * A DataHandler created with an object will always have a null name.
 * A DataHandler created with a DataSource will usually have a
 * non-null name.
 *
 * XXX - This is actually quite a disgusting hack, but it makes
 *	 a common case run over twice as fast.
 */
if (dh.getName() != null)
    return getEncoding(dh.getDataSource());

I expected the DispositionDataContentHandler to be used here but it is not a DataHandler (the default java mail DataHandler is used) and then "7bit" is set due to the content all being ASCII characters.

The only way I got things quickly working is by explicitly setting

aTextPart.setHeader(CHttpHeader.CONTENT_TRANSFER_ENCODING, "binary");

and

aReportPart.setHeader(CHttpHeader.CONTENT_TRANSFER_ENCODING, "binary");

in AS2Helper.java

Yes, using the 'AS2 default' would be better and maybe even retrieve it from the partnership if declared there, but I want to be sure it is something that needs to be 'fixed' on hte AS2-Lib side or that it is a bug in our software that was never noticed since everybody participating in the expesive (both in cost and time) Drummond certifications did not send MDN in this format.

micalg=sha-1 vs sha1

I have run into a problem with a partner rejecting a message with an "unsupported mic-algorithms" error.

The mime content starts like this:

Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-1; 
    boundary="----=_Part_1_1009538009.1460639689958"

This seems to be caused by an old change in bouncycastle:

RFC 5751 changed the definition of the micalg parameters defined in RFC 3851. The SMIMESignedGenerator is now up to date with the latest micalg parameter set and a constructor has been added to allow the old micalg parameter set to be used.

https://www.rfc-editor.org/errata_search.php?rfc=4130
https://www.drummondgroup.com/images/pdf/AS2-1Q14_Issues_Resolved.pdf

The latest version of the sending participants Crypto API uses RFC 5751 which has
micalg=sha-1 by default when signing data. The receiving participant required the older
RFC 3851 micalg=sha1. The sending participant modified their code to accommodate
the receiving participant as described in the following note. All other participants
accepted either sha1 or sha-1. Note from Crypto API vendor: between RFC 3851 and
RFC 5751 the values used in the micalg parameter for signed messages changed. We
will accept both, but the default is now to use RFC 5751. In the event you are dealing
with an RFC 3851 based system you will also need to use a constructor that sets the
micalgs table and call it with RFC3851_MICALGS.

As I understand it sending "sha-1" is correct (in general); the only solution for compat with old software appears to be an additional flag (per partnership) to switch to old micalg names?

The following is minimally tested and seems to work for me:

diff --git a/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java b/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java
index 65670e0..b1b784f 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java
@@ -413,7 +413,8 @@ public final class BCCryptoHelper implements ICryptoHelper
                             @Nonnull final X509Certificate aX509Cert,
                             @Nonnull final PrivateKey aPrivateKey,
                             @Nonnull final ECryptoAlgorithmSign eAlgorithm,
-                            final boolean bIncludeCertificateInSignedContent) throws GeneralSecurityException,
+                            final boolean bIncludeCertificateInSignedContent,
+                            final boolean rfc3851MicAlgs) throws GeneralSecurityException,
                                                                               SMIMEException,
                                                                               MessagingException,
                                                                               OperatorCreationException
@@ -454,7 +455,9 @@ public final class BCCryptoHelper implements ICryptoHelper
     // aSignedAttrs.add (new SMIMEEncryptionKeyPreferenceAttribute (issAndSer));

     // create the generator for creating an smime/signed message
-    final SMIMESignedGenerator aSGen = new SMIMESignedGenerator ();
+    final SMIMESignedGenerator aSGen = rfc3851MicAlgs
+            ? new SMIMESignedGenerator(SMIMESignedGenerator.RFC3851_MICALGS)
+            : new SMIMESignedGenerator ();
     // aSGen.addSigner (aPrivKey, aX509Cert, aSignDigest.getId ());

     // add a signer to the generator - this specifies we are using SHA1 and
diff --git a/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java b/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java
index dcfadae..cfe1aed 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java
@@ -186,7 +186,8 @@ public interface ICryptoHelper
                      @Nonnull X509Certificate aCert,
                      @Nonnull PrivateKey aKey,
                      @Nonnull ECryptoAlgorithmSign eAlgorithm,
-                     boolean bIncludeCertificateInSignedContent) throws Exception;
+                     boolean bIncludeCertificateInSignedContent,
+                     boolean rfc3851MicAlgs) throws Exception;

   /**
    * Verify the specified Mime Body part against the part certificate
diff --git a/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java b/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java
index 6853dfe..698e762 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java
@@ -81,6 +81,9 @@ public final class CPartnershipIDs
    * (using the value of the <code>getID()</code> method)
    */
   public static final String PA_ENCRYPT = "encrypt";
+  
+  public static final String PA_RFC3851_MICALGS = "rfc3851_micalgs";
+  
   /**
    * Set this to the signature digest algorithm to sign sent messages, check
    * {@link com.helger.as2lib.crypto.ECryptoAlgorithmSign} constants for values
diff --git a/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java b/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java
index 110a1d4..311cf12 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java
@@ -788,6 +788,16 @@ public class Partnership implements Serializable
   {
     return setAttribute (CPartnershipIDs.PA_DISABLE_DECOMPRESS, Boolean.toString (bValue));
   }
+  
+  public boolean isRfc3851MicAlgs()
+  {
+    return m_aAttributes.getAttributeAsBoolean(CPartnershipIDs.PA_RFC3851_MICALGS, false);
+  }
+  
+  public EChange setRfc3851MicAlgs(final boolean bValue)
+  {
+    return setAttribute (CPartnershipIDs.PA_RFC3851_MICALGS, Boolean.toString(bValue));
+  }

   /**
    * @return A copy of all contained attributes. Never <code>null</code>.
diff --git a/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java b/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java
index eb59d0d..c20649f 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java
@@ -348,7 +348,8 @@ public class AS2SenderModule extends AbstractHttpSenderModule

       // Main signing
       aDataBP = AS2Helper.getCryptoHelper ()
-                         .sign (aDataBP, aSenderCert, aSenderKey, eSignAlgorithm, bIncludeCertificateInSignedContent);
+                         .sign (aDataBP, aSenderCert, aSenderKey, eSignAlgorithm, bIncludeCertificateInSignedContent,
+                                 aPartnership.isRfc3851MicAlgs());

       if (s_aLogger.isDebugEnabled ())
         s_aLogger.debug ("Signed data with " +
diff --git a/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java b/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java
index d32105a..9271938 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java
@@ -118,7 +118,8 @@ public final class AS2Helper
                                     @Nonnull final IMessageMDN aMdn,
                                     final boolean bSignMDN,
                                     final boolean bIncludeCertificateInSignedContent,
-                                    @Nullable final ECryptoAlgorithmSign eMICAlg) throws Exception
+                                    @Nullable final ECryptoAlgorithmSign eMICAlg,
+                                    final boolean rfc3851MicAlgs) throws Exception
   {
     ValueEnforcer.notNull (aSession, "AS2Session");
     ValueEnforcer.notNull (aMdn, "MDN");
@@ -175,7 +176,7 @@ public final class AS2Helper
                                                                     aSenderCert,
                                                                     aSenderKey,
                                                                     eMICAlg,
-                                                                    bIncludeCertificateInSignedContent);
+                                                                    bIncludeCertificateInSignedContent, rfc3851MicAlgs);
         aMdn.setData (aSignedReport);
       }
       catch (final CertificateNotFoundException ex)
@@ -322,7 +323,8 @@ public final class AS2Helper
       }
     }

-    createMDNData (aSession, aMDN, bSignMDN, bIncludeCertificateInSignedContent, aDispositionOptions.getFirstMICAlg ());
+    createMDNData (aSession, aMDN, bSignMDN, bIncludeCertificateInSignedContent, aDispositionOptions.getFirstMICAlg (),
+            aMsg.getPartnership().isRfc3851MicAlgs());

     aMDN.updateMessageID ();

socket timeout exception, but file sent

Hi Philip,
using your library sometimes we have this error:

com.helger.as2lib.exception.OpenAS2Exception OpenAS2 WrappedOpenAS2Exception terminated: java.net.SocketTimeoutException: Read timed out; sources: {message=[AS2Message@0x107cf2de: data=javax.mail.internet.MimeBodyPart@6fbf0b80; MDN=null]}: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1536)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at com.helger.as2lib.processor.sender.AS2SenderModule._sendViaHTTP(AS2SenderModule.java:635)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:706)
at com.helger.as2lib.client.AS2Client.sendSynchronous(AS2Client.java:318)
at com.helger.peppol.as2client.AS2ClientBuilder.sendSynchronous(AS2ClientBuilder.java:983)
at com.jpeppol.as2sender.service.As2SenderService.process(As2SenderService.java:250)

But the file is received correctly.
Did you experience this?

thanks in advance
Fiorenzo Pizza

Sync mdn - if mic isn't matched excetiopn isn't thrown

Hi Philip,
When working with sync mdn and the mic that returned from the server doesn't match the mic calculated in the client the as2 lib only print that the mic isn't matched without throwing exception.
Is it desired behaviour?
Thanks,
Itay

Async MDN support for AS2Client

It seems like com.helger.as2lib.client.AS2Client only support AS2 message sending using synchronize MDN mode (through sendSynchronous() method). Is it possible to use this client to send AS2 in Asynchronized MDN mode instead?

I tried to read the source code and seems like async or not was controlled by aPartnership.setAS2ReceiptOption ()... what value should be set for this option value in order to support async MDN? any other changes needed?

Should Partner-related methods be in `IPartnershipFactory`?

This is rather a question than an actual issue.
I wonder if the Partner-related methods and classes (e.g. PartnerMap) should be moved to XMLPartnershipFactory. AFAICT, the whole "Partner" concept is currently local to the XML configuration, the rest of the code seems to work with complete Partnerships.
I'm asking because I have created a custom IPartnershipFactory that stores partnerships in a MongoDB collection (I could contribute the code if you're interested) and was confused that I had to implement all those methods but they were never called from anywhere.

Error when sync MDN headers are read.

Hi Philip,
I think the headers are not written to the MDN message. I think it is around the line
aMDN.headers ().addAllHeaders (aConn.getHeaderFields ());
in AS2SenderModule#receiveSyncMDN.
What do you think?

unable to send file to AS2 server from AS2-LIB but works fine from Mendelson server

I created an AS2 client based on the file https://github.com/phax/as2-lib/blob/master/as2-lib/src/test/java/com/helger/as2lib/supplementary/main/MainSendToMendelsonTest.java and is working for a Mendelson server that I setup on another computer. I am able to successfully send files to that local AS2 server and receive the MDNs successfully through this code.

However, using the same code to send a message to a external AS2 server on the internet, I am unable to do so. I get an exception

[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - MIC IS NOT MATCHED, original mic: 'IpjGylckS2ovHgk995aA3SU2Jlw=, sha1' return mic: 'null' [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]

Also, I tried sending that file to the same external AS2 server from Mendelson AS2 and that worked like a charm. Now, I am wondering what I am doing wrong in my code that I get the exception above.

Source Code :

package com.cts.as2client;

/**
 * The following code was written based on the original source found in the link below:
 * Original Author: Philip Helger
 * https://github.com/phax/as2-lib/blob/master/as2-lib/src/test/java/com/helger/as2lib/supplementary/main/MainSendToMendelsonTest.java
 */

/**
 * The FreeBSD Copyright
 * Copyright 1994-2008 The FreeBSD Project. All rights reserved.
 * Copyright (C) 2013-2018 Philip Helger philip[at]helger[dot]com
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *    1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation
 * are those of the authors and should not be interpreted as representing
 * official policies, either expressed or implied, of the FreeBSD Project.
 */

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.HashMap;

import org.glassfish.jersey.internal.util.Base64;

import com.helger.as2lib.client.AS2Client;
import com.helger.as2lib.client.AS2ClientRequest;
import com.helger.as2lib.client.AS2ClientResponse;
import com.helger.as2lib.client.AS2ClientSettings;
import com.helger.as2lib.crypto.ECompressionType;
import com.helger.as2lib.crypto.ECryptoAlgorithmCrypt;
import com.helger.as2lib.crypto.ECryptoAlgorithmSign;
import com.helger.as2lib.disposition.DispositionOptions;
import com.helger.as2lib.util.cert.AS2KeyStoreHelper;
import com.helger.commons.mime.CMimeType;
import com.helger.security.keystore.EKeyStoreType;

/**
 * Class to send an AS2 messages to AS2 server.
 */
public final class JavaAS2Client
{
  static
  {
    if (true)
      System.setProperty ("org.slf4j.simpleLogger.defaultLogLevel", "TRACE");
  }

  public static void main(String [] args) throws Exception
  {
	  String aResponse = null;
//	  aResponse = sendFileToAS2Server
//	  (
//	    "C:/mendelson/nginx/nginx-1.13.10/conf/javaAS2ClientTestStore.pfx"
//	  , "test"
//	  , "javaAS2"
//	  , "[email protected]"
//	  , "javaas2clienttest.org"
//	  , "AS2 test message from JavaAS2Client"
//	  , "YW1vZWJhIHBhcmFtb2VjaXVtIGV1Z2xpbmEgaHlkcmEgYmFjdGVyaWE="
//	  //, new File("C:/mendelson/nginx/nginx-1.13.10/conf/ACK3_SUCCESS_Single_Report.xml")
//	  , "DIGEST_SHA1"
//	  , "foodsafetyAS2"
//	  , "foodsafety-vm.cloudapp.net"
//	  , "https://foodsafety-vm.cloudapp.net:7090/as2/HttpReceiver"
//	  , "C:/mendelson/nginx/nginx-1.13.10/conf/foodsafety_sha1_1024.cer"
//	  );
	  
	  aResponse = sendFileToAS2Server
	  (
		"C:/mendelson/javaAS2client/Certificates/FDA/CognizantMedvantageFDA.Private.Key.pfx"
	  , "ctstest"
	  , "788157159_CTS_AS2"
	  , "[email protected]"
	  , "Cognizant.MedvantageFDA.net"
	  , "AS2 test message from JavaAS2Client"
	  , "YW1vZWJhIHBhcmFtb2VjaXVtIGV1Z2xpbmEgaHlkcmEgYmFjdGVyaWE="
	  //, new File("C:/mendelson/nginx/nginx-1.13.10/conf/ACK3_SUCCESS_Single_Report.xml")
	  , "DIGEST_SHA1"
	  , "ZZFDATST"
	  , "FDA ESG Administrators"
	  , "https://esgtest.fda.gov:4080/exchange/ZZFDAAS2TST"
	  , "C:/mendelson/javaAS2client/Certificates/FDA/ESGsign_encryptioncert.cer"
	  );
	  
	  if (aResponse != null)
	  {
        System.out.println("Response received = " + aResponse);
        String search = null;
        int start = -1, end = -1;
        
        search = "responseAsStringBase64";
        start = aResponse.indexOf(search) + search.length() + 5;
        end = aResponse.indexOf("\"", start);
        System.out.println("Response decoded = " + Base64.decodeAsString(aResponse.substring(start, end)));

        search = "mdnTextBase64";
        start = aResponse.indexOf(search) + search.length() + 5;
        end = aResponse.indexOf("\"", start);
        System.out.println("MDN Text decoded = " + Base64.decodeAsString(aResponse.substring(start, end)));
	  }
	  else
		  System.out.println("null response");
  }

  public static String sendFileToAS2Server 
  (
    String clientKeyStoreFilePath
  , String clientKeyStoreRawPassword
  , String clientAS2PartnerName
  , String clientAS2ServerEmailAddress
  , String clientAS2PrivateKeyAlias
  , String clientAS2RequestDescription
  , String clientAS2RequestDataAsBase64
  , String clientAS2SignatureAlgorithm
  , String serverAS2PartnerName
  , String serverAS2PublicKeyAlias
  , String serverAS2URL
  , String serverAS2PublicKeyFilePath
  ) throws Exception
  {
	AS2ClientSettings aSettings = initAS2ClientSettings
	(
	  clientKeyStoreFilePath
	, clientKeyStoreRawPassword
	, clientAS2PartnerName
	, clientAS2ServerEmailAddress
	, clientAS2PrivateKeyAlias
	, clientAS2SignatureAlgorithm
	, serverAS2PartnerName
	, serverAS2PublicKeyAlias
	, serverAS2URL
	, serverAS2PublicKeyFilePath
	);
	
    // Build client request
    final AS2ClientRequest aRequest = new AS2ClientRequest (clientAS2RequestDescription);
    aRequest.setData (Base64.decodeAsString(clientAS2RequestDataAsBase64), StandardCharsets.ISO_8859_1);

//    //SVN-ADDEDFORFDATEST
//    aRequest.setFilename("test.xml");
    
    aRequest.setContentType (CMimeType.TEXT_PLAIN.getAsString());

    HashMap <String, String> hmAS2Response = sendAS2Request(aSettings, aRequest);
    
    return hashMapToJsonString(hmAS2Response);
  }
  
  public static String sendFileToAS2Server 
  (
    String clientKeyStoreFilePath
  , String clientKeyStoreRawPassword
  , String clientAS2PartnerName
  , String clientAS2ServerEmailAddress
  , String clientAS2PrivateKeyAlias
  , String clientAS2RequestDescription
  , File clientAS2RequestDataFilePath
  , String clientAS2SignatureAlgorithm
  , String serverAS2PartnerName
  , String serverAS2PublicKeyAlias
  , String serverAS2URL
  , String serverAS2PublicKeyFilePath
  ) throws Exception
  {
	AS2ClientSettings aSettings = initAS2ClientSettings
	(
	  clientKeyStoreFilePath
	, clientKeyStoreRawPassword
	, clientAS2PartnerName
	, clientAS2ServerEmailAddress
	, clientAS2PrivateKeyAlias
	, clientAS2SignatureAlgorithm
	, serverAS2PartnerName
	, serverAS2PublicKeyAlias
	, serverAS2URL
	, serverAS2PublicKeyFilePath
	);
	
    // Build client request
    final AS2ClientRequest aRequest = new AS2ClientRequest (clientAS2RequestDescription);
    aRequest.setData (clientAS2RequestDataFilePath, StandardCharsets.ISO_8859_1);
    
//    //SVN-ADDEDFORFDATEST
//    aRequest.setFilename(clientAS2RequestDataFilePath.getName());
    
    aRequest.setContentType (CMimeType.TEXT_PLAIN.getAsString());

    HashMap <String, String> hmAS2Response = sendAS2Request(aSettings, aRequest);
    
    return hashMapToJsonString(hmAS2Response);
  }
  
  public static AS2ClientSettings initAS2ClientSettings
  (
	  String clientKeyStoreFilePath
	, String clientKeyStoreRawPassword
	, String clientAS2PartnerName
	, String clientAS2ServerEmailAddress
	, String clientAS2PrivateKeyAlias
	, String clientAS2SignatureAlgorithm
	, String serverAS2PartnerName
	, String serverAS2PublicKeyAlias
	, String serverAS2URL
	, String serverAS2PublicKeyFilePath
  ) throws Exception
  {
    // Start client configuration
    final AS2ClientSettings aSettings = new AS2ClientSettings ();
    // This PFX file should contain the client AS2's private key pair and the server AS2's public key
    aSettings.setKeyStore (EKeyStoreType.PKCS12, new File (clientKeyStoreFilePath), clientKeyStoreRawPassword);
    
    //SVN-ADDEDFORFDATEST
    aSettings.customHeaders().addHeader("X-Cyclone-Metadata-FdaSubmissionType", "GWTEST");
    aSettings.customHeaders().addHeader("X-Cyclone-Metadata-FdaCenter", "ConnectTest");
    
    // sender - This java program, which is an AS2 client
    aSettings.setSenderData (clientAS2PartnerName, clientAS2ServerEmailAddress, clientAS2PrivateKeyAlias);

    // receiver - The AS2 server that receives the file sent
    aSettings.setReceiverData 
    (
      serverAS2PartnerName    // AS2 id of the AS2 Server
    , serverAS2PublicKeyAlias // Key alias of the server's public key, 
                              // imported into the client's keystore 
                              // (here javaAS2ClientTestStore.pfx)
    , serverAS2URL            // URL of the AS2 server
    ); 
    
    // public key exported from the AS2 server 
    // and sent to the client computer, for encryption
    final X509Certificate aReceiverCertificate = AS2KeyStoreHelper.readX509Certificate (serverAS2PublicKeyFilePath); 
    aSettings.setReceiverCertificate (aReceiverCertificate);

    // AS2 stuff
    aSettings.setPartnershipName (aSettings.getSenderAS2ID () + "_" + aSettings.getReceiverAS2ID ());
    
    // When a signed message is used, the algorithm for MIC and message must be identical
    final ECryptoAlgorithmSign eSignAlgo = ECryptoAlgorithmSign.valueOf(clientAS2SignatureAlgorithm);
    //final ECryptoAlgorithmSign eSignAlgo = ECryptoAlgorithmSign.DIGEST_SHA256;
    
    aSettings.setMDNOptions 
    (
		new DispositionOptions ()
			.setMICAlg (eSignAlgo)
		    .setMICAlgImportance (DispositionOptions.IMPORTANCE_REQUIRED)
		    .setProtocol (DispositionOptions.SIGNED_RECEIPT_MICALG)
		    .setProtocolImportance (DispositionOptions.IMPORTANCE_REQUIRED)
    );
    aSettings.setEncryptAndSign (ECryptoAlgorithmCrypt.CRYPT_3DES, eSignAlgo);
    aSettings.setCompress (ECompressionType.ZLIB, false);
    aSettings.setMessageIDFormat ("JavaAS2Client_phaxAS2Lib-$date.ddMMuuuuHHmmssZ$-$rand.1234$@$msg.sender.as2_id$_$msg.receiver.as2_id$");
    aSettings.setRetryCount (1);
    aSettings.setConnectTimeoutMS (600_000);
    aSettings.setReadTimeoutMS (600_000);

    return aSettings;
  }
  
  public static HashMap <String, String> sendAS2Request(AS2ClientSettings aSettings, AS2ClientRequest aRequest)
  {
    // Send message
    final AS2ClientResponse aResponse = new AS2Client ()
    		.setHttpProxy (null)
    		.sendSynchronous (aSettings, aRequest);
    
    // Process Response
    HashMap <String, String> hmAS2Response = new HashMap<String, String>();
    if (aResponse.hasException())
    {
    	StringWriter stackTrace = new StringWriter();
    	aResponse.getException().printStackTrace(new PrintWriter(stackTrace));
    	hmAS2Response.put("exceptionAsStringBase64", Base64.encodeAsString(stackTrace.toString()));
    }
    else
    {
	    hmAS2Response.put("originalMessageID", (String) nvl(aResponse.getOriginalMessageID(), "NULL_RECD"));
	    hmAS2Response.put("mdnMessageID", (String) nvl(aResponse.getMDNMessageID(), "NULL_RECD"));
	    hmAS2Response.put("mdnDisposition", (String) nvl(aResponse.getMDNDisposition(), "NULL_RECD"));
	    hmAS2Response.put("mdnTextBase64", Base64.encodeAsString((String) nvl(aResponse.getMDNText(), "NULL_RECD")));
	    hmAS2Response.put("responseAsStringBase64", Base64.encodeAsString((String) nvl(aResponse.getAsString(), "NULL_RECD")));
    }
	
    return hmAS2Response;
  }
  
  public static Object nvl(Object objCheck, Object objReturn)
  {
	  if (objCheck == null)
		  return objReturn;
	  return objCheck;
  }
  
  public static String hashMapToJsonString(HashMap<String, String> map)
  {
	  String jsonString = null;
	  
	  for (String key : map.keySet())
	  {
		 String keyValue = '"' + key + '"' + " : " + '"' + map.get(key) + '"';
		 jsonString = (jsonString == null) ? keyValue : jsonString + ", " + keyValue; 
	  }
	  
	  return "{ " + jsonString + " }";
  }
}

Log Messages


[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.MonthDay'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.YearMonth'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.Year'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.Duration'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.temporal.TemporalAmount'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.Period'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.chrono.ChronoPeriod'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class java.time.Month'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class java.lang.Enum'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class java.time.DayOfWeek'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.commons.typeconvert.IOTypeConverterRegistrar
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.lang.String'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'interface java.lang.CharSequence'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.net.URI'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.net.URL'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class java.io.File'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class java.net.URL'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.lang.String'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface java.lang.CharSequence'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.io.File'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.net.URI'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.io.File'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.net.URI'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.net.URL'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class com.helger.commons.io.resource.ClassPathResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.lang.IHasClassLoader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IReadableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IResourceBase'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasInputStreamAndReader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasInputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class com.helger.commons.io.resource.ClassPathResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.lang.IHasClassLoader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IReadableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IResourceBase'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasInputStreamAndReader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasInputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class com.helger.commons.io.resource.FileSystemResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IReadWriteResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IWritableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasOutputStreamAndWriter'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasOutputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class com.helger.commons.io.resource.FileSystemResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IReadWriteResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IWritableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasOutputStreamAndWriter'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasOutputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class com.helger.commons.io.resource.URLResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class com.helger.commons.io.resource.URLResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class com.helger.commons.io.resource.URLResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.resource.IReadableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.resource.IResourceBase'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.IHasInputStreamAndReader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.IHasInputStream'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.commons.typeconvert.LocaleTypeConverterRegistrar
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.util.Locale'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.commons.typeconvert.MutableTypeConverterRegistrar
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'class java.math.BigDecimal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'class com.helger.commons.mutable.MutableBigDecimal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'class java.math.BigInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'class com.helger.commons.mutable.MutableBigInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'class java.lang.Boolean'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'class com.helger.commons.mutable.MutableBoolean'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'class java.lang.Byte'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'class com.helger.commons.mutable.MutableByte'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'class java.lang.Character'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'class com.helger.commons.mutable.MutableChar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'class java.lang.Double'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class com.helger.commons.mutable.MutableDouble'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'class java.lang.Float'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class com.helger.commons.mutable.MutableFloat'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'class java.lang.Integer'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class com.helger.commons.mutable.MutableInt'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'class java.lang.Long'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'class com.helger.commons.mutable.MutableLong'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'class java.lang.Short'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'class com.helger.commons.mutable.MutableShort'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.mail.config.TypeConverterRegistrar_ph_mail
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'class com.helger.commons.email.EmailAddress'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'interface com.helger.commons.email.IEmailAddress'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'interface com.helger.commons.name.IHasDisplayName'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'class javax.mail.internet.InternetAddress'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'class javax.mail.Address'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'interface java.lang.Cloneable'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - 772 type converters and 90 rules registered
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - Connecting to https://esgtest.fda.gov:4080/exchange/ZZFDAAS2TST [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] INFO com.helger.commons.ws.TrustManagerTrustAll - checkServerTrusted ([[
[
  Version: V3
  Subject: CN=esgtest.fda.gov, O=US Dept of Health and Human Services, L=Rockville, ST=Maryland, C=US
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 26409645288072701685708252283552198223498845611725200609755740624137536448254583927263516302206825663359835877366947508397562478771854330112768468404204218646721940101008831157216559587018218996277705710684825971653832578751114215113605869986712576535332758046714100060480896544508932543054628863001228951853095653365058690860811265776630400588805096499610772203015157957988730690067495538956821204723914150011103723587187690627740048054158215126598468835180795138671881933572486518495389384190921489473869426023299262768290119823952935390155295718121764919749671918403970618298307670826490325329912099059045633915901
  public exponent: 65537
  Validity: [From: Mon Oct 30 13:51:21 UTC 2017,
               To: Sat Nov 23 14:21:20 UTC 2019]
  Issuer: CN=Entrust Certification Authority - L1K, OU="(c) 2012 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
  SerialNumber: [    8a9f7bc8 d36bf291 00000000 50debe6d]

Certificate Extensions: 9
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [
   accessMethod: ocsp
   accessLocation: URIName: http://ocsp.entrust.net
, 
   accessMethod: caIssuers
   accessLocation: URIName: http://aia.entrust.net/l1k-chain256.cer
]
]

[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 82 A2 70 74 DD BC 53 3F   CF 7B D4 F7 CD 7F A7 60  ..pt..S?.......`
0010: C6 0A 4C BF                                        ..L.
]
]

[3]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [URIName: http://crl.entrust.net/level1k.crl]
]]

[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
  [CertificatePolicyId: [2.16.840.1.114028.10.1.5]
[PolicyQualifierInfo: [
  qualifierID: 1.3.6.1.5.5.7.2.1
  qualifier: 0000: 16 1A 68 74 74 70 3A 2F   2F 77 77 77 2E 65 6E 74  ..http://www.ent
0010: 72 75 73 74 2E 6E 65 74   2F 72 70 61              rust.net/rpa

]]  ]
  [CertificatePolicyId: [2.23.140.1.2.2]
[]  ]
]

[6]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
  serverAuth
  clientAuth
]

[7]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

[8]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: esgtest.fda.gov
]

[9]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 9C 7A 6F E8 22 A3 4C 69   4B 04 4B 1C A2 F5 2B 16  .zo.".LiK.K...+.
0010: 57 23 5D 19                                        W#].
]
]

]
  Algorithm: [SHA256withRSA]
  Signature:
0000: C7 73 AC 4F 03 11 31 6D   38 F2 58 D9 03 E1 63 5A  .s.O..1m8.X...cZ
0010: 58 87 BD F7 7E AF E7 9E   03 D0 47 53 63 07 F6 EE  X.........GSc...
0020: 68 D0 29 50 8E FB 61 C9   63 C9 23 CB 1B A8 CF A3  h.)P..a.c.#.....
0030: 7B F5 7A 83 8B B0 EC 37   8C 08 47 81 74 65 5A F6  ..z....7..G.teZ.
0040: 37 31 11 A0 BE D6 B1 83   36 57 A0 3F F8 75 50 A6  71......6W.?.uP.
0050: 02 C1 61 63 92 E5 A7 23   D6 C9 B5 6C 3A D1 C0 27  ..ac...#...l:..'
0060: CC B0 F3 12 E3 34 82 B1   48 49 BD D6 91 81 9E 53  .....4..HI.....S
0070: 5C F8 02 83 7D 93 1D D6   26 4C BD 31 36 EB 38 16  \.......&L.16.8.
0080: 49 24 68 8D 2E F1 7F 60   AC 4C D4 75 C4 C1 55 9D  I$h....`.L.u..U.
0090: A5 68 AD 91 96 9D 08 01   CC 22 49 63 82 63 80 4C  .h......."Ic.c.L
00A0: CD DB 2A A0 98 F3 6D EF   45 76 64 BC 1B B3 94 A2  ..*...m.Evd.....
00B0: F8 7F 03 A6 FF C1 A7 4D   6D 33 41 EC D6 85 BE 30  .......Mm3A....0
00C0: 5C 75 2F A4 67 27 0A C0   B4 28 65 BB 8B 7C F6 B4  \u/.g'...(e.....
00D0: D5 A9 AD 21 63 FD 5D B5   33 23 48 BD 8B EE B1 79  ...!c.].3#H....y
00E0: 11 E7 A6 6F 96 F1 81 EE   3D A4 60 B5 3E 17 52 24  ...o....=.`.>.R$
00F0: 45 B1 2E 79 5D 91 BE BC   5A 3A E9 9E 8B 66 E2 58  E..y]...Z:...f.X

], [
[
  Version: V3
  Subject: CN=Entrust Certification Authority - L1K, OU="(c) 2012 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 27551307444371019689131110149769219990039807338613156351862185174382854411507882869594323045972646206522091223412845084662697963738056329694954757733127615230544144867691820621020457350209413744664435391268026938568271273767754233391180191225380975610419044223872547759974221165383368362204707920992085265752716511977418428433352003666603687066036036809314076495340047097056540549930002295830214871821901801683045861508207035810803683518154876258099914890430271432879895190838085378353306026330728201860966695131162987330349622401592098379219672966523107482097898903654925215411696318757332545538679817537243386206491
  public exponent: 65537
  Validity: [From: Mon Oct 05 19:13:56 UTC 2015,
               To: Thu Dec 05 19:43:56 UTC 2030]
  Issuer: CN=Entrust Root Certification Authority - G2, OU="(c) 2009 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
  SerialNumber: [    0ee94cc3 00000000 51d37785]

Certificate Extensions: 7
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [
   accessMethod: ocsp
   accessLocation: URIName: http://ocsp.entrust.net
]
]

[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 6A 72 26 7A D0 1E EF 7D   E7 3B 69 51 D4 6C 8D 9F  jr&z.....;iQ.l..
0010: 90 12 66 AB                                        ..f.
]
]

[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:0
]

[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [URIName: http://crl.entrust.net/g2ca.crl]
]]

[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
  [CertificatePolicyId: [2.5.29.32.0]
[PolicyQualifierInfo: [
  qualifierID: 1.3.6.1.5.5.7.2.1
  qualifier: 0000: 16 1A 68 74 74 70 3A 2F   2F 77 77 77 2E 65 6E 74  ..http://www.ent
0010: 72 75 73 74 2E 6E 65 74   2F 72 70 61              rust.net/rpa

]]  ]
]

[6]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  Key_CertSign
  Crl_Sign
]

[7]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 82 A2 70 74 DD BC 53 3F   CF 7B D4 F7 CD 7F A7 60  ..pt..S?.......`
0010: C6 0A 4C BF                                        ..L.
]
]

]
  Algorithm: [SHA256withRSA]
  Signature:
0000: 39 D5 8E 98 83 61 C8 2C   63 D3 70 1D 19 30 CB F6  9....a.,c.p..0..
0010: 09 AC CC 69 D5 C9 DC 37   41 F2 32 0F EF 74 C3 58  ...i...7A.2..t.X
0020: F6 78 27 09 34 08 95 92   2F D7 DF B8 A3 FD 0E 81  .x'.4.../.......
0030: E9 A4 9C D3 3F 4D 68 2B   15 31 0A 15 CC 52 04 93  ....?Mh+.1...R..
0040: E8 93 50 C3 D9 B1 E2 E1   68 B7 3A 09 74 F1 34 58  ..P.....h.:.t.4X
0050: 0A 3F 77 98 40 B8 E6 68   FF 5D E4 C8 46 C5 EC 81  [email protected].]..F...
0060: D7 C9 82 18 5C 83 CE 71   D8 BC BF AC 99 02 93 DB  ....\..q........
0070: 94 98 84 D2 9C A6 B5 FE   5C BB F0 4A AF 21 AC C2  ........\..J.!..
0080: 3F 49 24 67 D6 2E 8E CF   AC CC 64 15 18 72 E5 6C  ?I$g......d..r.l
0090: 77 D3 52 A8 B9 DD 8D AC   00 4A 35 19 D4 6F 73 A3  w.R......J5..os.
00A0: 75 EF 6B 64 C3 E0 8D 83   12 A1 8A E7 0E 86 4D D8  u.kd..........M.
00B0: B4 20 1B BE 6A A5 8C 4B   68 66 E3 2B C7 58 0B FB  . ..j..Khf.+.X..
00C0: 56 10 D4 91 FB 1D D3 31   58 10 8C 44 E3 75 7B 10  V......1X..D.u..
00D0: 9D B5 38 B1 F6 AA CA 81   64 6C E8 F2 E2 81 55 97  ..8.....dl....U.
00E0: 51 7F E1 C2 27 50 A2 C9   3C 5B 00 43 F6 5B B9 D5  Q...'P..<[.C.[..
00F0: A5 FC FF 07 50 40 67 07   B0 55 F0 B7 7E 6E 2D CC  [email protected].

], [
[
  Version: V3
  Subject: CN=Entrust Root Certification Authority - G2, OU="(c) 2009 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 23545767790267846087020216328652375341530866026192217463317405594910218314123159568888460497267501687940934346981754258614432514248455478810313157154214138578842767759163979536305859476265307686116748146371797434166143379656079822969790429567552761570863643046057291809190478531977203100009678850846269337262832775419535844414491425351658902840388933458673579532971478290411639120918504262738267963831253623767536425274517686015410328746042499987144667039641594899862629160973434220831909420079304090908018145960484024335529733348176737696982633769639849884581132755009947068081018826110609706967697922262932941743217
  public exponent: 65537
  Validity: [From: Mon Sep 22 17:14:57 UTC 2014,
               To: Mon Sep 23 01:31:53 UTC 2024]
  Issuer: CN=Entrust Root Certification Authority, OU="(c) 2006 Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, O="Entrust, Inc.", C=US
  SerialNumber: [    51d34044]

Certificate Extensions: 7
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [
   accessMethod: ocsp
   accessLocation: URIName: http://ocsp.entrust.net
]
]

[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 68 90 E4 67 A4 A6 53 80   C7 86 66 A4 F1 F7 4B 43  h..g..S...f...KC
0010: FB 84 BD 6D                                        ...m
]
]

[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:1
]

[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [URIName: http://crl.entrust.net/rootca1.crl]
]]

[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
  [CertificatePolicyId: [2.5.29.32.0]
[PolicyQualifierInfo: [
  qualifierID: 1.3.6.1.5.5.7.2.1
  qualifier: 0000: 16 1A 68 74 74 70 3A 2F   2F 77 77 77 2E 65 6E 74  ..http://www.ent
0010: 72 75 73 74 2E 6E 65 74   2F 43 50 53              rust.net/CPS

]]  ]
]

[6]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  Key_CertSign
  Crl_Sign
]

[7]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 6A 72 26 7A D0 1E EF 7D   E7 3B 69 51 D4 6C 8D 9F  jr&z.....;iQ.l..
0010: 90 12 66 AB                                        ..f.
]
]

]
  Algorithm: [SHA256withRSA]
  Signature:
0000: 69 33 83 FC 28 7A 6F 7D   EF 9D 55 EB C5 3E 7A 9D  i3..(zo...U..>z.
0010: 75 B3 CC C3 38 36 D9 34   A2 28 68 18 EA 1E 69 D3  u...86.4.(h...i.
0020: BD E7 D0 77 DA B8 00 83   4E 4A CF 6F D1 F1 C1 22  ...w....NJ.o..."
0030: 3F 74 E4 F7 98 49 9E 9B   B6 9E E1 DB 98 77 2D 56  ?t...I.......w-V
0040: 34 B1 A8 3C D9 FD C0 CD   C7 BF 05 03 D4 02 C5 F1  4..<............
0050: E5 C6 DA 08 A5 13 C7 62   23 11 D1 61 30 1D 60 84  .......b#..a0.`.
0060: 45 EF 79 A8 C6 26 93 A4   B7 CD 34 B8 69 C5 13 F6  E.y..&....4.i...
0070: 91 B3 C9 45 73 76 B6 92   F6 76 0A 5B E1 03 47 B7  ...Esv...v.[..G.
0080: E9 29 4C 91 32 23 37 4A   9C 35 D8 78 FD 1D 1F E4  .)L.2#7J.5.x....
0090: 83 89 24 80 AD B7 F9 CF   E4 5D A5 D4 71 C4 85 5B  ..$......]..q..[
00A0: 70 1F DB 3F 1C 01 EB 1A   45 26 31 14 CC 65 BF 67  p..?....E&1..e.g
00B0: DE CA CC 33 65 E5 41 91   D7 37 BE 41 1A 96 9D E6  ...3e.A..7.A....
00C0: 8A 97 9D A7 CE AC 4E 9A   3D BD 01 A0 6A D9 4F 22  ......N.=...j.O"
00D0: 00 8B 44 D5 69 62 7B 2E   EB CC BA E7 92 7D 69 67  ..D.ib........ig
00E0: 3D FC B8 7C DE 41 87 D0   69 EA BA 0A 18 7A 1A 95  =....A..i....z..
00F0: 43 B3 79 71 28 76 6D A1   FB 57 4A EC 4D C8 0E 10  C.yq(vm..WJ.M...

], [
[
  Version: V3
  Subject: CN=Entrust Root Certification Authority, OU="(c) 2006 Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, O="Entrust, Inc.", C=US
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 2048 bits
  modulus: 23049197224710113590772544035103433278481817674493882011447342834437521939051768037777212700992378980195921282446936121554158364416908288069326476596859155882566673978444887949728617315810731530565469331622778409966087591257255114642101890934133193460653279618791020470236538122347487563173039818616304559198218202536315405577676472315795560540193000101878682158853566414134229236728954663196113800150132822629817679485490182404418400673058073844967527388560195880858402422047483008658534964509529966280511092808510110509164093311927186336350002098847973301828089965319406146060814149283619496543832009520752545683659
  public exponent: 65537
  Validity: [From: Mon Nov 27 20:23:42 UTC 2006,
               To: Fri Nov 27 20:53:42 UTC 2026]
  Issuer: CN=Entrust Root Certification Authority, OU="(c) 2006 Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, O="Entrust, Inc.", C=US
  SerialNumber: [    456b5054]

Certificate Extensions: 6
[1]: ObjectId: 1.2.840.113533.7.65.0 Criticality=false
Extension unknown: DER encoded OCTET string =
0000: 04 10 30 0E 1B 08 56 37   2E 31 3A 34 2E 30 03 02  ..0...V7.1:4.0..
0010: 04 90                                              ..


[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 68 90 E4 67 A4 A6 53 80   C7 86 66 A4 F1 F7 4B 43  h..g..S...f...KC
0010: FB 84 BD 6D                                        ...m
]
]

[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

[4]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  Key_CertSign
  Crl_Sign
]

[5]: ObjectId: 2.5.29.16 Criticality=false
PrivateKeyUsage: [
From: Mon Nov 27 20:23:42 UTC 2006, To: Fri Nov 27 20:53:42 UTC 2026]

[6]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 68 90 E4 67 A4 A6 53 80   C7 86 66 A4 F1 F7 4B 43  h..g..S...f...KC
0010: FB 84 BD 6D                                        ...m
]
]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 93 D4 30 B0 D7 03 20 2A   D0 F9 63 E8 91 0C 05 20  ..0... *..c.... 
0010: A9 5F 19 CA 7B 72 4E D4   B1 DB D0 96 FB 54 5A 19  ._...rN......TZ.
0020: 2C 0C 08 F7 B2 BC 85 A8   9D 7F 6D 3B 52 B3 2A DB  ,.........m;R.*.
0030: E7 D4 84 8C 63 F6 0F CB   26 01 91 50 6C F4 5F 14  ....c...&..Pl._.
0040: E2 93 74 C0 13 9E 30 3A   50 E3 B4 60 C5 1C F0 22  ..t...0:P..`..."
0050: 44 8D 71 47 AC C8 1A C9   E9 9B 9A 00 60 13 FF 70  D.qG........`..p
0060: 7E 5F 11 4D 49 1B B3 15   52 7B C9 54 DA BF 9D 95  ._.MI...R..T....
0070: AF 6B 9A D8 9E E9 F1 E4   43 8D E2 11 44 3A BF AF  .k......C...D:..
0080: BD 83 42 73 52 8B AA BB   A7 29 CF F5 64 1C 0A 4D  ..BsR....)..d..M
0090: D1 BC AA AC 9F 2A D0 FF   7F 7F DA 7D EA B1 ED 30  .....*.........0
00A0: 25 C1 84 DA 34 D2 5B 78   83 56 EC 9C 36 C3 26 E2  %...4.[x.V..6.&.
00B0: 11 F6 67 49 1D 92 AB 8C   FB EB FF 7A EE 85 4A A7  ..gI.......z..J.
00C0: 50 80 F0 A7 5C 4A 94 2E   5F 05 99 3C 52 41 E0 CD  P...\J.._..<RA..
00D0: B4 63 CF 01 43 BA 9C 83   DC 8F 60 3B F3 5A B4 B4  .c..C.....`;.Z..
00E0: 7B AE DA 0B 90 38 75 EF   81 1D 66 D2 F7 57 70 36  .....8u...f..Wp6
00F0: B3 BF FC 28 AF 71 25 85   5B 13 FE 1E 7F 5A B4 3C  ...(.q%.[....Z.<

]], RSA)
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - transferred 2257 bytes in 0.044 seconds at 50.95 KBps [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] DEBUG com.helger.as2lib.processor.sender.AS2SenderModule - Receiving synchronous MDN for message [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] DEBUG com.helger.commons.http.HttpHeaderMap - Adding HTTP header: 'Connection' = 'close'
[main] DEBUG com.helger.commons.http.HttpHeaderMap - Adding HTTP header: 'Set-Cookie' = 'BIGipServerPreProd-Extranet-ESG3-4080=390638346.55315.0000; path=/'
[main] DEBUG com.helger.commons.http.HttpHeaderMap - Adding HTTP header: 'Set-Cookie' = 'BIGipServerPreProd-Extranet-ESG3-5080=911321866.55315.0000; path=/'
[main] TRACE com.helger.as2lib.processor.sender.AS2SenderModule - Retrieved MDN stream data:

[main] INFO com.helger.as2lib.util.AS2Helper - Start parsing MDN of [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] DEBUG com.helger.as2lib.processor.DefaultMessageProcessor - DefaultMessageProcessor.handle (storemdn,[AS2Message@0x772861aa: data=javax.mail.internet.MimeBodyPart@6631cb64; MDN=[[AS2MessageMDN@0x19962194: attributes=[{}]; headers=[HttpHeaderMap@0x481e91b6: Headers={connection=[close], set-cookie=[BIGipServerPreProd-Extranet-ESG3-4080=390638346.55315.0000; path=/, BIGipServerPreProd-Extranet-ESG3-5080=911321866.55315.0000; path=/]}]; partnership=[Partnership@0x3ee69ad8: name=auto-created-dummy; senderIDs=[{as2_id=null, x509_alias=FDA ESG Administrators}]; receiverIDs=[{as2_id=null, x509_alias=Cognizant.MedvantageFDA.net}]; attributes=[{}]]]; message=<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>; data=javax.mail.internet.MimeBodyPart@7c8f9c2e; text=null]],null)
[main] DEBUG com.helger.as2lib.processor.AbstractMessageProcessor -   no modules found for 'storemdn'; modules are: [[[{}]], [[{connecttimeout=600000, readtimeout=600000}]]]
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - received MDN [null] [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - MIC IS NOT MATCHED, original mic: 'IpjGylckS2ovHgk995aA3SU2Jlw=, sha1' return mic: 'null' [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] INFO com.helger.as2lib.exception.OpenAS2Exception - OpenAS2 OpenAS2Exception terminated: Message was sent but an error occured while receiving the MDN; sources: {message=[AS2Message@0x772861aa: data=javax.mail.internet.MimeBodyPart@6631cb64; MDN=[[AS2MessageMDN@0x19962194: attributes=[{}]; headers=[HttpHeaderMap@0x481e91b6: Headers={connection=[close], set-cookie=[BIGipServerPreProd-Extranet-ESG3-4080=390638346.55315.0000; path=/, BIGipServerPreProd-Extranet-ESG3-5080=911321866.55315.0000; path=/]}]; partnership=[Partnership@0x3ee69ad8: name=auto-created-dummy; senderIDs=[{as2_id=null, x509_alias=FDA ESG Administrators}]; receiverIDs=[{as2_id=null, x509_alias=Cognizant.MedvantageFDA.net}]; attributes=[{}]]]; message=<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>; data=javax.mail.internet.MimeBodyPart@7c8f9c2e; text=null]]}
com.helger.as2lib.exception.OpenAS2Exception: Invalid disposition type format: null
	at com.helger.as2lib.disposition.DispositionType.createFromString(DispositionType.java:151)
	at com.helger.as2lib.processor.sender.AS2SenderModule.receiveSyncMDN(AS2SenderModule.java:589)
	at com.helger.as2lib.processor.sender.AS2SenderModule._sendViaHTTP(AS2SenderModule.java:724)
	at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:773)
	at com.helger.as2lib.client.AS2Client.sendSynchronous(AS2Client.java:382)
	at com.cts.as2client.JavaAS2Client.sendAS2Request(JavaAS2Client.java:290)
	at com.cts.as2client.JavaAS2Client.sendFileToAS2Server(JavaAS2Client.java:170)
	at com.cts.as2client.JavaAS2Client.main(JavaAS2Client.java:94)
[main] DEBUG com.helger.as2lib.client.AS2Client - Response retrieved: 
OriginalMessageID: <JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>

Response received = { "mdnDisposition" : "NULL_RECD", "responseAsStringBase64" : "Ck9yaWdpbmFsTWVzc2FnZUlEOiA8SmF2YUFTMkNsaWVudF9waGF4QVMyTGliLTE3MDUyMDE4MDkxMjM0KzAwMDAtNTYxN0A3ODgxNTcxNTlfQ1RTX0FTMl9aWkZEQVRTVD4KU2VuZGluZyBkdXJhdGlvbjogUFQxLjkyMjI1MjRTCg==", "originalMessageID" : "<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>", "mdnTextBase64" : "TlVMTF9SRUNE", "mdnMessageID" : "NULL_RECD" }
Response decoded = 
OriginalMessageID: <JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>
Sending duration: PT1.9222524S

MDN Text decoded = NULL_RECD

Request your assistance in finding the possible mistake in the code.

Thanks.

NPE

[2018-03-05T19:40:42,459] [ERB] [INFO ] [ajp-nio-127.0.0.1-8009-exec-21] OpenAS2 WrappedOpenAS2Exception terminated: java.lang.NullPointerException: The value of 'MimeBodyPart' may not be null!; sources: {message=[AS2Message@0x1e28fd3b: data=null; MDN=[[AS2MessageMDN@0x63825fb4: attributes=[{REPORTING_UA=ph-OpenAS2 [email protected]:443, ORIGINAL_RECIPIENT=rfc822; APP_1000000135, FINAL_RECIPIENT=rfc822; null, ORIGINAL_MESSAGE_ID=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>, DISPOSITION=automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error}]; headers=[HttpHeaderMap@0x27aafcdb: Headers={as2-to=[APP_1000000345], as2-from=[APP_1000000135], as2-version=[1.1], date=[Mo, 05 M?r 2018 20:40:42 +0100], server=[ph-OpenAS2 4.0.0], mime-version=[1.0], subject=[Your Requested MDN Response]}]; partnership=[Partnership@0x71f6a35c: name=APP_1000000135-APP_1000000345; senderIDs=[{as2_id=APP_1000000135, x509_alias=null}]; receiverIDs=[{as2_id=APP_1000000345, x509_alias=null}]; attributes=[{sign=sha-1}]]]; message=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>; data=null; text=The message sent to Recipient null on Mon, 05 Mar 2018 19:40:39 GMT with Subject AS2 message from Databutikken Access Point has been received, but an error occured while parsing the MIME content.]]} -- com.helger.as2lib.exception.OpenAS2Exception.log(OpenAS2Exception.java:108)
java.lang.NullPointerException: The value of 'MimeBodyPart' may not be null!
	at com.helger.commons.ValueEnforcer.notNull(ValueEnforcer.java:276) ~[ph-commons-9.0.1.jar:9.0.1]
	at com.helger.as2lib.crypto.BCCryptoHelper.calculateMIC(BCCryptoHelper.java:256) ~[as2-lib-4.0.0.jar:4.0.0]
	at com.helger.as2lib.util.AS2Helper.createMDN(AS2Helper.java:304) ~[as2-lib-4.0.0.jar:4.0.0]
	at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.sendSyncMDN(AS2ReceiverHandler.java:270) [as2-lib-4.0.0.jar:4.0.0]
	at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.handleIncomingMessage(AS2ReceiverHandler.java:536) [as2-lib-4.0.0.jar:4.0.0]
	at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.handeIncomingMessage(AbstractAS2ReceiveXServletHandler.java:162) [as2-servlet-4.0.0.jar:4.0.0]
	at at.gv.brz.erb.webapp.servlet.ERBAS2ReceiveXServletHandler.handeIncomingMessage(ERBAS2ReceiveXServletHandler.java:81) [classes/:5.0.6]
	at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.onRequest(AbstractAS2ReceiveXServletHandler.java:198) [as2-servlet-4.0.0.jar:4.0.0]
	at com.helger.xservlet.AbstractXServlet._invokeHandler(AbstractXServlet.java:336) [ph-xservlet-9.0.0.jar:9.0.0]
	at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:520) [ph-xservlet-9.0.0.jar:9.0.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at com.helger.servlet.filter.CharacterEncodingFilter.doHttpFilter(CharacterEncodingFilter.java:183) [ph-servlet-9.0.0.jar:9.0.0]
	at com.helger.servlet.filter.AbstractHttpServletFilter.doFilter(AbstractHttpServletFilter.java:66) [ph-servlet-9.0.0.jar:9.0.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.10.0.jar:2.10.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.46]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.46]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.46]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) [catalina.jar:8.0.46]
	at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:877) [tomcat-coyote.jar:8.0.46]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) [tomcat-coyote.jar:8.0.46]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539) [tomcat-coyote.jar:8.0.46]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495) [tomcat-coyote.jar:8.0.46]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.46]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
[2018-03-05T19:40:42,470] [ERB] [INFO ] [ajp-nio-127.0.0.1-8009-exec-21] OpenAS2 DispositionException terminated: automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error; sources: {message=[AS2Message@0x1e28fd3b: data=null; MDN=[[AS2MessageMDN@0x63825fb4: attributes=[{REPORTING_UA=ph-OpenAS2 [email protected]:443, ORIGINAL_RECIPIENT=rfc822; APP_1000000135, FINAL_RECIPIENT=rfc822; null, ORIGINAL_MESSAGE_ID=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>, DISPOSITION=automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error}]; headers=[HttpHeaderMap@0x27aafcdb: Headers={as2-to=[APP_1000000345], as2-from=[APP_1000000135], as2-version=[1.1], date=[Mo, 05 M?r 2018 20:40:42 +0100], server=[ph-OpenAS2 4.0.0], mime-version=[1.0], subject=[Your Requested MDN Response]}]; partnership=[Partnership@0x71f6a35c: name=APP_1000000135-APP_1000000345; senderIDs=[{as2_id=APP_1000000135, x509_alias=null}]; receiverIDs=[{as2_id=APP_1000000345, x509_alias=null}]; attributes=[{sign=sha-1}]]]; message=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>; data=null; text=The message sent to Recipient null on Mon, 05 Mar 2018 19:40:39 GMT with Subject AS2 message from Databutikken Access Point has been received, but an error occured while parsing the MIME content.]]} -- com.helger.as2lib.exception.OpenAS2Exception.log(OpenAS2Exception.java:108)
javax.mail.internet.ParseException: In Content-Type string <null>, expected MIME type, got null
	at javax.mail.internet.ContentType.<init>(ContentType.java:97) ~[javax.mail-1.6.0.jar:1.6.0]
	at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.handleIncomingMessage(AS2ReceiverHandler.java:362) [as2-lib-4.0.0.jar:4.0.0]
	at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.handeIncomingMessage(AbstractAS2ReceiveXServletHandler.java:162) [as2-servlet-4.0.0.jar:4.0.0]
	at at.gv.brz.erb.webapp.servlet.ERBAS2ReceiveXServletHandler.handeIncomingMessage(ERBAS2ReceiveXServletHandler.java:81) [classes/:5.0.6]
	at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.onRequest(AbstractAS2ReceiveXServletHandler.java:198) [as2-servlet-4.0.0.jar:4.0.0]
	at com.helger.xservlet.AbstractXServlet._invokeHandler(AbstractXServlet.java:336) [ph-xservlet-9.0.0.jar:9.0.0]
	at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:520) [ph-xservlet-9.0.0.jar:9.0.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at com.helger.servlet.filter.CharacterEncodingFilter.doHttpFilter(CharacterEncodingFilter.java:183) [ph-servlet-9.0.0.jar:9.0.0]
	at com.helger.servlet.filter.AbstractHttpServletFilter.doFilter(AbstractHttpServletFilter.java:66) [ph-servlet-9.0.0.jar:9.0.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.10.0.jar:2.10.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.46]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.46]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [catalina.jar:8.0.46]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.46]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) [catalina.jar:8.0.46]
	at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:877) [tomcat-coyote.jar:8.0.46]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) [tomcat-coyote.jar:8.0.46]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539) [tomcat-coyote.jar:8.0.46]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495) [tomcat-coyote.jar:8.0.46]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.46]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]

Testing partnership data

Hi,
Implementing AS2, we want to validate a partnership's data before the first actual send. Can the library help with such a test?
Thank you for your help,
Ziv

Warnings when checking out

Hello helger first of all i would like to thank you for the great work your doing. and i might use your work in the near future and create GUI to work with server.

When checking out out a project it comes with 80 or so warnings,

1st warning is about adding a serialize id to the classes. could you please add automatic generated id's? right now i have to add it myself with every revision update.

second is about dead code. maby add suppression warnings?

third warning: XML files changelog and findbugs-exlusion. could oyu add to it to suppress no grammer contrainst warnings

kind regards,

Async mdn question

Hi Philip,
I saw in code whem using async mdn we store the mic in mdmpendinginfo folder and in the file we set the mic and mdmpending file.
My question what are you doing with this file beacuse the file isnt created and you are trying to delete him when mic is matched.
Another issuewhen you delete mdmpendinginfo file you print to log the directory from mdmpending and not from mdmpendinginfo.
Thanks,
Itay

BCCryptoHelper - Using explicit in BouncyCastleProvider.PROVIDER_NAME instead of m_sSecurityProviderName

Hi Philip,
You made a change to support BCFIPS provider in BCCryptoHelper class however there 2 places you left with calling to BC Provider explicit and not via the new parameter m_sSecurityProviderName.
In decrypt method you are using BouncyCastleProvider.PROVIDER_NAME instead of m_sSecurityProviderName

if (bLargeFileOn)
{
aDecryptedDataBodyPart = SMIMEUtil.toMimeBodyPart (aRecipient.getContentStream (new JceKeyTransEnvelopedRecipient (aPrivateKey).setProvider (BouncyCastleProvider.PROVIDER_NAME)));
}
else
{
final byte [] aDecryptedData = aRecipient.getContent (new JceKeyTransEnvelopedRecipient (aPrivateKey).setProvider (BouncyCastleProvider.PROVIDER_NAME));

  if (s_aDumpDecryptedDirectory != null)
  {
    _dumpDecrypted (aDecryptedData);
  }

  aDecryptedDataBodyPart = SMIMEUtil.toMimeBodyPart (aDecryptedData);
}
return aDecryptedDataBodyPart;

}

Could you please modify those changes and push them to 4.2.0
Another question is when 4.2.0 should be released?

Thanks a lot,
Itay

Exception in client when sending a message clear text messagse

Hi Philip,
When sending a message with no encryption, signature, or compression, the call
aSecuredMimePart.getInputStream() (AS2SenderModule:682) fails with Exception javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/xml.
Thanks, Ziv

Keystore has to be read write

When sending the message the encryption is done by a private key residing in a keystore.

The as2-lib needs this keystore to be writeable. In a production environment this is not
acceptable for 2 reasons.

  • Security wise
  • Keystore if written to can be corrupted.

Please make a keystore as a copy in the /tmp folder or move the keystore to memory

AS2ReceiveServlet startup issue

Hi there,

I've setup the AS2ReceiveServlet servlet in my web.xml, and created the required config.xml and other files.

I'm getting the following exception after hitting the AS2ReceiveServlet via a browser GET request (http://localhost:8080/test-web/as2/HttpReceiver): "java.lang.IllegalStateException: No global scope object has been set!" (see stacktrace below). Do you have any idea how to resolve this issue?

NOTE: This exception occurs prior to loading the configuration file from web.xml init parameter.

Thanks,
Yusuf

Caused by: java.lang.IllegalStateException: No global scope object has been set!
	at com.helger.scope.mgr.ScopeManager.getGlobalScope(ScopeManager.java:158)
	at com.helger.scope.singleton.AbstractGlobalSingleton._getStaticScope(AbstractGlobalSingleton.java:48)
	at com.helger.scope.singleton.AbstractGlobalSingleton.getGlobalSingleton(AbstractGlobalSingleton.java:65)
	at com.helger.xservlet.servletstatus.ServletStatusManager.getInstance(ServletStatusManager.java:66)
	at com.helger.xservlet.AbstractXServlet.<init>(AbstractXServlet.java:181)
	at com.helger.as2servlet.AS2ReceiveServlet.<init>(AS2ReceiveServlet.java:32)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:119)
	at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:92)
	at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:78)
	at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
	at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:116)
	at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:180)
	at org.jboss.as.weld.injection.WeldInjectionContext.produce(WeldInjectionContext.java:46)
	at org.jboss.as.weld.injection.WeldManagedReferenceFactory.create(WeldManagedReferenceFactory.java:55)
	at org.jboss.as.ee.component.ComponentInstantiatorInterceptor.processInvocation(ComponentInstantiatorInterceptor.java:67)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
	at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:26)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.weld.injection.WeldInjectionContextInterceptor.processInvocation(WeldInjectionContextInterceptor.java:43)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
	at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
	at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
	... 44 more

Calculating MIC for signed message when *not* having MDN options fails

Version: AS2-LIB 4.1.1-SNAPSHOT from 'master'

I'm sending (or at least trying to send) an encrypted and signed message while at the same time not requesting an MDN and (sort of consequently) not having an 'MDNOptions' on the partnership. From our documentation, it is a valid (albeit strange) test case.

Securing the message happens in handle() in AS2SenderModule

      // compress and/or sign and/or encrypt the message if needed
      final MimeBodyPart aSecuredData = secure (aMsg);

      // Calculate MIC after compress/sign/crypt was handled, because the
      // message data might change if compression before signing is active.
      final String sMIC = calculateAndStoreMIC (aMsg);

      if (LOGGER.isDebugEnabled ())
        LOGGER.debug ("Setting message content type to '" + aSecuredData.getContentType () + "'");
      aMsg.setContentType (aSecuredData.getContentType ());

The securing part works and in the secure(aMsg) the signing algorithm is taken from the partnership:

final String sSignAlgorithm = aPartnership.getSigningAlgorithm ();

After the signing the MIC is calculated and this part fails with the following exception

15:33:58.042 [main] ERROR com.helger.as2lib.client.AS2Client - Error sending AS2 message
com.helger.as2lib.exception.WrappedOpenAS2Exception: java.lang.NullPointerException: The value of 'DigestAlgorithm' may not be null!
	at com.helger.as2lib.exception.WrappedOpenAS2Exception.wrap(WrappedOpenAS2Exception.java:66) ~[classes/:na]
	at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:810) ~[classes/:na]
	at com.helger.as2lib.client.AS2Client.sendSynchronous(AS2Client.java:388) ~[classes/:na]
	at com.descartes.as2.AS2ClientBuilder.sendSynchronous(AS2ClientBuilder.java:954) [classes/:na]
	at com.descartes.as2.MainAS2TestClient.main(MainAS2TestClient.java:193) [test-classes/:na]
Caused by: java.lang.NullPointerException: The value of 'DigestAlgorithm' may not be null!
	at com.helger.commons.ValueEnforcer.notNull(ValueEnforcer.java:277) ~[ph-commons-9.1.3.jar:9.1.3]
	at com.helger.as2lib.crypto.BCCryptoHelper.calculateMIC(BCCryptoHelper.java:252) ~[classes/:na]
	at com.helger.as2lib.processor.sender.AS2SenderModule.calculateAndStoreMIC(AS2SenderModule.java:257) ~[classes/:na]
	at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:780) ~[classes/:na]
	... 3 common frames omitted

The reason being that in protected String calculateAndStoreMIC (@Nonnull final AS2Message aMsg) Disposition options (a string here!) are being parsed to a DispositionOptions object and from that the fist mic is read.

final String sDispositionOptions = aPartnership.getAS2MDNOptions ();
final DispositionOptions aDispositionOptions = DispositionOptions.createFromString (sDispositionOptions);
. . .
final String sMIC = AS2Helper.getCryptoHelper ().calculateMIC (aMsg.getData (),
                                                               aDispositionOptions.getFirstMICAlg (),
                                                               bIncludeHeadersInMIC); (sDispositionOptions);

It looks like this is a copy/paste from an MDN related method and since it is only used in the AS2SenderModule, I think

aDispositionOptions.getFirstMICAlg (),

should be replaced by

ECryptoAlgorithmSign.getFromIDOrThrow(aPartnership.getSigningAlgorithm()),

Or an assignment, a null check like for the encryption or...

Validation failure with cert chain in message body.

Validation of the SMIME signature fails when the body includes a certificate chain and the signing cert is not first in the list.

The validation code is simply using the first certificate. It should examine the signature and use the certificate that matches that.

Reverse partnership for MDN response does not honor certificate alias

When sending a message and the AS2 ID and the key alias are not the same, the reverse partnership that is created when receiving a synchronous MDN uses the message recipient's (or MDN sender's) AS2 ID as the certificate alias instead of the KeyAlias from the AS2ClientSettings and the lookup fails.
I hope this makes sense, I'm not entirely sure if I'm using it correctly.

Large files

Hi Philip,

It seems that the issue with large files comes from HttpUrlConnection. The OutputStream that is obtained from it stores all data in memory and only at the end writes it to the socket. I would like to add the possibility to work with Apache HttpClient that supports streaming without holding all data in memory.
What do you think?
Thanks,
Ziv

List of variable that can be used in "as2-servlet-configuration.xml"

I have currently implemented the AS2 Servlet in a test suite where we are performing regression testing of our integration platform. I'm wondering which parameters are existing for generating a better dynamic filename? I'm specifically interested in the AS2 Filename and AS2 Subject. Example from the readme below. Is there a list of "variables" that can be used in the "as2-servlet-configuration.xml" file?
<module classname="com.helger.as2lib.processor.storage.MessageFileModule" filename="%home%/inbox/$date.yyyy$/$date.MM$/$msg.sender.as2_id$-$msg.receiver.as2_id$-$msg.headers.message-id$" header="%home%/inbox/msgheaders/$date.yyyy$/$date.MM$/$msg.sender.as2_id$-$msg.receiver.as2_id$-$msg.headers.message-id$" protocol="as2" tempdir="%home%/temp"/>

as2-servlet: JCE cannot authenticate the provider BC

I'm getting the following error when trying to receive a message using as2-servlet:

ERROR [com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler] (default task-8) Error decrypting [<MY-JUNIT-TEST-CASE-phax-as2-lib-31072018232014+0200-1843@OpenAS2B_OID_OpenAS2A_OID>]: JCE cannot authenticate the provider BC

I've tried a number of options found online without any success. Any ideas on how to resolve this?

Thanks!
Yusuf

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.