blautenb    2003/08/31 05:50:47

  Modified:    c/src/dsig DSIGConstants.cpp DSIGConstants.hpp
               c/src/framework XSECError.cpp XSECException.hpp
                        XSECProvider.cpp XSECProvider.hpp
               c/src/utils XSECDOMUtils.cpp XSECDOMUtils.hpp
                        XSECSafeBuffer.cpp XSECSafeBuffer.hpp
  Log:
  Updates to start linking in XML Encryption
  
  Revision  Changes    Path
  1.11      +4 -1      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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- DSIGConstants.cpp 5 Jul 2003 10:30:30 -0000       1.10
  +++ DSIGConstants.cpp 31 Aug 2003 12:50:47 -0000      1.11
  @@ -82,6 +82,7 @@
   const XMLCh * DSIGConstants::s_unicodeStrURIDSIG;
   const XMLCh * DSIGConstants::s_unicodeStrURIEC;
   const XMLCh * DSIGConstants::s_unicodeStrURIXPF;
  +const XMLCh * DSIGConstants::s_unicodeStrURIXENC;
   
   const XMLCh * DSIGConstants::s_unicodeStrURIRawX509;
   const XMLCh * DSIGConstants::s_unicodeStrURISHA1;
  @@ -121,6 +122,7 @@
        s_unicodeStrURIDSIG = XMLString::transcode(URI_ID_DSIG);
        s_unicodeStrURIEC = XMLString::transcode(URI_ID_EC);
        s_unicodeStrURIXPF = XMLString::transcode(URI_ID_XPF);
  +     s_unicodeStrURIXENC = XMLString::transcode(URI_ID_XENC);
        s_unicodeStrURISHA1 = XMLString::transcode(URI_ID_SHA1);
        s_unicodeStrURIMD5 = XMLString::transcode(URI_ID_MD5);
        s_unicodeStrURIBASE64 = XMLString::transcode(URI_ID_BASE64);
  @@ -155,6 +157,7 @@
        delete[] (XMLCh *) s_unicodeStrURIDSIG;
        delete[] (XMLCh *) s_unicodeStrURIEC;
        delete[] (XMLCh *) s_unicodeStrURIXPF;
  +     delete[] (XMLCh *) s_unicodeStrURIXENC;
        delete[] (XMLCh *) s_unicodeStrURISHA1;
        delete[] (XMLCh *) s_unicodeStrURIMD5;
        delete[] (XMLCh *) s_unicodeStrURIBASE64;
  
  
  
  1.13      +3 -1      xml-security/c/src/dsig/DSIGConstants.hpp
  
  Index: DSIGConstants.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGConstants.hpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- DSIGConstants.hpp 5 Jul 2003 10:30:30 -0000       1.12
  +++ DSIGConstants.hpp 31 Aug 2003 12:50:47 -0000      1.13
  @@ -84,6 +84,7 @@
   #define URI_ID_EC            "http://www.w3.org/2001/10/xml-exc-c14n#";
   // Also used as algorithm ID for XPATH_FILTER
   #define URI_ID_XPF           "http://www.w3.org/2002/06/xmldsig-filter2";
  +#define URI_ID_XENC          "http://www.w3.org/2001/04/xmlenc#";
   
   // Hashing Algorithms
   
  @@ -306,6 +307,7 @@
        static const XMLCh * s_unicodeStrURIDSIG;
        static const XMLCh * s_unicodeStrURIEC;
        static const XMLCh * s_unicodeStrURIXPF;
  +     static const XMLCh * s_unicodeStrURIXENC;
   
        static const XMLCh * s_unicodeStrURIRawX509;
        static const XMLCh * s_unicodeStrURISHA1;
  
  
  
  1.7       +5 -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.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSECError.cpp     5 Jul 2003 10:30:34 -0000       1.6
  +++ XSECError.cpp     31 Aug 2003 12:50:47 -0000      1.7
  @@ -116,6 +116,11 @@
        "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",
  +     "An error occurred during processing of an Encrypted[Data|Key] node",
  +     "Did not find expected XENC child element",
  +     "An error occurred processing a CipherData node",
  +     "An error occurred processing a CipherValue node",
  +     "An error occurred in the XSECCipher processor",
        "Unknown Error type",
   
   };
  
  
  
  1.9       +9 -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.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XSECException.hpp 5 Jul 2003 10:30:34 -0000       1.8
  +++ XSECException.hpp 31 Aug 2003 12:50:47 -0000      1.9
  @@ -143,7 +143,14 @@
                LoadEmptyXPathFilter            = 39,
                XPathFilterError                        = 40,
                DNameDecodeError                        = 41,
  -             UnknownError                            = 42            // Must 
