e6b1cecee34b494a5b41813455f302cc9c84e5ae
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / SignatureValidator.cpp
1 /*\r
2  *  Copyright 2001-2006 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 /**\r
18  * SignatureValidator.cpp\r
19  * \r
20  * Validator for signatures based on an externally-supplied key \r
21  */\r
22  \r
23 #include "internal.h"\r
24 #include "signature/SignatureValidator.h"\r
25 \r
26 #include <xsec/enc/XSECCryptoException.hpp>\r
27 #include <xsec/framework/XSECException.hpp>\r
28 \r
29 using namespace xmlsignature;\r
30 using namespace xmltooling;\r
31 using namespace std;\r
32 \r
33 void SignatureValidator::validate(const XMLObject* xmlObject) const\r
34 {\r
35     const Signature* sigObj=dynamic_cast<const Signature*>(xmlObject);\r
36     if (!sigObj)\r
37         throw ValidationException("Validator only applies to Signature objects.");\r
38     validate(sigObj);\r
39 }\r
40 \r
41 void SignatureValidator::validate(const Signature* sigObj) const\r
42 {\r
43     DSIGSignature* sig=sigObj->getXMLSignature();\r
44     if (!sig)\r
45         throw ValidationException("Signature does not exist yet.");\r
46 \r
47     try {\r
48         sig->setSigningKey(m_key->clone());\r
49         if (!sig->verify())\r
50             throw ValidationException("Digital signature does not validate with the given key.");\r
51     }\r
52     catch(XSECException& e) {\r
53         auto_ptr_char temp(e.getMsg());\r
54         throw ValidationException(string("Caught an XMLSecurity exception verifying signature: ") + temp.get());\r
55     }\r
56     catch(XSECCryptoException& e) {\r
57         throw ValidationException(string("Caught an XMLSecurity exception verifying signature: ") + e.getMsg());\r
58     }\r
59 }\r