src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp
author weijun
Mon, 14 May 2018 21:06:55 +0800
branchJDK-8199569-branch
changeset 56553 3e490160d5ec
parent 56552 543279c75f1a
child 56554 9b381f73498a
permissions -rw-r--r--
no more warning
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56552
543279c75f1a First working version
weijun
parents:
diff changeset
     1
/*
543279c75f1a First working version
weijun
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
543279c75f1a First working version
weijun
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
543279c75f1a First working version
weijun
parents:
diff changeset
     4
 *
543279c75f1a First working version
weijun
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
543279c75f1a First working version
weijun
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
543279c75f1a First working version
weijun
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
543279c75f1a First working version
weijun
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
543279c75f1a First working version
weijun
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
543279c75f1a First working version
weijun
parents:
diff changeset
    10
 *
543279c75f1a First working version
weijun
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
543279c75f1a First working version
weijun
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
543279c75f1a First working version
weijun
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
543279c75f1a First working version
weijun
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
543279c75f1a First working version
weijun
parents:
diff changeset
    15
 * accompanied this code).
543279c75f1a First working version
weijun
parents:
diff changeset
    16
 *
543279c75f1a First working version
weijun
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
543279c75f1a First working version
weijun
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
543279c75f1a First working version
weijun
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
543279c75f1a First working version
weijun
parents:
diff changeset
    20
 *
543279c75f1a First working version
weijun
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
543279c75f1a First working version
weijun
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
543279c75f1a First working version
weijun
parents:
diff changeset
    23
 * questions.
543279c75f1a First working version
weijun
parents:
diff changeset
    24
 */
543279c75f1a First working version
weijun
parents:
diff changeset
    25
543279c75f1a First working version
weijun
parents:
diff changeset
    26
#define UNICODE
543279c75f1a First working version
weijun
parents:
diff changeset
    27
#define _UNICODE
543279c75f1a First working version
weijun
parents:
diff changeset
    28
543279c75f1a First working version
weijun
parents:
diff changeset
    29
#include <windows.h>
543279c75f1a First working version
weijun
parents:
diff changeset
    30
#include <stdlib.h>
543279c75f1a First working version
weijun
parents:
diff changeset
    31
#include <stdio.h>
543279c75f1a First working version
weijun
parents:
diff changeset
    32
#include <stdlib.h>
543279c75f1a First working version
weijun
parents:
diff changeset
    33
#include <string.h>
543279c75f1a First working version
weijun
parents:
diff changeset
    34
543279c75f1a First working version
weijun
parents:
diff changeset
    35
#define GSS_DLL_FILE
543279c75f1a First working version
weijun
parents:
diff changeset
    36
#include "gssapi.h"
543279c75f1a First working version
weijun
parents:
diff changeset
    37
543279c75f1a First working version
weijun
parents:
diff changeset
    38
#define SECURITY_WIN32
543279c75f1a First working version
weijun
parents:
diff changeset
    39
#include <sspi.h>
543279c75f1a First working version
weijun
parents:
diff changeset
    40
543279c75f1a First working version
weijun
parents:
diff changeset
    41
#pragma comment(lib, "secur32.lib")
543279c75f1a First working version
weijun
parents:
diff changeset
    42
543279c75f1a First working version
weijun
parents:
diff changeset
    43
//#define DEBUG
543279c75f1a First working version
weijun
parents:
diff changeset
    44
543279c75f1a First working version
weijun
parents:
diff changeset
    45
#ifdef DEBUG
543279c75f1a First working version
weijun
parents:
diff changeset
    46
TCHAR _bb[256];
543279c75f1a First working version
weijun
parents:
diff changeset
    47
#define SEC_SUCCESS(Status) ((Status) >= 0 ? TRUE: (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,ss,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),_bb,256,0),printf("SECURITY_STATUS: (%lx) %ls\n",ss,_bb),FALSE))
543279c75f1a First working version
weijun
parents:
diff changeset
    48
#define P fprintf(stdout, "SSPI (%ld): \n", __LINE__); fflush(stdout);
543279c75f1a First working version
weijun
parents:
diff changeset
    49
#define PP(s) fprintf(stdout, "SSPI (%ld): ", __LINE__); fprintf(stdout, "%s\n", s); fflush(stdout)
543279c75f1a First working version
weijun
parents:
diff changeset
    50
#define PP1(s,n) fprintf(stdout, "SSPI (%ld): ", __LINE__); fprintf(stdout, s, n); fflush(stdout)
543279c75f1a First working version
weijun
parents:
diff changeset
    51
#define PP2(s,n1,n2) fprintf(stdout, "SSPI (%ld): ", __LINE__); fprintf(stdout, s, n1, n2); fflush(stdout)
543279c75f1a First working version
weijun
parents:
diff changeset
    52
#define PP3(s,n1,n2,n3) fprintf(stdout, "SSPI (%ld): ", __LINE__); fprintf(stdout, s, n1, n2, n3); fflush(stdout)
543279c75f1a First working version
weijun
parents:
diff changeset
    53
BOOL debug = TRUE;
543279c75f1a First working version
weijun
parents:
diff changeset
    54
#else
543279c75f1a First working version
weijun
parents:
diff changeset
    55
#define SEC_SUCCESS(Status) ((Status) >= 0)
543279c75f1a First working version
weijun
parents:
diff changeset
    56
#define P
543279c75f1a First working version
weijun
parents:
diff changeset
    57
#define PP(s)
543279c75f1a First working version
weijun
parents:
diff changeset
    58
#define PP1(s,n)
543279c75f1a First working version
weijun
parents:
diff changeset
    59
#define PP2(s,n1,n2)
543279c75f1a First working version
weijun
parents:
diff changeset
    60
#define PP3(s,n1,n2,n3)
543279c75f1a First working version
weijun
parents:
diff changeset
    61
BOOL debug = FALSE;
543279c75f1a First working version
weijun
parents:
diff changeset
    62
#endif
543279c75f1a First working version
weijun
parents:
diff changeset
    63
543279c75f1a First working version
weijun
parents:
diff changeset
    64
char KRB5_OID[9] = {(char)0x2a, (char)0x86, (char)0x48, (char)0x86, (char)0xf7, (char)0x12, (char)0x01, (char)0x02, (char)0x02};
543279c75f1a First working version
weijun
parents:
diff changeset
    65
char KRB5_U2U_OID[10] = {(char)0x2a, (char)0x86, (char)0x48, (char)0x86, (char)0xf7, (char)0x12, (char)0x01, (char)0x02, (char)0x02, (char)0x03};
543279c75f1a First working version
weijun
parents:
diff changeset
    66
char SPNEGO_OID[6] = {(char)0x2b, (char)0x06, (char)0x01, (char)0x05, (char)0x05, (char)0x02};
543279c75f1a First working version
weijun
parents:
diff changeset
    67
char USER_NAME_OID[10] = {(char)0x2a, (char)0x86, (char)0x48, (char)0x86, (char)0xf7, (char)0x12, (char)0x01, (char)0x02, (char)0x01, (char)0x01};
543279c75f1a First working version
weijun
parents:
diff changeset
    68
char HOST_SERVICE_NAME_OID[10] = {(char)0x2a, (char)0x86, (char)0x48, (char)0x86, (char)0xf7, (char)0x12, (char)0x01, (char)0x02, (char)0x01, (char)0x04};
543279c75f1a First working version
weijun
parents:
diff changeset
    69
543279c75f1a First working version
weijun
parents:
diff changeset
    70
typedef struct {
543279c75f1a First working version
weijun
parents:
diff changeset
    71
    TCHAR PackageName[20];
543279c75f1a First working version
weijun
parents:
diff changeset
    72
    CredHandle* phCred;
543279c75f1a First working version
weijun
parents:
diff changeset
    73
    struct _SecHandle hCtxt;
543279c75f1a First working version
weijun
parents:
diff changeset
    74
    DWORD cbMaxMessage;
543279c75f1a First working version
weijun
parents:
diff changeset
    75
    SecPkgContext_Sizes SecPkgContextSizes;
543279c75f1a First working version
weijun
parents:
diff changeset
    76
} Context;
543279c75f1a First working version
weijun
parents:
diff changeset
    77
543279c75f1a First working version
weijun
parents:
diff changeset
    78
#ifdef __cplusplus
543279c75f1a First working version
weijun
parents:
diff changeset
    79
