You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by sc...@apache.org on 2016/12/16 21:18:40 UTC
svn commit: r1774662 [3/3] - in /santuario/xml-security-cpp/trunk/xsec:
enc/OpenSSL/ tools/checksig/
Modified: santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.cpp
URL: http://svn.apache.org/viewvc/santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.cpp?rev=1774662&r1=1774661&r2=1774662&view=diff
==============================================================================
--- santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.cpp (original)
+++ santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.cpp Fri Dec 16 21:18:39 2016
@@ -21,7 +21,7 @@
* XSEC
*
* InteropResolver := Class to resolve key elements into certificates for
- * merlin-18 interop test
+ * merlin-18 interop test
*
* $Id$
*
@@ -51,16 +51,16 @@ XERCES_CPP_NAMESPACE_USE
InteropResolver::InteropResolver(const XMLCh * baseURI) {
- if (baseURI != NULL)
- mp_baseURI = XMLString::replicate(baseURI);
- else
- mp_baseURI = NULL;
+ if (baseURI != NULL)
+ mp_baseURI = XMLString::replicate(baseURI);
+ else
+ mp_baseURI = NULL;
- m_searchStarted = false;
- m_searchFinished = false;
+ m_searchStarted = false;
+ m_searchFinished = false;
#if !defined(_WIN32)
- m_fcount = 0;
+ m_fcount = 0;
#endif
}
@@ -68,8 +68,8 @@ InteropResolver::InteropResolver(const X
InteropResolver::~InteropResolver() {
- if (mp_baseURI != NULL)
- XSEC_RELEASE_XMLCH(mp_baseURI);
+ if (mp_baseURI != NULL)
+ XSEC_RELEASE_XMLCH(mp_baseURI);
}
@@ -77,12 +77,12 @@ InteropResolver::~InteropResolver() {
void reverseSlash(safeBuffer &path) {
- for (int i = 0; i < (int) strlen(path.rawCharBuffer()); ++i) {
+ for (int i = 0; i < (int) strlen(path.rawCharBuffer()); ++i) {
- if (path[i] == '/')
- path[i] = '\\';
+ if (path[i] == '/')
+ path[i] = '\\';
- }
+ }
}
@@ -92,560 +92,560 @@ void reverseSlash(safeBuffer &path) {
X509 * InteropResolver::nextFile2Cert(void) {
- if (m_searchFinished)
- return NULL;
+ if (m_searchFinished)
+ return NULL;
- int res;
+ int res;
- if (!m_searchStarted) {
+ if (!m_searchStarted) {
- char * base = XMLString::transcode(mp_baseURI);
- safeBuffer path = base;
- XSEC_RELEASE_XMLCH(base);
+ char * base = XMLString::transcode(mp_baseURI);
+ safeBuffer path = base;
+ XSEC_RELEASE_XMLCH(base);
- path.sbStrcatIn("/certs/*.crt");
+ path.sbStrcatIn("/certs/*.crt");
#if defined(_WIN32)
- // Reverse the "backslash" characters
+ // Reverse the "backslash" characters
- reverseSlash(path);
+ reverseSlash(path);
- m_handle = (long) _findfirst(path.rawCharBuffer(), &m_finder);
- res = m_handle;
+ m_handle = (long) _findfirst(path.rawCharBuffer(), &m_finder);
+ res = m_handle;
#else
- if (glob(path.rawCharBuffer(), 0, NULL, &m_globbuf) != 0)
- res = -1;
- else
- res = 0;
+ if (glob(path.rawCharBuffer(), 0, NULL, &m_globbuf) != 0)
+ res = -1;
+ else
+ res = 0;
#endif
- m_searchStarted = true;
+ m_searchStarted = true;
- }
- else {
+ }
+ else {
#if defined(_WIN32)
- res = _findnext(m_handle, &m_finder);
+ res = _findnext(m_handle, &m_finder);
#else
- if (m_fcount == (int) m_globbuf.gl_pathc)
- res = -1;
- else
- res = 0;
+ if (m_fcount == (int) m_globbuf.gl_pathc)
+ res = -1;
+ else
+ res = 0;
#endif
- }
+ }
- if (res == -1) {
+ if (res == -1) {
- m_searchFinished = true;
- return NULL;
+ m_searchFinished = true;
+ return NULL;
- }
+ }
- /*
- * Create the OpenSSL BIOs necessary to read in the X509 cert
- */
+ /*
+ * Create the OpenSSL BIOs necessary to read in the X509 cert
+ */
- BIO * bioCert;
- if ((bioCert = BIO_new(BIO_s_file())) == NULL) {
+ BIO * bioCert;
+ if ((bioCert = BIO_new(BIO_s_file())) == NULL) {
- std::cerr << "Error opening certificate file\n\n";
- exit (1);
+ std::cerr << "Error opening certificate file\n\n";
+ exit (1);
- }
+ }
- // Create the filename
- safeBuffer fname;
+ // Create the filename
+ safeBuffer fname;
#if defined(_WIN32)
- fname.sbTranscodeIn(mp_baseURI);
- fname.sbStrcatIn("/certs/");
- fname.sbStrcatIn(m_finder.name);
- reverseSlash(fname);
+ fname.sbTranscodeIn(mp_baseURI);
+ fname.sbStrcatIn("/certs/");
+ fname.sbStrcatIn(m_finder.name);
+ reverseSlash(fname);
#else
- fname.sbStrcpyIn(m_globbuf.gl_pathv[m_fcount++]);
+ fname.sbStrcpyIn(m_globbuf.gl_pathv[m_fcount++]);
#endif
- if (BIO_read_filename(bioCert, fname.rawCharBuffer()) <= 0) {
+ if (BIO_read_filename(bioCert, fname.rawCharBuffer()) <= 0) {
- std::cerr << "Error opening certificate file\n" << fname.rawCharBuffer() << std::endl;
- return NULL;
+ std::cerr << "Error opening certificate file\n" << fname.rawCharBuffer() << std::endl;
+ return NULL;
- }
+ }
- X509 * x509 = d2i_X509_bio(bioCert, NULL);
- BIO_free(bioCert);
+ X509 * x509 = d2i_X509_bio(bioCert, NULL);
+ BIO_free(bioCert);
- return x509;
+ return x509;
}
X509_NAME * X509_NAME_create_from_txt(const char * n) {
- // I'm sure there must be a function to do this in OpenSSL, but I'm
- // darned if I can find it.
+ // I'm sure there must be a function to do this in OpenSSL, but I'm
+ // darned if I can find it.
- int idx = 0;
- int j;
- bool ok = true;
-
- X509_NAME_ENTRY * entries[10];
- int entCount = 0;
-
- char * name = new char[strlen(n)];
- char * value = new char[strlen(n)];
- while (true) {
-
- while (n[idx] == ' ' ||
- n[idx] == '\t' ||
- n[idx] == '\n' ||
- n[idx] == '\r')
- idx++;
-
- if (n[idx] == 0)
- break;
-
- j = 0;
- while (n[idx] != 0 && n[idx] != '=') {
- name[j++] = n[idx++];
- }
-
- if (j == 0 || n[idx] == 0) {
- ok = false;
- break;
- }
-
- name[j] = '\0';
- idx++;
-
- // Now the value
- j = 0;
- while (n[idx] != 0 && n[idx] != '\n' && n[idx] != '\r') {
-
- if (n[idx] == ',') {
-
- // find out if this is a marker for end of RDN
- int jdx = idx + 1;
- while (n[jdx] != '\0' && n[jdx] != '=' && n[jdx] != ',')
- ++jdx;
-
- if (n[jdx] != ',')
- break;
-
- }
-
- value[j++] = n[idx++];
-
- }
-
- if (j == 0) {
- ok = false;
- break;
- }
-
- if (n[idx] != 0)
- idx++;
-
- value[j] = '\0';
- X509_NAME_ENTRY * xne;
-
- xne = X509_NAME_ENTRY_create_by_txt(NULL, name, MBSTRING_ASC, (unsigned char *) value, -1);
-
- if (xne != NULL) {
- entries[entCount++] = xne;
- if (entCount == 10) {
- ok = false;
- break;
- }
- }
- else {
- ok = false;
- break;
- }
-
- }
-
- delete[] name;
- delete[] value;
-
- X509_NAME *ret = NULL;
- int i;
-
- if (ok) {
-
- // Create the return value
- ret = X509_NAME_new();
- for (i = entCount - 1; i >= 0; --i) {
-
- if (!X509_NAME_add_entry(ret, entries[i], -1, 0)) {
- X509_NAME_free(ret);
- ret = NULL;
- break;
- }
- }
-
- }
-
- // Clean out the entries
- for (i = 0; i < entCount; ++i) {
- X509_NAME_ENTRY_free(entries[i]);
- }
+ int idx = 0;
+ int j;
+ bool ok = true;
+
+ X509_NAME_ENTRY * entries[10];
+ int entCount = 0;
+
+ char * name = new char[strlen(n)];
+ char * value = new char[strlen(n)];
+ while (true) {
+
+ while (n[idx] == ' ' ||
+ n[idx] == '\t' ||
+ n[idx] == '\n' ||
+ n[idx] == '\r')
+ idx++;
+
+ if (n[idx] == 0)
+ break;
+
+ j = 0;
+ while (n[idx] != 0 && n[idx] != '=') {
+ name[j++] = n[idx++];
+ }
+
+ if (j == 0 || n[idx] == 0) {
+ ok = false;
+ break;
+ }
+
+ name[j] = '\0';
+ idx++;
+
+ // Now the value
+ j = 0;
+ while (n[idx] != 0 && n[idx] != '\n' && n[idx] != '\r') {
+
+ if (n[idx] == ',') {
+
+ // find out if this is a marker for end of RDN
+ int jdx = idx + 1;
+ while (n[jdx] != '\0' && n[jdx] != '=' && n[jdx] != ',')
+ ++jdx;
+
+ if (n[jdx] != ',')
+ break;
+
+ }
+
+ value[j++] = n[idx++];
+
+ }
+
+ if (j == 0) {
+ ok = false;
+ break;
+ }
+
+ if (n[idx] != 0)
+ idx++;
+
+ value[j] = '\0';
+ X509_NAME_ENTRY * xne;
- return ret;
+ xne = X509_NAME_ENTRY_create_by_txt(NULL, name, MBSTRING_ASC, (unsigned char *) value, -1);
+
+ if (xne != NULL) {
+ entries[entCount++] = xne;
+ if (entCount == 10) {
+ ok = false;
+ break;
+ }
+ }
+ else {
+ ok = false;
+ break;
+ }
+
+ }
+
+ delete[] name;
+ delete[] value;
+
+ X509_NAME *ret = NULL;
+ int i;
+
+ if (ok) {
+
+ // Create the return value
+ ret = X509_NAME_new();
+ for (i = entCount - 1; i >= 0; --i) {
+
+ if (!X509_NAME_add_entry(ret, entries[i], -1, 0)) {
+ X509_NAME_free(ret);
+ ret = NULL;
+ break;
+ }
+ }
+
+ }
+
+ // Clean out the entries
+ for (i = 0; i < entCount; ++i) {
+ X509_NAME_ENTRY_free(entries[i]);
+ }
+
+ return ret;
}
bool InteropResolver::checkMatch(DSIGKeyInfoList * lst, X509 * x) {
- // Check if the parameters in x match the required certificate
+ // Check if the parameters in x match the required certificate
- int sz = (int) lst->getSize();
- DSIGKeyInfo* k;
-
- for (int i = 0; i < sz; ++i) {
+ int sz = (int) lst->getSize();
+ DSIGKeyInfo* k;
+
+ for (int i = 0; i < sz; ++i) {
- k = lst->item(i);
+ k = lst->item(i);
- if (k->getKeyInfoType() == DSIGKeyInfo::KEYINFO_X509) {
+ if (k->getKeyInfoType() == DSIGKeyInfo::KEYINFO_X509) {
- DSIGKeyInfoX509 * kx = static_cast<DSIGKeyInfoX509 *>(k);
-
- const XMLCh * serial = kx->getX509IssuerSerialNumber();
+ DSIGKeyInfoX509 * kx = static_cast<DSIGKeyInfoX509 *>(k);
+
+ const XMLCh * serial = kx->getX509IssuerSerialNumber();
- if (serial != NULL) {
+ if (serial != NULL) {
- char * cserial = XMLString::transcode(serial);
- char * xserial;
+ char * cserial = XMLString::transcode(serial);
+ char * xserial;
- BIGNUM * bnserial = ASN1_INTEGER_to_BN(x->cert_info->serialNumber, NULL);
- xserial = BN_bn2dec(bnserial);
- BN_free(bnserial);
+ BIGNUM * bnserial = ASN1_INTEGER_to_BN(x->cert_info->serialNumber, NULL);
+ xserial = BN_bn2dec(bnserial);
+ BN_free(bnserial);
- if (strcmp(xserial, cserial) == 0) {
-
- OPENSSL_free(xserial);
- XSEC_RELEASE_XMLCH(cserial);
- return true;
+ if (strcmp(xserial, cserial) == 0) {
+
+ OPENSSL_free(xserial);
+ XSEC_RELEASE_XMLCH(cserial);
+ return true;
- }
- //delete[] xserial;
- XSEC_RELEASE_XMLCH(cserial);
- OPENSSL_free(xserial);
+ }
+ //delete[] xserial;
+ XSEC_RELEASE_XMLCH(cserial);
+ OPENSSL_free(xserial);
- }
+ }
- /*
- * Either it's not a serial number, or we didn't pass, so lets
- * look at the next option.
- */
-
- const XMLCh * ski = kx->getX509SKI();
-
- if (ski != NULL) {
+ /*
+ * Either it's not a serial number, or we didn't pass, so lets
+ * look at the next option.
+ */
+
+ const XMLCh * ski = kx->getX509SKI();
+
+ if (ski != NULL) {
- char * cski = XMLString::transcode(ski);
- int clen = (int) strlen(cski);
- unsigned char * xski = new unsigned char[clen];
- ArrayJanitor <unsigned char> j_xski(xski);
+ char * cski = XMLString::transcode(ski);
+ int clen = (int) strlen(cski);
+ unsigned char * xski = new unsigned char[clen];
+ ArrayJanitor <unsigned char> j_xski(xski);
- // Decode
+ // Decode
- OpenSSLCryptoBase64 b64;
- b64.decodeInit();
- int xlen = b64.decode((unsigned char *) cski, clen, xski, clen);
- xlen += b64.decodeFinish(&xski[xlen], clen - xlen);
+ OpenSSLCryptoBase64 b64;
+ b64.decodeInit();
+ int xlen = b64.decode((unsigned char *) cski, clen, xski, clen);
+ xlen += b64.decodeFinish(&xski[xlen], clen - xlen);
XSEC_RELEASE_XMLCH(cski);
- if (xlen != 0) {
+ if (xlen != 0) {
- // Have a buffer with a number in it
- STACK_OF(X509_EXTENSION) *exts;
- exts = x->cert_info->extensions;
-
- if (exts != NULL) {
-
- // Find the Subject Key Identifier OID
- X509_EXTENSION * ext;
- ASN1_OBJECT * objski = OBJ_nid2obj(NID_subject_key_identifier);
- int extn = X509v3_get_ext_by_OBJ(exts, objski, -1);
- if (extn != -1) {
- // Dummy up an OCTET_STRING from the xski
- unsigned char * octxski = new unsigned char[xlen + 2];
- ArrayJanitor<unsigned char> j_octxski(octxski);
-
- octxski[0] = 4;
- octxski[1] = xlen;
- memcpy(&octxski[2], xski, xlen);
-
- ext = sk_X509_EXTENSION_value(exts,extn);
- ASN1_OCTET_STRING *skid = ext->value;
- ASN1_OCTET_STRING * xskid = M_ASN1_OCTET_STRING_new();
- ASN1_STRING_set(xskid, octxski, xlen+2);
-
- if (ASN1_OCTET_STRING_cmp(xskid, skid) == 0) {
- ASN1_OCTET_STRING_free(xskid);
- return true;
- }
- }
-
- }
-
- }
-
- }
-
- /* Not a subject key identifier */
- const XMLCh *sn = kx->getX509SubjectName();
-
- if (sn != NULL) {
-
- char * csn = XMLString::transcode(sn);
-
- X509_NAME * x509name = X509_get_subject_name(x);
- X509_NAME * snname = X509_NAME_create_from_txt(csn);
- XSEC_RELEASE_XMLCH(csn);
-
- if (snname != NULL) {
-
- if (!X509_NAME_cmp(x509name, snname)) {
- X509_NAME_free(snname);
- return true;
- }
-
- X509_NAME_free(snname);
- }
- }
- }
- }
+ // Have a buffer with a number in it
+ STACK_OF(X509_EXTENSION) *exts;
+ exts = x->cert_info->extensions;
+
+ if (exts != NULL) {
+
+ // Find the Subject Key Identifier OID
+ X509_EXTENSION * ext;
+ ASN1_OBJECT * objski = OBJ_nid2obj(NID_subject_key_identifier);
+ int extn = X509v3_get_ext_by_OBJ(exts, objski, -1);
+ if (extn != -1) {
+ // Dummy up an OCTET_STRING from the xski
+ unsigned char * octxski = new unsigned char[xlen + 2];
+ ArrayJanitor<unsigned char> j_octxski(octxski);
+
+ octxski[0] = 4;
+ octxski[1] = xlen;
+ memcpy(&octxski[2], xski, xlen);
+
+ ext = sk_X509_EXTENSION_value(exts,extn);
+ ASN1_OCTET_STRING *skid = ext->value;
+ ASN1_OCTET_STRING * xskid = M_ASN1_OCTET_STRING_new();
+ ASN1_STRING_set(xskid, octxski, xlen+2);
+
+ if (ASN1_OCTET_STRING_cmp(xskid, skid) == 0) {
+ ASN1_OCTET_STRING_free(xskid);
+ return true;
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ /* Not a subject key identifier */
+ const XMLCh *sn = kx->getX509SubjectName();
+
+ if (sn != NULL) {
+
+ char * csn = XMLString::transcode(sn);
+
+ X509_NAME * x509name = X509_get_subject_name(x);
+ X509_NAME * snname = X509_NAME_create_from_txt(csn);
+ XSEC_RELEASE_XMLCH(csn);
+
+ if (snname != NULL) {
+
+ if (!X509_NAME_cmp(x509name, snname)) {
+ X509_NAME_free(snname);
+ return true;
+ }
+
+ X509_NAME_free(snname);
+ }
+ }
+ }
+ }
- return false;
+ return false;
}
XSECCryptoKey * InteropResolver::openCertURI(const XMLCh * uri) {
- // Open a certificate from a file URI relative to the signature file
- BIO * bioCert;
- if ((bioCert = BIO_new(BIO_s_file())) == NULL) {
-
- return NULL;
-
- }
-
- safeBuffer fname;
- char * u = XMLString::transcode(uri);
- fname.sbTranscodeIn(mp_baseURI);
- fname.sbStrcatIn("/");
- fname.sbStrcatIn(u);
- XSEC_RELEASE_XMLCH(u);
+ // Open a certificate from a file URI relative to the signature file
+ BIO * bioCert;
+ if ((bioCert = BIO_new(BIO_s_file())) == NULL) {
+
+ return NULL;
+
+ }
+
+ safeBuffer fname;
+ char * u = XMLString::transcode(uri);
+ fname.sbTranscodeIn(mp_baseURI);
+ fname.sbStrcatIn("/");
+ fname.sbStrcatIn(u);
+ XSEC_RELEASE_XMLCH(u);
#if defined(_WIN32)
- reverseSlash(fname);
+ reverseSlash(fname);
#endif
- if (BIO_read_filename(bioCert, fname.rawCharBuffer()) <= 0) {
-
- return NULL;
+ if (BIO_read_filename(bioCert, fname.rawCharBuffer()) <= 0) {
+
+ return NULL;
- }
+ }
- X509 * x509 = d2i_X509_bio(bioCert, NULL);
- BIO_free(bioCert);
+ X509 * x509 = d2i_X509_bio(bioCert, NULL);
+ BIO_free(bioCert);
- OpenSSLCryptoX509 oX509(x509);
- X509_free(x509);
+ OpenSSLCryptoX509 oX509(x509);
+ X509_free(x509);
- return oX509.clonePublicKey();
+ return oX509.clonePublicKey();
}
XSECCryptoKey * InteropResolver::resolveKey(DSIGKeyInfoList * lst) {
- // First check if this has an X509 cert + an X509 CRL
- const XMLCh * b64cert = NULL;
- const XMLCh * b64crl = NULL;
+ // First check if this has an X509 cert + an X509 CRL
+ const XMLCh * b64cert = NULL;
+ const XMLCh * b64crl = NULL;
- int lstSize = (int) lst->getSize();
+ int lstSize = (int) lst->getSize();
- for (int i = 0; i < lstSize; ++i) {
+ for (int i = 0; i < lstSize; ++i) {
- DSIGKeyInfo * ki;
- ki = lst->item(i);
- const XMLCh * rawuri;
+ DSIGKeyInfo * ki;
+ ki = lst->item(i);
+ const XMLCh * rawuri;
- if (ki->getKeyInfoType() == DSIGKeyInfo::KEYINFO_X509) {
-
- DSIGKeyInfoX509 * kix509 = static_cast<DSIGKeyInfoX509 *>(ki);
+ if (ki->getKeyInfoType() == DSIGKeyInfo::KEYINFO_X509) {
+
+ DSIGKeyInfoX509 * kix509 = static_cast<DSIGKeyInfoX509 *>(ki);
- if ((rawuri = kix509->getRawRetrievalURI()) != NULL) {
+ if ((rawuri = kix509->getRawRetrievalURI()) != NULL) {
- // We have a raw certificate by de-reference
- // Assume it is just a file dereference and open the cert
+ // We have a raw certificate by de-reference
+ // Assume it is just a file dereference and open the cert
- return openCertURI(rawuri);
+ return openCertURI(rawuri);
- }
-
- if (kix509->getCertificateListSize() == 1) {
+ }
+
+ if (kix509->getCertificateListSize() == 1) {
- b64cert = kix509->getCertificateItem(0);
+ b64cert = kix509->getCertificateItem(0);
- }
+ }
- if (b64crl == NULL) {
+ if (b64crl == NULL) {
- b64crl = kix509->getX509CRL();
+ b64crl = kix509->getX509CRL();
- }
- }
+ }
+ }
- else if (ki->getKeyInfoType() == DSIGKeyInfo::KEYINFO_NAME) {
+ else if (ki->getKeyInfoType() == DSIGKeyInfo::KEYINFO_NAME) {
- DSIGKeyInfoName * kn = static_cast<DSIGKeyInfoName *>(ki);
+ DSIGKeyInfoName * kn = static_cast<DSIGKeyInfoName *>(ki);
- if (kn->getKeyName() != NULL) {
+ if (kn->getKeyName() != NULL) {
- static XMLCh certStr[] = {
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_c,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_s,
- XERCES_CPP_NAMESPACE_QUALIFIER chForwardSlash,
- XERCES_CPP_NAMESPACE_QUALIFIER chNull
- };
- static XMLCh extStr[] = {
- XERCES_CPP_NAMESPACE_QUALIFIER chPeriod,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_c,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r,
- XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t,
- XERCES_CPP_NAMESPACE_QUALIFIER chNull
- };
+ static XMLCh certStr[] = {
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_c,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_s,
+ XERCES_CPP_NAMESPACE_QUALIFIER chForwardSlash,
+ XERCES_CPP_NAMESPACE_QUALIFIER chNull
+ };
+ static XMLCh extStr[] = {
+ XERCES_CPP_NAMESPACE_QUALIFIER chPeriod,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_c,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r,
+ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t,
+ XERCES_CPP_NAMESPACE_QUALIFIER chNull
+ };
- safeBuffer fname;
- fname = certStr;
- fname.sbXMLChCat(kn->getKeyName());
- fname.sbXMLChCat(extStr);
+ safeBuffer fname;
+ fname = certStr;
+ fname.sbXMLChCat(kn->getKeyName());
+ fname.sbXMLChCat(extStr);
- fname.sbStrlwr();
+ fname.sbStrlwr();
- return openCertURI(fname.rawXMLChBuffer());
+ return openCertURI(fname.rawXMLChBuffer());
- }
+ }
- }
+ }
- }
+ }
- if (b64cert != NULL && b64crl != NULL) {
+ if (b64cert != NULL && b64crl != NULL) {
- // We have a certificate and a crl, lets get the cert and check in the crl
+ // We have a certificate and a crl, lets get the cert and check in the crl
- OpenSSLCryptoBase64 b64;
- char * transb64cert = XMLString::transcode(b64cert);
- unsigned char * x509buf = new unsigned char[strlen(transb64cert)];
- ArrayJanitor<unsigned char> j_x509buf(x509buf);
+ OpenSSLCryptoBase64 b64;
+ char * transb64cert = XMLString::transcode(b64cert);
+ unsigned char * x509buf = new unsigned char[strlen(transb64cert)];
+ ArrayJanitor<unsigned char> j_x509buf(x509buf);
- int x509bufLen;
+ int x509bufLen;
- X509 *x;
+ X509 *x;
- b64.decodeInit();
- x509bufLen = b64.decode((unsigned char *) transb64cert, (unsigned int) strlen(transb64cert), x509buf, (unsigned int) strlen(transb64cert));
- x509bufLen += b64.decodeFinish(&x509buf[x509bufLen], (unsigned int) strlen(transb64cert) - x509bufLen);
- XSEC_RELEASE_XMLCH(transb64cert);
+ b64.decodeInit();
+ x509bufLen = b64.decode((unsigned char *) transb64cert, (unsigned int) strlen(transb64cert), x509buf, (unsigned int) strlen(transb64cert));
+ x509bufLen += b64.decodeFinish(&x509buf[x509bufLen], (unsigned int) strlen(transb64cert) - x509bufLen);
+ XSEC_RELEASE_XMLCH(transb64cert);
- if (x509bufLen > 0) {
+ if (x509bufLen > 0) {
#if defined(XSEC_OPENSSL_D2IX509_CONST_BUFFER)
- x = d2i_X509(NULL, (const unsigned char **) (&x509buf), x509bufLen
+ x = d2i_X509(NULL, (const unsigned char **) (&x509buf), x509bufLen
);
#else
- x = d2i_X509(NULL, &x509buf, x509bufLen);
+ x = d2i_X509(NULL, &x509buf, x509bufLen);
#endif
- }
- else
- return NULL; // Something has gone wrong
+ }
+ else
+ return NULL; // Something has gone wrong
- if (x == NULL)
- return NULL;
+ if (x == NULL)
+ return NULL;
- // Now the CRL
- char * transb64crl = XMLString::transcode(b64crl);
- unsigned char * crlbuf = new unsigned char[strlen(transb64crl)];
- ArrayJanitor<unsigned char> j_crlbuf(crlbuf);
+ // Now the CRL
+ char * transb64crl = XMLString::transcode(b64crl);
+ unsigned char * crlbuf = new unsigned char[strlen(transb64crl)];
+ ArrayJanitor<unsigned char> j_crlbuf(crlbuf);
- int crlbufLen;
+ int crlbufLen;
- X509_CRL * c;
+ X509_CRL * c;
- b64.decodeInit();
- crlbufLen = b64.decode((unsigned char*) transb64crl, (unsigned int) strlen(transb64crl), crlbuf, (unsigned int) strlen(transb64crl));
- crlbufLen += b64.decodeFinish(&crlbuf[crlbufLen], (unsigned int) strlen(transb64crl) - crlbufLen);
- XSEC_RELEASE_XMLCH(transb64crl);
+ b64.decodeInit();
+ crlbufLen = b64.decode((unsigned char*) transb64crl, (unsigned int) strlen(transb64crl), crlbuf, (unsigned int) strlen(transb64crl));
+ crlbufLen += b64.decodeFinish(&crlbuf[crlbufLen], (unsigned int) strlen(transb64crl) - crlbufLen);
+ XSEC_RELEASE_XMLCH(transb64crl);
- if (crlbufLen > 0) {
+ if (crlbufLen > 0) {
#if defined(XSEC_OPENSSL_D2IX509_CONST_BUFFER)
- c = d2i_X509_CRL(NULL, (const unsigned char **) (&crlbuf), crlbufLen);
+ c = d2i_X509_CRL(NULL, (const unsigned char **) (&crlbuf), crlbufLen);
#else
- c = d2i_X509_CRL(NULL, &crlbuf, crlbufLen);
+ c = d2i_X509_CRL(NULL, &crlbuf, crlbufLen);
#endif
- }
- else
- return NULL; // Something has gone wrong
+ }
+ else
+ return NULL; // Something has gone wrong
- if (c == NULL)
- return NULL;
+ if (c == NULL)
+ return NULL;
- // Now check if the cert is in the CRL (code lifted from OpenSSL x509_vfy.c
+ // Now check if the cert is in the CRL (code lifted from OpenSSL x509_vfy.c
int idx;
X509_REVOKED rtmp;
/* Look for serial number of certificate in CRL */
- rtmp.serialNumber = X509_get_serialNumber(x);
+ rtmp.serialNumber = X509_get_serialNumber(x);
idx = sk_X509_REVOKED_find(c->crl->revoked, &rtmp);
- /* Not found: OK */
+ /* Not found: OK */
- if(idx != -1) {
+ if(idx != -1) {
- std::cerr << "Warning - certificate revoked in attached CRL" << std::endl;
+ std::cerr << "Warning - certificate revoked in attached CRL" << std::endl;
- }
+ }
- OpenSSLCryptoX509 ox(x);
- X509_free(x);
- X509_CRL_free(c);
- return ox.clonePublicKey();
+ OpenSSLCryptoX509 ox(x);
+ X509_free(x);
+ X509_CRL_free(c);
+ return ox.clonePublicKey();
- }
+ }
- // Do a run through each match in the directory
+ // Do a run through each match in the directory
- while (m_searchFinished == false) {
+ while (m_searchFinished == false) {
- X509 * x = nextFile2Cert();
+ X509 * x = nextFile2Cert();
- if (x != NULL) {
+ if (x != NULL) {
- if (checkMatch(lst, x)) {
+ if (checkMatch(lst, x)) {
- OpenSSLCryptoX509 ox(x);
- X509_free(x);
- return ox.clonePublicKey();
+ OpenSSLCryptoX509 ox(x);
+ X509_free(x);
+ return ox.clonePublicKey();
- }
+ }
- }
- X509_free(x);
+ }
+ X509_free(x);
- }
+ }
- return false;
+ return false;
}
@@ -653,7 +653,7 @@ XSECCryptoKey * InteropResolver::resolve
XSECKeyInfoResolver * InteropResolver::clone(void) const {
- return new InteropResolver(mp_baseURI);
+ return new InteropResolver(mp_baseURI);
}
Modified: santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.hpp
URL: http://svn.apache.org/viewvc/santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.hpp?rev=1774662&r1=1774661&r2=1774662&view=diff
==============================================================================
--- santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.hpp (original)
+++ santuario/xml-security-cpp/trunk/xsec/tools/checksig/InteropResolver.hpp Fri Dec 16 21:18:39 2016
@@ -21,7 +21,7 @@
* XSEC
*
* InteropResolver := Class to resolve key elements into certificates for
- * merlin-18 interop test
+ * merlin-18 interop test
*
* Author(s): Berin Lautenbach
*
@@ -41,34 +41,34 @@
#endif
#if defined (XSEC_HAVE_OPENSSL)
-# include <openssl/x509.h>
+# include <openssl/x509.h>
class InteropResolver : public XSECKeyInfoResolver {
public :
- InteropResolver(const XMLCh * baseURI);
- ~InteropResolver();
+ InteropResolver(const XMLCh * baseURI);
+ ~InteropResolver();
- // Interface functions
+ // Interface functions
- virtual XSECCryptoKey * resolveKey(DSIGKeyInfoList * lst);
- virtual XSECKeyInfoResolver * clone(void) const;
+ virtual XSECCryptoKey * resolveKey(DSIGKeyInfoList * lst);
+ virtual XSECKeyInfoResolver * clone(void) const;
- // Internal functions
- X509 * nextFile2Cert(void);
- bool checkMatch(DSIGKeyInfoList * lst, X509 * x);
- XSECCryptoKey * openCertURI(const XMLCh * uri);
+ // Internal functions
+ X509 * nextFile2Cert(void);
+ bool checkMatch(DSIGKeyInfoList * lst, X509 * x);
+ XSECCryptoKey * openCertURI(const XMLCh * uri);
private:
- XMLCh * mp_baseURI;
- bool m_searchStarted;
- bool m_searchFinished;
+ XMLCh * mp_baseURI;
+ bool m_searchStarted;
+ bool m_searchFinished;
#if defined (_WIN32)
- _finddata_t m_finder;
- long m_handle;
+ _finddata_t m_finder;
+ long m_handle;
#else
glob_t m_globbuf;
int m_fcount;