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