extern "C" {
543279c75f1a First working version
weijun
parents:
diff changeset
    80
#endif /* __cplusplus */
543279c75f1a First working version
weijun
parents:
diff changeset
    81
543279c75f1a First working version
weijun
parents:
diff changeset
    82
__declspec(dllexport) OM_uint32 gss_release_name
543279c75f1a First working version
weijun
parents:
diff changeset
    83
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
    84
                                gss_name_t *name) {
543279c75f1a First working version
weijun
parents:
diff changeset
    85
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
    86
}
543279c75f1a First working version
weijun
parents:
diff changeset
    87
543279c75f1a First working version
weijun
parents:
diff changeset
    88
__declspec(dllexport) OM_uint32 gss_import_name
543279c75f1a First working version
weijun
parents:
diff changeset
    89
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
    90
                                gss_buffer_t input_name_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
    91
                                gss_OID input_name_type,
543279c75f1a First working version
weijun
parents:
diff changeset
    92
                                gss_name_t *output_name) {
543279c75f1a First working version
weijun
parents:
diff changeset
    93
    SecPkgCredentials_Names* names = new SecPkgCredentials_Names();
543279c75f1a First working version
weijun
parents:
diff changeset
    94
    int len = (int)input_name_buffer->length;
543279c75f1a First working version
weijun
parents:
diff changeset
    95
    names->sUserName = new SEC_WCHAR[len + 1];
543279c75f1a First working version
weijun
parents:
diff changeset
    96
    MultiByteToWideChar(CP_ACP, 0, (LPSTR)input_name_buffer->value, len, names->sUserName, len);
543279c75f1a First working version
weijun
parents:
diff changeset
    97
    names->sUserName[len] = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
    98
    if (input_name_type->length == 10 && !memcmp(input_name_type->elements, HOST_SERVICE_NAME_OID, 10)) {
543279c75f1a First working version
weijun
parents:
diff changeset
    99
        for (int i = 0; i < len; i++) {
543279c75f1a First working version
weijun
parents:
diff changeset
   100
            if (names->sUserName[i] == '@') {
543279c75f1a First working version
weijun
parents:
diff changeset
   101
                names->sUserName[i] = '/';
543279c75f1a First working version
weijun
parents:
diff changeset
   102
            }
543279c75f1a First working version
weijun
parents:
diff changeset
   103
        }
543279c75f1a First working version
weijun
parents:
diff changeset
   104
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   105
    *output_name = (gss_name_t) names;
543279c75f1a First working version
weijun
parents:
diff changeset
   106
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   107
}
543279c75f1a First working version
weijun
parents:
diff changeset
   108
543279c75f1a First working version
weijun
parents:
diff changeset
   109
__declspec(dllexport) OM_uint32 gss_compare_name
543279c75f1a First working version
weijun
parents:
diff changeset
   110
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   111
                                gss_name_t name1,
543279c75f1a First working version
weijun
parents:
diff changeset
   112
                                gss_name_t name2,
543279c75f1a First working version
weijun
parents:
diff changeset
   113
                                int *name_equal) {
543279c75f1a First working version
weijun
parents:
diff changeset
   114
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   115
}
543279c75f1a First working version
weijun
parents:
diff changeset
   116
543279c75f1a First working version
weijun
parents:
diff changeset
   117
__declspec(dllexport) OM_uint32 gss_canonicalize_name
543279c75f1a First working version
weijun
parents:
diff changeset
   118
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   119
                                gss_name_t input_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   120
                                gss_OID mech_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   121
                                gss_name_t *output_name) {
543279c75f1a First working version
weijun
parents:
diff changeset
   122
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   123
}
543279c75f1a First working version
weijun
parents:
diff changeset
   124
543279c75f1a First working version
weijun
parents:
diff changeset
   125
__declspec(dllexport) OM_uint32 gss_export_name
543279c75f1a First working version
weijun
parents:
diff changeset
   126
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   127
                                gss_name_t input_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   128
                                gss_buffer_t exported_name) {
543279c75f1a First working version
weijun
parents:
diff changeset
   129
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   130
}
543279c75f1a First working version
weijun
parents:
diff changeset
   131
543279c75f1a First working version
weijun
parents:
diff changeset
   132