be last!
  +
  +             // Encryption errors
  +             EncryptedTypeError                      = 42,
  +             ExpectedXENCChildNotFound       = 43,
  +             CipherDataError                         = 44,
  +             CipherValueError                        = 45,
  +             CipherError                                     = 46,
  +             UnknownError                            = 47            // Must 
be last!
   
        };
   
  
  
  
  1.6       +71 -2     xml-security/c/src/framework/XSECProvider.cpp
  
  Index: XSECProvider.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/framework/XSECProvider.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XSECProvider.cpp  5 Jul 2003 10:30:34 -0000       1.5
  +++ XSECProvider.cpp  31 Aug 2003 12:50:47 -0000      1.6
  @@ -74,6 +74,8 @@
   #include <xsec/utils/XSECDOMUtils.hpp>
   #include <xsec/framework/XSECURIResolverXerces.hpp>
   
  +#include "../xenc/impl/XENCCipherImpl.hpp"
  +
   // 
--------------------------------------------------------------------------------
   //           Constructors/Destructors
   // 
--------------------------------------------------------------------------------
  @@ -87,8 +89,9 @@
   
   XSECProvider::~XSECProvider() {
   
  +     // First delete signatures
  +     
        SignatureListVectorType::iterator i;
  -
        
        for (i = m_activeSignatures.begin(); i != m_activeSignatures.end(); ++i)
                delete *i;
  @@ -97,6 +100,16 @@
   
        if (mp_URIResolver != NULL)
                delete mp_URIResolver;
  +
  +     // Now delete ciphers
  +
  +     CipherListVectorType::iterator j;
  +     
  +     for (j = m_activeCiphers.begin(); j != m_activeCiphers.end(); ++j)
  +             delete *j;
  +
  +     m_activeCiphers.clear();
  +
   }
   
   // 
--------------------------------------------------------------------------------
  @@ -177,6 +190,51 @@
   }
   
   // 
--------------------------------------------------------------------------------
  +//           Cipher Creation/Deletion
  +// 
