--- a/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp Tue May 15 12:19:38 2018 +0800
+++ b/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp Tue May 15 12:20:42 2018 +0800
@@ -40,7 +40,7 @@
#pragma comment(lib, "secur32.lib")
-#define DEBUG
+//#define DEBUG
#ifdef DEBUG
TCHAR _bb[256];
@@ -87,9 +87,80 @@
extern "C" {
#endif /* __cplusplus */
-__declspec(dllexport) OM_uint32 gss_release_name
- (OM_uint32 *minor_status,
- gss_name_t *name) {
+/* This section holds supporting functions that are not exported */
+
+long
+TimeStampToLong(TimeStamp *time)
+{
+ ULARGE_INTEGER *a, *b;
+ FILETIME fnow;
+ GetSystemTimeAsFileTime(&fnow);
+ a = (ULARGE_INTEGER*)time;
+ b = (ULARGE_INTEGER*)&fnow;
+ PP("Difference %ld\n", (long)((a->QuadPart - b->QuadPart) / 10000000));
+ return (long)((a->QuadPart - b->QuadPart) / 10000000);
+}
+
+void
+FillContextAfterEstablished(Context *pc)
+{
+ QueryContextAttributes(
+ &pc->hCtxt, SECPKG_ATTR_SIZES, &pc->SecPkgContextSizes);
+}
+
+Context*
+NewContext(TCHAR* PackageName)
+{
+ SECURITY_STATUS ss;
+ PSecPkgInfo pkgInfo;
+
+ Context* out = (Context*)malloc(sizeof(Context));
+ ss = QuerySecurityPackageInfo(PackageName, &pkgInfo);
+ if (!SEC_SUCCESS(ss)) {
+ return NULL;
+ }
+ out->phCred = NULL;
+ out->cbMaxMessage = pkgInfo->cbMaxToken;
+ PP(" QuerySecurityPackageInfo %ls goes %ld\n", PackageName, out->cbMaxMessage);
+ wcscpy(out->PackageName, PackageName);
+ FreeContextBuffer(pkgInfo);
+ return out;
+}
+
+int
+flagSspi2Gss(int fin)
+{
+ int fout = 0;
+ if (fin & ISC_REQ_MUTUAL_AUTH) fout |= GSS_C_MUTUAL_FLAG;
+ if (fin & ISC_REQ_CONFIDENTIALITY) fout |= GSS_C_CONF_FLAG;
+ if (fin & ISC_REQ_DELEGATE) fout |= GSS_C_DELEG_FLAG;
+ if (fin & ISC_REQ_INTEGRITY) fout |= GSS_C_INTEG_FLAG;
+ if (fin & ISC_REQ_REPLAY_DETECT) fout |= GSS_C_REPLAY_FLAG;
+ if (fin & ISC_REQ_SEQUENCE_DETECT) fout |= GSS_C_SEQUENCE_FLAG;
+ return fout;
+}
+
+int
+flagGss2Sspi(int fin)
+{
+ int fout = 0;
+ if (fin & GSS_C_MUTUAL_FLAG) fout |= ISC_RET_MUTUAL_AUTH;
+ if (fin & GSS_C_CONF_FLAG) fout |= ISC_RET_CONFIDENTIALITY;
+ if (fin & GSS_C_DELEG_FLAG) fout |= ISC_RET_DELEGATE;
+ if (fin & GSS_C_INTEG_FLAG) fout |= ISC_RET_INTEGRITY;
+ if (fin & GSS_C_REPLAY_FLAG) fout |= ISC_RET_REPLAY_DETECT;
+ if (fin & GSS_C_SEQUENCE_FLAG) fout |= ISC_RET_SEQUENCE_DETECT;
+ return fout;
+}
+
+/* End support section */
+
+/* This section holds exported functions that currently have no implementation */
+
+__declspec(dllexport) OM_uint32
+gss_release_name(OM_uint32 *minor_status,
+ gss_name_t *name)
+{
if (name != NULL) {
SecPkgCredentials_Names* names = (SecPkgCredentials_Names*)name;
if (names->sUserName != NULL) {
@@ -101,34 +172,29 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_import_name
- (OM_uint32 *minor_status,
- gss_buffer_t input_name_buffer,
- gss_OID input_name_type,
- gss_name_t *output_name) {
-PP("");
+__declspec(dllexport) OM_uint32
+gss_import_name(OM_uint32 *minor_status,
+ gss_buffer_t input_name_buffer,
+ gss_OID input_name_type,
+ gss_name_t *output_name)
+{
if (input_name_buffer == NULL || input_name_buffer->value == NULL
|| input_name_buffer->length == 0) {
return GSS_S_BAD_NAME;
}
-PP("");
SecPkgCredentials_Names* names = new SecPkgCredentials_Names();
if (names == NULL) {
goto err;
}
int len = (int)input_name_buffer->length;
-PP("%d", len);
names->sUserName = new SEC_WCHAR[len + 1];
-PP("");
if (names->sUserName == NULL) {
goto err;
}
-PP("");
if (MultiByteToWideChar(CP_ACP, 0, (LPSTR)input_name_buffer->value, len,
names->sUserName, len) == 0) {
goto err;
}
-PP("");
names->sUserName[len] = 0;
if (input_name_type != NULL && input_name_type->length == 10
&& !memcmp(input_name_type->elements, HOST_SERVICE_NAME_OID, 10)) {
@@ -151,11 +217,12 @@
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_compare_name
- (OM_uint32 *minor_status,
- gss_name_t name1,
- gss_name_t name2,
- int *name_equal) {
+__declspec(dllexport) OM_uint32
+gss_compare_name(OM_uint32 *minor_status,
+ gss_name_t name1,
+ gss_name_t name2,
+ int *name_equal)
+{
if (name1 == NULL || name2 == NULL) {
*name_equal = 0;
return GSS_S_BAD_NAME;
@@ -171,11 +238,12 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_canonicalize_name
- (OM_uint32 *minor_status,
- gss_name_t input_name,
- gss_OID mech_type,
- gss_name_t *output_name) {
+__declspec(dllexport) OM_uint32
+gss_canonicalize_name(OM_uint32 *minor_status,
+ gss_name_t input_name,
+ gss_OID mech_type,
+ gss_name_t *output_name)
+{
SecPkgCredentials_Names* names1 = (SecPkgCredentials_Names*)input_name;
SecPkgCredentials_Names* names2 = new SecPkgCredentials_Names();
names2->sUserName = new SEC_WCHAR[lstrlen(names1->sUserName) + 1];
@@ -184,10 +252,11 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_export_name
- (OM_uint32 *minor_status,
- gss_name_t input_name,
- gss_buffer_t exported_name) {
+__declspec(dllexport) OM_uint32
+gss_export_name(OM_uint32 *minor_status,
+ gss_name_t input_name,
+ gss_buffer_t exported_name)
+{
SecPkgCredentials_Names* names = (SecPkgCredentials_Names*)input_name;
int len = (int)wcslen(names->sUserName);
char* buffer = new char[len+1];
@@ -198,11 +267,12 @@
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_display_name
- (OM_uint32 *minor_status,
- gss_name_t input_name,
- gss_buffer_t output_name_buffer,
- gss_OID *output_name_type) {
+__declspec(dllexport) OM_uint32
+gss_display_name(OM_uint32 *minor_status,
+ gss_name_t input_name,
+ gss_buffer_t output_name_buffer,
+ gss_OID *output_name_type)
+{
SecPkgCredentials_Names* names = (SecPkgCredentials_Names*)input_name;
int len = (int)wcslen(names->sUserName);
char* buffer = new char[len+1];
@@ -221,25 +291,16 @@
return GSS_S_COMPLETE;
}
-long TimeStampToLong(TimeStamp *time) {
- ULARGE_INTEGER *a, *b;
- FILETIME fnow;
- GetSystemTimeAsFileTime(&fnow);
- a = (ULARGE_INTEGER*)time;
- b = (ULARGE_INTEGER*)&fnow;
- PP("Difference %ld\n", (long)((a->QuadPart - b->QuadPart) / 10000000));
- return (long)((a->QuadPart - b->QuadPart) / 10000000);
-}
-
-__declspec(dllexport) OM_uint32 gss_acquire_cred
- (OM_uint32 *minor_status,
- gss_name_t desired_name,
- OM_uint32 time_req,
- gss_OID_set desired_mech,
- gss_cred_usage_t cred_usage,
- gss_cred_id_t *output_cred_handle,
- gss_OID_set *actual_mechs,
- OM_uint32 *time_rec) {
+__declspec(dllexport) OM_uint32
+gss_acquire_cred(OM_uint32 *minor_status,
+ gss_name_t desired_name,
+ OM_uint32 time_req,
+ gss_OID_set desired_mech,
+ gss_cred_usage_t cred_usage,
+ gss_cred_id_t *output_cred_handle,
+ gss_OID_set *actual_mechs,
+ OM_uint32 *time_rec)
+{
if (desired_name != NULL) {
return GSS_S_FAILURE; // Only support default cred
}
@@ -258,8 +319,7 @@
NULL,
NULL,
cred,
- &ts
- );
+ &ts);
actual_mechs = &desired_mech;
*output_cred_handle = (void*)cred;
@@ -270,9 +330,10 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_release_cred
- (OM_uint32 *minor_status,
- gss_cred_id_t *cred_handle) {
+__declspec(dllexport) OM_uint32
+gss_release_cred(OM_uint32 *minor_status,
+ gss_cred_id_t *cred_handle)
+{
if (cred_handle && *cred_handle) {
FreeCredentialsHandle((CredHandle*)*cred_handle);
*cred_handle = GSS_C_NO_CREDENTIAL;
@@ -280,13 +341,14 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_inquire_cred
- (OM_uint32 *minor_status,
- gss_cred_id_t cred_handle,
- gss_name_t *name,
- OM_uint32 *lifetime,
- gss_cred_usage_t *cred_usage,
- gss_OID_set *mechanisms) {
+__declspec(dllexport) OM_uint32
+gss_inquire_cred(OM_uint32 *minor_status,
+ gss_cred_id_t cred_handle,
+ gss_name_t *name,
+ OM_uint32 *lifetime,
+ gss_cred_usage_t *cred_usage,
+ gss_OID_set *mechanisms)
+{
CredHandle* cred = (CredHandle*)cred_handle;
SECURITY_STATUS ss;
if (name) {
@@ -298,73 +360,29 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_import_sec_context
- (OM_uint32 *minor_status,
- gss_buffer_t interprocess_token,
- gss_ctx_id_t *context_handle) {
+__declspec(dllexport) OM_uint32
+gss_import_sec_context(OM_uint32 *minor_status,
+ gss_buffer_t interprocess_token,
+ gss_ctx_id_t *context_handle)
+{
return GSS_S_FAILURE;
}
-void FillContextAfterEstablished(Context *pc) {
- QueryContextAttributes(&pc->hCtxt, SECPKG_ATTR_SIZES,
- &pc->SecPkgContextSizes);
-}
-
-Context* NewContext(TCHAR* PackageName) {
- SECURITY_STATUS ss;
- PSecPkgInfo pkgInfo;
-
- Context* out = (Context*)malloc(sizeof(Context));
- ss = QuerySecurityPackageInfo(
- PackageName,
- &pkgInfo);
- if (!SEC_SUCCESS(ss)) {
- return NULL;
- }
- out->phCred = NULL;
- out->cbMaxMessage = pkgInfo->cbMaxToken;
- PP(" QuerySecurityPackageInfo %ls goes %ld\n", PackageName, out->cbMaxMessage);
- wcscpy(out->PackageName, PackageName);
- FreeContextBuffer(pkgInfo);
- return out;
-}
-
-int flagSspi2Gss(int fin) {
- int fout = 0;
- if (fin & ISC_REQ_MUTUAL_AUTH) fout |= GSS_C_MUTUAL_FLAG;
- if (fin & ISC_REQ_CONFIDENTIALITY) fout |= GSS_C_CONF_FLAG;
- if (fin & ISC_REQ_DELEGATE) fout |= GSS_C_DELEG_FLAG;
- if (fin & ISC_REQ_INTEGRITY) fout |= GSS_C_INTEG_FLAG;
- if (fin & ISC_REQ_REPLAY_DETECT) fout |= GSS_C_REPLAY_FLAG;
- if (fin & ISC_REQ_SEQUENCE_DETECT) fout |= GSS_C_SEQUENCE_FLAG;
- return fout;
-}
-
-int flagGss2Sspi(int fin) {
- int fout = 0;
- if (fin & GSS_C_MUTUAL_FLAG) fout |= ISC_RET_MUTUAL_AUTH;
- if (fin & GSS_C_CONF_FLAG) fout |= ISC_RET_CONFIDENTIALITY;
- if (fin & GSS_C_DELEG_FLAG) fout |= ISC_RET_DELEGATE;
- if (fin & GSS_C_INTEG_FLAG) fout |= ISC_RET_INTEGRITY;
- if (fin & GSS_C_REPLAY_FLAG) fout |= ISC_RET_REPLAY_DETECT;
- if (fin & GSS_C_SEQUENCE_FLAG) fout |= ISC_RET_SEQUENCE_DETECT;
- return fout;
-}
-
-__declspec(dllexport) OM_uint32 gss_init_sec_context
- (OM_uint32 *minor_status,
- gss_cred_id_t initiator_cred_handle,
- gss_ctx_id_t *context_handle,
- gss_name_t target_name,
- gss_OID mech_type,
- OM_uint32 req_flags,
- OM_uint32 time_req,
- gss_channel_bindings_t input_chan_bindings,
- gss_buffer_t input_token,
- gss_OID *actual_mech_type,
- gss_buffer_t output_token,
- OM_uint32 *ret_flags,
- OM_uint32 *time_rec) {
+__declspec(dllexport) OM_uint32
+gss_init_sec_context(OM_uint32 *minor_status,
+ gss_cred_id_t initiator_cred_handle,
+ gss_ctx_id_t *context_handle,
+ gss_name_t target_name,
+ gss_OID mech_type,
+ OM_uint32 req_flags,
+ OM_uint32 time_req,
+ gss_channel_bindings_t input_chan_bindings,
+ gss_buffer_t input_token,
+ gss_OID *actual_mech_type,
+ gss_buffer_t output_token,
+ OM_uint32 *ret_flags,
+ OM_uint32 *time_rec)
+{
SECURITY_STATUS ss;
TimeStamp Lifetime;
SecBufferDesc InBuffDesc;
@@ -479,76 +497,82 @@
}
}
-__declspec(dllexport) OM_uint32 gss_accept_sec_context
- (OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- gss_cred_id_t acceptor_cred_handle,
- gss_buffer_t input_token,
- gss_channel_bindings_t input_chan_bindings,
- gss_name_t *src_name,
- gss_OID *mech_type,
- gss_buffer_t output_token,
- OM_uint32 *ret_flags,
- OM_uint32 *time_rec,
- gss_cred_id_t *delegated_cred_handle) {
+__declspec(dllexport) OM_uint32
+gss_accept_sec_context(OM_uint32 *minor_status,
+ gss_ctx_id_t *context_handle,
+ gss_cred_id_t acceptor_cred_handle,
+ gss_buffer_t input_token,
+ gss_channel_bindings_t input_chan_bindings,
+ gss_name_t *src_name,
+ gss_OID *mech_type,
+ gss_buffer_t output_token,
+ OM_uint32 *ret_flags,
+ OM_uint32 *time_rec,
+ gss_cred_id_t *delegated_cred_handle)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_inquire_context
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- gss_name_t *src_name,
- gss_name_t *targ_name,
- OM_uint32 *lifetime_rec,
- gss_OID *mech_type,
- OM_uint32 *ctx_flags,
- int *locally_initiated,
- int *open) {
+__declspec(dllexport) OM_uint32
+gss_inquire_context(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ gss_name_t *src_name,
+ gss_name_t *targ_name,
+ OM_uint32 *lifetime_rec,
+ gss_OID *mech_type,
+ OM_uint32 *ctx_flags,
+ int *locally_initiated,
+ int *open)
+{
Context* pc = (Context*) context_handle;
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_delete_sec_context
- (OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- gss_buffer_t output_token) {
+__declspec(dllexport) OM_uint32
+gss_delete_sec_context(OM_uint32 *minor_status,
+ gss_ctx_id_t *context_handle,
+ gss_buffer_t output_token)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_context_time
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- OM_uint32 *time_rec) {
+__declspec(dllexport) OM_uint32
+gss_context_time(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ OM_uint32 *time_rec)
+{
Context* pc = (Context*) context_handle;
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_wrap_size_limit
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- int conf_req_flag,
- gss_qop_t qop_req,
- OM_uint32 req_output_size,
- OM_uint32 *max_input_size) {
+__declspec(dllexport) OM_uint32
+gss_wrap_size_limit(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ int conf_req_flag,
+ gss_qop_t qop_req,
+ OM_uint32 req_output_size,
+ OM_uint32 *max_input_size)
+{
Context* pc = (Context*) context_handle;
*max_input_size = pc->cbMaxMessage;
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_export_sec_context
- (OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- gss_buffer_t interprocess_token) {
+__declspec(dllexport) OM_uint32
+gss_export_sec_context(OM_uint32 *minor_status,
+ gss_ctx_id_t *context_handle,
+ gss_buffer_t interprocess_token)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_get_mic
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- gss_qop_t qop_req,
- gss_buffer_t message_buffer,
- gss_buffer_t msg_token) {
-
+__declspec(dllexport) OM_uint32
+gss_get_mic(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ gss_qop_t qop_req,
+ gss_buffer_t message_buffer,
+ gss_buffer_t msg_token)
+{
Context* pc = (Context*) context_handle;
SECURITY_STATUS ss;
@@ -578,12 +602,13 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_verify_mic
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- gss_buffer_t message_buffer,
- gss_buffer_t token_buffer,
- gss_qop_t *qop_state) {
+__declspec(dllexport) OM_uint32
+gss_verify_mic(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ gss_buffer_t message_buffer,
+ gss_buffer_t token_buffer,
+ gss_qop_t *qop_state)
+{
Context* pc = (Context*) context_handle;
SECURITY_STATUS ss;
@@ -615,15 +640,15 @@
}
}
-__declspec(dllexport) OM_uint32 gss_wrap
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- int conf_req_flag,
- gss_qop_t qop_req,
- gss_buffer_t input_message_buffer,
- int *conf_state,
- gss_buffer_t output_message_buffer) {
-
+__declspec(dllexport) OM_uint32
+gss_wrap(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ int conf_req_flag,
+ gss_qop_t qop_req,
+ gss_buffer_t input_message_buffer,
+ int *conf_state,
+ gss_buffer_t output_message_buffer)
+{
Context* pc = (Context*) context_handle;
SECURITY_STATUS ss;
@@ -675,13 +700,14 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_unwrap
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- gss_buffer_t input_message_buffer,
- gss_buffer_t output_message_buffer,
- int *conf_state,
- gss_qop_t *qop_state) {
+__declspec(dllexport) OM_uint32
+gss_unwrap(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ gss_buffer_t input_message_buffer,
+ gss_buffer_t output_message_buffer,
+ int *conf_state,
+ gss_qop_t *qop_state)
+{
Context* pc = (Context*) context_handle;
SECURITY_STATUS ss;
@@ -715,9 +741,10 @@
return GSS_S_COMPLETE;
}
-__declspec(dllexport) OM_uint32 gss_indicate_mechs
- (OM_uint32 *minor_status,
- gss_OID_set *mech_set) {
+__declspec(dllexport) OM_uint32
+gss_indicate_mechs(OM_uint32 *minor_status,
+ gss_OID_set *mech_set)
+{
gss_OID_set_desc *copy;
OM_uint32 minor = 0;
OM_uint32 major = GSS_S_COMPLETE;
@@ -784,48 +811,56 @@
return (major);
}
-__declspec(dllexport) OM_uint32 gss_inquire_names_for_mech
- (OM_uint32 *minor_status,
- const gss_OID mechanism,
- gss_OID_set *name_types) {
+__declspec(dllexport) OM_uint32
+gss_inquire_names_for_mech(OM_uint32 *minor_status,
+ const gss_OID mechanism,
+ gss_OID_set *name_types)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_add_oid_set_member
- (OM_uint32 *minor_status,
- gss_OID member_oid,
- gss_OID_set *oid_set) {
+__declspec(dllexport) OM_uint32
+gss_add_oid_set_member(OM_uint32 *minor_status,
+ gss_OID member_oid,
+ gss_OID_set *oid_set)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_display_status
- (OM_uint32 *minor_status,
- OM_uint32 status_value,
- int status_type,
- gss_OID mech_type,
- OM_uint32 *message_context,
- gss_buffer_t status_string) {
+__declspec(dllexport) OM_uint32
+gss_display_status(OM_uint32 *minor_status,
+ OM_uint32 status_value,
+ int status_type,
+ gss_OID mech_type,
+ OM_uint32 *message_context,
+ gss_buffer_t status_string)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_create_empty_oid_set
- (OM_uint32 *minor_status,
- gss_OID_set *oid_set) {
+__declspec(dllexport) OM_uint32
+gss_create_empty_oid_set(OM_uint32 *minor_status,
+ gss_OID_set *oid_set)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_release_oid_set
- (OM_uint32 *minor_status,
- gss_OID_set *set) {
+__declspec(dllexport) OM_uint32
+gss_release_oid_set(OM_uint32 *minor_status,
+ gss_OID_set *set)
+{
return GSS_S_FAILURE;
}
-__declspec(dllexport) OM_uint32 gss_release_buffer
- (OM_uint32 *minor_status,
- gss_buffer_t buffer) {
+__declspec(dllexport) OM_uint32
+gss_release_buffer(OM_uint32 *minor_status,
+ gss_buffer_t buffer)
+{
return GSS_S_FAILURE;
}
+/* End implemented section */
+
#ifdef __cplusplus
}
#endif