__declspec(dllexport) OM_uint32 gss_display_name
543279c75f1a First working version
weijun
parents:
diff changeset
   133
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   134
                                gss_name_t input_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   135
                                gss_buffer_t output_name_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   136
                                gss_OID *output_name_type) {
543279c75f1a First working version
weijun
parents:
diff changeset
   137
    SecPkgCredentials_Names* names = (SecPkgCredentials_Names*)input_name;
543279c75f1a First working version
weijun
parents:
diff changeset
   138
    int len = (int)wcslen(names->sUserName);
543279c75f1a First working version
weijun
parents:
diff changeset
   139
    char* buffer = new char[len+1];
543279c75f1a First working version
weijun
parents:
diff changeset
   140
    WideCharToMultiByte(CP_ACP, 0, names->sUserName, len, buffer, len, NULL, NULL);
543279c75f1a First working version
weijun
parents:
diff changeset
   141
    buffer[len] = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   142
    output_name_buffer->length = len+1;
543279c75f1a First working version
weijun
parents:
diff changeset
   143
    output_name_buffer->value = buffer;
543279c75f1a First working version
weijun
parents:
diff changeset
   144
    PP1("Name found: %ls\n", names->sUserName);
543279c75f1a First working version
weijun
parents:
diff changeset
   145
    PP2("%d [%s]", len, buffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   146
    if (output_name_type != NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   147
        gss_OID_desc* oid = new gss_OID_desc();
543279c75f1a First working version
weijun
parents:
diff changeset
   148
        oid->length = (OM_uint32)strlen(USER_NAME_OID);
543279c75f1a First working version
weijun
parents:
diff changeset
   149
        oid->elements = strdup(USER_NAME_OID);
543279c75f1a First working version
weijun
parents:
diff changeset
   150
        *output_name_type = oid;
543279c75f1a First working version
weijun
parents:
diff changeset
   151
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   152
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   153
}
543279c75f1a First working version
weijun
parents:
diff changeset
   154
543279c75f1a First working version
weijun
parents:
diff changeset
   155
long TimeStampToLong(TimeStamp *time) {
543279c75f1a First working version
weijun
parents:
diff changeset
   156
    ULARGE_INTEGER *a, *b;
543279c75f1a First working version
weijun
parents:
diff changeset
   157
    FILETIME fnow;
543279c75f1a First working version
weijun
parents:
diff changeset
   158
    GetSystemTimeAsFileTime(&fnow);
543279c75f1a First working version
weijun
parents:
diff changeset
   159
    a = (ULARGE_INTEGER*)time;
543279c75f1a First working version
weijun
parents:
diff changeset
   160
    b = (ULARGE_INTEGER*)&fnow;
543279c75f1a First working version
weijun
parents:
diff changeset
   161
    PP1("Difference %ld\n", (long)((a->QuadPart - b->QuadPart) / 10000000));
543279c75f1a First working version
weijun
parents:
diff changeset
   162
    return (long)((a->QuadPart - b->QuadPart) / 10000000);
543279c75f1a First working version
weijun
parents:
diff changeset
   163
}
543279c75f1a First working version
weijun
parents:
diff changeset
   164
543279c75f1a First working version
weijun
parents:
diff changeset
   165
__declspec(dllexport) OM_uint32 gss_acquire_cred
543279c75f1a First working version
weijun
parents:
diff changeset
   166
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   167
                                gss_name_t desired_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   168
                                OM_uint32 time_req,
543279c75f1a First working version
weijun
parents:
diff changeset
   169
                                gss_OID_set desired_mech,
543279c75f1a First working version
weijun
parents:
diff changeset
   170
                                gss_cred_usage_t cred_usage,
543279c75f1a First working version
weijun
parents:
diff changeset
   171
                                gss_cred_id_t *output_cred_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   172
                                gss_OID_set *actual_mechs,
543279c75f1a First working version
weijun
parents:
diff changeset
   173
                                OM_uint32 *time_rec) {
543279c75f1a First working version
weijun
parents:
diff changeset
   174
    if (desired_name != NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   175
        return GSS_S_FAILURE; // Only support default cred
543279c75f1a First working version
weijun
parents:
diff changeset
   176
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   177
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   178
    CredHandle* cred = new CredHandle();
543279c75f1a First working version
weijun
parents:
diff changeset
   179
    TimeStamp ts;
543279c75f1a First working version
weijun
parents:
diff changeset
   180
	cred_usage = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   181
    PP1("AcquireCredentialsHandle with %d\n", cred_usage);
543279c75f1a First working version
weijun
parents:
diff changeset
   182
    ss = AcquireCredentialsHandle(
543279c75f1a First working version
weijun
parents:
diff changeset
   183
            NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   184
            L"Kerberos",
543279c75f1a First working version
weijun
parents:
diff changeset
   185
            cred_usage == 0 ? SECPKG_CRED_BOTH :
543279c75f1a First working version
weijun
parents:
diff changeset
   186
                (cred_usage == 1 ? SECPKG_CRED_OUTBOUND : SECPKG_CRED_INBOUND),
543279c75f1a First working version
weijun
parents:
diff changeset
   187
            NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   188
            NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   189
            NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   190
            NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   191
            cred,
543279c75f1a First working version
weijun
parents:
diff changeset
   192
            &ts
543279c75f1a First working version
weijun
parents:
diff changeset
   193
            );
543279c75f1a First working version
weijun
parents:
diff changeset
   194
543279c75f1a First working version
weijun
parents:
diff changeset
   195
    actual_mechs = &desired_mech;
543279c75f1a First working version
weijun
parents:
diff changeset
   196
    *output_cred_handle = (void*)cred;
543279c75f1a First working version
weijun
parents:
diff changeset
   197
    if (time_rec != NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   198
        *time_rec = TimeStampToLong(&ts);
543279c75f1a First working version
weijun
parents:
diff changeset
   199
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   200
543279c75f1a First working version
weijun
parents:
diff changeset
   201
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   202
}
543279c75f1a First working version
weijun
parents:
diff changeset
   203
543279c75f1a First working version
weijun
parents:
diff changeset
   204
__declspec(dllexport) OM_uint32 gss_release_cred
543279c75f1a First working version
weijun
parents:
diff changeset
   205
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   206
                                gss_cred_id_t *cred_handle) {
543279c75f1a First working version
weijun
parents:
diff changeset
   207
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   208
}
543279c75f1a First working version
weijun
parents:
diff changeset
   209
543279c75f1a First working version
weijun
parents:
diff changeset
   210
__declspec(dllexport) OM_uint32 gss_inquire_cred
543279c75f1a First working version
weijun
parents:
diff changeset
   211
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   212
                                gss_cred_id_t cred_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   213
                                gss_name_t *name,
543279c75f1a First working version
weijun
parents:
diff changeset
   214
                                OM_uint32 *lifetime,
543279c75f1a First working version
weijun
parents:
diff changeset
   215
                                gss_cred_usage_t *cred_usage,
543279c75f1a First working version
weijun
parents:
diff changeset
   216
                                gss_OID_set *mechanisms) {
543279c75f1a First working version
weijun
parents:
diff changeset
   217
    CredHandle* cred = (CredHandle*)cred_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   218
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   219
    if (name) {
543279c75f1a First working version
weijun
parents:
diff changeset
   220
        SecPkgCredentials_Names* names = new SecPkgCredentials_Names();
543279c75f1a First working version
weijun
parents:
diff changeset
   221
        ss = QueryCredentialsAttributes(cred, SECPKG_CRED_ATTR_NAMES, names);
543279c75f1a First working version
weijun
parents:
diff changeset
   222
        *name = (gss_name_t) names;
543279c75f1a First working version
weijun
parents:
diff changeset
   223
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   224
    // Others inquiries not supported yet
543279c75f1a First working version
weijun
parents:
diff changeset
   225
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   226
}
543279c75f1a First working version
weijun
parents:
diff changeset
   227
543279c75f1a First working version
weijun
parents:
diff changeset
   228
__declspec(dllexport) OM_uint32 gss_import_sec_context
543279c75f1a First working version
weijun
parents:
diff changeset
   229
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   230
                                gss_buffer_t interprocess_token,
543279c75f1a First working version
weijun
parents:
diff changeset
   231
                                gss_ctx_id_t *context_handle) {
543279c75f1a First working version
weijun
parents:
diff changeset
   232
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   233
}
543279c75f1a First working version
weijun
parents:
diff changeset
   234
543279c75f1a First working version
weijun
parents:
diff changeset
   235
void FillContextAfterEstablished(Context *pc) {
543279c75f1a First working version
weijun
parents:
diff changeset
   236
    QueryContextAttributes(&pc->hCtxt, SECPKG_ATTR_SIZES,
543279c75f1a First working version
weijun
parents:
diff changeset
   237
                &pc->SecPkgContextSizes);
543279c75f1a First working version
weijun
parents:
diff changeset
   238
}
543279c75f1a First working version
weijun
parents:
diff changeset
   239
543279c75f1a First working version
weijun
parents:
diff changeset
   240
SECURITY_STATUS GenClientContext(
543279c75f1a First working version
weijun
parents:
diff changeset
   241
        Context *pc,
543279c75f1a First working version
weijun
parents:
diff changeset
   242
        int flag,
543279c75f1a First working version
weijun
parents:
diff changeset
   243
        BYTE *pIn,
543279c75f1a First working version
weijun
parents:
diff changeset
   244
        size_t cbIn,
543279c75f1a First working version
weijun
parents:
diff changeset
   245
        BYTE *pOut,
543279c75f1a First working version
weijun
parents:
diff changeset
   246
        size_t *pcbOut,
543279c75f1a First working version
weijun
parents:
diff changeset
   247
        BOOL *pfDone,
543279c75f1a First working version
weijun
parents:
diff changeset
   248
        ULONG *pOutFlag,
543279c75f1a First working version
weijun
parents:
diff changeset
   249
        TCHAR *pszTarget) {
543279c75f1a First working version
weijun
parents:
diff changeset
   250
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   251
    TimeStamp Lifetime;
543279c75f1a First working version
weijun
parents:
diff changeset
   252
    SecBufferDesc OutBuffDesc;
543279c75f1a First working version
weijun
parents:
diff changeset
   253
    SecBuffer OutSecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   254
    SecBufferDesc InBuffDesc;
543279c75f1a First working version
weijun
parents:
diff changeset
   255
    SecBuffer InSecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   256
543279c75f1a First working version
weijun
parents:
diff changeset
   257
    OutBuffDesc.ulVersion = SECBUFFER_VERSION;
543279c75f1a First working version
weijun
parents:
diff changeset
   258
    OutBuffDesc.cBuffers = 1;
543279c75f1a First working version
weijun
parents:
diff changeset
   259
    OutBuffDesc.pBuffers = &OutSecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   260
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   261
    OutSecBuff.cbBuffer = (unsigned long)*pcbOut;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   262
    OutSecBuff.BufferType = SECBUFFER_TOKEN;
543279c75f1a First working version
weijun
parents:
diff changeset
   263
    OutSecBuff.pvBuffer = pOut;
543279c75f1a First working version
weijun
parents:
diff changeset
   264
543279c75f1a First working version
weijun
parents:
diff changeset
   265
    PP2("TARGET: %ls %ls\n", pszTarget, pc->PackageName);
543279c75f1a First working version
weijun
parents:
diff changeset
   266
    PP2("flag: %x [%ls]\n", flag, pszTarget);
543279c75f1a First working version
weijun
parents:
diff changeset
   267
    if (pIn) {
543279c75f1a First working version
weijun
parents:
diff changeset
   268
        InBuffDesc.ulVersion = SECBUFFER_VERSION;
543279c75f1a First working version
weijun
parents:
diff changeset
   269
        InBuffDesc.cBuffers = 1;
543279c75f1a First working version
weijun
parents:
diff changeset
   270
        InBuffDesc.pBuffers = &InSecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   271
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   272
        InSecBuff.cbBuffer = (unsigned long)cbIn;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   273
        InSecBuff.BufferType = SECBUFFER_TOKEN;
543279c75f1a First working version
weijun
parents:
diff changeset
   274
        InSecBuff.pvBuffer = pIn;
543279c75f1a First working version
weijun
parents:
diff changeset
   275
543279c75f1a First working version
weijun
parents:
diff changeset
   276
        ss = InitializeSecurityContext(
543279c75f1a First working version
weijun
parents:
diff changeset
   277
                pc->phCred,
543279c75f1a First working version
weijun
parents:
diff changeset
   278
                &pc->hCtxt,
543279c75f1a First working version
weijun
parents:
diff changeset
   279
                pszTarget,
543279c75f1a First working version
weijun
parents:
diff changeset
   280
                flag,
543279c75f1a First working version
weijun
parents:
diff changeset
   281
                0,
543279c75f1a First working version
weijun
parents:
diff changeset
   282
                SECURITY_NATIVE_DREP,
543279c75f1a First working version
weijun
parents:
diff changeset
   283
                &InBuffDesc,
543279c75f1a First working version
weijun
parents:
diff changeset
   284
                0,
543279c75f1a First working version
weijun
parents:
diff changeset
   285
                &pc->hCtxt,
543279c75f1a First working version
weijun
parents:
diff changeset
   286
                &OutBuffDesc,
543279c75f1a First working version
weijun
parents:
diff changeset
   287
                pOutFlag,
543279c75f1a First working version
weijun
parents:
diff changeset
   288
                &Lifetime);
543279c75f1a First working version
weijun
parents:
diff changeset
   289
    } else {
543279c75f1a First working version
weijun
parents:
diff changeset
   290
        if (!pc->phCred) {
543279c75f1a First working version
weijun
parents:
diff changeset
   291
            PP("No credentials provided, acquire automatically");
543279c75f1a First working version
weijun
parents:
diff changeset
   292
            ss = AcquireCredentialsHandle(
543279c75f1a First working version
weijun
parents:
diff changeset
   293
                    NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   294
                    pc->PackageName,
543279c75f1a First working version
weijun
parents:
diff changeset
   295
                    SECPKG_CRED_OUTBOUND,
543279c75f1a First working version
weijun
parents:
diff changeset
   296
                    NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   297
                    NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   298
                    NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   299
                    NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   300
                    pc->phCred,
543279c75f1a First working version
weijun
parents:
diff changeset
   301
                    &Lifetime);
543279c75f1a First working version
weijun
parents:
diff changeset
   302
            PP("end");
543279c75f1a First working version
weijun
parents:
diff changeset
   303
            if (!(SEC_SUCCESS(ss))) {
543279c75f1a First working version
weijun
parents:
diff changeset
   304
                PP("Failed");
543279c75f1a First working version
weijun
parents:
diff changeset
   305
                return ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   306
            }
543279c75f1a First working version
weijun
parents:
diff changeset
   307
        } else {
543279c75f1a First working version
weijun
parents:
diff changeset
   308
            PP("Credentials OK");
543279c75f1a First working version
weijun
parents:
diff changeset
   309
        }
543279c75f1a First working version
weijun
parents:
diff changeset
   310
        ss = InitializeSecurityContext(
543279c75f1a First working version
weijun
parents:
diff changeset
   311
                pc->phCred,
543279c75f1a First working version
weijun
parents:
diff changeset
   312
                NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   313
                pszTarget,
543279c75f1a First working version
weijun
parents:
diff changeset
   314
                flag,
543279c75f1a First working version
weijun
parents:
diff changeset
   315
                0,
543279c75f1a First working version
weijun
parents:
diff changeset
   316
                SECURITY_NATIVE_DREP,
543279c75f1a First working version
weijun
parents:
diff changeset
   317
                NULL,
543279c75f1a First working version
weijun
parents:
diff changeset
   318
                0,
543279c75f1a First working version
weijun
parents:
diff changeset
   319
                &pc->hCtxt,
543279c75f1a First working version
weijun
parents:
diff changeset
   320
                &OutBuffDesc,
543279c75f1a First working version
weijun
parents:
diff changeset
   321
                pOutFlag,
543279c75f1a First working version
weijun
parents:
diff changeset
   322
                &Lifetime);
543279c75f1a First working version
weijun
parents:
diff changeset
   323
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   324
543279c75f1a First working version
weijun
parents:
diff changeset
   325
    if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   326
        PP("InitializeSecurityContext Failed");
543279c75f1a First working version
weijun
parents:
diff changeset
   327
        return ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   328
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   329
    //-------------------------------------------------------------------
543279c75f1a First working version
weijun
parents:
diff changeset
   330
    //  If necessary, complete the token.
543279c75f1a First working version
weijun
parents:
diff changeset
   331
543279c75f1a First working version
weijun
parents:
diff changeset
   332
    if ((SEC_I_COMPLETE_NEEDED == ss)
543279c75f1a First working version
weijun
parents:
diff changeset
   333
            || (SEC_I_COMPLETE_AND_CONTINUE == ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   334
        ss = CompleteAuthToken(&pc->hCtxt, &OutBuffDesc);
543279c75f1a First working version
weijun
parents:
diff changeset
   335
        if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   336
            return ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   337
        }
543279c75f1a First working version
weijun
parents:
diff changeset
   338
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   339
543279c75f1a First working version
weijun
parents:
diff changeset
   340
    *pcbOut = OutSecBuff.cbBuffer;
543279c75f1a First working version
weijun
parents:
diff changeset
   341
543279c75f1a First working version
weijun
parents:
diff changeset
   342
    *pfDone = !((SEC_I_CONTINUE_NEEDED == ss) ||
543279c75f1a First working version
weijun
parents:
diff changeset
   343
            (SEC_I_COMPLETE_AND_CONTINUE == ss));
543279c75f1a First working version
weijun
parents:
diff changeset
   344
543279c75f1a First working version
weijun
parents:
diff changeset
   345
    return ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   346
}
543279c75f1a First working version
weijun
parents:
diff changeset
   347
543279c75f1a First working version
weijun
parents:
diff changeset
   348
Context* NewContext(TCHAR* PackageName) {
543279c75f1a First working version
weijun
parents:
diff changeset
   349
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   350
    PSecPkgInfo pkgInfo;
543279c75f1a First working version
weijun
parents:
diff changeset
   351
543279c75f1a First working version
weijun
parents:
diff changeset
   352
    Context* out = (Context*)malloc(sizeof(Context));
543279c75f1a First working version
weijun
parents:
diff changeset
   353
    ss = QuerySecurityPackageInfo(
543279c75f1a First working version
weijun
parents:
diff changeset
   354
            PackageName,
543279c75f1a First working version
weijun
parents:
diff changeset
   355
            &pkgInfo);
543279c75f1a First working version
weijun
parents:
diff changeset
   356
    if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   357
        return NULL;
543279c75f1a First working version
weijun
parents:
diff changeset
   358
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   359
    out->phCred = NULL;
543279c75f1a First working version
weijun
parents:
diff changeset
   360
    out->cbMaxMessage = pkgInfo->cbMaxToken;
543279c75f1a First working version
weijun
parents:
diff changeset
   361
    PP2("   QuerySecurityPackageInfo %ls goes %ld\n", PackageName, out->cbMaxMessage);
543279c75f1a First working version
weijun
parents:
diff changeset
   362
    wcscpy(out->PackageName, PackageName);
543279c75f1a First working version
weijun
parents:
diff changeset
   363
    FreeContextBuffer(pkgInfo);
543279c75f1a First working version
weijun
parents:
diff changeset
   364
    return out;
543279c75f1a First working version
weijun
parents:
diff changeset
   365
}
543279c75f1a First working version
weijun
parents:
diff changeset
   366
543279c75f1a First working version
weijun
parents:
diff changeset
   367
int flagSspi2Gss(int fin) {
543279c75f1a First working version
weijun
parents:
diff changeset
   368
	int fout = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   369
	if (fin & ISC_REQ_MUTUAL_AUTH) fout |= GSS_C_MUTUAL_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   370
	if (fin & ISC_REQ_CONFIDENTIALITY) fout |= GSS_C_CONF_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   371
	if (fin & ISC_REQ_DELEGATE) fout |= GSS_C_DELEG_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   372
	if (fin & ISC_REQ_INTEGRITY) fout |= GSS_C_INTEG_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   373
	if (fin & ISC_REQ_REPLAY_DETECT) fout |= GSS_C_REPLAY_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   374
	if (fin & ISC_REQ_SEQUENCE_DETECT) fout |= GSS_C_SEQUENCE_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   375
	return fout;
543279c75f1a First working version
weijun
parents:
diff changeset
   376
}
543279c75f1a First working version
weijun
parents:
diff changeset
   377
543279c75f1a First working version
weijun
parents:
diff changeset
   378
int flagGss2Sspi(int fin) {
543279c75f1a First working version
weijun
parents:
diff changeset
   379
	int fout = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   380
	if (fin & GSS_C_MUTUAL_FLAG) fout |= ISC_RET_MUTUAL_AUTH;
543279c75f1a First working version
weijun
parents:
diff changeset
   381
	if (fin & GSS_C_CONF_FLAG) fout |= ISC_RET_CONFIDENTIALITY;
543279c75f1a First working version
weijun
parents:
diff changeset
   382
	if (fin & GSS_C_DELEG_FLAG) fout |= ISC_RET_DELEGATE;
543279c75f1a First working version
weijun
parents:
diff changeset
   383
	if (fin & GSS_C_INTEG_FLAG) fout |= ISC_RET_INTEGRITY;
543279c75f1a First working version
weijun
parents:
diff changeset
   384
	if (fin & GSS_C_REPLAY_FLAG) fout |= ISC_RET_REPLAY_DETECT;
543279c75f1a First working version
weijun
parents:
diff changeset
   385
	if (fin & GSS_C_SEQUENCE_FLAG) fout |= ISC_RET_SEQUENCE_DETECT;
543279c75f1a First working version
weijun
parents:
diff changeset
   386
	return fout;
543279c75f1a First working version
weijun
parents:
diff changeset
   387
}
543279c75f1a First working version
weijun
parents:
diff changeset
   388
543279c75f1a First working version
weijun
parents:
diff changeset
   389
__declspec(dllexport) OM_uint32 gss_init_sec_context
543279c75f1a First working version
weijun
parents:
diff changeset
   390
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   391
                                gss_cred_id_t initiator_cred_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   392
                                gss_ctx_id_t *context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   393
                                gss_name_t target_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   394
                                gss_OID mech_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   395
                                OM_uint32 req_flags,
543279c75f1a First working version
weijun
parents:
diff changeset
   396
                                OM_uint32 time_req,
543279c75f1a First working version
weijun
parents:
diff changeset
   397
                                gss_channel_bindings_t input_chan_bindings,
543279c75f1a First working version
weijun
parents:
diff changeset
   398
                                gss_buffer_t input_token,
543279c75f1a First working version
weijun
parents:
diff changeset
   399
                                gss_OID *actual_mech_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   400
                                gss_buffer_t output_token,
543279c75f1a First working version
weijun
parents:
diff changeset
   401
                                OM_uint32 *ret_flags,
543279c75f1a First working version
weijun
parents:
diff changeset
   402
                                OM_uint32 *time_rec) {
543279c75f1a First working version
weijun
parents:
diff changeset
   403
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   404
543279c75f1a First working version
weijun
parents:
diff changeset
   405
    Context* pc;
543279c75f1a First working version
weijun
parents:
diff changeset
   406
    if (input_token->length == 0) {
543279c75f1a First working version
weijun
parents:
diff changeset
   407
        pc = NewContext(L"Kerberos");
543279c75f1a First working version
weijun
parents:
diff changeset
   408
        pc->phCred = (CredHandle*)initiator_cred_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   409
        *context_handle = (gss_ctx_id_t) pc;
543279c75f1a First working version
weijun
parents:
diff changeset
   410
    } else {
543279c75f1a First working version
weijun
parents:
diff changeset
   411
        pc = (Context*)*context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   412
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   413
543279c75f1a First working version
weijun
parents:
diff changeset
   414
    output_token->length = pc->cbMaxMessage;
543279c75f1a First working version
weijun
parents:
diff changeset
   415
    output_token->value = new char[pc->cbMaxMessage];
543279c75f1a First working version
weijun
parents:
diff changeset
   416
543279c75f1a First working version
weijun
parents:
diff changeset
   417
    DWORD outFlag;    
543279c75f1a First working version
weijun
parents:
diff changeset
   418
    TCHAR outName[100];
543279c75f1a First working version
weijun
parents:
diff changeset
   419
543279c75f1a First working version
weijun
parents:
diff changeset
   420
    OM_uint32 minor;
543279c75f1a First working version
weijun
parents:
diff changeset
   421
    gss_buffer_desc tn;
543279c75f1a First working version
weijun
parents:
diff changeset
   422
    gss_display_name(&minor, target_name, &tn, NULL);
543279c75f1a First working version
weijun
parents:
diff changeset
   423
    MultiByteToWideChar(CP_ACP, 0, (LPCCH)tn.value, (int)tn.length, outName, (int)tn.length);
543279c75f1a First working version
weijun
parents:
diff changeset
   424
    outName[tn.length] = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   425
543279c75f1a First working version
weijun
parents:
diff changeset
   426
    BOOL pfDone;
543279c75f1a First working version
weijun
parents:
diff changeset
   427
    ss = GenClientContext(
543279c75f1a First working version
weijun
parents:
diff changeset
   428
            pc, flagGss2Sspi(req_flags),
543279c75f1a First working version
weijun
parents:
diff changeset
   429
            (BYTE*)input_token->value, input_token->length,
543279c75f1a First working version
weijun
parents:
diff changeset
   430
            (BYTE*)output_token->value, &(output_token->length),
543279c75f1a First working version
weijun
parents:
diff changeset
   431
            &pfDone, &outFlag,
543279c75f1a First working version
weijun
parents:
diff changeset
   432
            (TCHAR*)outName);
543279c75f1a First working version
weijun
parents:
diff changeset
   433
    if (ss == SEC_E_OK) FillContextAfterEstablished(pc);
543279c75f1a First working version
weijun
parents:
diff changeset
   434
	outFlag = flagSspi2Gss(outFlag);
543279c75f1a First working version
weijun
parents:
diff changeset
   435
543279c75f1a First working version
weijun
parents:
diff changeset
   436
	if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   437
		return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   438
	}
543279c75f1a First working version
weijun
parents:
diff changeset
   439
543279c75f1a First working version
weijun
parents:
diff changeset
   440
    *ret_flags = (OM_uint32)outFlag;
543279c75f1a First working version
weijun
parents:
diff changeset
   441
    if (ss == SEC_I_CONTINUE_NEEDED) {
543279c75f1a First working version
weijun
parents:
diff changeset
   442
        return GSS_S_CONTINUE_NEEDED;
543279c75f1a First working version
weijun
parents:
diff changeset
   443
    } else {
543279c75f1a First working version
weijun
parents:
diff changeset
   444
        *ret_flags |= GSS_C_PROT_READY_FLAG;
543279c75f1a First working version
weijun
parents:
diff changeset
   445
        return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   446
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   447
}
543279c75f1a First working version
weijun
parents:
diff changeset
   448
543279c75f1a First working version
weijun
parents:
diff changeset
   449
__declspec(dllexport) OM_uint32 gss_accept_sec_context
543279c75f1a First working version
weijun
parents:
diff changeset
   450
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   451
                                gss_ctx_id_t *context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   452
                                gss_cred_id_t acceptor_cred_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   453
                                gss_buffer_t input_token,
543279c75f1a First working version
weijun
parents:
diff changeset
   454
                                gss_channel_bindings_t input_chan_bindings,
543279c75f1a First working version
weijun
parents:
diff changeset
   455
                                gss_name_t *src_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   456
                                gss_OID *mech_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   457
                                gss_buffer_t output_token,
543279c75f1a First working version
weijun
parents:
diff changeset
   458
                                OM_uint32 *ret_flags,
543279c75f1a First working version
weijun
parents:
diff changeset
   459
                                OM_uint32 *time_rec,
543279c75f1a First working version
weijun
parents:
diff changeset
   460
                                gss_cred_id_t *delegated_cred_handle) {
543279c75f1a First working version
weijun
parents:
diff changeset
   461
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   462
}
543279c75f1a First working version
weijun
parents:
diff changeset
   463
543279c75f1a First working version
weijun
parents:
diff changeset
   464
__declspec(dllexport) OM_uint32 gss_inquire_context
543279c75f1a First working version
weijun
parents:
diff changeset
   465
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   466
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   467
                                gss_name_t *src_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   468
                                gss_name_t *targ_name,
543279c75f1a First working version
weijun
parents:
diff changeset
   469
                                OM_uint32 *lifetime_rec,
543279c75f1a First working version
weijun
parents:
diff changeset
   470
                                gss_OID *mech_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   471
                                OM_uint32 *ctx_flags,
543279c75f1a First working version
weijun
parents:
diff changeset
   472
                                int *locally_initiated,
543279c75f1a First working version
weijun
parents:
diff changeset
   473
                                int *open) {
543279c75f1a First working version
weijun
parents:
diff changeset
   474
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   475
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   476
}
543279c75f1a First working version
weijun
parents:
diff changeset
   477
543279c75f1a First working version
weijun
parents:
diff changeset
   478
__declspec(dllexport) OM_uint32 gss_delete_sec_context
543279c75f1a First working version
weijun
parents:
diff changeset
   479
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   480
                                gss_ctx_id_t *context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   481
                                gss_buffer_t output_token) {
543279c75f1a First working version
weijun
parents:
diff changeset
   482
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   483
}
543279c75f1a First working version
weijun
parents:
diff changeset
   484
