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