1 /** 2 * Licensed to the University Corporation for Advanced Internet 3 * Development, Inc. (UCAID) under one or more contributor license 4 * agreements. See the NOTICE file distributed with this work for 5 * additional information regarding copyright ownership. 6 * 7 * UCAID licenses this file to you under the Apache License, 8 * Version 2.0 (the "License"); you may not use this file except 9 * in compliance with the License. You may obtain a copy of the 10 * License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 17 * either express or implied. See the License for the specific 18 * language governing permissions and limitations under the License. 19 */ 20 21 /** 22 * KeyInfoImpl.cpp 23 * 24 * Implementation classes for KeyInfo schema. 25 */ 26 27 #include "internal.h" 28 #include "AbstractComplexElement.h" 29 #include "AbstractSimpleElement.h" 30 #include "exceptions.h" 31 #include "io/AbstractXMLObjectMarshaller.h" 32 #include "io/AbstractXMLObjectUnmarshaller.h" 33 #include "signature/KeyInfo.h" 34 #include "util/XMLHelper.h" 35 36 #include <boost/lambda/bind.hpp> 37 #include <boost/lambda/casts.hpp> 38 #include <boost/lambda/if.hpp> 39 #include <boost/lambda/lambda.hpp> 40 #include <xercesc/util/XMLUniDefs.hpp> 41 42 using namespace xmlsignature; 43 using namespace xmltooling; 44 using namespace xercesc; 45 using namespace std; 46 using xmlconstants::XMLSIG_NS; 47 using xmlconstants::XMLSIG11_NS; 48 49 #if defined (_MSC_VER) 50 #pragma warning( push ) 51 #pragma warning( disable : 4250 4251 ) 52 #endif 53 54 namespace xmlsignature { 55 56 class XMLTOOL_DLLLOCAL DSAKeyValueImpl : public virtual DSAKeyValue, 57 public AbstractComplexElement, 58 public AbstractDOMCachingXMLObject, 59 public AbstractXMLObjectMarshaller, 60 public AbstractXMLObjectUnmarshaller 61 { init()62 void init() { 63 m_P=nullptr; 64 m_Q=nullptr; 65 m_G=nullptr; 66 m_Y=nullptr; 67 m_J=nullptr; 68 m_Seed=nullptr; 69 m_PgenCounter=nullptr; 70 m_children.push_back(nullptr); 71 m_children.push_back(nullptr); 72 m_children.push_back(nullptr); 73 m_children.push_back(nullptr); 74 m_children.push_back(nullptr); 75 m_children.push_back(nullptr); 76 m_children.push_back(nullptr); 77 m_pos_P=m_children.begin(); 78 m_pos_Q=m_pos_P; 79 ++m_pos_Q; 80 m_pos_G=m_pos_Q; 81 ++m_pos_G; 82 m_pos_Y=m_pos_G; 83 ++m_pos_Y; 84 m_pos_J=m_pos_Y; 85 ++m_pos_J; 86 m_pos_Seed=m_pos_J; 87 ++m_pos_Seed; 88 m_pos_PgenCounter=m_pos_Seed; 89 ++m_pos_PgenCounter; 90 } 91 92 public: ~DSAKeyValueImpl()93 virtual ~DSAKeyValueImpl() {} 94 DSAKeyValueImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)95 DSAKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 96 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 97 init(); 98 } 99 DSAKeyValueImpl(const DSAKeyValueImpl & src)100 DSAKeyValueImpl(const DSAKeyValueImpl& src) 101 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 102 init(); 103 IMPL_CLONE_TYPED_CHILD(P); 104 IMPL_CLONE_TYPED_CHILD(Q); 105 IMPL_CLONE_TYPED_CHILD(G); 106 IMPL_CLONE_TYPED_CHILD(Y); 107 IMPL_CLONE_TYPED_CHILD(J); 108 IMPL_CLONE_TYPED_CHILD(Seed); 109 IMPL_CLONE_TYPED_CHILD(PgenCounter); 110 } 111 112 IMPL_XMLOBJECT_CLONE(DSAKeyValue); 113 IMPL_TYPED_CHILD(P); 114 IMPL_TYPED_CHILD(Q); 115 IMPL_TYPED_CHILD(G); 116 IMPL_TYPED_CHILD(Y); 117 IMPL_TYPED_CHILD(J); 118 IMPL_TYPED_CHILD(Seed); 119 IMPL_TYPED_CHILD(PgenCounter); 120 121 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)122 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 123 PROC_TYPED_CHILD(P,XMLSIG_NS,false); 124 PROC_TYPED_CHILD(Q,XMLSIG_NS,false); 125 PROC_TYPED_CHILD(G,XMLSIG_NS,false); 126 PROC_TYPED_CHILD(Y,XMLSIG_NS,false); 127 PROC_TYPED_CHILD(J,XMLSIG_NS,false); 128 PROC_TYPED_CHILD(Seed,XMLSIG_NS,false); 129 PROC_TYPED_CHILD(PgenCounter,XMLSIG_NS,false); 130 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 131 } 132 }; 133 134 class XMLTOOL_DLLLOCAL RSAKeyValueImpl : public virtual RSAKeyValue, 135 public AbstractComplexElement, 136 public AbstractDOMCachingXMLObject, 137 public AbstractXMLObjectMarshaller, 138 public AbstractXMLObjectUnmarshaller 139 { init()140 void init() { 141 m_Modulus=nullptr; 142 m_Exponent=nullptr; 143 m_children.push_back(nullptr); 144 m_children.push_back(nullptr); 145 m_pos_Modulus=m_children.begin(); 146 m_pos_Exponent=m_pos_Modulus; 147 ++m_pos_Exponent; 148 } 149 150 public: ~RSAKeyValueImpl()151 virtual ~RSAKeyValueImpl() {} 152 RSAKeyValueImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)153 RSAKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 154 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 155 init(); 156 } 157 RSAKeyValueImpl(const RSAKeyValueImpl & src)158 RSAKeyValueImpl(const RSAKeyValueImpl& src) 159 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 160 init(); 161 IMPL_CLONE_TYPED_CHILD(Modulus); 162 IMPL_CLONE_TYPED_CHILD(Exponent); 163 } 164 165 IMPL_XMLOBJECT_CLONE(RSAKeyValue); 166 IMPL_TYPED_CHILD(Modulus); 167 IMPL_TYPED_CHILD(Exponent); 168 169 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)170 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 171 PROC_TYPED_CHILD(Modulus,XMLSIG_NS,false); 172 PROC_TYPED_CHILD(Exponent,XMLSIG_NS,false); 173 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 174 } 175 }; 176 177 class XMLTOOL_DLLLOCAL NamedCurveImpl : public virtual NamedCurve, 178 public AbstractComplexElement, 179 public AbstractDOMCachingXMLObject, 180 public AbstractXMLObjectMarshaller, 181 public AbstractXMLObjectUnmarshaller 182 { 183 public: ~NamedCurveImpl()184 virtual ~NamedCurveImpl() { 185 XMLString::release(&m_URI); 186 } 187 NamedCurveImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)188 NamedCurveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 189 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_URI(nullptr) { 190 } 191 NamedCurveImpl(const NamedCurveImpl & src)192 NamedCurveImpl(const NamedCurveImpl& src) 193 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_URI(nullptr) { 194 IMPL_CLONE_ATTRIB(URI); 195 } 196 197 IMPL_XMLOBJECT_CLONE(NamedCurve); 198 IMPL_STRING_ATTRIB(URI); 199 200 protected: marshallAttributes(DOMElement * domElement) const201 void marshallAttributes(DOMElement* domElement) const { 202 MARSHALL_STRING_ATTRIB(URI,URI,nullptr); 203 } 204 processAttribute(const DOMAttr * attribute)205 void processAttribute(const DOMAttr* attribute) { 206 PROC_STRING_ATTRIB(URI,URI,nullptr); 207 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 208 } 209 }; 210 211 class XMLTOOL_DLLLOCAL ECKeyValueImpl : public virtual ECKeyValue, 212 public AbstractComplexElement, 213 public AbstractDOMCachingXMLObject, 214 public AbstractXMLObjectMarshaller, 215 public AbstractXMLObjectUnmarshaller 216 { init()217 void init() { 218 m_Id=nullptr; 219 m_ECParameters=nullptr; 220 m_NamedCurve=nullptr; 221 m_PublicKey=nullptr; 222 m_children.push_back(nullptr); 223 m_children.push_back(nullptr); 224 m_children.push_back(nullptr); 225 m_pos_ECParameters=m_children.begin(); 226 m_pos_NamedCurve=m_pos_ECParameters; 227 ++m_pos_NamedCurve; 228 m_pos_PublicKey=m_pos_NamedCurve; 229 ++m_pos_PublicKey; 230 } 231 232 public: ~ECKeyValueImpl()233 virtual ~ECKeyValueImpl() { 234 XMLString::release(&m_Id); 235 } 236 ECKeyValueImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)237 ECKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 238 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 239 init(); 240 } 241 ECKeyValueImpl(const ECKeyValueImpl & src)242 ECKeyValueImpl(const ECKeyValueImpl& src) 243 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 244 init(); 245 IMPL_CLONE_ATTRIB(Id); 246 IMPL_CLONE_XMLOBJECT_CHILD(ECParameters); 247 IMPL_CLONE_TYPED_CHILD(NamedCurve); 248 IMPL_CLONE_TYPED_CHILD(PublicKey); 249 } 250 251 IMPL_XMLOBJECT_CLONE(ECKeyValue); 252 IMPL_ID_ATTRIB_EX(Id,ID,nullptr); 253 IMPL_XMLOBJECT_CHILD(ECParameters); 254 IMPL_TYPED_CHILD(NamedCurve); 255 IMPL_TYPED_CHILD(PublicKey); 256 257 protected: marshallAttributes(DOMElement * domElement) const258 void marshallAttributes(DOMElement* domElement) const { 259 MARSHALL_ID_ATTRIB(Id,ID,nullptr); 260 } 261 processChildElement(XMLObject * childXMLObject,const DOMElement * root)262 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 263 PROC_TYPED_CHILD(NamedCurve,XMLSIG11_NS,false); 264 PROC_TYPED_CHILD(PublicKey,XMLSIG11_NS,false); 265 266 // Not really "unknown", but currently unwrapped. 267 static const XMLCh _ECParameters[] = UNICODE_LITERAL_12(E,C,P,a,r,a,m,e,t,e,r,s); 268 if (XMLString::equals(root->getLocalName(), _ECParameters) && XMLString::equals(root->getNamespaceURI(), XMLSIG11_NS)) { 269 setECParameters(childXMLObject); 270 return; 271 } 272 273 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 274 } 275 processAttribute(const DOMAttr * attribute)276 void processAttribute(const DOMAttr* attribute) { 277 PROC_ID_ATTRIB(Id,ID,nullptr); 278 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 279 } 280 }; 281 282 class XMLTOOL_DLLLOCAL KeyValueImpl : public virtual KeyValue, 283 public AbstractComplexElement, 284 public AbstractDOMCachingXMLObject, 285 public AbstractXMLObjectMarshaller, 286 public AbstractXMLObjectUnmarshaller 287 { init()288 void init() { 289 m_DSAKeyValue=nullptr; 290 m_RSAKeyValue=nullptr; 291 m_ECKeyValue=nullptr; 292 m_UnknownXMLObject=nullptr; 293 m_children.push_back(nullptr); 294 m_children.push_back(nullptr); 295 m_children.push_back(nullptr); 296 m_children.push_back(nullptr); 297 m_pos_DSAKeyValue=m_children.begin(); 298 m_pos_RSAKeyValue=m_pos_DSAKeyValue; 299 ++m_pos_RSAKeyValue; 300 m_pos_ECKeyValue=m_pos_RSAKeyValue; 301 ++m_pos_ECKeyValue; 302 m_pos_UnknownXMLObject=m_pos_ECKeyValue; 303 ++m_pos_UnknownXMLObject; 304 } 305 306 public: ~KeyValueImpl()307 virtual ~KeyValueImpl() {} 308 KeyValueImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)309 KeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 310 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 311 init(); 312 } 313 KeyValueImpl(const KeyValueImpl & src)314 KeyValueImpl(const KeyValueImpl& src) 315 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 316 init(); 317 IMPL_CLONE_TYPED_CHILD(DSAKeyValue); 318 IMPL_CLONE_TYPED_CHILD(RSAKeyValue); 319 IMPL_CLONE_TYPED_CHILD(ECKeyValue); 320 IMPL_CLONE_XMLOBJECT_CHILD(UnknownXMLObject); 321 } 322 323 IMPL_XMLOBJECT_CLONE(KeyValue); 324 IMPL_TYPED_CHILD(DSAKeyValue); 325 IMPL_TYPED_CHILD(RSAKeyValue); 326 IMPL_TYPED_CHILD(ECKeyValue); 327 IMPL_XMLOBJECT_CHILD(UnknownXMLObject); 328 329 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)330 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 331 PROC_TYPED_CHILD(DSAKeyValue,XMLSIG_NS,false); 332 PROC_TYPED_CHILD(RSAKeyValue,XMLSIG_NS,false); 333 PROC_TYPED_CHILD(ECKeyValue,XMLSIG11_NS,false); 334 335 // Unknown child. 336 const XMLCh* nsURI=root->getNamespaceURI(); 337 if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) { 338 setUnknownXMLObject(childXMLObject); 339 return; 340 } 341 342 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 343 } 344 }; 345 346 class XMLTOOL_DLLLOCAL DEREncodedKeyValueImpl : public virtual DEREncodedKeyValue, 347 public AbstractSimpleElement, 348 public AbstractDOMCachingXMLObject, 349 public AbstractXMLObjectMarshaller, 350 public AbstractXMLObjectUnmarshaller 351 { 352 public: ~DEREncodedKeyValueImpl()353 virtual ~DEREncodedKeyValueImpl() { 354 XMLString::release(&m_Id); 355 } 356 DEREncodedKeyValueImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)357 DEREncodedKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 358 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(nullptr) { 359 } 360 DEREncodedKeyValueImpl(const DEREncodedKeyValueImpl & src)361 DEREncodedKeyValueImpl(const DEREncodedKeyValueImpl& src) 362 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_Id(nullptr) { 363 IMPL_CLONE_ATTRIB(Id); 364 } 365 366 IMPL_XMLOBJECT_CLONE(DEREncodedKeyValue); 367 IMPL_ID_ATTRIB_EX(Id,ID,nullptr); 368 369 protected: marshallAttributes(DOMElement * domElement) const370 void marshallAttributes(DOMElement* domElement) const { 371 MARSHALL_ID_ATTRIB(Id,ID,nullptr); 372 } 373 processAttribute(const DOMAttr * attribute)374 void processAttribute(const DOMAttr* attribute) { 375 PROC_ID_ATTRIB(Id,ID,nullptr); 376 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 377 } 378 }; 379 380 class XMLTOOL_DLLLOCAL TransformImpl : public virtual Transform, 381 public AbstractComplexElement, 382 public AbstractDOMCachingXMLObject, 383 public AbstractXMLObjectMarshaller, 384 public AbstractXMLObjectUnmarshaller 385 { 386 public: ~TransformImpl()387 virtual ~TransformImpl() { 388 XMLString::release(&m_Algorithm); 389 } 390 TransformImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)391 TransformImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 392 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Algorithm(nullptr) { 393 } 394 TransformImpl(const TransformImpl & src)395 TransformImpl(const TransformImpl& src) 396 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_Algorithm(nullptr) { 397 IMPL_CLONE_ATTRIB(Algorithm); 398 IMPL_CLONE_CHILDBAG_BEGIN; 399 IMPL_CLONE_TYPED_CHILD_IN_BAG(XPath); 400 IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject); 401 IMPL_CLONE_CHILDBAG_END; 402 } 403 404 IMPL_XMLOBJECT_CLONE(Transform); 405 IMPL_STRING_ATTRIB(Algorithm); 406 IMPL_TYPED_CHILDREN(XPath,m_children.end()); 407 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); 408 409 protected: marshallAttributes(DOMElement * domElement) const410 void marshallAttributes(DOMElement* domElement) const { 411 MARSHALL_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); 412 } 413 processChildElement(XMLObject * childXMLObject,const DOMElement * root)414 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 415 PROC_TYPED_CHILDREN(XPath,XMLSIG_NS,false); 416 417 // Unknown child. 418 const XMLCh* nsURI=root->getNamespaceURI(); 419 if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) { 420 getUnknownXMLObjects().push_back(childXMLObject); 421 return; 422 } 423 424 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 425 } 426 processAttribute(const DOMAttr * attribute)427 void processAttribute(const DOMAttr* attribute) { 428 PROC_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); 429 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 430 } 431 }; 432 433 class XMLTOOL_DLLLOCAL TransformsImpl : public virtual Transforms, 434 public AbstractComplexElement, 435 public AbstractDOMCachingXMLObject, 436 public AbstractXMLObjectMarshaller, 437 public AbstractXMLObjectUnmarshaller 438 { 439 public: ~TransformsImpl()440 virtual ~TransformsImpl() {} 441 TransformsImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)442 TransformsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 443 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 444 } 445 TransformsImpl(const TransformsImpl & src)446 TransformsImpl(const TransformsImpl& src) 447 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 448 IMPL_CLONE_TYPED_CHILDREN(Transform); 449 } 450 451 IMPL_XMLOBJECT_CLONE(Transforms); 452 IMPL_TYPED_CHILDREN(Transform,m_children.end()); 453 454 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)455 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 456 PROC_TYPED_CHILDREN(Transform,XMLSIG_NS,false); 457 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 458 } 459 }; 460 461 class XMLTOOL_DLLLOCAL RetrievalMethodImpl : public virtual RetrievalMethod, 462 public AbstractComplexElement, 463 public AbstractDOMCachingXMLObject, 464 public AbstractXMLObjectMarshaller, 465 public AbstractXMLObjectUnmarshaller 466 { init()467 void init() { 468 m_URI=m_Type=nullptr; 469 m_Transforms=nullptr; 470 m_children.push_back(nullptr); 471 m_pos_Transforms=m_children.begin(); 472 } 473 474 public: ~RetrievalMethodImpl()475 virtual ~RetrievalMethodImpl() { 476 XMLString::release(&m_URI); 477 XMLString::release(&m_Type); 478 } 479 RetrievalMethodImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)480 RetrievalMethodImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 481 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 482 init(); 483 } 484 RetrievalMethodImpl(const RetrievalMethodImpl & src)485 RetrievalMethodImpl(const RetrievalMethodImpl& src) 486 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 487 init(); 488 IMPL_CLONE_ATTRIB(URI); 489 IMPL_CLONE_ATTRIB(Type); 490 IMPL_CLONE_TYPED_CHILD(Transforms); 491 } 492 493 IMPL_XMLOBJECT_CLONE(RetrievalMethod); 494 IMPL_STRING_ATTRIB(URI); 495 IMPL_STRING_ATTRIB(Type); 496 IMPL_TYPED_CHILD(Transforms); 497 498 protected: marshallAttributes(DOMElement * domElement) const499 void marshallAttributes(DOMElement* domElement) const { 500 MARSHALL_STRING_ATTRIB(URI,URI,nullptr); 501 MARSHALL_STRING_ATTRIB(Type,TYPE,nullptr); 502 } 503 processChildElement(XMLObject * childXMLObject,const DOMElement * root)504 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 505 PROC_TYPED_CHILD(Transforms,XMLSIG_NS,false); 506 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 507 } 508 processAttribute(const DOMAttr * attribute)509 void processAttribute(const DOMAttr* attribute) { 510 PROC_STRING_ATTRIB(URI,URI,nullptr); 511 PROC_STRING_ATTRIB(Type,TYPE,nullptr); 512 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 513 } 514 }; 515 516 class XMLTOOL_DLLLOCAL X509IssuerSerialImpl : public virtual X509IssuerSerial, 517 public AbstractComplexElement, 518 public AbstractDOMCachingXMLObject, 519 public AbstractXMLObjectMarshaller, 520 public AbstractXMLObjectUnmarshaller 521 { init()522 void init() { 523 m_X509IssuerName=nullptr; 524 m_X509SerialNumber=nullptr; 525 m_children.push_back(nullptr); 526 m_children.push_back(nullptr); 527 m_pos_X509IssuerName=m_children.begin(); 528 m_pos_X509SerialNumber=m_pos_X509IssuerName; 529 ++m_pos_X509SerialNumber; 530 } 531 532 public: ~X509IssuerSerialImpl()533 virtual ~X509IssuerSerialImpl() {} 534 X509IssuerSerialImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)535 X509IssuerSerialImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 536 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 537 init(); 538 } 539 X509IssuerSerialImpl(const X509IssuerSerialImpl & src)540 X509IssuerSerialImpl(const X509IssuerSerialImpl& src) 541 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 542 init(); 543 IMPL_CLONE_TYPED_CHILD(X509IssuerName); 544 IMPL_CLONE_TYPED_CHILD(X509SerialNumber); 545 } 546 547 IMPL_XMLOBJECT_CLONE(X509IssuerSerial); 548 IMPL_TYPED_CHILD(X509IssuerName); 549 IMPL_TYPED_CHILD(X509SerialNumber); 550 551 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)552 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 553 PROC_TYPED_CHILD(X509IssuerName,XMLSIG_NS,false); 554 PROC_TYPED_CHILD(X509SerialNumber,XMLSIG_NS,false); 555 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 556 } 557 }; 558 559 class XMLTOOL_DLLLOCAL X509DigestImpl : public virtual X509Digest, 560 public AbstractSimpleElement, 561 public AbstractDOMCachingXMLObject, 562 public AbstractXMLObjectMarshaller, 563 public AbstractXMLObjectUnmarshaller 564 { 565 public: ~X509DigestImpl()566 virtual ~X509DigestImpl() { 567 XMLString::release(&m_Algorithm); 568 } 569 X509DigestImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)570 X509DigestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 571 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Algorithm(nullptr) { 572 } 573 X509DigestImpl(const X509DigestImpl & src)574 X509DigestImpl(const X509DigestImpl& src) 575 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_Algorithm(nullptr) { 576 IMPL_CLONE_ATTRIB(Algorithm); 577 } 578 579 IMPL_XMLOBJECT_CLONE(X509Digest); 580 IMPL_STRING_ATTRIB(Algorithm); 581 582 protected: marshallAttributes(DOMElement * domElement) const583 void marshallAttributes(DOMElement* domElement) const { 584 MARSHALL_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); 585 } 586 processAttribute(const DOMAttr * attribute)587 void processAttribute(const DOMAttr* attribute) { 588 PROC_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); 589 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 590 } 591 }; 592 593 594 class XMLTOOL_DLLLOCAL X509DataImpl : public virtual X509Data, 595 public AbstractComplexElement, 596 public AbstractDOMCachingXMLObject, 597 public AbstractXMLObjectMarshaller, 598 public AbstractXMLObjectUnmarshaller 599 { 600 public: ~X509DataImpl()601 virtual ~X509DataImpl() {} 602 X509DataImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)603 X509DataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 604 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 605 } 606 X509DataImpl(const X509DataImpl & src)607 X509DataImpl(const X509DataImpl& src) 608 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 609 IMPL_CLONE_CHILDBAG_BEGIN; 610 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509Certificate); 611 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509CRL); 612 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509SubjectName); 613 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509IssuerSerial); 614 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509SKI); 615 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509Digest); 616 IMPL_CLONE_TYPED_CHILD_IN_BAG(OCSPResponse); 617 IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject); 618 IMPL_CLONE_CHILDBAG_END; 619 } 620 621 IMPL_XMLOBJECT_CLONE(X509Data); 622 IMPL_TYPED_CHILDREN(X509IssuerSerial,m_children.end()); 623 IMPL_TYPED_CHILDREN(X509SKI,m_children.end()); 624 IMPL_TYPED_CHILDREN(X509SubjectName,m_children.end()); 625 IMPL_TYPED_CHILDREN(X509Certificate,m_children.end()); 626 IMPL_TYPED_CHILDREN(X509CRL,m_children.end()); 627 IMPL_TYPED_CHILDREN(X509Digest,m_children.end()); 628 IMPL_TYPED_CHILDREN(OCSPResponse,m_children.end()); 629 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); 630 631 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)632 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 633 PROC_TYPED_CHILDREN(X509IssuerSerial,XMLSIG_NS,false); 634 PROC_TYPED_CHILDREN(X509SKI,XMLSIG_NS,false); 635 PROC_TYPED_CHILDREN(X509SubjectName,XMLSIG_NS,false); 636 PROC_TYPED_CHILDREN(X509Certificate,XMLSIG_NS,false); 637 PROC_TYPED_CHILDREN(X509CRL,XMLSIG_NS,false); 638 PROC_TYPED_CHILDREN(X509Digest,XMLSIG11_NS,false); 639 PROC_TYPED_CHILDREN(OCSPResponse,XMLSIG11_NS,false); 640 641 // Unknown child. 642 const XMLCh* nsURI=root->getNamespaceURI(); 643 if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) { 644 getUnknownXMLObjects().push_back(childXMLObject); 645 return; 646 } 647 648 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 649 } 650 }; 651 652 class XMLTOOL_DLLLOCAL SPKIDataImpl : public virtual SPKIData, 653 public AbstractComplexElement, 654 public AbstractDOMCachingXMLObject, 655 public AbstractXMLObjectMarshaller, 656 public AbstractXMLObjectUnmarshaller 657 { 658 vector< pair<SPKISexp*,XMLObject*> > m_SPKISexps; 659 660 public: ~SPKIDataImpl()661 virtual ~SPKIDataImpl() {} 662 SPKIDataImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)663 SPKIDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 664 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 665 } 666 SPKIDataImpl(const SPKIDataImpl & src)667 SPKIDataImpl(const SPKIDataImpl& src) 668 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 669 for (vector< pair<SPKISexp*,XMLObject*> >::const_iterator i = src.m_SPKISexps.begin(); i != src.m_SPKISexps.end(); ++i) { 670 if (i->first) { 671 getSPKISexps().push_back(make_pair(i->first->cloneSPKISexp(),(i->second ? i->second->clone() : (XMLObject*)nullptr))); 672 } 673 } 674 } 675 676 IMPL_XMLOBJECT_CLONE(SPKIData); 677 678 public: VectorOfPairs(SPKISexp,XMLObject)679 VectorOfPairs(SPKISexp,XMLObject) getSPKISexps() { 680 return VectorOfPairs(SPKISexp,XMLObject)(this, m_SPKISexps, &m_children, m_children.end()); 681 } 682 getSPKISexps() const683 const vector< pair<SPKISexp*,XMLObject*> >& getSPKISexps() const { 684 return m_SPKISexps; 685 } 686 687 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)688 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 689 if (XMLHelper::isNodeNamed(root,XMLSIG_NS,SPKISexp::LOCAL_NAME)) { 690 SPKISexp* typesafe=dynamic_cast<SPKISexp*>(childXMLObject); 691 if (typesafe) { 692 getSPKISexps().push_back(make_pair(typesafe,(XMLObject*)nullptr)); 693 return; 694 } 695 } 696 697 // Unknown child (has to be paired with the last SPKISexp processed. 698 const XMLCh* nsURI=root->getNamespaceURI(); 699 if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) { 700 // Update second half of pair in vector, and in master list. 701 if (!m_SPKISexps.empty() && m_SPKISexps.back().second==nullptr) { 702 m_SPKISexps.back().second=childXMLObject; 703 m_children.back()=childXMLObject; 704 return; 705 } 706 else 707 throw UnmarshallingException("Extension element must follow ds:SPKISexp element."); 708 } 709 710 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 711 } 712 }; 713 714 class XMLTOOL_DLLLOCAL PGPDataImpl : public virtual PGPData, 715 public AbstractComplexElement, 716 public AbstractDOMCachingXMLObject, 717 public AbstractXMLObjectMarshaller, 718 public AbstractXMLObjectUnmarshaller 719 { init()720 void init() { 721 m_PGPKeyID=nullptr; 722 m_PGPKeyPacket=nullptr; 723 m_children.push_back(nullptr); 724 m_children.push_back(nullptr); 725 m_pos_PGPKeyID=m_children.begin(); 726 m_pos_PGPKeyPacket=m_pos_PGPKeyID; 727 ++m_pos_PGPKeyPacket; 728 } 729 730 public: ~PGPDataImpl()731 virtual ~PGPDataImpl() {} 732 PGPDataImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)733 PGPDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 734 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 735 init(); 736 } 737 PGPDataImpl(const PGPDataImpl & src)738 PGPDataImpl(const PGPDataImpl& src) 739 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 740 init(); 741 IMPL_CLONE_TYPED_CHILD(PGPKeyID); 742 IMPL_CLONE_TYPED_CHILD(PGPKeyPacket); 743 IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); 744 } 745 746 IMPL_XMLOBJECT_CLONE(PGPData); 747 IMPL_TYPED_CHILD(PGPKeyID); 748 IMPL_TYPED_CHILD(PGPKeyPacket); 749 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); 750 751 protected: processChildElement(XMLObject * childXMLObject,const DOMElement * root)752 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 753 PROC_TYPED_CHILD(PGPKeyID,XMLSIG_NS,false); 754 PROC_TYPED_CHILD(PGPKeyPacket,XMLSIG_NS,false); 755 756 // Unknown child. 757 const XMLCh* nsURI=root->getNamespaceURI(); 758 if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) { 759 getUnknownXMLObjects().push_back(childXMLObject); 760 return; 761 } 762 763 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 764 } 765 }; 766 767 class XMLTOOL_DLLLOCAL KeyInfoReferenceImpl : public virtual KeyInfoReference, 768 public AbstractComplexElement, 769 public AbstractDOMCachingXMLObject, 770 public AbstractXMLObjectMarshaller, 771 public AbstractXMLObjectUnmarshaller 772 { init()773 void init() { 774 m_Id=m_URI=nullptr; 775 } 776 777 public: ~KeyInfoReferenceImpl()778 virtual ~KeyInfoReferenceImpl() { 779 XMLString::release(&m_Id); 780 XMLString::release(&m_URI); 781 } 782 KeyInfoReferenceImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)783 KeyInfoReferenceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 784 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { 785 init(); 786 } 787 KeyInfoReferenceImpl(const KeyInfoReferenceImpl & src)788 KeyInfoReferenceImpl(const KeyInfoReferenceImpl& src) 789 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { 790 init(); 791 IMPL_CLONE_ATTRIB(Id); 792 IMPL_CLONE_ATTRIB(URI); 793 } 794 795 IMPL_XMLOBJECT_CLONE(KeyInfoReference); 796 IMPL_ID_ATTRIB_EX(Id,ID,nullptr); 797 IMPL_STRING_ATTRIB(URI); 798 799 protected: marshallAttributes(DOMElement * domElement) const800 void marshallAttributes(DOMElement* domElement) const { 801 MARSHALL_ID_ATTRIB(Id,ID,nullptr); 802 MARSHALL_STRING_ATTRIB(URI,URI,nullptr); 803 } 804 processAttribute(const DOMAttr * attribute)805 void processAttribute(const DOMAttr* attribute) { 806 PROC_ID_ATTRIB(Id,ID,nullptr); 807 PROC_STRING_ATTRIB(URI,URI,nullptr); 808 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 809 } 810 }; 811 812 class XMLTOOL_DLLLOCAL KeyInfoImpl : public virtual KeyInfo, 813 public AbstractComplexElement, 814 public AbstractDOMCachingXMLObject, 815 public AbstractXMLObjectMarshaller, 816 public AbstractXMLObjectUnmarshaller 817 { 818 public: ~KeyInfoImpl()819 virtual ~KeyInfoImpl() { 820 XMLString::release(&m_Id); 821 } 822 KeyInfoImpl(const XMLCh * nsURI,const XMLCh * localName,const XMLCh * prefix,const xmltooling::QName * schemaType)823 KeyInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) 824 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(nullptr) { 825 } 826 KeyInfoImpl(const KeyInfoImpl & src)827 KeyInfoImpl(const KeyInfoImpl& src) 828 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_Id(nullptr) { 829 IMPL_CLONE_ATTRIB(Id); 830 IMPL_CLONE_CHILDBAG_BEGIN; 831 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509Data); 832 IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyName); 833 IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyValue); 834 IMPL_CLONE_TYPED_CHILD_IN_BAG(DEREncodedKeyValue); 835 IMPL_CLONE_TYPED_CHILD_IN_BAG(RetrievalMethod); 836 IMPL_CLONE_TYPED_CHILD_IN_BAG(MgmtData); 837 IMPL_CLONE_TYPED_CHILD_IN_BAG(SPKIData); 838 IMPL_CLONE_TYPED_CHILD_IN_BAG(PGPData); 839 IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyInfoReference); 840 IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject); 841 IMPL_CLONE_CHILDBAG_END; 842 } 843 844 IMPL_XMLOBJECT_CLONE(KeyInfo); 845 IMPL_ID_ATTRIB_EX(Id,ID,nullptr); 846 IMPL_TYPED_CHILDREN(KeyName,m_children.end()); 847 IMPL_TYPED_CHILDREN(KeyValue,m_children.end()); 848 IMPL_TYPED_CHILDREN(DEREncodedKeyValue,m_children.end()); 849 IMPL_TYPED_CHILDREN(RetrievalMethod,m_children.end()); 850 IMPL_TYPED_CHILDREN(X509Data,m_children.end()); 851 IMPL_TYPED_CHILDREN(MgmtData,m_children.end()); 852 IMPL_TYPED_CHILDREN(SPKIData,m_children.end()); 853 IMPL_TYPED_CHILDREN(PGPData,m_children.end()); 854 IMPL_TYPED_CHILDREN(KeyInfoReference,m_children.end()); 855 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); 856 857 protected: marshallAttributes(DOMElement * domElement) const858 void marshallAttributes(DOMElement* domElement) const { 859 MARSHALL_ID_ATTRIB(Id,ID,nullptr); 860 } 861 processChildElement(XMLObject * childXMLObject,const DOMElement * root)862 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { 863 PROC_TYPED_CHILDREN(X509Data,XMLSIG_NS,false); 864 PROC_TYPED_CHILDREN(KeyName,XMLSIG_NS,false); 865 PROC_TYPED_CHILDREN(KeyValue,XMLSIG_NS,false); 866 PROC_TYPED_CHILDREN(DEREncodedKeyValue,XMLSIG11_NS,false); 867 PROC_TYPED_CHILDREN(RetrievalMethod,XMLSIG_NS,false); 868 PROC_TYPED_CHILDREN(MgmtData,XMLSIG_NS,false); 869 PROC_TYPED_CHILDREN(SPKIData,XMLSIG_NS,false); 870 PROC_TYPED_CHILDREN(PGPData,XMLSIG_NS,false); 871 PROC_TYPED_CHILDREN(KeyInfoReference,XMLSIG11_NS,false); 872 873 // Unknown child. 874 const XMLCh* nsURI=root->getNamespaceURI(); 875 if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) { 876 getUnknownXMLObjects().push_back(childXMLObject); 877 return; 878 } 879 880 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); 881 } 882 processAttribute(const DOMAttr * attribute)883 void processAttribute(const DOMAttr* attribute) { 884 PROC_ID_ATTRIB(Id,ID,nullptr); 885 AbstractXMLObjectUnmarshaller::processAttribute(attribute); 886 } 887 }; 888 889 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,KeyName); 890 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,MgmtData); 891 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Modulus); 892 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Exponent); 893 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Seed); 894 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PgenCounter); 895 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,P); 896 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Q); 897 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,G); 898 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Y); 899 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,J); 900 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,XPath); 901 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509IssuerName); 902 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509SerialNumber); 903 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509SKI); 904 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509SubjectName); 905 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509Certificate); 906 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509CRL); 907 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,SPKISexp); 908 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PGPKeyID); 909 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PGPKeyPacket); 910 911 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,OCSPResponse); 912 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PublicKey); 913 }; 914 915 #if defined (_MSC_VER) 916 #pragma warning( pop ) 917 #endif 918 919 // Builder Implementations 920 921 IMPL_XMLOBJECTBUILDER(X509IssuerSerial); 922 IMPL_XMLOBJECTBUILDER(X509IssuerName); 923 IMPL_XMLOBJECTBUILDER(X509SerialNumber); 924 IMPL_XMLOBJECTBUILDER(X509SKI); 925 IMPL_XMLOBJECTBUILDER(X509SubjectName); 926 IMPL_XMLOBJECTBUILDER(X509Certificate); 927 IMPL_XMLOBJECTBUILDER(X509CRL); 928 IMPL_XMLOBJECTBUILDER(X509Data); 929 IMPL_XMLOBJECTBUILDER(XPath); 930 IMPL_XMLOBJECTBUILDER(Transform); 931 IMPL_XMLOBJECTBUILDER(Transforms); 932 IMPL_XMLOBJECTBUILDER(RetrievalMethod); 933 IMPL_XMLOBJECTBUILDER(KeyName); 934 IMPL_XMLOBJECTBUILDER(MgmtData); 935 IMPL_XMLOBJECTBUILDER(Modulus); 936 IMPL_XMLOBJECTBUILDER(Exponent); 937 IMPL_XMLOBJECTBUILDER(Seed); 938 IMPL_XMLOBJECTBUILDER(PgenCounter); 939 IMPL_XMLOBJECTBUILDER(P); 940 IMPL_XMLOBJECTBUILDER(Q); 941 IMPL_XMLOBJECTBUILDER(G); 942 IMPL_XMLOBJECTBUILDER(Y); 943 IMPL_XMLOBJECTBUILDER(J); 944 IMPL_XMLOBJECTBUILDER(DSAKeyValue); 945 IMPL_XMLOBJECTBUILDER(RSAKeyValue); 946 IMPL_XMLOBJECTBUILDER(KeyValue); 947 IMPL_XMLOBJECTBUILDER(KeyInfo); 948 IMPL_XMLOBJECTBUILDER(SPKISexp); 949 IMPL_XMLOBJECTBUILDER(SPKIData); 950 IMPL_XMLOBJECTBUILDER(PGPKeyID); 951 IMPL_XMLOBJECTBUILDER(PGPKeyPacket); 952 IMPL_XMLOBJECTBUILDER(PGPData); 953 954 IMPL_XMLOBJECTBUILDER(DEREncodedKeyValue); 955 IMPL_XMLOBJECTBUILDER(ECKeyValue); 956 IMPL_XMLOBJECTBUILDER(KeyInfoReference); 957 IMPL_XMLOBJECTBUILDER(NamedCurve); 958 IMPL_XMLOBJECTBUILDER(OCSPResponse); 959 IMPL_XMLOBJECTBUILDER(PublicKey); 960 IMPL_XMLOBJECTBUILDER(X509Digest); 961 962 // Unicode literals 963 964 const XMLCh KeyInfo::LOCAL_NAME[] = UNICODE_LITERAL_7(K,e,y,I,n,f,o); 965 const XMLCh KeyInfo::TYPE_NAME[] = UNICODE_LITERAL_11(K,e,y,I,n,f,o,T,y,p,e); 966 const XMLCh KeyInfo::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,d); 967 const XMLCh KeyValue::LOCAL_NAME[] = UNICODE_LITERAL_8(K,e,y,V,a,l,u,e); 968 const XMLCh KeyValue::TYPE_NAME[] = UNICODE_LITERAL_12(K,e,y,V,a,l,u,e,T,y,p,e); 969 const XMLCh DSAKeyValue::LOCAL_NAME[] = UNICODE_LITERAL_11(D,S,A,K,e,y,V,a,l,u,e); 970 const XMLCh DSAKeyValue::TYPE_NAME[] = UNICODE_LITERAL_15(D,S,A,K,e,y,V,a,l,u,e,T,y,p,e); 971 const XMLCh RSAKeyValue::LOCAL_NAME[] = UNICODE_LITERAL_11(R,S,A,K,e,y,V,a,l,u,e); 972 const XMLCh RSAKeyValue::TYPE_NAME[] = UNICODE_LITERAL_15(R,S,A,K,e,y,V,a,l,u,e,T,y,p,e); 973 const XMLCh MgmtData::LOCAL_NAME[] = UNICODE_LITERAL_8(M,g,m,t,D,a,t,a); 974 const XMLCh KeyName::LOCAL_NAME[] = UNICODE_LITERAL_7(K,e,y,N,a,m,e); 975 const XMLCh Modulus::LOCAL_NAME[] = UNICODE_LITERAL_7(M,o,d,u,l,u,s); 976 const XMLCh Exponent::LOCAL_NAME[] = UNICODE_LITERAL_8(E,x,p,o,n,e,n,t); 977 const XMLCh Seed::LOCAL_NAME[] = UNICODE_LITERAL_4(S,e,e,d); 978 const XMLCh PgenCounter::LOCAL_NAME[] = UNICODE_LITERAL_11(P,g,e,n,C,o,u,n,t,e,r); 979 const XMLCh P::LOCAL_NAME[] = UNICODE_LITERAL_1(P); 980 const XMLCh Q::LOCAL_NAME[] = UNICODE_LITERAL_1(Q); 981 const XMLCh G::LOCAL_NAME[] = UNICODE_LITERAL_1(G); 982 const XMLCh Y::LOCAL_NAME[] = UNICODE_LITERAL_1(Y); 983 const XMLCh J::LOCAL_NAME[] = UNICODE_LITERAL_1(J); 984 const XMLCh XPath::LOCAL_NAME[] = UNICODE_LITERAL_5(X,P,a,t,h); 985 const XMLCh Transform::LOCAL_NAME[] = UNICODE_LITERAL_9(T,r,a,n,s,f,o,r,m); 986 const XMLCh Transform::TYPE_NAME[] = UNICODE_LITERAL_13(T,r,a,n,s,f,o,r,m,T,y,p,e); 987 const XMLCh Transform::ALGORITHM_ATTRIB_NAME[] = UNICODE_LITERAL_9(A,l,g,o,r,i,t,h,m); 988 const XMLCh Transforms::LOCAL_NAME[] = UNICODE_LITERAL_10(T,r,a,n,s,f,o,r,m,s); 989 const XMLCh Transforms::TYPE_NAME[] = UNICODE_LITERAL_14(T,r,a,n,s,f,o,r,m,s,T,y,p,e); 990 const XMLCh RetrievalMethod::LOCAL_NAME[] = UNICODE_LITERAL_15(R,e,t,r,i,e,v,a,l,M,e,t,h,o,d); 991 const XMLCh RetrievalMethod::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,t,r,i,e,v,a,l,M,e,t,h,o,d,T,y,p,e); 992 const XMLCh RetrievalMethod::URI_ATTRIB_NAME[] = UNICODE_LITERAL_3(U,R,I); 993 const XMLCh RetrievalMethod::TYPE_ATTRIB_NAME[] = UNICODE_LITERAL_4(T,y,p,e); 994 const XMLCh SPKISexp::LOCAL_NAME[] = UNICODE_LITERAL_8(S,P,K,I,S,e,x,p); 995 const XMLCh SPKIData::LOCAL_NAME[] = UNICODE_LITERAL_8(S,P,K,I,D,a,t,a); 996 const XMLCh SPKIData::TYPE_NAME[] = UNICODE_LITERAL_12(S,P,K,I,D,a,t,a,T,y,p,e); 997 const XMLCh PGPKeyID::LOCAL_NAME[] = UNICODE_LITERAL_8(P,G,P,K,e,y,I,D); 998 const XMLCh PGPKeyPacket::LOCAL_NAME[] = UNICODE_LITERAL_12(P,G,P,K,e,y,P,a,c,k,e,t); 999 const XMLCh PGPData::LOCAL_NAME[] = UNICODE_LITERAL_7(P,G,P,D,a,t,a); 1000 const XMLCh PGPData::TYPE_NAME[] = UNICODE_LITERAL_11(P,G,P,D,a,t,a,T,y,p,e); 1001 1002 const XMLCh DEREncodedKeyValue::LOCAL_NAME[] = UNICODE_LITERAL_18(D,E,R,E,n,c,o,d,e,d,K,e,y,V,a,l,u,e); 1003 const XMLCh DEREncodedKeyValue::TYPE_NAME[] = UNICODE_LITERAL_22(D,E,R,E,n,c,o,d,e,d,K,e,y,V,a,l,u,e,T,y,p,e); 1004 const XMLCh DEREncodedKeyValue::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,d); 1005 const XMLCh ECKeyValue::LOCAL_NAME[] = UNICODE_LITERAL_10(E,C,K,e,y,V,a,l,u,e); 1006 const XMLCh ECKeyValue::TYPE_NAME[] = UNICODE_LITERAL_14(E,C,K,e,y,V,a,l,u,e,T,y,p,e); 1007 const XMLCh ECKeyValue::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,d); 1008 const XMLCh KeyInfoReference::LOCAL_NAME[] = UNICODE_LITERAL_16(K,e,y,I,n,f,o,R,e,f,e,r,e,n,c,e); 1009 const XMLCh KeyInfoReference::TYPE_NAME[] = UNICODE_LITERAL_20(K,e,y,I,n,f,o,R,e,f,e,r,e,n,c,e,T,y,p,e); 1010 const XMLCh KeyInfoReference::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,d); 1011 const XMLCh KeyInfoReference::URI_ATTRIB_NAME[] = UNICODE_LITERAL_3(U,R,I); 1012 const XMLCh NamedCurve::LOCAL_NAME[] = UNICODE_LITERAL_10(N,a,m,e,d,C,u,r,v,e); 1013 const XMLCh NamedCurve::TYPE_NAME[] = UNICODE_LITERAL_14(N,a,m,e,d,C,u,r,v,e,T,y,p,e); 1014 const XMLCh NamedCurve::URI_ATTRIB_NAME[] = UNICODE_LITERAL_3(U,R,I); 1015 const XMLCh OCSPResponse::LOCAL_NAME[] = UNICODE_LITERAL_12(O,C,S,P,R,e,s,p,o,n,s,e); 1016 const XMLCh PublicKey::LOCAL_NAME[] = UNICODE_LITERAL_9(P,u,b,l,i,c,K,e,y); 1017 const XMLCh X509Digest::ALGORITHM_ATTRIB_NAME[] = UNICODE_LITERAL_9(A,l,g,o,r,i,t,h,m); 1018 1019 #define XCH(ch) chLatin_##ch 1020 #define XNUM(d) chDigit_##d 1021 1022 const XMLCh X509Data::LOCAL_NAME[] = { 1023 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(a), XCH(t), XCH(a), chNull 1024 }; 1025 const XMLCh X509Data::TYPE_NAME[] = { 1026 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(a), XCH(t), XCH(a), XCH(T), XCH(y), XCH(p), XCH(e), chNull 1027 }; 1028 const XMLCh X509IssuerSerial::LOCAL_NAME[] = { 1029 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(I), XCH(s), XCH(s), XCH(u), XCH(e), XCH(r), 1030 XCH(S), XCH(e), XCH(r), XCH(i), XCH(a), XCH(l), chNull 1031 }; 1032 const XMLCh X509IssuerSerial::TYPE_NAME[] = { 1033 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(I), XCH(s), XCH(s), XCH(u), XCH(e), XCH(r), 1034 XCH(S), XCH(e), XCH(r), XCH(i), XCH(a), XCH(l), XCH(T), XCH(y), XCH(p), XCH(e), chNull 1035 }; 1036 const XMLCh X509IssuerName::LOCAL_NAME[] = { 1037 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(I), XCH(s), XCH(s), XCH(u), XCH(e), XCH(r), 1038 XCH(N), XCH(a), XCH(m), XCH(e), chNull 1039 }; 1040 const XMLCh X509SerialNumber::LOCAL_NAME[] = { 1041 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(S), XCH(e), XCH(r), XCH(i), XCH(a), XCH(l), 1042 XCH(N), XCH(u), XCH(m), XCH(b), XCH(e), XCH(r), chNull 1043 }; 1044 const XMLCh X509SKI::LOCAL_NAME[] = { XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(S), XCH(K), XCH(I), chNull }; 1045 const XMLCh X509SubjectName::LOCAL_NAME[] = { 1046 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(S), XCH(u), XCH(b), XCH(j), XCH(e), XCH(c), XCH(t), 1047 XCH(N), XCH(a), XCH(m), XCH(e), chNull 1048 }; 1049 const XMLCh X509Certificate::LOCAL_NAME[] = { 1050 XCH(X), XNUM(5), XNUM(0), XNUM(9), 1051 XCH(C), XCH(e), XCH(r), XCH(t), XCH(i), XCH(f), XCH(i), XCH(c), XCH(a), XCH(t), XCH(e), chNull 1052 }; 1053 const XMLCh X509CRL::LOCAL_NAME[] = { XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(C), XCH(R), XCH(L), chNull }; 1054 const XMLCh X509Digest::LOCAL_NAME[] = { 1055 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(i), XCH(g), XCH(e), XCH(s), XCH(t), chNull 1056 }; 1057 const XMLCh X509Digest::TYPE_NAME[] = { 1058 XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(i), XCH(g), XCH(e), XCH(s), XCH(t), XCH(T), XCH(y), XCH(p), XCH(e), chNull 1059 }; 1060 1061 const XMLCh RetrievalMethod::TYPE_DSAKEYVALUE[] = { 1062 chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash, 1063 chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash, 1064 chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash, chDigit_0, chDigit_9, chForwardSlash, 1065 chLatin_x, chLatin_m, chLatin_l, chLatin_d, chLatin_s, chLatin_i, chLatin_g, chPound, 1066 chLatin_D, chLatin_S, chLatin_A, chLatin_K, chLatin_e, chLatin_y, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull 1067 }; 1068 1069 const XMLCh RetrievalMethod::TYPE_RSAKEYVALUE[] = { 1070 chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash, 1071 chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash, 1072 chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash, chDigit_0, chDigit_9, chForwardSlash, 1073 chLatin_x, chLatin_m, chLatin_l, chLatin_d, chLatin_s, chLatin_i, chLatin_g, chPound, 1074 chLatin_R, chLatin_S, chLatin_A, chLatin_K, chLatin_e, chLatin_y, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull 1075 }; 1076 1077 const XMLCh RetrievalMethod::TYPE_X509DATA[] = { 1078 chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash, 1079 chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash, 1080 chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash, chDigit_0, chDigit_9, chForwardSlash, 1081 chLatin_x, chLatin_m, chLatin_l, chLatin_d, chLatin_s, chLatin_i, chLatin_g, chPound, 1082 chLatin_X, chDigit_5, chDigit_0, chDigit_9, chLatin_D, chLatin_a, chLatin_t, chLatin_a, chNull 1083 }; 1084