543279c75f1a First working version
weijun
parents:
diff changeset
   485
__declspec(dllexport) OM_uint32 gss_context_time
543279c75f1a First working version
weijun
parents:
diff changeset
   486
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   487
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   488
                                OM_uint32 *time_rec) {
543279c75f1a First working version
weijun
parents:
diff changeset
   489
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   490
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   491
}
543279c75f1a First working version
weijun
parents:
diff changeset
   492
543279c75f1a First working version
weijun
parents:
diff changeset
   493
__declspec(dllexport) OM_uint32 gss_wrap_size_limit
543279c75f1a First working version
weijun
parents:
diff changeset
   494
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   495
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   496
                                int conf_req_flag,
543279c75f1a First working version
weijun
parents:
diff changeset
   497
                                gss_qop_t qop_req,
543279c75f1a First working version
weijun
parents:
diff changeset
   498
                                OM_uint32 req_output_size,
543279c75f1a First working version
weijun
parents:
diff changeset
   499
                                OM_uint32 *max_input_size) {
543279c75f1a First working version
weijun
parents:
diff changeset
   500
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   501
    *max_input_size = pc->cbMaxMessage;
543279c75f1a First working version
weijun
parents:
diff changeset
   502
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   503
}
543279c75f1a First working version
weijun
parents:
diff changeset
   504
