1 /* Copyright (c) 2015, Shuang Qiu, Robbie Harwood,
2 Vladislav Vaintroub & MariaDB Corporation
3
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
15
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include <windows.h>
30 #include <stdio.h>
31
32 #ifndef SEC_E_INVALID_PARAMETER
33 #define SEC_E_INVALID_PARAMETER _HRESULT_TYPEDEF_(0x8009035D)
34 #endif
35 #ifndef SEC_E_DELEGATION_POLICY
36 #define SEC_E_DELEGATION_POLICY _HRESULT_TYPEDEF_(0x8009035E)
37 #endif
38 #ifndef SEC_E_POLICY_NLTM_ONLY
39 #define SEC_E_POLICY_NLTM_ONLY _HRESULT_TYPEDEF_(0x8009035F)
40 #endif
41 #ifndef SEC_E_NO_CONTEXT
42 #define SEC_E_NO_CONTEXT _HRESULT_TYPEDEF_(0x80090361)
43 #endif
44 #ifndef SEC_E_PKU2U_CERT_FAILURE
45 #define SEC_E_PKU2U_CERT_FAILURE _HRESULT_TYPEDEF_(0x80090362)
46 #endif
47 #ifndef SEC_E_MUTUAL_AUTH_FAILED
48 #define SEC_E_MUTUAL_AUTH_FAILED _HRESULT_TYPEDEF_(0x80090363)
49 #endif
50
51 #define ERRSYM(x) {x, #x}
52 static struct {
53 int error;
54 const char *sym;
55 } error_symbols[] =
56 {
57 ERRSYM(SEC_E_OK),
58 ERRSYM(SEC_E_INSUFFICIENT_MEMORY),
59 ERRSYM(SEC_E_INVALID_HANDLE),
60 ERRSYM(SEC_E_UNSUPPORTED_FUNCTION),
61 ERRSYM(SEC_E_TARGET_UNKNOWN),
62 ERRSYM(SEC_E_INTERNAL_ERROR),
63 ERRSYM(SEC_E_SECPKG_NOT_FOUND),
64 ERRSYM(SEC_E_NOT_OWNER),
65 ERRSYM(SEC_E_CANNOT_INSTALL),
66 ERRSYM(SEC_E_INVALID_TOKEN),
67 ERRSYM(SEC_E_CANNOT_PACK),
68 ERRSYM(SEC_E_QOP_NOT_SUPPORTED),
69 ERRSYM(SEC_E_NO_IMPERSONATION),
70 ERRSYM(SEC_E_LOGON_DENIED),
71 ERRSYM(SEC_E_UNKNOWN_CREDENTIALS),
72 ERRSYM(SEC_E_NO_CREDENTIALS),
73 ERRSYM(SEC_E_MESSAGE_ALTERED),
74 ERRSYM(SEC_E_OUT_OF_SEQUENCE),
75 ERRSYM(SEC_E_NO_AUTHENTICATING_AUTHORITY),
76 ERRSYM(SEC_E_BAD_PKGID),
77 ERRSYM(SEC_E_CONTEXT_EXPIRED),
78 ERRSYM(SEC_E_INCOMPLETE_MESSAGE),
79 ERRSYM(SEC_E_INCOMPLETE_CREDENTIALS),
80 ERRSYM(SEC_E_BUFFER_TOO_SMALL),
81 ERRSYM(SEC_E_WRONG_PRINCIPAL),
82 ERRSYM(SEC_E_TIME_SKEW),
83 ERRSYM(SEC_E_UNTRUSTED_ROOT),
84 ERRSYM(SEC_E_ILLEGAL_MESSAGE),
85 ERRSYM(SEC_E_CERT_UNKNOWN),
86 ERRSYM(SEC_E_CERT_EXPIRED),
87 ERRSYM(SEC_E_ENCRYPT_FAILURE),
88 ERRSYM(SEC_E_DECRYPT_FAILURE),
89 ERRSYM(SEC_E_ALGORITHM_MISMATCH),
90 ERRSYM(SEC_E_SECURITY_QOS_FAILED),
91 ERRSYM(SEC_E_UNFINISHED_CONTEXT_DELETED),
92 ERRSYM(SEC_E_NO_TGT_REPLY),
93 ERRSYM(SEC_E_NO_IP_ADDRESSES),
94 ERRSYM(SEC_E_WRONG_CREDENTIAL_HANDLE),
95 ERRSYM(SEC_E_CRYPTO_SYSTEM_INVALID),
96 ERRSYM(SEC_E_MAX_REFERRALS_EXCEEDED),
97 ERRSYM(SEC_E_MUST_BE_KDC),
98 ERRSYM(SEC_E_STRONG_CRYPTO_NOT_SUPPORTED),
99 ERRSYM(SEC_E_TOO_MANY_PRINCIPALS),
100 ERRSYM(SEC_E_NO_PA_DATA),
101 ERRSYM(SEC_E_PKINIT_NAME_MISMATCH),
102 ERRSYM(SEC_E_SMARTCARD_LOGON_REQUIRED),
103 ERRSYM(SEC_E_SHUTDOWN_IN_PROGRESS),
104 ERRSYM(SEC_E_KDC_INVALID_REQUEST),
105 ERRSYM(SEC_E_KDC_UNABLE_TO_REFER),
106 ERRSYM(SEC_E_KDC_UNKNOWN_ETYPE),
107 ERRSYM(SEC_E_UNSUPPORTED_PREAUTH),
108 ERRSYM(SEC_E_DELEGATION_REQUIRED),
109 ERRSYM(SEC_E_BAD_BINDINGS),
110 ERRSYM(SEC_E_MULTIPLE_ACCOUNTS),
111 ERRSYM(SEC_E_NO_KERB_KEY),
112 ERRSYM(SEC_E_CERT_WRONG_USAGE),
113 ERRSYM(SEC_E_DOWNGRADE_DETECTED),
114 ERRSYM(SEC_E_SMARTCARD_CERT_REVOKED),
115 ERRSYM(SEC_E_ISSUING_CA_UNTRUSTED),
116 ERRSYM(SEC_E_REVOCATION_OFFLINE_C),
117 ERRSYM(SEC_E_PKINIT_CLIENT_FAILURE),
118 ERRSYM(SEC_E_SMARTCARD_CERT_EXPIRED),
119 ERRSYM(SEC_E_NO_S4U_PROT_SUPPORT),
120 ERRSYM(SEC_E_CROSSREALM_DELEGATION_FAILURE),
121 ERRSYM(SEC_E_REVOCATION_OFFLINE_KDC),
122 ERRSYM(SEC_E_ISSUING_CA_UNTRUSTED_KDC),
123 ERRSYM(SEC_E_KDC_CERT_EXPIRED),
124 ERRSYM(SEC_E_KDC_CERT_REVOKED),
125 ERRSYM(SEC_E_INVALID_PARAMETER),
126 ERRSYM(SEC_E_DELEGATION_POLICY),
127 ERRSYM(SEC_E_POLICY_NLTM_ONLY),
128 ERRSYM(SEC_E_NO_CONTEXT),
129 ERRSYM(SEC_E_PKU2U_CERT_FAILURE),
130 ERRSYM(SEC_E_MUTUAL_AUTH_FAILED),
131 ERRSYM(SEC_E_NO_SPM),
132 ERRSYM(SEC_E_NOT_SUPPORTED),
133 {0,0}
134 };
135
sspi_errmsg(int err,char * buf,size_t size)136 void sspi_errmsg(int err, char *buf, size_t size)
137 {
138 size_t len,i;
139
140 buf[size - 1] = 0;
141 for (i= 0; error_symbols[i].sym; i++)
142 {
143 if (error_symbols[i].error == err)
144 {
145 size_t len= strlen(error_symbols[i].sym);
146 if (len + 2 < size)
147 {
148 memcpy(buf, error_symbols[i].sym, len);
149 buf[len]= ' ';
150 buf += len + 1;
151 size-= len + 1;
152 }
153 break;
154 }
155 }
156
157 len = FormatMessageA(
158 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
159 err, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
160 buf, (DWORD)size, NULL);
161
162 if(len > 0)
163 {
164 /* Trim trailing \n\r*/
165 char *p;
166 for(p= buf + len;p > buf && (*p == '\n' || *p=='\r' || *p == 0);p--)
167 *p= 0;
168 }
169 }
170