You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by bl...@apache.org on 2003/05/22 13:17:41 UTC

cvs commit: xml-security/c/src/utils XSECDOMUtils.cpp XSECDOMUtils.hpp

blautenb    2003/05/22 04:17:41

  Modified:    c/src/dsig DSIGConstants.cpp DSIGKeyInfoName.cpp
                        DSIGKeyInfoName.hpp DSIGKeyInfoValue.hpp
                        DSIGKeyInfoX509.cpp DSIGKeyInfoX509.hpp
                        DSIGSignature.cpp DSIGSignature.hpp
               c/src/framework XSECError.cpp XSECException.hpp
               c/src/utils XSECDOMUtils.cpp XSECDOMUtils.hpp
  Log:
  Added support for encoding and decoding of DNames
  
  Revision  Changes    Path
  1.9       +28 -28    xml-security/c/src/dsig/DSIGConstants.cpp
  
  Index: DSIGConstants.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGConstants.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DSIGConstants.cpp	19 May 2003 12:30:59 -0000	1.8
  +++ DSIGConstants.cpp	22 May 2003 11:17:40 -0000	1.9
  @@ -145,33 +145,33 @@
   void DSIGConstants::destroy() {
   
   	// Delete the static strings
  -	delete[] s_unicodeStrEmpty;
  -	delete[] s_unicodeStrNL;
  -	delete[] s_unicodeStrXmlns;
  +	delete[] (XMLCh *) s_unicodeStrEmpty;
  +	delete[] (XMLCh *) s_unicodeStrNL;
  +	delete[] (XMLCh *) s_unicodeStrXmlns;
   
  -	delete[] s_unicodeStrAlgorithm;
  +	delete[] (XMLCh *) s_unicodeStrAlgorithm;
   
  -	delete[] s_unicodeStrURIRawX509;
  -	delete[] s_unicodeStrURIDSIG;
  -	delete[] s_unicodeStrURIEC;
  -	delete[] s_unicodeStrURIXPF;
  -	delete[] s_unicodeStrURISHA1;
  -	delete[] s_unicodeStrURIMD5;
  -	delete[] s_unicodeStrURIBASE64;
  -	delete[] s_unicodeStrURIXPATH;
  -	delete[] s_unicodeStrURIXSLT;
  -	delete[] s_unicodeStrURIENVELOPE;
  -	delete[] s_unicodeStrURIC14N_NOC;
  -	delete[] s_unicodeStrURIC14N_COM;
  -	delete[] s_unicodeStrURIEXC_C14N_NOC;
  -	delete[] s_unicodeStrURIEXC_C14N_COM;
  -	delete[] s_unicodeStrURIDSA_SHA1;
  -	delete[] s_unicodeStrURIRSA_SHA1;
  -	delete[] s_unicodeStrURIHMAC_SHA1;
  -	delete[] s_unicodeStrURIXMLNS;
  -	delete[] s_unicodeStrURIMANIFEST;
  +	delete[] (XMLCh *) s_unicodeStrURIRawX509;
  +	delete[] (XMLCh *) s_unicodeStrURIDSIG;
  +	delete[] (XMLCh *) s_unicodeStrURIEC;
  +	delete[] (XMLCh *) s_unicodeStrURIXPF;
  +	delete[] (XMLCh *) s_unicodeStrURISHA1;
  +	delete[] (XMLCh *) s_unicodeStrURIMD5;
  +	delete[] (XMLCh *) s_unicodeStrURIBASE64;
  +	delete[] (XMLCh *) s_unicodeStrURIXPATH;
  +	delete[] (XMLCh *) s_unicodeStrURIXSLT;
  +	delete[] (XMLCh *) s_unicodeStrURIENVELOPE;
  +	delete[] (XMLCh *) s_unicodeStrURIC14N_NOC;
  +	delete[] (XMLCh *) s_unicodeStrURIC14N_COM;
  +	delete[] (XMLCh *) s_unicodeStrURIEXC_C14N_NOC;
  +	delete[] (XMLCh *) s_unicodeStrURIEXC_C14N_COM;
  +	delete[] (XMLCh *) s_unicodeStrURIDSA_SHA1;
  +	delete[] (XMLCh *) s_unicodeStrURIRSA_SHA1;
  +	delete[] (XMLCh *) s_unicodeStrURIHMAC_SHA1;
  +	delete[] (XMLCh *) s_unicodeStrURIXMLNS;
  +	delete[] (XMLCh *) s_unicodeStrURIMANIFEST;
   
  -	delete[] s_unicodeStrPROVOpenSSL;
  -	delete[] s_unicodeStrPROVWinCAPI;
  +	delete[] (XMLCh *) s_unicodeStrPROVOpenSSL;
  +	delete[] (XMLCh *) s_unicodeStrPROVWinCAPI;
   
   }
  
  
  
  1.3       +67 -7     xml-security/c/src/dsig/DSIGKeyInfoName.cpp
  
  Index: DSIGKeyInfoName.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGKeyInfoName.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DSIGKeyInfoName.cpp	9 Feb 2003 11:13:47 -0000	1.2
  +++ DSIGKeyInfoName.cpp	22 May 2003 11:17:40 -0000	1.3
  @@ -64,9 +64,7 @@
    *
    * Author(s): Berin Lautenbach
    *
  - * $ID$
  - *
  - * $LOG$
  + * $Id$
    *
    */
   
  @@ -76,6 +74,10 @@
   #include <xsec/utils/XSECDOMUtils.hpp>
   #include <xsec/dsig/DSIGSignature.hpp>
   
  +#include <xercesc/util/Janitor.hpp>
  +
  +XSEC_USING_XERCES(ArrayJanitor);
  +
   // --------------------------------------------------------------------------------
   //           Constructors and Destructors
   // --------------------------------------------------------------------------------
  @@ -84,6 +86,7 @@
   DSIGKeyInfoName::DSIGKeyInfoName(DSIGSignature *sig, DOMNode *nameNode) : 
   DSIGKeyInfo(sig),
   mp_name(NULL),
  +mp_decodedDName(NULL),
   mp_keyNameTextNode(0) {
   
   	mp_keyInfoDOMNode = nameNode;
  @@ -94,6 +97,7 @@
   DSIGKeyInfoName::DSIGKeyInfoName(DSIGSignature *sig) : 
   DSIGKeyInfo(sig),
   mp_name(NULL),
  +mp_decodedDName(NULL),
   mp_keyNameTextNode(0) {
   
   	mp_keyInfoDOMNode = 0;
  @@ -103,6 +107,9 @@
   
   DSIGKeyInfoName::~DSIGKeyInfoName() {
   
  +	if (mp_decodedDName != NULL)
  +		delete[] mp_decodedDName;
  +
   };
   
   // --------------------------------------------------------------------------------
  @@ -151,11 +158,23 @@
   
   }
   
  +const XMLCh * DSIGKeyInfoName::getDecodedKeyName(void) {
  +
  +	if (mp_decodedDName == NULL) {
  +
  +		mp_decodedDName = decodeDName(mp_name);
  +
  +	}
  +
  +	return mp_decodedDName;
  +
  +}
  +
   // --------------------------------------------------------------------------------
   //           Create and Set functions
   // --------------------------------------------------------------------------------
   
  -DOMElement * DSIGKeyInfoName::createBlankKeyName(const XMLCh * name) {
  +DOMElement * DSIGKeyInfoName::createBlankKeyName(const XMLCh * name, bool isDName) {
   
   	// Create the DOM Structure
   
  @@ -167,7 +186,23 @@
   
   	DOMElement *ret = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer());
   	mp_keyInfoDOMNode = ret;
  -	mp_keyNameTextNode = doc->createTextNode(name);
  +
  +	// Check whether to encode prior to adding
  +	if (isDName == true) {
  +
  +		// Treat as a distinguished name
  +
  +		mp_decodedDName = XMLString::replicate(name);
  +		XMLCh * encodedName = encodeDName(name);
  +		ArrayJanitor<XMLCh> j_encodedName(encodedName);
  +
  +		mp_keyNameTextNode = doc->createTextNode(encodedName);
  +
  +	}
  +
  +	else
  +		mp_keyNameTextNode = doc->createTextNode(name);
  +
   	ret->appendChild(mp_keyNameTextNode);
   
   	mp_name = mp_keyNameTextNode->getNodeValue();
  @@ -176,7 +211,7 @@
   
   }
   
  -void DSIGKeyInfoName::setKeyName(const XMLCh * name) {
  +void DSIGKeyInfoName::setKeyName(const XMLCh * name, bool isDName) {
   
   	if (mp_keyNameTextNode == 0) {
   
  @@ -186,7 +221,32 @@
   
   	}
   
  -	mp_keyNameTextNode->setNodeValue(name);
  +	if (mp_decodedDName != NULL) {
  +
  +		delete[] mp_decodedDName;
  +		mp_decodedDName = NULL;
  +
  +	}
  +
  +	if (isDName == true) {
  +
  +		// This name should be treated as a Distinguished Name - so do the
  +		// required encoding
  +
  +		mp_decodedDName = XMLString::replicate(name);
  +		XMLCh * encodedName = encodeDName(name);
  +		ArrayJanitor<XMLCh> j_encodedName(encodedName);
  +
  +		mp_keyNameTextNode->setNodeValue(encodedName);
  +
  +	}
  +
  +	else {
  +
  +		mp_keyNameTextNode->setNodeValue(name);
  +
  +	}
  +
   	mp_name = mp_keyNameTextNode->getNodeValue();
   
   }
  
  
  
  1.3       +18 -2     xml-security/c/src/dsig/DSIGKeyInfoName.hpp
  
  Index: DSIGKeyInfoName.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGKeyInfoName.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DSIGKeyInfoName.hpp	9 Feb 2003 11:13:47 -0000	1.2
  +++ DSIGKeyInfoName.hpp	22 May 2003 11:17:40 -0000	1.3
  @@ -153,6 +153,17 @@
   
   	virtual const XMLCh * getKeyName(void) {return mp_name;};
   
  +	/**
  +	 * \brief Get the decoded key name (for distinguished names)
  +	 *
  +	 * Returns a pointer to the buffer containing the decoded Distinguished
  +	 * Name.
  +	 *
  +	 * @returns A pointer to the char buffer containing the key name
  +	 */
  +
  +	virtual const XMLCh * getDecodedKeyName(void);
  +
   	//@}
   
   	/**@name Create and set functions */
  @@ -165,10 +176,12 @@
   	 * passed in.
   	 *
   	 * @param name Value to set the KeyName as
  +	 * @param isDName If set to true, the name will be encoded as a DName
  +	 * prior to be being placed in the DOM document
   	 * @returns The newly created DOMElement with the structure underneath.
   	 */
   
  -	DOMElement * createBlankKeyName(const XMLCh * name);
  +	DOMElement * createBlankKeyName(const XMLCh * name, bool isDName = false);
   
   	/**
   	 * \brief Set the value of the KeyName to a new string.
  @@ -176,9 +189,11 @@
   	 * Uses the passed in string to set a new value in the DOM structure.
   	 *
   	 * @param name Value to set in KeyName
  +	 * @param isDName If set to true, the name will be encoded as a DName
  +	 * prior to be being placed in the DOM document
   	 */
   
  -	void setKeyName(const XMLCh * name);
  +	void setKeyName(const XMLCh * name, bool isDName = false);
   
   	//@}
   
  @@ -198,6 +213,7 @@
   	DSIGKeyInfoName();							// Non-implemented constructor
   
   	const XMLCh			* mp_name;				// The Data stored in the XML file
  +	XMLCh				* mp_decodedDName;		// When this is a DName that needs decoding
   	DOMNode				* mp_keyNameTextNode;	// Text node containing the name
   
   };
  
  
  
  1.3       +13 -3     xml-security/c/src/dsig/DSIGKeyInfoValue.hpp
  
  Index: DSIGKeyInfoValue.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGKeyInfoValue.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DSIGKeyInfoValue.hpp	9 Feb 2003 11:13:47 -0000	1.2
  +++ DSIGKeyInfoValue.hpp	22 May 2003 11:17:40 -0000	1.3
  @@ -64,9 +64,7 @@
    *
    * Author(s): Berin Lautenbach
    *
  - * $ID$
  - *
  - * $LOG$
  + * $Id$
    *
    */
   
  @@ -90,6 +88,18 @@
    * Class for holding information on a KeyValue node as well as setting
    * such a node in a signature.
    *
  + * Two types of Value are understood - RSA and DSA.
  + *
  + * RSA values are fully implemented as per XML-DSig.  They have two parameters
  + *
  + * <ul>
  + * <li><em>Modulus</em> - holds the modulus of this public key; and</li>
  + * <li><em>Exponent</em> - holds the exponent.</li>
  + * </ul>
  + *
  + * DSA values have all mandatory parts implemented  - P, Q, G and Y.
  + *
  + * J, Seed and PgenCounter are not currently implemented.
    */
   
   
  
  
  
  1.6       +36 -13    xml-security/c/src/dsig/DSIGKeyInfoX509.cpp
  
  Index: DSIGKeyInfoX509.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGKeyInfoX509.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DSIGKeyInfoX509.cpp	18 May 2003 11:00:02 -0000	1.5
  +++ DSIGKeyInfoX509.cpp	22 May 2003 11:17:40 -0000	1.6
  @@ -75,6 +75,10 @@
   #include <xsec/utils/XSECDOMUtils.hpp>
   #include <xsec/dsig/DSIGSignature.hpp>
   
  +#include <xercesc/util/Janitor.hpp>
  +
  +XSEC_USING_XERCES(ArrayJanitor);
  +
   // --------------------------------------------------------------------------------
   //           Constructors and Destructors
   // --------------------------------------------------------------------------------
  @@ -121,6 +125,15 @@
   
   DSIGKeyInfoX509::~DSIGKeyInfoX509() {
   
  +	// SubjectName and IssuerName are local (decoded) copies of the
  +	// encoded DName held in the DOM
  +
  +	if (mp_X509IssuerName != NULL)
  +		delete[] mp_X509IssuerName;
  +
  +	if (mp_X509SubjectName != NULL)
  +		delete[] mp_X509SubjectName;
  +
   	X509ListType::iterator i;
   
   	for (i = m_X509List.begin(); i != m_X509List.end(); ++i) {
  @@ -202,7 +215,7 @@
   
   				}
   
  -				mp_X509SubjectName = child->getNodeValue();
  +				mp_X509SubjectName = decodeDName(child->getNodeValue());
   
   			}
   
  @@ -231,7 +244,7 @@
   
   				}
   
  -				mp_X509IssuerName = child->getNodeValue();
  +				mp_X509IssuerName = decodeDName(child->getNodeValue());
   
   				// Now find the serial number
   				child = tmpElt->getFirstChild();
  @@ -447,6 +460,14 @@
   
   void DSIGKeyInfoX509::setX509SubjectName(const XMLCh * name) {
   
  +	if (mp_X509SubjectName != NULL)
  +		delete[] mp_X509SubjectName;
  +
  +	mp_X509SubjectName = XMLString::replicate(name);
  +	
  +	XMLCh * encodedName = encodeDName(name);
  +	ArrayJanitor<XMLCh> j_encodedName(encodedName);
  +
   	if (mp_X509SubjectNameTextNode == 0) {
   
   		// Does not yet exist in the DOM
  @@ -458,7 +479,7 @@
   		makeQName(str, prefix, "X509SubjectName");
   
   		DOMElement * s = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer());
  -		mp_X509SubjectNameTextNode = doc->createTextNode(name);
  +		mp_X509SubjectNameTextNode = doc->createTextNode(encodedName);
   		s->appendChild(mp_X509SubjectNameTextNode);
   
   		// Add to the over-arching node
  @@ -469,16 +490,21 @@
   
   	else {
   
  -		mp_X509SubjectNameTextNode->setNodeValue(name);
  +		mp_X509SubjectNameTextNode->setNodeValue(encodedName);
   
   	}
  -
  -	mp_X509SubjectName = mp_X509SubjectNameTextNode->getNodeValue();
  -
   }
   
   void DSIGKeyInfoX509::setX509IssuerSerial(const XMLCh * name, const XMLCh * serial) {
   
  +	if (mp_X509IssuerName != NULL)
  +		delete[] mp_X509IssuerName;
  +
  +	mp_X509IssuerName = XMLString::replicate(name);
  +	
  +	XMLCh * encodedName = encodeDName(name);
  +	ArrayJanitor<XMLCh> j_encodedName(encodedName);
  +
   	if (mp_X509IssuerNameTextNode == 0) {
   
   		// Does not yet exist in the DOM
  @@ -494,7 +520,7 @@
   
   		// Create the text nodes with the contents
   
  -		mp_X509IssuerNameTextNode = doc->createTextNode(name);
  +		mp_X509IssuerNameTextNode = doc->createTextNode(encodedName);
   		mp_X509SerialNumberTextNode = doc->createTextNode(serial);
   	
   		// Create the sub elements
  @@ -522,13 +548,10 @@
   
   	else {
   
  -		mp_X509IssuerNameTextNode->setNodeValue(name);
  +		mp_X509IssuerNameTextNode->setNodeValue(encodedName);
   		mp_X509SerialNumberTextNode->setNodeValue(serial);
   
   	}
  -
  -	mp_X509IssuerName = mp_X509IssuerNameTextNode->getNodeValue();
  -	mp_X509SerialNumber = mp_X509SerialNumberTextNode->getNodeValue();
   
   }
   
  
  
  
  1.4       +15 -4     xml-security/c/src/dsig/DSIGKeyInfoX509.hpp
  
  Index: DSIGKeyInfoX509.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGKeyInfoX509.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DSIGKeyInfoX509.hpp	18 May 2003 11:00:02 -0000	1.3
  +++ DSIGKeyInfoX509.hpp	22 May 2003 11:17:40 -0000	1.4
  @@ -183,7 +183,9 @@
   	 * Get the name stored in the X509SubjectName element (if it
   	 * exists).
   	 *
  -	 * @returns A pointer to the buffer containing the name (or NULL if not set)
  +	 * @returns A pointer to the buffer containing the name (or NULL if not set).
  +	 * The decoded string is returned.
  +	 * @see setX509SubjectName(void)
   	 */
   
   	const XMLCh * getKeyName(void);
  @@ -206,7 +208,8 @@
   	 * signing certificate.
   	 * 
   	 * @returns A pointer to the string containing the IssuerSerialNumber.
  -	 * (0 if not set.)
  +	 * (0 if not set.)  This is the decoded string.
  +	 * @see setX509IssuerSerial
   	 */
   
   	const XMLCh * getX509IssuerSerialNumber(void);
  @@ -295,6 +298,10 @@
   	 * If a X509SubjectName element exists, replace the text with the
   	 * provided text.  Otherwise create the element and set the text.
   	 *
  +	 * @note XMLDSIG requires Distinguished Names be encoded in a defined
  +	 * manner (escaping '<' characters etc.).  This method will perform
  +	 * this encoding prior to creating the DOM nodes.
  +	 *
   	 * @param name The name to set.
   	 */
   
  @@ -306,6 +313,10 @@
   	 * If an X509IssuerSerial exists, replace the values with those provided,
   	 * otherwise create a new element and set the values appropriately.
   	 *
  +	 * @note XMLDSIG requires Distinguished Names be encoded in a defined
  +	 * manner (escaping '<' characters etc.).  This method will perform
  +	 * this encoding prior to creating the DOM nodes.
  +	 *
   	 * @param name The name of the issuer.
   	 * @param serial The serial number of the issuer's certificate
   	 */
  @@ -369,9 +380,9 @@
   	DSIGKeyInfoX509();
   
   	X509ListType		m_X509List;				// The X509 structures
  -	const XMLCh 		* mp_X509IssuerName;	// Parameters from KeyInfo (not cert)
  +	XMLCh 				* mp_X509IssuerName;	// Parameters from KeyInfo (not cert)
   	const XMLCh 		* mp_X509SerialNumber;
  -	const XMLCh 		* mp_X509SubjectName;
  +	XMLCh 				* mp_X509SubjectName;
   	const XMLCh			* mp_X509CRL;
   	const XMLCh			* mp_X509SKI;
   	XMLCh				* mp_rawRetrievalURI;
  
  
  
  1.14      +3 -3      xml-security/c/src/dsig/DSIGSignature.cpp
  
  Index: DSIGSignature.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGSignature.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- DSIGSignature.cpp	18 May 2003 11:00:02 -0000	1.13
  +++ DSIGSignature.cpp	22 May 2003 11:17:40 -0000	1.14
  @@ -681,7 +681,7 @@
   
   }
   
  -DSIGKeyInfoName * DSIGSignature::appendKeyName(const XMLCh * name) {
  +DSIGKeyInfoName * DSIGSignature::appendKeyName(const XMLCh * name, bool isDName) {
   
   	createKeyInfoElement();
   
  @@ -689,7 +689,7 @@
   
   	XSECnew(n, DSIGKeyInfoName(this));
   
  -	mp_KeyInfoNode->appendChild(n->createBlankKeyName(name));
  +	mp_KeyInfoNode->appendChild(n->createBlankKeyName(name, isDName));
   	mp_KeyInfoNode->appendChild(mp_doc->createTextNode(DSIGConstants::s_unicodeStrNL));
   
   	// Add to the list
  
  
  
  1.9       +3 -2      xml-security/c/src/dsig/DSIGSignature.hpp
  
  Index: DSIGSignature.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGSignature.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DSIGSignature.hpp	8 May 2003 12:10:58 -0000	1.8
  +++ DSIGSignature.hpp	22 May 2003 11:17:40 -0000	1.9
  @@ -619,10 +619,11 @@
   	 * Add a new KeyInfo element for a key name.
   	 *
   	 * @param name The name of the key to set in the XML
  +	 * @param isDName Treat the name as a Distinguished name and encode accordingly
   	 * @returns A pointer to the created object
   	 */
   
  -	DSIGKeyInfoName * appendKeyName(const XMLCh * name);
  +	DSIGKeyInfoName * appendKeyName(const XMLCh * name, bool isDName = false);
   
   	//@}
   
  
  
  
  1.4       +1 -0      xml-security/c/src/framework/XSECError.cpp
  
  Index: XSECError.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/framework/XSECError.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XSECError.cpp	12 Feb 2003 11:21:03 -0000	1.3
  +++ XSECError.cpp	22 May 2003 11:17:41 -0000	1.4
  @@ -115,6 +115,7 @@
   	"An error occured in a DSIGTransform holder",
   	"An error occured in a safe buffer",
   	"An error occurred processing an HTTP request via internal resolver",
  +	"An error occurred decoding a DSIG encoded Distinguished name",
   	"Unknown Error type",
   
   };
  
  
  
  1.7       +3 -2      xml-security/c/src/framework/XSECException.hpp
  
  Index: XSECException.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/framework/XSECException.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSECException.hpp	8 May 2003 12:10:58 -0000	1.6
  +++ XSECException.hpp	22 May 2003 11:17:41 -0000	1.7
  @@ -142,7 +142,8 @@
   		HTTPURIInputStreamError     = 38,
   		LoadEmptyXPathFilter		= 39,
   		XPathFilterError			= 40,
  -		UnknownError				= 41		// Must be last!
  +		DNameDecodeError			= 41,
  +		UnknownError				= 42		// Must be last!
   
   	};
   
  
  
  
  1.7       +243 -0    xml-security/c/src/utils/XSECDOMUtils.cpp
  
  Index: XSECDOMUtils.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/utils/XSECDOMUtils.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSECDOMUtils.cpp	8 May 2003 12:10:59 -0000	1.6
  +++ XSECDOMUtils.cpp	22 May 2003 11:17:41 -0000	1.7
  @@ -73,6 +73,7 @@
   // XSEC
   
   #include <xsec/utils/XSECDOMUtils.hpp>
  +#include <xsec/framework/XSECError.hpp>
   
   // Xerces
   
  @@ -238,3 +239,245 @@
   	}
   
   }
  +
  +// --------------------------------------------------------------------------------
  +//           String decode/encode
  +// --------------------------------------------------------------------------------
  +
  +/*
  + * Distinguished names have a particular encoding that needs to be performed prior
  + * to enclusion in the DOM
  + */
  +
  +XMLCh * encodeDName(const XMLCh * toEncode) {
  +
  +	XERCES_CPP_NAMESPACE_USE;
  +
  +	safeBuffer result;
  +
  +	static XMLCh s_strEncodedSpace[] = {
  +		chBackSlash,
  +		chDigit_2,
  +		chDigit_0,
  +		chNull
  +	};
  +
  +	result.sbXMLChIn(DSIGConstants::s_unicodeStrEmpty);
  +
  +	if (toEncode == NULL) {
  +		return NULL;
  +	}
  +
  +	
  +	// Find where the trailing whitespace starts
  +	const XMLCh * ws = &toEncode[XMLString::stringLen(toEncode)];
  +	
  +	*ws--;
  +	while (ws != toEncode && 
  +		(*ws == '\t' || *ws == '\r' || *ws ==' ' || *ws == '\n'))
  +		*ws--;
  +
  +	// Set to first white space character, if we didn't get back to the start
  +	if (toEncode != ws)
  +		*ws++;
  +
  +	// Now run through each character and encode if necessary
  +
  +	const XMLCh * i = toEncode;
  +
  +	if (*i == chPound) {
  +		// "#" Characters escaped at the start of a string
  +		result.sbXMLChAppendCh(chBackSlash);
  +	}
  +
  +	while (*i != chNull && i != ws) {
  +
  +		if (*i <= 0x09) {
  +			result.sbXMLChAppendCh(chBackSlash);
  +			result.sbXMLChAppendCh(chDigit_0);
  +			result.sbXMLChAppendCh(chDigit_0 + *i);
  +		}
  +		else if (*i <= 0x0f) {
  +			result.sbXMLChAppendCh(chBackSlash);
  +			result.sbXMLChAppendCh(chDigit_0);
  +			result.sbXMLChAppendCh(chLatin_A + *i);
  +		}
  +		else if (*i <= 0x19) {
  +			result.sbXMLChAppendCh(chBackSlash);
  +			result.sbXMLChAppendCh(chDigit_1);
  +			result.sbXMLChAppendCh(chDigit_0 + *i);
  +		}
  +		else if (*i <= 0x1f) {
  +			result.sbXMLChAppendCh(chBackSlash);
  +			result.sbXMLChAppendCh(chDigit_1);
  +			result.sbXMLChAppendCh(chLatin_A + *i);
  +		}
  +
  +		else if (*i == chComma) {
  +
  +			// Determine if this is an RDN separator
  +			const XMLCh *j = i;
  +			*j++;
  +			while (*j != chComma && *j != chEqual && *j != chNull)
  +				*j++;
  +
  +			if (*j != chEqual)
  +				result.sbXMLChAppendCh(chBackSlash);
  +
  +			result.sbXMLChAppendCh(*i);
  +
  +		}
  +
  +		else {
  +			
  +			if (*i == chPlus ||
  +				*i == chDoubleQuote ||
  +				*i == chBackSlash ||
  +				*i == chOpenAngle ||
  +				*i == chCloseAngle ||
  +				*i == chSemiColon) {
  +
  +				result.sbXMLChAppendCh(chBackSlash);
  +			}
  +
  +			result.sbXMLChAppendCh(*i);
  +
  +		}
  +
  +		*i++;
  +
  +	}
  +
  +	// Now encode trailing white space
  +	while (*i != NULL) {
  +
  +		if (*i == ' ')
  +			result.sbXMLChCat(s_strEncodedSpace);
  +		else
  +			result.sbXMLChAppendCh(*i);
  +
  +		*i++;
  +
  +	}
  +
  +	return XMLString::replicate(result.rawXMLChBuffer());
  +
  +}
  +
  +XMLCh * decodeDName(const XMLCh * toDecode) {
  +
  +	// Take an encoded name and decode to a normal XMLCh string
  +
  +	XERCES_CPP_NAMESPACE_USE;
  +
  +	safeBuffer result;
  +
  +	result.sbXMLChIn(DSIGConstants::s_unicodeStrEmpty);
  +
  +	if (toDecode == NULL) {
  +		return NULL;
  +	}
  +
  +	const XMLCh * i = toDecode;
  +
  +	if (*i == chBackSlash && i[1] == chPound) {
  +
  +		result.sbXMLChAppendCh(chPound);
  +		*i++;
  +		*i++;
  +
  +	}
  +
  +	while (*i != chNull) {
  +
  +		if (*i == chBackSlash) {
  +
  +			*i++;
  +			
  +			if (*i == chDigit_0) {
  +
  +				*i++;
  +
  +				if (*i >= chDigit_0 && *i <= chDigit_9) {
  +					result.sbXMLChAppendCh(*i - chDigit_0);
  +				}
  +				else if (*i >= chLatin_A && *i <= chLatin_F) {
  +					result.sbXMLChAppendCh(10 + *i - chLatin_A);
  +				}
  +				else if (*i >= chLatin_a && *i <= chLatin_f) {
  +					result.sbXMLChAppendCh(10 + *i - chLatin_a);
  +				}
  +				else {
  +					throw XSECException(XSECException::DNameDecodeError,
  +						"Unexpected escaped character in Distinguished name");
  +				}
  +			}
  +
  +			else if (*i == chDigit_1) {
  +
  +				*i++;
  +
  +				if (*i >= chDigit_0 && *i <= chDigit_9) {
  +					result.sbXMLChAppendCh(16 + *i - chDigit_0);
  +				}
  +				else if (*i >= chLatin_A && *i <= chLatin_F) {
  +					result.sbXMLChAppendCh(26 + *i - chLatin_A);
  +				}
  +				else if (*i >= chLatin_a && *i <= chLatin_f) {
  +					result.sbXMLChAppendCh(26 + *i - chLatin_a);
  +				}
  +				else {
  +					throw XSECException(XSECException::DNameDecodeError,
  +						"Unexpected escaped character in Distinguished name");
  +				}
  +			}
  +
  +			else if (*i == chDigit_2) {
  +
  +				*i++;
  +
  +				if (*i == '0') {
  +					result.sbXMLChAppendCh(' ');
  +				}
  +
  +				else {
  +					throw XSECException(XSECException::DNameDecodeError,
  +						"Unexpected escaped character in Distinguished name");
  +				}
  +
  +			}
  +
  +			else if (*i == chComma ||
  +					 *i == chPlus ||
  +					 *i == chDoubleQuote ||
  +					 *i == chBackSlash ||
  +					 *i == chOpenAngle ||
  +					 *i == chCloseAngle ||
  +					 *i == chSemiColon) {
  +
  +				result.sbXMLChAppendCh(*i);
  +			}
  +
  +			else {
  +
  +				throw XSECException(XSECException::DNameDecodeError,
  +					"Unexpected escaped character in Distinguished name");
  +
  +			}
  +
  +			*i++;
  +
  +		}
  +
  +		else {
  +
  +			result.sbXMLChAppendCh(*i++);
  +
  +		}
  +
  +	}
  +
  +	return XMLString::replicate(result.rawXMLChBuffer());
  +
  +}
  +
  
  
  
  1.7       +13 -1     xml-security/c/src/utils/XSECDOMUtils.hpp
  
  Index: XSECDOMUtils.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/utils/XSECDOMUtils.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSECDOMUtils.hpp	8 May 2003 12:10:59 -0000	1.6
  +++ XSECDOMUtils.hpp	22 May 2003 11:17:41 -0000	1.7
  @@ -144,6 +144,18 @@
   void DSIG_EXPORT gatherChildrenText(DOMNode * parent, safeBuffer &output);
   
   // --------------------------------------------------------------------------------
  +//           String decode/encode
  +// --------------------------------------------------------------------------------
  +
  +/*
  + * Distinguished names have a particular encoding that needs to be performed prior
  + * to enclusion in the DOM
  + */
  +
  +XMLCh * encodeDName(const XMLCh * toEncode);
  +XMLCh * decodeDName(const XMLCh * toDecode);
  +
  +// --------------------------------------------------------------------------------
   //           String Functions 
   // --------------------------------------------------------------------------------