543279c75f1a First working version
weijun
parents:
diff changeset
   505
__declspec(dllexport) OM_uint32 gss_export_sec_context
543279c75f1a First working version
weijun
parents:
diff changeset
   506
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   507
                                gss_ctx_id_t *context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   508
                                gss_buffer_t interprocess_token) {
543279c75f1a First working version
weijun
parents:
diff changeset
   509
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   510
}
543279c75f1a First working version
weijun
parents:
diff changeset
   511
543279c75f1a First working version
weijun
parents:
diff changeset
   512
__declspec(dllexport) OM_uint32 gss_get_mic
543279c75f1a First working version
weijun
parents:
diff changeset
   513
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   514
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   515
                                gss_qop_t qop_req,
543279c75f1a First working version
weijun
parents:
diff changeset
   516
                                gss_buffer_t message_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   517
                                gss_buffer_t msg_token) {
543279c75f1a First working version
weijun
parents:
diff changeset
   518
543279c75f1a First working version
weijun
parents:
diff changeset
   519
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   520
543279c75f1a First working version
weijun
parents:
diff changeset
   521
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   522
    SecBufferDesc BuffDesc;
543279c75f1a First working version
weijun
parents:
diff changeset
   523
    SecBuffer SecBuff[2];
543279c75f1a First working version
weijun
parents:
diff changeset
   524
543279c75f1a First working version
weijun
parents:
diff changeset
   525
    BuffDesc.cBuffers = 2;
543279c75f1a First working version
weijun
parents:
diff changeset
   526
    BuffDesc.pBuffers = SecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   527
    BuffDesc.ulVersion = SECBUFFER_VERSION;
543279c75f1a First working version
weijun
parents:
diff changeset
   528
543279c75f1a First working version
weijun
parents:
diff changeset
   529
    SecBuff[0].BufferType = SECBUFFER_DATA;
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   530
    SecBuff[0].cbBuffer = (unsigned long)message_buffer->length;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   531
    SecBuff[0].pvBuffer = message_buffer->value;
543279c75f1a First working version
weijun
parents:
diff changeset
   532
543279c75f1a First working version
weijun
parents:
diff changeset
   533
    SecBuff[1].BufferType = SECBUFFER_TOKEN;
543279c75f1a First working version
weijun
parents:
diff changeset
   534
    SecBuff[1].cbBuffer = pc->SecPkgContextSizes.cbMaxSignature;
543279c75f1a First working version
weijun
parents:
diff changeset
   535
    SecBuff[1].pvBuffer = msg_token->value = malloc(SecBuff[1].cbBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   536
543279c75f1a First working version
weijun
parents:
diff changeset
   537
    ss = MakeSignature(&pc->hCtxt, 0, &BuffDesc, 0);
543279c75f1a First working version
weijun
parents:
diff changeset
   538
543279c75f1a First working version
weijun
parents:
diff changeset
   539
    if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   540
        free(SecBuff[1].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   541
        return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   542
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   543
543279c75f1a First working version
weijun
parents:
diff changeset
   544
    msg_token->length = SecBuff[1].cbBuffer;
543279c75f1a First working version
weijun
parents:
diff changeset
   545
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   546
}
543279c75f1a First working version
weijun
parents:
diff changeset
   547
543279c75f1a First working version
weijun
parents:
diff changeset
   548
__declspec(dllexport) OM_uint32 gss_verify_mic
543279c75f1a First working version
weijun
parents:
diff changeset
   549
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   550
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   551
                                gss_buffer_t message_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   552
                                gss_buffer_t token_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   553
                                gss_qop_t *qop_state) {
543279c75f1a First working version
weijun
parents:
diff changeset
   554
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   555
543279c75f1a First working version
weijun
parents:
diff changeset
   556
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   557
    SecBufferDesc BuffDesc;
543279c75f1a First working version
weijun
parents:
diff changeset
   558
    SecBuffer SecBuff[2];
543279c75f1a First working version
weijun
parents:
diff changeset
   559
    ULONG qop;
543279c75f1a First working version
weijun
parents:
diff changeset
   560
543279c75f1a First working version
weijun
parents:
diff changeset
   561
    BuffDesc.ulVersion = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   562
    BuffDesc.cBuffers = 2;
543279c75f1a First working version
weijun
parents:
diff changeset
   563
    BuffDesc.pBuffers = SecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   564
543279c75f1a First working version
weijun
parents:
diff changeset
   565
    SecBuff[0].BufferType = SECBUFFER_TOKEN;
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   566
    SecBuff[0].cbBuffer = (unsigned long)token_buffer->length;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   567
    SecBuff[0].pvBuffer = token_buffer->value;
543279c75f1a First working version
weijun
parents:
diff changeset
   568
543279c75f1a First working version
weijun
parents:
diff changeset
   569
    SecBuff[1].BufferType = SECBUFFER_DATA;
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   570
    SecBuff[1].cbBuffer = (unsigned long)message_buffer->length;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   571
    SecBuff[1].pvBuffer = message_buffer->value;
543279c75f1a First working version
weijun
parents:
diff changeset
   572
543279c75f1a First working version
weijun
parents:
diff changeset
   573
    ss = VerifySignature(&pc->hCtxt, &BuffDesc, 0, &qop);
543279c75f1a First working version
weijun
parents:
diff changeset
   574
    *qop_state = qop;
543279c75f1a First working version
weijun
parents:
diff changeset
   575
543279c75f1a First working version
weijun
parents:
diff changeset
   576
    if (ss == SEC_E_OK) {
543279c75f1a First working version
weijun
parents:
diff changeset
   577
        return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   578
    } else if (ss == SEC_E_OUT_OF_SEQUENCE) {
543279c75f1a First working version
weijun
parents:
diff changeset
   579
        return GSS_S_UNSEQ_TOKEN;
543279c75f1a First working version
weijun
parents:
diff changeset
   580
    } else {
543279c75f1a First working version
weijun
parents:
diff changeset
   581
        return GSS_S_BAD_SIG;
543279c75f1a First working version
weijun
parents:
diff changeset
   582
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   583
}
543279c75f1a First working version
weijun
parents:
diff changeset
   584
543279c75f1a First working version
weijun
parents:
diff changeset
   585
__declspec(dllexport) OM_uint32 gss_wrap
543279c75f1a First working version
weijun
parents:
diff changeset
   586
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   587
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   588
                                int conf_req_flag,
543279c75f1a First working version
weijun
parents:
diff changeset
   589
                                gss_qop_t qop_req,
543279c75f1a First working version
weijun
parents:
diff changeset
   590
                                gss_buffer_t input_message_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   591
                                int *conf_state,
543279c75f1a First working version
weijun
parents:
diff changeset
   592
                                gss_buffer_t output_message_buffer) {
543279c75f1a First working version
weijun
parents:
diff changeset
   593
543279c75f1a First working version
weijun
parents:
diff changeset
   594
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   595
543279c75f1a First working version
weijun
parents:
diff changeset
   596
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   597
    SecBufferDesc BuffDesc;
543279c75f1a First working version
weijun
parents:
diff changeset
   598
    SecBuffer SecBuff[3];
543279c75f1a First working version
weijun
parents:
diff changeset
   599
543279c75f1a First working version
weijun
parents:
diff changeset
   600
    BuffDesc.ulVersion = SECBUFFER_VERSION;
543279c75f1a First working version
weijun
parents:
diff changeset
   601
    BuffDesc.cBuffers = 3;
543279c75f1a First working version
weijun
parents:
diff changeset
   602
    BuffDesc.pBuffers = SecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   603
543279c75f1a First working version
weijun
parents:
diff changeset
   604
    SecBuff[0].BufferType = SECBUFFER_TOKEN;
543279c75f1a First working version
weijun
parents:
diff changeset
   605
    SecBuff[0].cbBuffer = pc->SecPkgContextSizes.cbSecurityTrailer;
543279c75f1a First working version
weijun
parents:
diff changeset
   606
    output_message_buffer->value = SecBuff[0].pvBuffer = malloc(pc->SecPkgContextSizes.cbSecurityTrailer
543279c75f1a First working version
weijun
parents:
diff changeset
   607
            + input_message_buffer->length + pc->SecPkgContextSizes.cbBlockSize);;
543279c75f1a First working version
weijun
parents:
diff changeset
   608
543279c75f1a First working version
weijun
parents:
diff changeset
   609
    SecBuff[1].BufferType = SECBUFFER_DATA;
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   610
    SecBuff[1].cbBuffer = (unsigned long)input_message_buffer->length;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   611
    SecBuff[1].pvBuffer = malloc(SecBuff[1].cbBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   612
    memcpy(SecBuff[1].pvBuffer, input_message_buffer->value, input_message_buffer->length);
543279c75f1a First working version
weijun
parents:
diff changeset
   613
543279c75f1a First working version
weijun
parents:
diff changeset
   614
    SecBuff[2].BufferType = SECBUFFER_PADDING;
543279c75f1a First working version
weijun
parents:
diff changeset
   615
    SecBuff[2].cbBuffer = pc->SecPkgContextSizes.cbBlockSize;
543279c75f1a First working version
weijun
parents:
diff changeset
   616
    SecBuff[2].pvBuffer = malloc(SecBuff[2].cbBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   617
543279c75f1a First working version
weijun
parents:
diff changeset
   618
    ss = EncryptMessage(&pc->hCtxt, conf_req_flag ? 0 : SECQOP_WRAP_NO_ENCRYPT, &BuffDesc, 0);
543279c75f1a First working version
weijun
parents:
diff changeset
   619
    *conf_state = conf_req_flag;
543279c75f1a First working version
weijun
parents:
diff changeset
   620
543279c75f1a First working version
weijun
parents:
diff changeset
   621
    if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   622
        free(SecBuff[0].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   623
        free(SecBuff[1].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   624
        free(SecBuff[2].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   625
        return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   626
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   627
543279c75f1a First working version
weijun
parents:
diff changeset
   628
    memcpy((PBYTE)SecBuff[0].pvBuffer + SecBuff[0].cbBuffer, SecBuff[1].pvBuffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   629
            SecBuff[1].cbBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   630
    memcpy((PBYTE)SecBuff[0].pvBuffer + SecBuff[0].cbBuffer + SecBuff[1].cbBuffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   631
            SecBuff[2].pvBuffer, SecBuff[2].cbBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   632
543279c75f1a First working version
weijun
parents:
diff changeset
   633
    output_message_buffer->length = SecBuff[1].cbBuffer + SecBuff[0].cbBuffer
543279c75f1a First working version
weijun
parents:
diff changeset
   634
            + SecBuff[2].cbBuffer;
543279c75f1a First working version
weijun
parents:
diff changeset
   635
    free(SecBuff[1].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   636
    free(SecBuff[2].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   637
543279c75f1a First working version
weijun
parents:
diff changeset
   638
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   639
}
543279c75f1a First working version
weijun
parents:
diff changeset
   640
543279c75f1a First working version
weijun
parents:
diff changeset
   641
__declspec(dllexport) OM_uint32 gss_unwrap
543279c75f1a First working version
weijun
parents:
diff changeset
   642
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   643
                                gss_ctx_id_t context_handle,
543279c75f1a First working version
weijun
parents:
diff changeset
   644
                                gss_buffer_t input_message_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   645
                                gss_buffer_t output_message_buffer,
543279c75f1a First working version
weijun
parents:
diff changeset
   646
                                int *conf_state,
543279c75f1a First working version
weijun
parents:
diff changeset
   647
                                gss_qop_t *qop_state) {
543279c75f1a First working version
weijun
parents:
diff changeset
   648
    Context* pc = (Context*) context_handle;
543279c75f1a First working version
weijun
parents:
diff changeset
   649
543279c75f1a First working version
weijun
parents:
diff changeset
   650
    SECURITY_STATUS ss;
543279c75f1a First working version
weijun
parents:
diff changeset
   651
    SecBufferDesc BuffDesc;
543279c75f1a First working version
weijun
parents:
diff changeset
   652
    SecBuffer SecBuff[2];
543279c75f1a First working version
weijun
parents:
diff changeset
   653
    ULONG ulQop = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   654
543279c75f1a First working version
weijun
parents:
diff changeset
   655
    BuffDesc.cBuffers = 2;
543279c75f1a First working version
weijun
parents:
diff changeset
   656
    BuffDesc.pBuffers = SecBuff;
543279c75f1a First working version
weijun
parents:
diff changeset
   657
    BuffDesc.ulVersion = SECBUFFER_VERSION;
543279c75f1a First working version
weijun
parents:
diff changeset
   658
543279c75f1a First working version
weijun
parents:
diff changeset
   659
    SecBuff[0].BufferType = SECBUFFER_STREAM;
56553
3e490160d5ec no more warning
weijun
parents: 56552
diff changeset
   660
    SecBuff[0].cbBuffer = (unsigned long)input_message_buffer->length;
56552
543279c75f1a First working version
weijun
parents:
diff changeset
   661
    output_message_buffer->value = SecBuff[0].pvBuffer = malloc(input_message_buffer->length);
543279c75f1a First working version
weijun
parents:
diff changeset
   662
    memcpy(SecBuff[0].pvBuffer, input_message_buffer->value, input_message_buffer->length);
543279c75f1a First working version
weijun
parents:
diff changeset
   663
543279c75f1a First working version
weijun
parents:
diff changeset
   664
    SecBuff[1].BufferType = SECBUFFER_DATA;
543279c75f1a First working version
weijun
parents:
diff changeset
   665
    SecBuff[1].cbBuffer = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   666
    SecBuff[1].pvBuffer = NULL;
543279c75f1a First working version
weijun
parents:
diff changeset
   667
543279c75f1a First working version
weijun
parents:
diff changeset
   668
    ss = DecryptMessage(&pc->hCtxt, &BuffDesc, 0, &ulQop);
543279c75f1a First working version
weijun
parents:
diff changeset
   669
    if (!SEC_SUCCESS(ss)) {
543279c75f1a First working version
weijun
parents:
diff changeset
   670
        free(SecBuff[0].pvBuffer);
543279c75f1a First working version
weijun
parents:
diff changeset
   671
        return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   672
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   673
    output_message_buffer->length = SecBuff[1].cbBuffer;
543279c75f1a First working version
weijun
parents:
diff changeset
   674
    output_message_buffer->value = SecBuff[1].pvBuffer;
543279c75f1a First working version
weijun
parents:
diff changeset
   675
    *conf_state = ulQop == SECQOP_WRAP_NO_ENCRYPT ? 0 : 1;
543279c75f1a First working version
weijun
parents:
diff changeset
   676
    return GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   677
}
543279c75f1a First working version
weijun
parents:
diff changeset
   678
543279c75f1a First working version
weijun
parents:
diff changeset
   679
__declspec(dllexport) OM_uint32 gss_indicate_mechs
543279c75f1a First working version
weijun
parents:
diff changeset
   680
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   681
                                gss_OID_set *mech_set) {
543279c75f1a First working version
weijun
parents:
diff changeset
   682
    gss_OID_set_desc *copy;
543279c75f1a First working version
weijun
parents:
diff changeset
   683
    OM_uint32 minor = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   684
    OM_uint32 major = GSS_S_COMPLETE;
543279c75f1a First working version
weijun
parents:
diff changeset
   685
    int n = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   686
    int i = 0;
543279c75f1a First working version
weijun
parents:
diff changeset
   687
    BOOLEAN hasSpnego = false, hasKerberos = false;
543279c75f1a First working version
weijun
parents:
diff changeset
   688
543279c75f1a First working version
weijun
parents:
diff changeset
   689
    ULONG ccPackages;
543279c75f1a First working version
weijun
parents:
diff changeset
   690
    PSecPkgInfo packages;
543279c75f1a First working version
weijun
parents:
diff changeset
   691
    EnumerateSecurityPackages(&ccPackages, &packages);
543279c75f1a First working version
weijun
parents:
diff changeset
   692
    PP1("EnumerateSecurityPackages returns %ld\n", ccPackages);
543279c75f1a First working version
weijun
parents:
diff changeset
   693
    // TODO: only return Kerberos, so no need to check input later
543279c75f1a First working version
weijun
parents:
diff changeset
   694
    PSecPkgInfo pkgInfo;
543279c75f1a First working version
weijun
parents:
diff changeset
   695
    SECURITY_STATUS ss = QuerySecurityPackageInfo(L"Negotiate", &pkgInfo);
543279c75f1a First working version
weijun
parents:
diff changeset
   696
    if (ss == SEC_E_OK) {
543279c75f1a First working version
weijun
parents:
diff changeset
   697
        // n++;
543279c75f1a First working version
weijun
parents:
diff changeset
   698
        // hasSpnego = true;
543279c75f1a First working version
weijun
parents:
diff changeset
   699
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   700
    ss = QuerySecurityPackageInfo(L"Kerberos", &pkgInfo);
543279c75f1a First working version
weijun
parents:
diff changeset
   701
    if (ss == SEC_E_OK) {
543279c75f1a First working version
weijun
parents:
diff changeset
   702
        n++;
543279c75f1a First working version
weijun
parents:
diff changeset
   703
        hasKerberos = true;
543279c75f1a First working version
weijun
parents:
diff changeset
   704
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   705
543279c75f1a First working version
weijun
parents:
diff changeset
   706
    if ((copy = new gss_OID_set_desc[1]) == NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   707
        major = GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   708
        goto done;
543279c75f1a First working version
weijun
parents:
diff changeset
   709
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   710
543279c75f1a First working version
weijun
parents:
diff changeset
   711
    if ((copy->elements = new gss_OID_desc[n]) == NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   712
        major = GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   713
        goto done;
543279c75f1a First working version
weijun
parents:
diff changeset
   714
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   715
543279c75f1a First working version
weijun
parents:
diff changeset
   716
    if (hasKerberos) {
543279c75f1a First working version
weijun
parents:
diff changeset
   717
        gss_OID_desc *out = &copy->elements[i];
543279c75f1a First working version
weijun
parents:
diff changeset
   718
        if ((out->elements = new char[sizeof(KRB5_OID)]) == NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   719
            major = GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   720
            goto done;
543279c75f1a First working version
weijun
parents:
diff changeset
   721
        }
543279c75f1a First working version
weijun
parents:
diff changeset
   722
        (void) memcpy(out->elements, KRB5_OID, sizeof(KRB5_OID));
543279c75f1a First working version
weijun
parents:
diff changeset
   723
        out->length = sizeof(KRB5_OID);
543279c75f1a First working version
weijun
parents:
diff changeset
   724
        i++;
543279c75f1a First working version
weijun
parents:
diff changeset
   725
    }    
543279c75f1a First working version
weijun
parents:
diff changeset
   726
    if (hasSpnego) {
543279c75f1a First working version
weijun
parents:
diff changeset
   727
        gss_OID_desc *out = &copy->elements[i];
543279c75f1a First working version
weijun
parents:
diff changeset
   728
        char in[6] = { 0x2B, 0x06, 0x01, 0x05, 0x05, 0x02 };
543279c75f1a First working version
weijun
parents:
diff changeset
   729
        if ((out->elements = new char[sizeof(in)]) == NULL) {
543279c75f1a First working version
weijun
parents:
diff changeset
   730
            major = GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   731
            goto done;
543279c75f1a First working version
weijun
parents:
diff changeset
   732
        }
543279c75f1a First working version
weijun
parents:
diff changeset
   733
        (void) memcpy(out->elements, in, sizeof(in));
543279c75f1a First working version
weijun
parents:
diff changeset
   734
        out->length = sizeof(in);
543279c75f1a First working version
weijun
parents:
diff changeset
   735
        i++;
543279c75f1a First working version
weijun
parents:
diff changeset
   736
    }    
543279c75f1a First working version
weijun
parents:
diff changeset
   737
    copy->count = i;
543279c75f1a First working version
weijun
parents:
diff changeset
   738
543279c75f1a First working version
weijun
parents:
diff changeset
   739
    *mech_set = copy;
543279c75f1a First working version
weijun
parents:
diff changeset
   740
done:
543279c75f1a First working version
weijun
parents:
diff changeset
   741
    if (major != GSS_S_COMPLETE) {
543279c75f1a First working version
weijun
parents:
diff changeset
   742
        // (void) generic_gss_release_oid_set(&minor, &copy);
543279c75f1a First working version
weijun
parents:
diff changeset
   743
    }
543279c75f1a First working version
weijun
parents:
diff changeset
   744
543279c75f1a First working version
weijun
parents:
diff changeset
   745
    return (major);
543279c75f1a First working version
weijun
parents:
diff changeset
   746
}
543279c75f1a First working version
weijun
parents:
diff changeset
   747
543279c75f1a First working version
weijun
parents:
diff changeset
   748
__declspec(dllexport) OM_uint32 gss_inquire_names_for_mech
543279c75f1a First working version
weijun
parents:
diff changeset
   749
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   750
                                const gss_OID mechanism,
543279c75f1a First working version
weijun
parents:
diff changeset
   751
                                gss_OID_set *name_types) {
543279c75f1a First working version
weijun
parents:
diff changeset
   752
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   753
}
543279c75f1a First working version
weijun
parents:
diff changeset
   754
543279c75f1a First working version
weijun
parents:
diff changeset
   755
__declspec(dllexport) OM_uint32 gss_add_oid_set_member
543279c75f1a First working version
weijun
parents:
diff changeset
   756
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   757
                                gss_OID member_oid,
543279c75f1a First working version
weijun
parents:
diff changeset
   758
                                gss_OID_set *oid_set) {
543279c75f1a First working version
weijun
parents:
diff changeset
   759
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   760
}
543279c75f1a First working version
weijun
parents:
diff changeset
   761
543279c75f1a First working version
weijun
parents:
diff changeset
   762
__declspec(dllexport) OM_uint32 gss_display_status
543279c75f1a First working version
weijun
parents:
diff changeset
   763
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   764
                                OM_uint32 status_value,
543279c75f1a First working version
weijun
parents:
diff changeset
   765
                                int status_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   766
                                gss_OID mech_type,
543279c75f1a First working version
weijun
parents:
diff changeset
   767
                                OM_uint32 *message_context,
543279c75f1a First working version
weijun
parents:
diff changeset
   768
                                gss_buffer_t status_string) {
543279c75f1a First working version
weijun
parents:
diff changeset
   769
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   770
}
543279c75f1a First working version
weijun
parents:
diff changeset
   771
543279c75f1a First working version
weijun
parents:
diff changeset
   772
__declspec(dllexport) OM_uint32 gss_create_empty_oid_set
543279c75f1a First working version
weijun
parents:
diff changeset
   773
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   774
                                gss_OID_set *oid_set) {
543279c75f1a First working version
weijun
parents:
diff changeset
   775
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   776
}
543279c75f1a First working version
weijun
parents:
diff changeset
   777
543279c75f1a First working version
weijun
parents:
diff changeset
   778
__declspec(dllexport) OM_uint32 gss_release_oid_set
543279c75f1a First working version
weijun
parents:
diff changeset
   779
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   780
                                gss_OID_set *set) {
543279c75f1a First working version
weijun
parents:
diff changeset
   781
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   782
}
543279c75f1a First working version
weijun
parents:
diff changeset
   783
543279c75f1a First working version
weijun
parents:
diff changeset
   784
__declspec(dllexport) OM_uint32 gss_release_buffer
543279c75f1a First working version
weijun
parents:
diff changeset
   785
                                (OM_uint32 *minor_status,
543279c75f1a First working version
weijun
parents:
diff changeset
   786
                                gss_buffer_t buffer) {
543279c75f1a First working version
weijun
parents:
diff changeset
   787
    return GSS_S_FAILURE;
543279c75f1a First working version
weijun
parents:
diff changeset
   788
}
543279c75f1a First working version
weijun
parents:
diff changeset
   789
543279c75f1a First working version
weijun
parents:
diff changeset
   790
#ifdef __cplusplus
543279c75f1a First working version
weijun
parents:
diff changeset
   791
}
543279c75f1a First working version
weijun
parents:
diff changeset
   792
#endif