--------------------------------------------------------------------------------
  +
  +XENCCipher * XSECProvider::newCipher(DOMDocument * doc) {
  +
  +     XENCCipherImpl * ret;
  +
  +     XSECnew(ret, XENCCipherImpl(doc));
  +
  +     setup(ret);
  +
  +     return ret;
  +
  +}
  +
  +void XSECProvider::releaseCipher(XENCCipher * toRelease) {
  +
  +     // Find in the active list
  +
  +     CipherListVectorType::iterator i;
  +
  +     m_providerMutex.lock();
  +     i = m_activeCiphers.begin();
  +     while (i != m_activeCiphers.end() && *i != toRelease)
  +             ++i;
  +
  +     if (i == m_activeCiphers.end()) {
  +
  +             m_providerMutex.unlock();
  +
  +             throw XSECException(XSECException::ProviderError,
  +                     "Attempt to release a cipher that was not created by 
this provider");
  +
  +     }
  +     
  +     // For now - remove from list.  Would be better to recycle
  +     m_activeCiphers.erase(i);
  +     m_providerMutex.unlock();
  +     delete toRelease;
  +
  +}
  +
  +
  +
  +// 
--------------------------------------------------------------------------------
   //           Environmental methods
   // 
--------------------------------------------------------------------------------
   
  @@ -204,5 +262,16 @@
        m_providerMutex.unlock();
   
        sig->setURIResolver(mp_URIResolver);
  +
  +}
  +
  +void XSECProvider::setup(XENCCipher * cipher) {
  +
  +     // Called by all Signature creation methods to set up the sig
  +
  +     // Add to the active list
  +     m_providerMutex.lock();
  +     m_activeCiphers.push_back(cipher);
  +     m_providerMutex.unlock();
   
   }
  
  
  
  1.7       +49 -7     xml-security/c/src/framework/XSECProvider.hpp
  
  Index: XSECProvider.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/framework/XSECProvider.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSECProvider.hpp  5 Jul 2003 10:30:34 -0000       1.6
  +++ XSECProvider.hpp  31 Aug 2003 12:50:47 -0000      1.7
  @@ -73,6 +73,7 @@
   
   #include <xsec/utils/XSECPlatformUtils.hpp>
   #include <xsec/dsig/DSIGSignature.hpp>
  +#include <xsec/xenc/XENCCipher.hpp>
   
   #include <xercesc/util/Mutexes.hpp>
   
  @@ -84,13 +85,13 @@
    */
   
   /**
  - * @brief The provider class for XML Digital Signatures objects.
  + * @brief The main provider class for XML Digital Signatures and Encryption 
objects.
    *
  - * <p>The XSECProvider class is used to create and destroy signature objects.
  - * It provides a number of methods to create signature objects for a variety 
of
  - * situations - in particular creating an empty signature with which to 
create
  - * the signature DOM structure or creating a signature based on an already
  - * existing DOM structure.</p>
  + * <p>The XSECProvider class is used to create and destroy signature objects 
and
  + * encryption objects.  It provides a number of methods to create signature 
  + * and encryption objects for a variety of situations - in particular 
creating an 
  + * empty signature or cipher with which to create the DOM structure or 
creating a 
  + * security object based on an already existing DOM structure.</p>
    *
    */
   
  @@ -103,6 +104,12 @@
        typedef std::vector<DSIGSignature *>    SignatureListVectorType;
   #endif
   
  +#if defined(XALAN_NO_NAMESPACES)
  +     typedef vector<XENCCipher *>                    CipherListVectorType;
  +#else
  +     typedef std::vector<XENCCipher *>               CipherListVectorType;
  +#endif
  +
   public:
   
       /** @name Constructors and Destructors */
  @@ -196,6 +203,39 @@
   
        //@}
   
  +     /** @name Encryption Creation Functions */
  +     //@{
  +
  +     /**
  +      * \brief Create an XENCCipher object based on a particular DOM Document
  +      *
  +      * XENCCipher is an engine class that is used to wrap 
encryption/decryption
  +      * functions.  Unlike the Signature functions, only a XENCCipher object 
attached
  +      * to a particular document is required.  Arbitrary objects within this 
document
  +      * can then be encrypted/decrypted using this class.
  +      *
  +      * @param doc Document to attach the XENCCipher to.
  +      * @returns An implementation object for XENCCipher
  +      */
  +
  +     XENCCipher * newCipher(DOMDocument * doc);
  +
  +     /**
  +      * \brief Method to delete XENCCipher objects created via this provider
  +      *
  +      * <p>The provider keeps track of all objects by it.  This method can 
be used
  +      * to delete any previously created XENCCipher objects prior to the 
provider
  +      * being deleted.  Any XENCCipher objects not released using this 
function will
  +      * automatically be deleted when the provider goes out of scope (or is 
itself
  +      * deleted).
  +      *
  +      * @param toRelease The XENCCipher object to be deleted
  +      */
  +
  +     void releaseCipher(XENCCipher * toRelease);
  +
  +     //@}
  +
        /** @name Environmental Options */
        //@{
   
  @@ -220,8 +260,10 @@
        // Internal functions
   
        void setup(DSIGSignature *sig);
  +     void setup(XENCCipher *cipher);
   
        SignatureListVectorType                                         
m_activeSignatures;
  +     CipherListVectorType                                            
m_activeCiphers;
        XSECURIResolver                                                         
* mp_URIResolver;
        XERCES_CPP_NAMESPACE_QUALIFIER XMLMutex         m_providerMutex;
   };
  
  
  
  1.11      +117 -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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XSECDOMUtils.cpp  5 Jul 2003 10:30:37 -0000       1.10
  +++ XSECDOMUtils.cpp  31 Aug 2003 12:50:47 -0000      1.11
  @@ -78,6 +78,16 @@
   // Xerces
   
   #include <xercesc/util/XMLUniDefs.hpp>
  +#include <xercesc/util/Janitor.hpp>
  +#include <xercesc/util/PlatformUtils.hpp>
  +#include <xercesc/util/TransService.hpp>
  +
  +XSEC_USING_XERCES(XMLTransService);
  +XSEC_USING_XERCES(XMLTranscoder);
  +XSEC_USING_XERCES(XMLPlatformUtils);
  +XSEC_USING_XERCES(Janitor);
  +XSEC_USING_XERCES(chNull);
  +
   // 
