Hello, I started using XML Security (C++) in my own project a few days ago.
I created a simple command line tool based on simpleEncrypt and simpleDecrypt examples. My goal is to create a small utility for encrypting/decrypting xml files with AES256_CBC (randomly generated key) and RSA_15 Public/Private keys (loaded from PEM files).
I ran into an error when I tried decrypting my previously encrypted xml file : An error occurred during an encryption operation Message: OpenSSL:SymmetricKey::decryptFinish - Out of range padding value in final block
I used valgrind to track down the problem and it seems to be related to the use of uninitilised value during both encrypting and decrypting.
A patch is available in attachment. The main problem is in XSECSafeBuffer.cpp The 2 other files modification are just small memory leaks. Please let me know if something is wrong with my patch. Thanks. Jérémy
Index: c/src/utils/XSECSafeBuffer.cpp =================================================================== --- c/src/utils/XSECSafeBuffer.cpp (révision 935194) +++ c/src/utils/XSECSafeBuffer.cpp (copie de travail) @@ -61,6 +61,7 @@ xsecsize_t newBufferSize = size * 2; unsigned char * newBuffer = new unsigned char[newBufferSize]; + memset((void *) newBuffer, 0, newBufferSize); memcpy(newBuffer, buffer, bufferSize); // If we are sensitive, clean the old buffer @@ -103,6 +104,7 @@ bufferSize = initialSize; buffer = new unsigned char[initialSize]; + memset((void *) buffer, 0, bufferSize); mp_XMLCh = NULL; m_isSensitive = false; @@ -112,6 +114,7 @@ bufferSize = DEFAULT_SAFE_BUFFER_SIZE; buffer = new unsigned char[bufferSize]; + memset((void *) buffer, 0, bufferSize); mp_XMLCh = NULL; m_bufferType = BUFFER_UNKNOWN; m_isSensitive = false; @@ -123,6 +126,7 @@ bufferSize = ((xsecsize_t) strlen(inStr) > initialSize ? (xsecsize_t) (strlen(inStr) * 2) : initialSize); buffer = new unsigned char[bufferSize]; + memset((void *) buffer, 0, bufferSize); strcpy((char *) buffer, inStr); mp_XMLCh = NULL; m_bufferType = BUFFER_CHAR; Index: c/src/xenc/impl/XENCEncryptedTypeImpl.cpp =================================================================== --- c/src/xenc/impl/XENCEncryptedTypeImpl.cpp (révision 935194) +++ c/src/xenc/impl/XENCEncryptedTypeImpl.cpp (copie de travail) @@ -324,7 +324,7 @@ // local code page and then transform char * b64 = XMLString::transcode(mp_cipherData->getCipherValue()->getCipherString()); - ArrayJanitor<char> j_b64(b64); + //ArrayJanitor<char> j_b64(b64); TXFMSB *sb; XSECnew(sb, TXFMSB(mp_env->getParentDocument())); @@ -340,6 +340,8 @@ chain->appendTxfm(tb64); + XMLString::release(&b64); + return chain; } Index: c/src/xenc/impl/XENCCipherImpl.cpp =================================================================== --- c/src/xenc/impl/XENCCipherImpl.cpp (révision 935194) +++ c/src/xenc/impl/XENCCipherImpl.cpp (copie de travail) @@ -286,7 +286,7 @@ sb.sbXMLChAppendCh(chCloseAngle); char * prefix = transcodeToUTF8(sb.rawXMLChBuffer()); - ArrayJanitor<char> j_prefix(prefix); + //ArrayJanitor<char> j_prefix(prefix); sbt = prefix; const char * crcb = content.rawCharBuffer(); @@ -315,8 +315,9 @@ sb.sbXMLChAppendCh(chCloseAngle); char * trailer = transcodeToUTF8(sb.rawXMLChBuffer()); - ArrayJanitor<char> j_trailer(trailer); + //ArrayJanitor<char> j_trailer(trailer); sbt.sbStrcatIn(trailer); + XMLString::release(&trailer); // Now we need to parse the document @@ -333,6 +334,8 @@ MemBufInputSource* memIS = new MemBufInputSource ((const XMLByte*) sbt.rawBuffer(), bytes, "XSECMem"); Janitor<MemBufInputSource> j_memIS(memIS); + XMLString::release(&prefix); + parser->parse(*memIS); xsecsize_t errorCount = parser->getErrorCount(); if (errorCount > 0)