I have a SOAP service I am calling with PHP 5.3.1’s builtin SoapClient. The first operation I must perform on the service is a custom authentication operation, and one of the required parameters I must pass is a 3DES encrypted string which I am creating using PHP’s mcrypt, like so:
$encryptionKey = '1234myKey1234';
$currentFormattedDate = date ("Y/m/d H:i");
$encryptedString = mcrypt_encrypt('tripledes', $encryptionKey, $currentFormattedDate, 'ecb');
If I try to just pass $encryptedString as I get it from mcrypt_encrypt() I get a fatal error on my side and no call is made:
Fatal error: SOAP-ERROR: Encoding: string ‘d\xe0…’ is not a valid utf-8 string in /path/to/file
However if I utf8_encode() the string as such:
$encryptedString = utf8_encode($encryptedString)
Then the call is made but their webservice responds with the following error:
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:argStatusDate. The InnerException message was ‘There was an error deserializing the object of type System.String. The byte 0x19 is not valid at this location. Line 2, position 318.’.
This is the closest I can get to success with this process after having tried so many things that I’m back to square one. I have verified I can just pass a bogus string which results in the expected response of not being able to authenticate.
I don’t think this should make any difference since I believe the SOAP call is ultimately made as utf8, but I have tried setting ‘encoding’ => ‘ISO-8859-1’ when constructing my SoapClient in PHP and I get the same error. The call is made but the server responds with the deserialization error.
Does anyone know a better way for me to treat this encrypted string that will please both my PHP client and their .Net webservice?
Maybe the problem is on their end?
FWIW, I can also request that we change the encryption method to “Rijndael AES Block Cypher” per their documentation. Not sure if that would result in an easier to handle string.
You probably need to encode the data in a base 64 encoded CDATA segment inside the opening and closing tags. You might want to ask the creater of the service for a sample, or – if it is a webservice – try to download the definition or even create a client through discovery. Note that the last link was found using Google search, I’ve been out of PHP for a while.
[EDIT] changing the cipher won’t help for this, although anything is better than ECB encoding XML