--------------------------------------------------------------------------------
   //           Utilities to manipulate DSIG namespaces
   // 
--------------------------------------------------------------------------------
  @@ -114,6 +124,18 @@
   
   }
   
  +const XMLCh DSIG_EXPORT * getXENCLocalName(const DOMNode *node) {
  +
  +     // XML Encryption namespace node
  +
  +     if (!strEquals(node->getNamespaceURI(), 
DSIGConstants::s_unicodeStrURIXENC))
  +             return NULL;
  +     else
  +             return node->getLocalName();
  +
  +}
  +
  +
   // 
--------------------------------------------------------------------------------
   //           Find a nominated DSIG node in a document
   // 
--------------------------------------------------------------------------------
  @@ -144,6 +166,35 @@
   }
   
   // 
--------------------------------------------------------------------------------
  +//           Find a nominated XENC node in a document
  +// 
--------------------------------------------------------------------------------
  +
  +DOMNode *findXENCNode(DOMNode *n, const char * nodeName) {
  +
  +     const XMLCh * name = getXENCLocalName(n);
  +
  +     if (strEquals(name, nodeName)) {
  +
  +             return n;
  +
  +     }
  +
  +     DOMNode *child = n->getFirstChild();
  +
  +     while (child != NULL) {
  +
  +             DOMNode *ret = findXENCNode(child, nodeName);
  +             if (ret != NULL)
  +                     return ret;
  +             child = child->getNextSibling();
  +
  +     }
  +
  +     return child;
  +
  +}
  +
  +// 
--------------------------------------------------------------------------------
   //           Find particular type of node child
   // 
--------------------------------------------------------------------------------
   
  @@ -163,6 +214,21 @@
   
   }
   
  +DOMNode * findNextChildOfType(DOMNode *n, DOMNode::NodeType t) {
  +
  +     DOMNode * s = n;
  +
  +     if (s == NULL)
  +             return s;
  +
  +     do {
  +             s = s->getNextSibling();
  +     } while (s != NULL && s->getNodeType() != t);
  +
  +     return s;
  +
  +}
  +
   // 
--------------------------------------------------------------------------------
   //           Make a QName
   // 
--------------------------------------------------------------------------------
  @@ -237,6 +303,57 @@
                c = c->getNextSibling();
   
        }
  +
  +}
  +
  +// 
--------------------------------------------------------------------------------
  +//           Some UTF8 utilities
  +// 
--------------------------------------------------------------------------------
  +
  +XMLCh * transcodeFromUTF8(const unsigned char * src) {
  +
  +     // Take a UTF-8 buffer and transcode to UTF-16
  +
  +     safeBuffer fullDest;
  +     fullDest.sbXMLChIn(DSIGConstants::s_unicodeStrEmpty);
  +     XMLCh outputBuf[2050];
  +
  +     // Used to record byte sizes
  +     unsigned char charSizes[2050];
  +
  +     // Grab a transcoder
  +     XMLTransService::Codes failReason;
  +
  +     XMLTranscoder* t = 
  +             XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8", 
  +                                                                             
                                           failReason, 
  +                                                                             
                                           2*1024, 
  +                                                                             
                                           XMLPlatformUtils::fgMemoryManager);
  +     Janitor<XMLTranscoder> j_t(t);
  +
  +     // Need to loop through, 2K at a time
  +     unsigned int bytesEaten;
  +     unsigned int totalBytesEaten = 0;
  +     unsigned int bytesToEat = XMLString::stringLen((char *) src);
  +
  +     while (totalBytesEaten < bytesToEat) {
  +
  +             int toEat = (bytesToEat > 2048 ? 2048 : bytesToEat);
  +
  +             t->transcodeFrom(&src[totalBytesEaten], 
  +                                             toEat, 
  +                                             outputBuf, 
  +                                             2048, 
  +                                             bytesEaten, 
  +                                             charSizes);
  +
  +             outputBuf[bytesEaten] = chNull;
  +             fullDest.sbXMLChCat(outputBuf);
  +             totalBytesEaten += bytesEaten;
  +     }
  +
  +     // Dup and output
  +     return XMLString::replicate(fullDest.rawXMLChBuffer());
   
   }
   
  
  
  
  1.10      +11 -2     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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XSECDOMUtils.hpp  5 Jul 2003 10:30:37 -0000       1.9
  +++ XSECDOMUtils.hpp  31 Aug 2003 12:50:47 -0000      1.10
  @@ -117,18 +117,27 @@
   const XMLCh DSIG_EXPORT * getDSIGLocalName(const DOMNode *node);
   const XMLCh DSIG_EXPORT * getECLocalName(const DOMNode *node);
   const XMLCh DSIG_EXPORT * getXPFLocalName(const DOMNode *node);
  +const XMLCh DSIG_EXPORT * getXENCLocalName(const DOMNode *node);
   
   // 
