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