0N/A/*
2362N/A * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A#include "sun_security_jgss_wrapper_GSSLibStub.h"
0N/A#include "NativeUtil.h"
0N/A#include "NativeFunc.h"
0N/A
0N/A/* Constants for indicating what type of info is needed for inqueries */
0N/Aconst int TYPE_CRED_NAME = 10;
0N/Aconst int TYPE_CRED_TIME = 11;
0N/Aconst int TYPE_CRED_USAGE = 12;
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: init
0N/A * Signature: (Ljava/lang/String;)Z
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_init(JNIEnv *env,
0N/A jclass jcls,
0N/A jstring jlibName) {
0N/A const char *libName;
0N/A char *error = NULL;
0N/A
0N/A if (jlibName == NULL) {
0N/A debug(env, "[GSSLibStub_init] GSS lib name is NULL");
0N/A return JNI_FALSE;
0N/A }
0N/A
0N/A libName = (*env)->GetStringUTFChars(env, jlibName, NULL);
0N/A sprintf(debugBuf, "[GSSLibStub_init] libName=%s", libName);
0N/A debug(env, debugBuf);
0N/A
0N/A /* initialize global function table */
0N/A error = loadNative(libName);
0N/A (*env)->ReleaseStringUTFChars(env, jlibName, libName);
0N/A
0N/A if (error == NULL) {
0N/A return JNI_TRUE;
0N/A } else {
0N/A debug(env, error);
0N/A return JNI_FALSE;
0N/A }
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getMechPtr
0N/A * Signature: ([B)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getMechPtr(JNIEnv *env,
0N/A jclass jcls,
0N/A jbyteArray jbytes) {
0N/A gss_OID cOid;
0N/A int i, len;
0N/A jbyte* bytes;
0N/A jthrowable gssEx;
0N/A jboolean found;
0N/A
0N/A if (jbytes != NULL) {
0N/A found = JNI_FALSE;
0N/A len = (*env)->GetArrayLength(env, jbytes) - 2;
0N/A bytes = (*env)->GetByteArrayElements(env, jbytes, NULL);
0N/A if (bytes != NULL) {
0N/A for (i = 0; i < ftab->mechs->count; i++) {
0N/A cOid = &(ftab->mechs->elements[i]);
0N/A if (len == cOid->length &&
0N/A (memcmp(cOid->elements, (bytes + 2), len) == 0)) {
0N/A // Found a match
0N/A found = JNI_TRUE;
0N/A break;
0N/A }
0N/A }
0N/A (*env)->ReleaseByteArrayElements(env, jbytes, bytes, 0);
0N/A }
0N/A if (found != JNI_TRUE) {
0N/A checkStatus(env, NULL, GSS_S_BAD_MECH, 0, "[GSSLibStub_getMechPtr]");
0N/A return NULL;
0N/A } else return cOid;
0N/A } else return GSS_C_NO_OID;
0N/A}
0N/A
0N/A
0N/A/*
0N/A * Utility routine which creates a gss_channel_bindings_t structure
0N/A * using the specified org.ietf.jgss.ChannelBinding object.
0N/A */
0N/Agss_channel_bindings_t getGSSCB(JNIEnv *env, jobject jcb) {
0N/A gss_channel_bindings_t cb;
0N/A jobject jinetAddr;
0N/A jbyteArray value;
0N/A
0N/A if (jcb == NULL) {
0N/A return GSS_C_NO_CHANNEL_BINDINGS;
0N/A }
0N/A cb = malloc(sizeof(struct gss_channel_bindings_struct));
0N/A /* set up initiator address */
0N/A jinetAddr =
0N/A (*env)->CallObjectMethod(env, jcb,
0N/A MID_ChannelBinding_getInitiatorAddr);
0N/A if (jinetAddr != NULL) {
0N/A cb->initiator_addrtype = GSS_C_AF_INET;
0N/A value = (*env)->CallObjectMethod(env, jinetAddr,
0N/A MID_InetAddress_getAddr);
0N/A initGSSBuffer(env, value, &(cb->initiator_address));
0N/A } else {
0N/A cb->initiator_addrtype = GSS_C_AF_NULLADDR;
0N/A cb->initiator_address.length = 0;
0N/A cb->initiator_address.value = NULL;
0N/A }
0N/A /* set up acceptor address */
0N/A jinetAddr =
0N/A (*env)->CallObjectMethod(env, jcb,
0N/A MID_ChannelBinding_getAcceptorAddr);
0N/A if (jinetAddr != NULL) {
0N/A cb->acceptor_addrtype = GSS_C_AF_INET;
0N/A value = (*env)->CallObjectMethod(env, jinetAddr,
0N/A MID_InetAddress_getAddr);
0N/A initGSSBuffer(env, value, &(cb->acceptor_address));
0N/A } else {
0N/A cb->acceptor_addrtype = GSS_C_AF_NULLADDR;
0N/A cb->acceptor_address.length = 0;
0N/A cb->acceptor_address.value = NULL;
0N/A }
0N/A /* set up application data */
0N/A value = (*env)->CallObjectMethod(env, jcb,
0N/A MID_ChannelBinding_getAppData);
0N/A if (value != NULL) {
0N/A initGSSBuffer(env, value, &(cb->application_data));
0N/A } else {
0N/A cb->application_data.length = 0;
0N/A cb->application_data.value = NULL;
0N/A }
0N/A return cb;
0N/A}
0N/A
0N/A/*
0N/A * Utility routine which releases the specified gss_channel_bindings_t
0N/A * structure.
0N/A */
0N/Avoid releaseGSSCB(JNIEnv *env, jobject jcb, gss_channel_bindings_t cb) {
0N/A jobject jinetAddr;
0N/A jbyteArray value;
0N/A
0N/A if (cb == GSS_C_NO_CHANNEL_BINDINGS) return;
0N/A /* release initiator address */
0N/A if (cb->initiator_addrtype != GSS_C_AF_NULLADDR) {
0N/A jinetAddr =
0N/A (*env)->CallObjectMethod(env, jcb,
0N/A MID_ChannelBinding_getInitiatorAddr);
0N/A value = (*env)->CallObjectMethod(env, jinetAddr,
0N/A MID_InetAddress_getAddr);
0N/A resetGSSBuffer(env, value, &(cb->initiator_address));
0N/A }
0N/A /* release acceptor address */
0N/A if (cb->acceptor_addrtype != GSS_C_AF_NULLADDR) {
0N/A jinetAddr =
0N/A (*env)->CallObjectMethod(env, jcb,
0N/A MID_ChannelBinding_getAcceptorAddr);
0N/A value = (*env)->CallObjectMethod(env, jinetAddr,
0N/A MID_InetAddress_getAddr);
0N/A resetGSSBuffer(env, value, &(cb->acceptor_address));
0N/A }
0N/A /* release application data */
0N/A if (cb->application_data.length != 0) {
0N/A value = (*env)->CallObjectMethod(env, jcb,
0N/A MID_ChannelBinding_getAppData);
0N/A resetGSSBuffer(env, value, &(cb->application_data));
0N/A }
0N/A free(cb);
0N/A}
0N/A
0N/A/*
0N/A * Utility routine for storing the supplementary information
0N/A * into the specified org.ietf.jgss.MessageProp object.
0N/A */
0N/Avoid setSupplementaryInfo(JNIEnv *env, jobject jstub, jobject jprop,
0N/A int suppInfo, int minor) {
0N/A jboolean isDuplicate, isOld, isUnseq, hasGap;
0N/A jstring minorMsg;
0N/A
0N/A if (suppInfo != GSS_S_COMPLETE) {
0N/A isDuplicate = ((suppInfo & GSS_S_DUPLICATE_TOKEN) != 0);
0N/A isOld = ((suppInfo & GSS_S_OLD_TOKEN) != 0);
0N/A isUnseq = ((suppInfo & GSS_S_UNSEQ_TOKEN) != 0);
0N/A hasGap = ((suppInfo & GSS_S_GAP_TOKEN) != 0);
0N/A minorMsg = getMinorMessage(env, jstub, minor);
0N/A (*env)->CallVoidMethod(env, jprop, MID_MessageProp_setSupplementaryStates,
0N/A isDuplicate, isOld, isUnseq, hasGap, minor,
0N/A minorMsg);
0N/A }
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: indicateMechs
0N/A * Signature: ()[Lorg/ietf/jgss/Oid;
0N/A */
0N/AJNIEXPORT jobjectArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_indicateMechs(JNIEnv *env,
0N/A jclass jcls)
0N/A{
0N/A if (ftab->mechs != NULL && ftab->mechs != GSS_C_NO_OID_SET) {
0N/A return getJavaOIDArray(env, ftab->mechs);
0N/A } else return NULL;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: inquireNamesForMech
0N/A * Signature: ()[Lorg/ietf/jgss/Oid;
0N/A */
0N/AJNIEXPORT jobjectArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_inquireNamesForMech(JNIEnv *env,
0N/A jobject jobj)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_OID mech;
0N/A gss_OID_set nameTypes;
0N/A jobjectArray result;
0N/A
0N/A if (ftab->inquireNamesForMech != NULL) {
0N/A
0N/A mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech);
0N/A nameTypes = GSS_C_NO_OID_SET;
0N/A
0N/A /* gss_inquire_names_for_mech(...) => N/A */
0N/A major = (*ftab->inquireNamesForMech)(&minor, mech, &nameTypes);
0N/A
0N/A result = getJavaOIDArray(env, nameTypes);
0N/A
0N/A /* release intermediate buffers */
0N/A deleteGSSOIDSet(nameTypes);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireNamesForMech]");
0N/A return result;
0N/A } else return NULL;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: releaseName
0N/A * Signature: (J)V
0N/A */
0N/AJNIEXPORT void JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_releaseName(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pName)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_name_t nameHdl;
0N/A
0N/A nameHdl = (gss_name_t) pName;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_releaseName] %ld", (long) pName);
0N/A debug(env, debugBuf);
0N/A
0N/A if (nameHdl != GSS_C_NO_NAME) {
0N/A /* gss_release_name(...) => GSS_S_BAD_NAME */
0N/A major = (*ftab->releaseName)(&minor, &nameHdl);
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseName]");
0N/A }
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: importName
0N/A * Signature: ([BLorg/ietf/jgss/Oid;)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_importName(JNIEnv *env,
0N/A jobject jobj,
0N/A jbyteArray jnameVal,
0N/A jobject jnameType)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_buffer_desc nameVal;
0N/A gss_OID nameType;
0N/A gss_name_t nameHdl;
0N/A
0N/A debug(env, "[GSSLibStub_importName]");
0N/A
0N/A initGSSBuffer(env, jnameVal, &nameVal);
0N/A nameType = newGSSOID(env, jnameType);
0N/A nameHdl = GSS_C_NO_NAME;
0N/A
0N/A /* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME,
0N/A GSS_S_BAD_MECH */
0N/A major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl);
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_importName] %ld", (long) nameHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A /* release intermediate buffers */
0N/A deleteGSSOID(nameType);
0N/A resetGSSBuffer(env, jnameVal, &nameVal);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_importName]");
0N/A return (jlong) nameHdl;
0N/A}
0N/A
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: compareName
0N/A * Signature: (JJ)Z
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_compareName(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pName1,
0N/A jlong pName2)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_name_t nameHdl1, nameHdl2;
0N/A int isEqual;
0N/A
0N/A isEqual = 0;
0N/A nameHdl1 = (gss_name_t) pName1;
0N/A nameHdl2 = (gss_name_t) pName2;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_compareName] %ld %ld", (long) pName1,
0N/A (long) pName2);
0N/A debug(env, debugBuf);
0N/A
0N/A if ((nameHdl1 != GSS_C_NO_NAME) && (nameHdl2 != GSS_C_NO_NAME)) {
0N/A
0N/A /* gss_compare_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME(!) */
0N/A major = (*ftab->compareName)(&minor, nameHdl1, nameHdl2, &isEqual);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_compareName]");
0N/A }
0N/A return (isEqual != 0);
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: canonicalizeName
0N/A * Signature: (J)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pName)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_name_t nameHdl, mnNameHdl;
0N/A gss_OID mech;
0N/A
0N/A nameHdl = (gss_name_t) pName;
0N/A sprintf(debugBuf, "[GSSLibStub_canonicalizeName] %ld", (long) pName);
0N/A debug(env, debugBuf);
0N/A
0N/A if (nameHdl != GSS_C_NO_NAME) {
0N/A mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech);
0N/A mnNameHdl = GSS_C_NO_NAME;
0N/A
0N/A /* gss_canonicalize_name(...) may return GSS_S_BAD_NAMETYPE,
0N/A GSS_S_BAD_NAME, GSS_S_BAD_MECH */
0N/A major = (*ftab->canonicalizeName)(&minor, nameHdl, mech, &mnNameHdl);
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_canonicalizeName] MN=%ld",
0N/A (long)mnNameHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A /* release intermediate buffers */
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_canonicalizeName]");
0N/A } else mnNameHdl = GSS_C_NO_NAME;
0N/A
0N/A return (jlong) mnNameHdl;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: exportName
0N/A * Signature: (J)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_exportName(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pName) {
0N/A OM_uint32 minor, major;
0N/A gss_name_t nameHdl, mNameHdl;
0N/A gss_buffer_desc outBuf;
0N/A jbyteArray jresult;
0N/A
0N/A nameHdl = (gss_name_t) pName;
0N/A sprintf(debugBuf, "[GSSLibStub_exportName] %ld", (long) pName);
0N/A debug(env, debugBuf);
0N/A
0N/A /* gss_export_name(...) => GSS_S_NAME_NOT_MN, GSS_S_BAD_NAMETYPE,
0N/A GSS_S_BAD_NAME */
0N/A major = (*ftab->exportName)(&minor, nameHdl, &outBuf);
0N/A
0N/A /* canonicalize the internal name to MN and retry */
0N/A if (major == GSS_S_NAME_NOT_MN) {
0N/A debug(env, "[GSSLibStub_exportName] canonicalize and re-try");
0N/A
0N/A mNameHdl = (gss_name_t)
0N/A Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName
0N/A (env, jobj, pName);
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A major = (*ftab->exportName)(&minor, mNameHdl, &outBuf);
0N/A Java_sun_security_jgss_wrapper_GSSLibStub_releaseName
0N/A (env, jobj, (jlong) mNameHdl);
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A }
0N/A
0N/A /* release intermediate buffers */
0N/A jresult = getJavaBuffer(env, &outBuf);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_exportName]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: displayName
0N/A * Signature: (J)[Ljava/lang/Object;
0N/A */
0N/AJNIEXPORT jobjectArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_displayName(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pName) {
0N/A OM_uint32 minor, major;
0N/A gss_name_t nameHdl;
0N/A gss_buffer_desc outNameBuf;
0N/A gss_OID outNameType;
0N/A jstring jname;
0N/A jobject jtype;
0N/A jobjectArray jresult;
0N/A
0N/A nameHdl = (gss_name_t) pName;
0N/A sprintf(debugBuf, "[GSSLibStub_displayName] %ld", (long) pName);
0N/A debug(env, debugBuf);
0N/A
0N/A if (nameHdl == GSS_C_NO_NAME) {
0N/A checkStatus(env, jobj, GSS_S_BAD_NAME, 0, "[GSSLibStub_displayName]");
0N/A return NULL;
0N/A }
0N/A
0N/A /* gss_display_name(...) => GSS_S_BAD_NAME */
0N/A major = (*ftab->displayName)(&minor, nameHdl, &outNameBuf, &outNameType);
0N/A
0N/A /* release intermediate buffers */
0N/A jname = getJavaString(env, &outNameBuf);
0N/A
0N/A jtype = getJavaOID(env, outNameType);
0N/A jresult = (*env)->NewObjectArray(env, 2, CLS_Object, NULL);
0N/A
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A
0N/A (*env)->SetObjectArrayElement(env, jresult, 0, jname);
0N/A (*env)->SetObjectArrayElement(env, jresult, 1, jtype);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_displayName]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: acquireCred
0N/A * Signature: (JII)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_acquireCred(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pName,
0N/A jint reqTime,
0N/A jint usage)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_OID mech;
0N/A gss_OID_set mechs;
0N/A gss_cred_usage_t credUsage;
0N/A gss_name_t nameHdl;
0N/A gss_cred_id_t credHdl;
0N/A
0N/A debug(env, "[GSSLibStub_acquireCred]");
0N/A
0N/A
0N/A mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech);
0N/A mechs = newGSSOIDSet(env, mech);
0N/A credUsage = (gss_cred_usage_t) usage;
0N/A nameHdl = (gss_name_t) pName;
0N/A credHdl = GSS_C_NO_CREDENTIAL;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_acquireCred] pName=%ld, usage=%d",
0N/A (long) pName, usage);
0N/A debug(env, debugBuf);
0N/A
0N/A /* gss_acquire_cred(...) => GSS_S_BAD_MECH, GSS_S_BAD_NAMETYPE,
0N/A GSS_S_BAD_NAME, GSS_S_CREDENTIALS_EXPIRED, GSS_S_NO_CRED */
0N/A major =
0N/A (*ftab->acquireCred)(&minor, nameHdl, reqTime, mechs,
0N/A credUsage, &credHdl, NULL, NULL);
0N/A /* release intermediate buffers */
0N/A deleteGSSOIDSet(mechs);
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_acquireCred] pCred=%ld", (long) credHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_acquireCred]");
0N/A return (jlong) credHdl;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: releaseCred
0N/A * Signature: (J)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pCred)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_cred_id_t credHdl;
0N/A
0N/A credHdl = (gss_cred_id_t) pCred;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_releaseCred] %ld", pCred);
0N/A debug(env, debugBuf);
0N/A
0N/A if (credHdl != GSS_C_NO_CREDENTIAL) {
0N/A
0N/A /* gss_release_cred(...) => GSS_S_NO_CRED(!) */
0N/A major = (*ftab->releaseCred)(&minor, &credHdl);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseCred]");
0N/A }
0N/A return (jlong) credHdl;
0N/A}
0N/A
0N/A/*
0N/A * Utility routine for obtaining info about a credential.
0N/A */
0N/Avoid inquireCred(JNIEnv *env, jobject jobj, gss_cred_id_t pCred,
0N/A jint type, void *result) {
0N/A OM_uint32 minor, major;
0N/A OM_uint32 routineErr;
0N/A gss_cred_id_t credHdl;
0N/A
0N/A credHdl = pCred;
0N/A
0N/A sprintf(debugBuf, "[gss_inquire_cred] %ld", (long) pCred);
0N/A debug(env, debugBuf);
0N/A
0N/A /* gss_inquire_cred(...) => GSS_S_DEFECTIVE_CREDENTIAL(!),
0N/A GSS_S_CREDENTIALS_EXPIRED(!), GSS_S_NO_CRED(!) */
0N/A if (type == TYPE_CRED_NAME) {
0N/A major = (*ftab->inquireCred)(&minor, credHdl, result, NULL, NULL, NULL);
0N/A } else if (type == TYPE_CRED_TIME) {
0N/A major = (*ftab->inquireCred)(&minor, credHdl, NULL, result, NULL, NULL);
0N/A } else if (type == TYPE_CRED_USAGE) {
0N/A major = (*ftab->inquireCred)(&minor, credHdl, NULL, NULL, result, NULL);
0N/A }
0N/A
0N/A /* release intermediate buffers */
0N/A
0N/A routineErr = GSS_ROUTINE_ERROR(major);
0N/A if (routineErr == GSS_S_CREDENTIALS_EXPIRED) {
0N/A /* ignore GSS_S_CREDENTIALS_EXPIRED for query */
0N/A major = GSS_CALLING_ERROR(major) |
0N/A GSS_SUPPLEMENTARY_INFO(major);
0N/A } else if (routineErr == GSS_S_NO_CRED) {
0N/A /* twik since Java API throws BAD_MECH instead of NO_CRED */
0N/A major = GSS_CALLING_ERROR(major) |
0N/A GSS_S_BAD_MECH | GSS_SUPPLEMENTARY_INFO(major);
0N/A }
0N/A checkStatus(env, jobj, major, minor, "[gss_inquire_cred]");
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getCredName
0N/A * Signature: (J)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getCredName(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pCred)
0N/A{
0N/A gss_name_t nameHdl;
0N/A gss_cred_id_t credHdl;
0N/A
0N/A credHdl = (gss_cred_id_t) pCred;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getCredName] %ld", pCred);
0N/A debug(env, debugBuf);
0N/A
0N/A nameHdl = GSS_C_NO_NAME;
0N/A inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl);
0N/A
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return 0;
0N/A }
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A return (jlong) nameHdl;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getCredTime
0N/A * Signature: (J)I
0N/A */
0N/AJNIEXPORT jint JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getCredTime(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pCred)
0N/A{
0N/A gss_cred_id_t credHdl;
0N/A OM_uint32 lifetime;
0N/A
0N/A credHdl = (gss_cred_id_t) pCred;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getCredTime] %ld", pCred);
0N/A debug(env, debugBuf);
0N/A
0N/A lifetime = 0;
0N/A inquireCred(env, jobj, credHdl, TYPE_CRED_TIME, &lifetime);
0N/A
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return 0;
0N/A }
0N/A return getJavaTime(lifetime);
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getCredUsage
0N/A * Signature: (J)I
0N/A */
0N/AJNIEXPORT jint JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getCredUsage(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pCred)
0N/A{
0N/A gss_cred_usage_t usage;
0N/A gss_cred_id_t credHdl;
0N/A
0N/A credHdl = (gss_cred_id_t) pCred;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getCredUsage] %ld", pCred);
0N/A debug(env, debugBuf);
0N/A
0N/A inquireCred(env, jobj, credHdl, TYPE_CRED_USAGE, &usage);
0N/A
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return -1;
0N/A }
0N/A return (jint) usage;
0N/A}
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: importContext
0N/A * Signature: ([B)Lsun/security/jgss/wrapper/NativeGSSContext;
0N/A */
0N/AJNIEXPORT jobject JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_importContext(JNIEnv *env,
0N/A jobject jobj,
0N/A jbyteArray jctxtToken)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_buffer_desc ctxtToken;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_OID mech, mech2;
0N/A
0N/A debug(env, "[GSSLibStub_importContext]");
0N/A
0N/A contextHdl = GSS_C_NO_CONTEXT;
0N/A initGSSBuffer(env, jctxtToken, &ctxtToken);
0N/A
0N/A /* gss_import_sec_context(...) => GSS_S_NO_CONTEXT, GSS_S_DEFECTIVE_TOKEN,
0N/A GSS_S_UNAVAILABLE, GSS_S_UNAUTHORIZED */
0N/A major = (*ftab->importSecContext)(&minor, &ctxtToken, &contextHdl);
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_importContext] pContext=%ld",
0N/A (long) contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A /* release intermediate buffers */
0N/A resetGSSBuffer(env, jctxtToken, &ctxtToken);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_importContext]");
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A
0N/A /* now that the context has been imported, proceed to find out
0N/A its mech */
0N/A major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL,
0N/A NULL, &mech, NULL, NULL, NULL);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_importContext] getMech");
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A
0N/A mech2 = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech);
0N/A
0N/A if (sameMech(env, mech, mech2) == JNI_TRUE) {
0N/A /* mech match - return the context object */
0N/A return (*env)->NewObject(env, CLS_NativeGSSContext,
0N/A MID_NativeGSSContext_ctor,
0N/A (jlong) contextHdl, jobj);
0N/A } else {
0N/A /* mech mismatch - clean up then return null */
0N/A major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER);
0N/A checkStatus(env, jobj, major, minor,
0N/A "[GSSLibStub_importContext] cleanup");
0N/A return NULL;
0N/A }
0N/A}
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: initContext
0N/A * Signature: (JJLorg/ietf/jgss/ChannelBinding;[BLsun/security/jgss/wrapper/NativeGSSContext;)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_initContext(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pCred,
0N/A jlong pName,
0N/A jobject jcb,
0N/A jbyteArray jinToken,
0N/A jobject jcontextSpi)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_cred_id_t credHdl ;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_name_t targetName;
0N/A gss_OID mech;
0N/A OM_uint32 flags, aFlags;
0N/A OM_uint32 time, aTime;
0N/A gss_channel_bindings_t cb;
0N/A gss_buffer_desc inToken;
0N/A gss_buffer_desc outToken;
0N/A jbyteArray jresult;
0N/A/* UNCOMMENT after SEAM bug#6287358 is backported to S10
0N/A gss_OID aMech;
0N/A jobject jMech;
0N/A*/
0N/A debug(env, "[GSSLibStub_initContext]");
0N/A
0N/A credHdl = (gss_cred_id_t) pCred;
0N/A contextHdl = (gss_ctx_id_t)
0N/A (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext);
0N/A targetName = (gss_name_t) pName;
0N/A mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech);
0N/A flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi,
0N/A FID_NativeGSSContext_flags);
0N/A time = getGSSTime((*env)->GetIntField(env, jcontextSpi,
0N/A FID_NativeGSSContext_lifetime));
0N/A cb = getGSSCB(env, jcb);
0N/A initGSSBuffer(env, jinToken, &inToken);
0N/A
0N/A sprintf(debugBuf,
0N/A "[GSSLibStub_initContext] before: pCred=%ld, pContext=%ld",
0N/A (long)credHdl, (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A /* gss_init_sec_context(...) => GSS_S_CONTINUE_NEEDED(!),
0N/A GSS_S_DEFECTIVE_TOKEN, GSS_S_NO_CRED, GSS_S_DEFECTIVE_CREDENTIAL(!),
0N/A GSS_S_CREDENTIALS_EXPIRED, GSS_S_BAD_BINDINGS, GSS_S_BAD_MIC,
0N/A GSS_S_OLD_TOKEN, GSS_S_DUPLICATE_TOKEN, GSS_S_NO_CONTEXT(!),
0N/A GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME(!), GSS_S_BAD_MECH */
0N/A major = (*ftab->initSecContext)(&minor, credHdl,
0N/A &contextHdl, targetName, mech,
0N/A flags, time, cb, &inToken, NULL /*aMech*/,
0N/A &outToken, &aFlags, &aTime);
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_initContext] after: pContext=%ld",
0N/A (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A sprintf(debugBuf, "[GSSLibStub_initContext] outToken len=%ld",
0N/A (long)outToken.length);
0N/A debug(env, debugBuf);
0N/A
0N/A if (GSS_ERROR(major) == GSS_S_COMPLETE) {
0N/A /* update member values if needed */
0N/A (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext,
0N/A (jlong) contextHdl);
0N/A (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags);
0N/A sprintf(debugBuf, "[GSSLibStub_initContext] set flags=0x%x", aFlags);
0N/A debug(env, debugBuf);
0N/A
0N/A if (major == GSS_S_COMPLETE) {
0N/A (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,
0N/A getJavaTime(aTime));
0N/A debug(env, "[GSSLibStub_initContext] context established");
0N/A
0N/A (*env)->SetBooleanField(env, jcontextSpi,
0N/A FID_NativeGSSContext_isEstablished,
0N/A JNI_TRUE);
0N/A
0N/A/* UNCOMMENT after SEAM bug#6287358 is backported to S10
0N/A jMech = getJavaOID(env, aMech);
0N/A (*env)->SetObjectField(env, jcontextSpi,
0N/A FID_NativeGSSContext_actualMech, jMech);
0N/A*/
0N/A } else if (major & GSS_S_CONTINUE_NEEDED) {
0N/A debug(env, "[GSSLibStub_initContext] context not established");
0N/A major -= GSS_S_CONTINUE_NEEDED;
0N/A }
0N/A }
0N/A /* release intermediate buffers */
0N/A releaseGSSCB(env, jcb, cb);
0N/A resetGSSBuffer(env, jinToken, &inToken);
0N/A jresult = getJavaBuffer(env, &outToken);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_initContext]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: acceptContext
0N/A * Signature: (JLorg/ietf/jgss/ChannelBinding;[BLsun/security/jgss/wrapper/NativeGSSContext;)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pCred,
0N/A jobject jcb,
0N/A jbyteArray jinToken,
0N/A jobject jcontextSpi)
0N/A{
0N/A OM_uint32 minor, major;
0N/A OM_uint32 minor2, major2;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_cred_id_t credHdl;
0N/A gss_buffer_desc inToken;
0N/A gss_channel_bindings_t cb;
0N/A gss_name_t srcName;
0N/A gss_buffer_desc outToken;
0N/A gss_OID aMech;
0N/A OM_uint32 aFlags;
0N/A OM_uint32 aTime;
0N/A gss_cred_id_t delCred;
0N/A jobject jsrcName;
0N/A jobject jdelCred;
0N/A jobject jMech;
0N/A jbyteArray jresult;
0N/A jboolean setTarget;
0N/A gss_name_t targetName;
0N/A jobject jtargetName;
0N/A
0N/A debug(env, "[GSSLibStub_acceptContext]");
0N/A
0N/A contextHdl = (gss_ctx_id_t)
0N/A (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext);
0N/A credHdl = (gss_cred_id_t) pCred;
0N/A initGSSBuffer(env, jinToken, &inToken);
0N/A cb = getGSSCB(env, jcb);
0N/A srcName = GSS_C_NO_NAME;
0N/A delCred = GSS_C_NO_CREDENTIAL;
0N/A setTarget = (credHdl == GSS_C_NO_CREDENTIAL);
0N/A aFlags = 0;
0N/A
0N/A sprintf(debugBuf,
0N/A "[GSSLibStub_acceptContext] before: pCred=%ld, pContext=%ld",
0N/A (long) credHdl, (long) contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A /* gss_accept_sec_context(...) => GSS_S_CONTINUE_NEEDED(!),
0N/A GSS_S_DEFECTIVE_TOKEN, GSS_S_DEFECTIVE_CREDENTIAL(!),
0N/A GSS_S_NO_CRED, GSS_S_CREDENTIALS_EXPIRED, GSS_S_BAD_BINDINGS,
0N/A GSS_S_NO_CONTEXT(!), GSS_S_BAD_MIC, GSS_S_OLD_TOKEN,
0N/A GSS_S_DUPLICATE_TOKEN, GSS_S_BAD_MECH */
0N/A major =
0N/A (*ftab->acceptSecContext)(&minor, &contextHdl, credHdl,
0N/A &inToken, cb, &srcName, &aMech, &outToken,
0N/A &aFlags, &aTime, &delCred);
0N/A
0N/A sprintf(debugBuf,
0N/A "[GSSLibStub_acceptContext] after: pCred=%ld, pContext=%ld, pDelegCred=%ld",
0N/A (long)credHdl, (long)contextHdl, (long) delCred);
0N/A debug(env, debugBuf);
0N/A
0N/A if (GSS_ERROR(major) == GSS_S_COMPLETE) {
0N/A /* update member values if needed */
0N/A (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext,
0N/A (jlong) contextHdl);
0N/A sprintf(debugBuf, "[GSSLibStub_acceptContext] set pContext=%ld",
0N/A (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A // WORKAROUND for a Heimdal bug
0N/A if (delCred == GSS_C_NO_CREDENTIAL) {
0N/A aFlags &= 0xfffffffe;
0N/A }
0N/A (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags);
0N/A sprintf(debugBuf, "[GSSLibStub_acceptContext] set flags=0x%x",
0N/A aFlags);
0N/A debug(env, debugBuf);
0N/A if (setTarget) {
0N/A major2 = (*ftab->inquireContext)(&minor2, contextHdl, NULL,
0N/A &targetName, NULL, NULL, NULL,
0N/A NULL, NULL);
0N/A jtargetName = (*env)->NewObject(env, CLS_GSSNameElement,
0N/A MID_GSSNameElement_ctor,
0N/A (jlong) targetName, jobj);
0N/A
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A sprintf(debugBuf, "[GSSLibStub_acceptContext] set targetName=%ld",
0N/A (long)targetName);
0N/A debug(env, debugBuf);
0N/A (*env)->SetObjectField(env, jcontextSpi, FID_NativeGSSContext_targetName,
0N/A jtargetName);
0N/A }
0N/A if (srcName != GSS_C_NO_NAME) {
0N/A jsrcName = (*env)->NewObject(env, CLS_GSSNameElement,
0N/A MID_GSSNameElement_ctor,
0N/A (jlong) srcName, jobj);
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A sprintf(debugBuf, "[GSSLibStub_acceptContext] set srcName=%ld",
0N/A (long)srcName);
0N/A debug(env, debugBuf);
0N/A (*env)->SetObjectField(env, jcontextSpi, FID_NativeGSSContext_srcName,
0N/A jsrcName);
0N/A }
0N/A if (major == GSS_S_COMPLETE) {
0N/A debug(env, "[GSSLibStub_acceptContext] context established");
0N/A
0N/A (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,
0N/A getJavaTime(aTime));
0N/A
0N/A (*env)->SetBooleanField(env, jcontextSpi,
0N/A FID_NativeGSSContext_isEstablished,
0N/A JNI_TRUE);
0N/A jMech = getJavaOID(env, aMech);
0N/A (*env)->SetObjectField(env, jcontextSpi,
0N/A FID_NativeGSSContext_actualMech, jMech);
0N/A if (delCred != GSS_C_NO_CREDENTIAL) {
0N/A jdelCred = (*env)->NewObject(env, CLS_GSSCredElement,
0N/A MID_GSSCredElement_ctor,
0N/A (jlong) delCred, jsrcName, jMech);
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A (*env)->SetObjectField(env, jcontextSpi,
0N/A FID_NativeGSSContext_delegatedCred,
0N/A jdelCred);
0N/A sprintf(debugBuf, "[GSSLibStub_acceptContext] set delegatedCred=%ld",
0N/A (long) delCred);
0N/A debug(env, debugBuf);
0N/A }
0N/A } else if (major & GSS_S_CONTINUE_NEEDED) {
0N/A debug(env, "[GSSLibStub_acceptContext] context not established");
0N/A
0N/A if (aFlags & GSS_C_PROT_READY_FLAG) {
0N/A (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,
0N/A getJavaTime(aTime));
0N/A }
0N/A major -= GSS_S_CONTINUE_NEEDED;
0N/A }
0N/A }
0N/A /* release intermediate buffers */
0N/A releaseGSSCB(env, jcb, cb);
0N/A resetGSSBuffer(env, jinToken, &inToken);
0N/A jresult = getJavaBuffer(env, &outToken);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_acceptContext]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: inquireContext
0N/A * Signature: (J)[J
0N/A */
0N/AJNIEXPORT jlongArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_inquireContext(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_name_t srcName, targetName;
0N/A OM_uint32 time;
0N/A OM_uint32 flags;
0N/A int isInitiator, isEstablished;
0N/A jlong result[6];
0N/A jlongArray jresult;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_inquireContext] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A srcName = targetName = GSS_C_NO_NAME;
0N/A time = 0;
0N/A flags = isInitiator = isEstablished = 0;
0N/A
0N/A /* gss_inquire_context(...) => GSS_S_NO_CONTEXT(!) */
0N/A major = (*ftab->inquireContext)(&minor, contextHdl, &srcName,
0N/A &targetName, &time, NULL, &flags,
0N/A &isInitiator, &isEstablished);
0N/A /* update member values if needed */
0N/A sprintf(debugBuf, "[GSSLibStub_inquireContext] srcName %ld", (long)srcName);
0N/A debug(env, debugBuf);
0N/A sprintf(debugBuf, "[GSSLibStub_inquireContext] targetName %ld",
0N/A (long)targetName);
0N/A debug(env, debugBuf);
0N/A
0N/A result[0] = (jlong) srcName;
0N/A result[1] = (jlong) targetName;
0N/A result[2] = (jlong) isInitiator;
0N/A result[3] = (jlong) isEstablished;
0N/A result[4] = (jlong) flags;
0N/A result[5] = (jlong) getJavaTime(time);
0N/A
0N/A jresult = (*env)->NewLongArray(env, 6);
0N/A (*env)->SetLongArrayRegion(env, jresult, 0, 6, result);
0N/A
0N/A /* release intermediate buffers */
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContext]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getContextMech
0N/A * Signature: (J)Lorg/ietf/jgss/Oid;
0N/A */
0N/AJNIEXPORT jobject JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getContextMech(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_OID mech;
0N/A gss_ctx_id_t contextHdl;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getContextMech] %ld", pContext);
0N/A debug(env, debugBuf);
0N/A
0N/A major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL,
0N/A NULL, &mech, NULL, NULL, NULL);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_getContextMech]");
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return NULL;
0N/A }
0N/A
0N/A return getJavaOID(env, mech);
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getContextName
0N/A * Signature: (JZ)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getContextName(JNIEnv *env,
0N/A jobject jobj, jlong pContext, jboolean isSrc)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_name_t nameHdl;
0N/A gss_ctx_id_t contextHdl;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getContextName] %ld, isSrc=%d",
0N/A (long)contextHdl, isSrc);
0N/A debug(env, debugBuf);
0N/A
0N/A nameHdl = GSS_C_NO_NAME;
0N/A if (isSrc == JNI_TRUE) {
0N/A major = (*ftab->inquireContext)(&minor, contextHdl, &nameHdl, NULL,
0N/A NULL, NULL, NULL, NULL, NULL);
0N/A } else {
0N/A major = (*ftab->inquireContext)(&minor, contextHdl, NULL, &nameHdl,
0N/A NULL, NULL, NULL, NULL, NULL);
0N/A }
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]");
0N/A /* return immediately if an exception has occurred */
0N/A if ((*env)->ExceptionCheck(env)) {
0N/A return (long)NULL;
0N/A }
0N/A
0N/A sprintf(debugBuf, "[GSSLibStub_getContextName] pName=%ld", (long) nameHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A return (jlong) nameHdl;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getContextTime
0N/A * Signature: (J)I
0N/A */
0N/AJNIEXPORT jint JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getContextTime(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext) {
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A OM_uint32 time;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_getContextTime] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) return 0;
0N/A
0N/A /* gss_context_time(...) => GSS_S_CONTEXT_EXPIRED(!),
0N/A GSS_S_NO_CONTEXT(!) */
0N/A major = (*ftab->contextTime)(&minor, contextHdl, &time);
0N/A if (GSS_ROUTINE_ERROR(major) == GSS_S_CONTEXT_EXPIRED) {
0N/A major = GSS_CALLING_ERROR(major) | GSS_SUPPLEMENTARY_INFO(major);
0N/A }
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_getContextTime]");
0N/A return getJavaTime(time);
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: deleteContext
0N/A * Signature: (J)J
0N/A */
0N/AJNIEXPORT jlong JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_deleteContext(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_deleteContext] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) return GSS_C_NO_CONTEXT;
0N/A
0N/A /* gss_delete_sec_context(...) => GSS_S_NO_CONTEXT(!) */
0N/A major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_deleteContext]");
0N/A return (jlong) contextHdl;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: wrapSizeLimit
0N/A * Signature: (JIII)I
0N/A */
0N/AJNIEXPORT jint JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_wrapSizeLimit(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext,
0N/A jint reqFlag,
0N/A jint jqop,
0N/A jint joutSize)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A OM_uint32 outSize, maxInSize;
0N/A gss_qop_t qop;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_wrapSizeLimit] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A // Check context handle??
0N/A
0N/A qop = (gss_qop_t) jqop;
0N/A outSize = (OM_uint32) joutSize;
0N/A maxInSize = 0;
0N/A /* gss_wrap_size_limit(...) => GSS_S_NO_CONTEXT(!), GSS_S_CONTEXT_EXPIRED,
0N/A GSS_S_BAD_QOP */
0N/A major = (*ftab->wrapSizeLimit)(&minor, contextHdl, reqFlag,
0N/A qop, outSize, &maxInSize);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_wrapSizeLimit]");
0N/A return (jint) maxInSize;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: exportContext
0N/A * Signature: (J)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_exportContext(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_buffer_desc interProcToken;
0N/A jbyteArray jresult;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_exportContext] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) {
0N/A // Twik per javadoc
0N/A checkStatus(env, jobj, GSS_S_NO_CONTEXT, 0, "[GSSLibStub_exportContext]");
0N/A return NULL;
0N/A }
0N/A /* gss_export_sec_context(...) => GSS_S_CONTEXT_EXPIRED,
0N/A GSS_S_NO_CONTEXT, GSS_S_UNAVAILABLE */
0N/A major =
0N/A (*ftab->exportSecContext)(&minor, &contextHdl, &interProcToken);
0N/A
0N/A /* release intermediate buffers */
0N/A jresult = getJavaBuffer(env, &interProcToken);
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_exportContext]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: getMic
0N/A * Signature: (JI[B)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_getMic(JNIEnv *env, jobject jobj,
0N/A jlong pContext, jint jqop,
0N/A jbyteArray jmsg)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_qop_t qop;
0N/A gss_buffer_desc msg;
0N/A gss_buffer_desc msgToken;
0N/A jbyteArray jresult;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_getMic] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) {
0N/A // Twik per javadoc
0N/A checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_getMic]");
0N/A return NULL;
0N/A }
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A qop = (gss_qop_t) jqop;
0N/A initGSSBuffer(env, jmsg, &msg);
0N/A
0N/A /* gss_get_mic(...) => GSS_S_CONTEXT_EXPIRED, GSS_S_NO_CONTEXT(!),
0N/A GSS_S_BAD_QOP */
0N/A major =
0N/A (*ftab->getMic)(&minor, contextHdl, qop, &msg, &msgToken);
0N/A
0N/A /* release intermediate buffers */
0N/A resetGSSBuffer(env, jmsg, &msg);
0N/A jresult = getJavaBuffer(env, &msgToken);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_getMic]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: verifyMic
0N/A * Signature: (J[B[BLorg/ietf/jgss/MessageProp;)V
0N/A */
0N/AJNIEXPORT void JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_verifyMic(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext,
0N/A jbyteArray jmsgToken,
0N/A jbyteArray jmsg,
0N/A jobject jprop)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_buffer_desc msg;
0N/A gss_buffer_desc msgToken;
0N/A gss_qop_t qop;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_verifyMic] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) {
0N/A // Twik per javadoc
0N/A checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0,
0N/A "[GSSLibStub_verifyMic]");
0N/A return;
0N/A }
0N/A initGSSBuffer(env, jmsg, &msg);
0N/A initGSSBuffer(env, jmsgToken, &msgToken);
0N/A qop = (gss_qop_t) (*env)->CallIntMethod(env, jprop, MID_MessageProp_getQOP);
0N/A /* gss_verify_mic(...) => GSS_S_DEFECTIVE_TOKEN, GSS_S_BAD_MIC,
0N/A GSS_S_CONTEXT_EXPIRED, GSS_S_DUPLICATE_TOKEN(!), GSS_S_OLD_TOKEN(!),
0N/A GSS_S_UNSEQ_TOKEN(!), GSS_S_GAP_TOKEN(!), GSS_S_NO_CONTEXT(!) */
0N/A major =
0N/A (*ftab->verifyMic)(&minor, contextHdl, &msg, &msgToken, &qop);
0N/A
0N/A /* release intermediate buffers */
0N/A resetGSSBuffer(env, jmsg, &msg);
0N/A resetGSSBuffer(env, jmsgToken, &msgToken);
0N/A
0N/A (*env)->CallVoidMethod(env, jprop, MID_MessageProp_setQOP, qop);
0N/A setSupplementaryInfo(env, jobj, jprop, GSS_SUPPLEMENTARY_INFO(major),
0N/A minor);
0N/A checkStatus(env, jobj, GSS_ERROR(major), minor, "[GSSLibStub_verifyMic]");
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: wrap
0N/A * Signature: (J[BLorg/ietf/jgss/MessageProp;)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_wrap(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext,
0N/A jbyteArray jmsg,
0N/A jobject jprop)
0N/A{
0N/A OM_uint32 minor, major;
0N/A jboolean confFlag;
0N/A gss_qop_t qop;
0N/A gss_buffer_desc msg;
0N/A gss_buffer_desc msgToken;
0N/A int confState;
0N/A gss_ctx_id_t contextHdl;
0N/A jbyteArray jresult;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_wrap] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) {
0N/A // Twik per javadoc
0N/A checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_wrap]");
0N/A return NULL;
0N/A }
0N/A
0N/A confFlag =
0N/A (*env)->CallBooleanMethod(env, jprop, MID_MessageProp_getPrivacy);
0N/A qop = (gss_qop_t)
0N/A (*env)->CallIntMethod(env, jprop, MID_MessageProp_getQOP);
0N/A initGSSBuffer(env, jmsg, &msg);
0N/A /* gss_wrap(...) => GSS_S_CONTEXT_EXPIRED, GSS_S_NO_CONTEXT(!),
0N/A GSS_S_BAD_QOP */
0N/A major = (*ftab->wrap)(&minor, contextHdl, confFlag, qop, &msg, &confState,
0N/A &msgToken);
0N/A
0N/A (*env)->CallVoidMethod(env, jprop, MID_MessageProp_setPrivacy,
0N/A (confState? JNI_TRUE:JNI_FALSE));
0N/A
0N/A /* release intermediate buffers */
0N/A resetGSSBuffer(env, jmsg, &msg);
0N/A jresult = getJavaBuffer(env, &msgToken);
0N/A
0N/A checkStatus(env, jobj, major, minor, "[GSSLibStub_wrap]");
0N/A return jresult;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_security_jgss_wrapper_GSSLibStub
0N/A * Method: unwrap
0N/A * Signature: (J[BLorg/ietf/jgss/MessageProp;)[B
0N/A */
0N/AJNIEXPORT jbyteArray JNICALL
0N/AJava_sun_security_jgss_wrapper_GSSLibStub_unwrap(JNIEnv *env,
0N/A jobject jobj,
0N/A jlong pContext,
0N/A jbyteArray jmsgToken,
0N/A jobject jprop)
0N/A{
0N/A OM_uint32 minor, major;
0N/A gss_ctx_id_t contextHdl;
0N/A gss_buffer_desc msgToken;
0N/A gss_buffer_desc msg;
0N/A int confState;
0N/A gss_qop_t qop;
0N/A jbyteArray jresult;
0N/A
0N/A contextHdl = (gss_ctx_id_t) pContext;
0N/A sprintf(debugBuf, "[GSSLibStub_unwrap] %ld", (long)contextHdl);
0N/A debug(env, debugBuf);
0N/A
0N/A if (contextHdl == GSS_C_NO_CONTEXT) {
0N/A // Twik per javadoc
0N/A checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_unwrap]");
0N/A return NULL;
0N/A }
0N/A initGSSBuffer(env, jmsgToken, &msgToken);
0N/A confState = 0;
0N/A qop = GSS_C_QOP_DEFAULT;
0N/A /* gss_unwrap(...) => GSS_S_DEFECTIVE_TOKEN, GSS_S_BAD_MIC,
0N/A GSS_S_CONTEXT_EXPIRED, GSS_S_DUPLICATE_TOKEN(!), GSS_S_OLD_TOKEN(!),
0N/A GSS_S_UNSEQ_TOKEN(!), GSS_S_GAP_TOKEN(!), GSS_S_NO_CONTEXT(!) */
0N/A major =
0N/A (*ftab->unwrap)(&minor, contextHdl, &msgToken, &msg, &confState, &qop);
0N/A /* update the message prop with relevant info */
0N/A (*env)->CallVoidMethod(env, jprop, MID_MessageProp_setPrivacy,
0N/A (confState != 0));
0N/A (*env)->CallVoidMethod(env, jprop, MID_MessageProp_setQOP, qop);
0N/A setSupplementaryInfo(env, jobj, jprop, GSS_SUPPLEMENTARY_INFO(major),
0N/A minor);
0N/A
0N/A /* release intermediate buffers */
0N/A resetGSSBuffer(env, jmsgToken, &msgToken);
0N/A jresult = getJavaBuffer(env, &msg);
0N/A
0N/A checkStatus(env, jobj, GSS_ERROR(major), minor, "[GSSLibStub_unwrap]");
0N/A return jresult;
0N/A}