--------------------------------------------------------------------------------
  -//           Find a nominated DSIG node in a document
  +//           Do UTF-8 <-> UTF-16 transcoding
  +// 
--------------------------------------------------------------------------------
  +
  +XMLCh DSIG_EXPORT * transcodeFromUTF8(const unsigned char * src);
  +
  +// 
--------------------------------------------------------------------------------
  +//           Find a nominated DSIG/XENC node in a document
   // 
--------------------------------------------------------------------------------
   
   DOMNode DSIG_EXPORT * findDSIGNode(DOMNode *n, const char * nodeName);
  +DOMNode DSIG_EXPORT * findXENCNode(DOMNode *n, const char * nodeName);
   
   // 
--------------------------------------------------------------------------------
   //           Find particular type of node child
   // 
--------------------------------------------------------------------------------
   
   DOMNode DSIG_EXPORT * findFirstChildOfType(DOMNode *n, DOMNode::NodeType t);
  +DOMNode DSIG_EXPORT * findNextChildOfType(DOMNode *n, DOMNode::NodeType t);
   
   // 
--------------------------------------------------------------------------------
   //           Make a QName
  
  
  
  1.10      +14 -1     xml-security/c/src/utils/XSECSafeBuffer.cpp
  
  Index: XSECSafeBuffer.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/utils/XSECSafeBuffer.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XSECSafeBuffer.cpp        5 Jul 2003 10:30:37 -0000       1.9
  +++ XSECSafeBuffer.cpp        31 Aug 2003 12:50:47 -0000      1.10
  @@ -71,11 +71,14 @@
   // XSEC includes
   
   #include <xsec/utils/XSECSafeBuffer.hpp>
  +#include <xsec/utils/XSECDOMUtils.hpp>
   #include <xsec/framework/XSECError.hpp>
   
   #include <xercesc/util/XMLUniDefs.hpp>
  +#include <xercesc/util/Janitor.hpp>
   
   XSEC_USING_XERCES(XMLString);
  +XSEC_USING_XERCES(ArrayJanitor);
   
   // Standard includes
   
  @@ -665,6 +668,16 @@
        XMLString::catString((XMLCh *) buffer, t);
   
        delete[] t;
  +}
  +
  +void safeBuffer::sbXMLChCat8(const char * str) {
  +
  +     checkBufferType(BUFFER_UNICODE);
  +
  +     XMLCh * toAdd = transcodeFromUTF8((const unsigned char *) str);
  +     ArrayJanitor<XMLCh> j_toAdd(toAdd);
  +     sbXMLChCat(toAdd);
  +
   }
   
   // Get functions
  
  
  
  1.12      +2 -1      xml-security/c/src/utils/XSECSafeBuffer.hpp
  
  Index: XSECSafeBuffer.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/utils/XSECSafeBuffer.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- XSECSafeBuffer.hpp        5 Jul 2003 10:30:37 -0000       1.11
  +++ XSECSafeBuffer.hpp        31 Aug 2003 12:50:47 -0000      1.12
  @@ -182,6 +182,7 @@
        void sbXMLChAppendCh(const XMLCh c);            // Append a Unicode 
character to the buffer
        void sbXMLChCat(const XMLCh *str);                      // Append a 
UTF-16 string to the buffer
        void sbXMLChCat(const char * str);                      // Append a 
(transcoded) local string to the buffer
  +     void sbXMLChCat8(const char * str);                     // Append a 
(transcoded) UTF-8 string to the buffer
   
        // Sensitive data functions
        void isSensitive(void);
  
  
  

Reply via email to