Path: blob/master/src/java.security.jgss/share/native/libj2gss/GSSLibStub.c
41152 views
/*1* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#include "sun_security_jgss_wrapper_GSSLibStub.h"26#include "NativeUtil.h"27#include "NativeFunc.h"28#include "jlong.h"29#include <jni.h>3031/* Constants for indicating what type of info is needed for inquiries */32const int TYPE_CRED_NAME = 10;33const int TYPE_CRED_TIME = 11;34const int TYPE_CRED_USAGE = 12;3536static jclass tlsCBCl = NULL;3738/*39* Class: sun_security_jgss_wrapper_GSSLibStub40* Method: init41* Signature: (Ljava/lang/String;Z)Z42*/43JNIEXPORT jboolean JNICALL44Java_sun_security_jgss_wrapper_GSSLibStub_init(JNIEnv *env,45jclass jcls,46jstring jlibName,47jboolean jDebug) {48const char *libName;49int failed;50char *error = NULL;5152if (!jDebug) {53JGSS_DEBUG = 0;54} else {55JGSS_DEBUG = 1;56}5758if (jlibName == NULL) {59TRACE0("[GSSLibStub_init] GSS lib name is NULL");60return JNI_FALSE;61}6263libName = (*env)->GetStringUTFChars(env, jlibName, NULL);64if (libName == NULL) {65return JNI_FALSE;66}67TRACE1("[GSSLibStub_init] libName=%s", libName);6869/* initialize global function table */70failed = loadNative(libName);71(*env)->ReleaseStringUTFChars(env, jlibName, libName);7273if (tlsCBCl == NULL) {7475/* initialize TLS Channel Binding class wrapper */76jclass cl = (*env)->FindClass(env,77"sun/security/jgss/krb5/internal/TlsChannelBindingImpl");78if (cl == NULL) { /* exception thrown */79return JNI_FALSE;80}81tlsCBCl = (*env)->NewGlobalRef(env, cl);82}8384if (!failed) {85return JNI_TRUE;86} else {87if (JGSS_DEBUG) {88#ifdef WIN3289#define MAX_MSG_SIZE 25690static CHAR szMsgBuf[MAX_MSG_SIZE];91DWORD dwRes;92DWORD dwError = GetLastError();93dwRes = FormatMessage (94FORMAT_MESSAGE_FROM_SYSTEM,95NULL,96dwError,970,98szMsgBuf,99MAX_MSG_SIZE,100NULL);101if (0 == dwRes) {102printf("GSS-API: Unknown failure %d\n", dwError);103} else {104printf("GSS-API: %s\n",szMsgBuf);105}106#else107char* error = dlerror();108if (error) {109TRACE0(error);110}111#endif112}113return JNI_FALSE;114}115}116117/*118* Class: sun_security_jgss_wrapper_GSSLibStub119* Method: getMechPtr120* Signature: ([B)J121*/122JNIEXPORT jlong JNICALL123Java_sun_security_jgss_wrapper_GSSLibStub_getMechPtr(JNIEnv *env,124jclass jcls,125jbyteArray jbytes) {126gss_OID cOid;127unsigned int i, len;128jbyte* bytes;129int found;130131if (jbytes != NULL) {132found = 0;133len = (unsigned int)((*env)->GetArrayLength(env, jbytes) - 2);134bytes = (*env)->GetByteArrayElements(env, jbytes, NULL);135if (bytes == NULL) {136return ptr_to_jlong(NULL);137}138for (i = 0; i < ftab->mechs->count; i++) {139cOid = &(ftab->mechs->elements[i]);140if (len == cOid->length &&141(memcmp(cOid->elements, (bytes + 2), len) == 0)) {142// Found a match143found = 1;144break;145}146}147(*env)->ReleaseByteArrayElements(env, jbytes, bytes, 0);148149if (found != 1) {150checkStatus(env, NULL, GSS_S_BAD_MECH, 0, "[GSSLibStub_getMechPtr]");151return ptr_to_jlong(NULL);152} else {153return ptr_to_jlong(cOid);154}155} else {156return ptr_to_jlong(GSS_C_NO_OID);157}158}159160/*161* Utility routine which releases the specified gss_channel_bindings_t162* structure.163*/164void deleteGSSCB(gss_channel_bindings_t cb) {165166if (cb == GSS_C_NO_CHANNEL_BINDINGS) return;167168/* release initiator address */169if (cb->initiator_addrtype != GSS_C_AF_NULLADDR &&170cb->initiator_addrtype != GSS_C_AF_UNSPEC) {171resetGSSBuffer(&(cb->initiator_address));172}173/* release acceptor address */174if (cb->acceptor_addrtype != GSS_C_AF_NULLADDR &&175cb->acceptor_addrtype != GSS_C_AF_UNSPEC) {176resetGSSBuffer(&(cb->acceptor_address));177}178/* release application data */179if (cb->application_data.length != 0) {180resetGSSBuffer(&(cb->application_data));181}182free(cb);183}184185/*186* Utility routine which creates a gss_channel_bindings_t structure187* using the specified org.ietf.jgss.ChannelBinding object.188* NOTE: must call deleteGSSCB() to free up the resources.189*/190gss_channel_bindings_t newGSSCB(JNIEnv *env, jobject jcb) {191gss_channel_bindings_t cb;192jobject jinetAddr;193jbyteArray value;194195if (jcb == NULL) {196return GSS_C_NO_CHANNEL_BINDINGS;197}198199cb = malloc(sizeof(struct gss_channel_bindings_struct));200if (cb == NULL) {201throwOutOfMemoryError(env,NULL);202return NULL;203}204205// initialize addrtype in CB first206// LDAP TLS Channel Binding requires GSS_C_AF_UNSPEC address type207// for unspecified initiator and acceptor addresses.208// GSS_C_AF_NULLADDR value should be used for unspecified address209// in all other cases.210211if ((*env)->IsInstanceOf(env, jcb, tlsCBCl)) {212// TLS Channel Binding requires unspecified addrtype=0213cb->initiator_addrtype = GSS_C_AF_UNSPEC;214cb->acceptor_addrtype = GSS_C_AF_UNSPEC;215} else {216cb->initiator_addrtype = GSS_C_AF_NULLADDR;217cb->acceptor_addrtype = GSS_C_AF_NULLADDR;218}219// addresses needs to be initialized to empty220memset(&cb->initiator_address, 0, sizeof(cb->initiator_address));221memset(&cb->acceptor_address, 0, sizeof(cb->acceptor_address));222223/* set up initiator address */224jinetAddr = (*env)->CallObjectMethod(env, jcb,225MID_ChannelBinding_getInitiatorAddr);226if ((*env)->ExceptionCheck(env)) {227goto cleanup;228}229if (jinetAddr != NULL) {230value = (*env)->CallObjectMethod(env, jinetAddr,231MID_InetAddress_getAddr);232if ((*env)->ExceptionCheck(env)) {233goto cleanup;234}235cb->initiator_addrtype = GSS_C_AF_INET;236initGSSBuffer(env, value, &(cb->initiator_address));237if ((*env)->ExceptionCheck(env)) {238goto cleanup;239}240}241/* set up acceptor address */242jinetAddr = (*env)->CallObjectMethod(env, jcb,243MID_ChannelBinding_getAcceptorAddr);244if ((*env)->ExceptionCheck(env)) {245goto cleanup;246}247if (jinetAddr != NULL) {248value = (*env)->CallObjectMethod(env, jinetAddr,249MID_InetAddress_getAddr);250if ((*env)->ExceptionCheck(env)) {251goto cleanup;252}253cb->acceptor_addrtype = GSS_C_AF_INET;254initGSSBuffer(env, value, &(cb->acceptor_address));255if ((*env)->ExceptionCheck(env)) {256goto cleanup;257}258}259/* set up application data */260value = (*env)->CallObjectMethod(env, jcb,261MID_ChannelBinding_getAppData);262if ((*env)->ExceptionCheck(env)) {263goto cleanup;264}265initGSSBuffer(env, value, &(cb->application_data));266if ((*env)->ExceptionCheck(env)) {267goto cleanup;268}269return cb;270cleanup:271deleteGSSCB(cb);272return NULL;273}274275/*276* Utility routine for storing the supplementary information277* into the specified org.ietf.jgss.MessageProp object.278*/279void setSupplementaryInfo(JNIEnv *env, jobject jstub, jobject jprop,280int suppInfo, int minor) {281jboolean isDuplicate, isOld, isUnseq, hasGap;282jstring minorMsg;283284if (suppInfo != GSS_S_COMPLETE) {285isDuplicate = ((suppInfo & GSS_S_DUPLICATE_TOKEN) != 0);286isOld = ((suppInfo & GSS_S_OLD_TOKEN) != 0);287isUnseq = ((suppInfo & GSS_S_UNSEQ_TOKEN) != 0);288hasGap = ((suppInfo & GSS_S_GAP_TOKEN) != 0);289minorMsg = getMinorMessage(env, jstub, minor);290if ((*env)->ExceptionCheck(env)) {291return;292}293(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setSupplementaryStates,294isDuplicate, isOld, isUnseq, hasGap, minor,295minorMsg);296}297}298299/*300* Class: sun_security_jgss_wrapper_GSSLibStub301* Method: indicateMechs302* Signature: ()[Lorg/ietf/jgss/Oid;303*/304JNIEXPORT jobjectArray JNICALL305Java_sun_security_jgss_wrapper_GSSLibStub_indicateMechs(JNIEnv *env,306jclass jcls)307{308if (ftab->mechs != NULL && ftab->mechs != GSS_C_NO_OID_SET) {309return getJavaOIDArray(env, ftab->mechs);310} else return NULL;311}312313/*314* Class: sun_security_jgss_wrapper_GSSLibStub315* Method: inquireNamesForMech316* Signature: ()[Lorg/ietf/jgss/Oid;317*/318JNIEXPORT jobjectArray JNICALL319Java_sun_security_jgss_wrapper_GSSLibStub_inquireNamesForMech(JNIEnv *env,320jobject jobj)321{322OM_uint32 minor, major;323gss_OID mech;324gss_OID_set nameTypes;325jobjectArray result;326327if (ftab->inquireNamesForMech != NULL) {328mech = (gss_OID)jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));329nameTypes = GSS_C_NO_OID_SET;330331/* gss_inquire_names_for_mech(...) => N/A */332major = (*ftab->inquireNamesForMech)(&minor, mech, &nameTypes);333334/* release intermediate buffers before checking status */335result = getJavaOIDArray(env, nameTypes);336deleteGSSOIDSet(nameTypes);337if ((*env)->ExceptionCheck(env)) {338return NULL;339}340341checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireNamesForMech]");342if ((*env)->ExceptionCheck(env)) {343return NULL;344}345return result;346}347return NULL;348}349350/*351* Class: sun_security_jgss_wrapper_GSSLibStub352* Method: releaseName353* Signature: (J)V354*/355JNIEXPORT void JNICALL356Java_sun_security_jgss_wrapper_GSSLibStub_releaseName(JNIEnv *env,357jobject jobj,358jlong pName)359{360OM_uint32 minor, major;361gss_name_t nameHdl;362363nameHdl = (gss_name_t) jlong_to_ptr(pName);364365TRACE1("[GSSLibStub_releaseName] %ld", (long) pName);366367if (nameHdl != GSS_C_NO_NAME) {368/* gss_release_name(...) => GSS_S_BAD_NAME */369major = (*ftab->releaseName)(&minor, &nameHdl);370checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseName]");371}372}373374/*375* Class: sun_security_jgss_wrapper_GSSLibStub376* Method: importName377* Signature: ([BLorg/ietf/jgss/Oid;)J378*/379JNIEXPORT jlong JNICALL380Java_sun_security_jgss_wrapper_GSSLibStub_importName(JNIEnv *env,381jobject jobj,382jbyteArray jnameVal,383jobject jnameType)384{385OM_uint32 minor, major;386gss_buffer_desc nameVal;387gss_OID nameType;388gss_name_t nameHdl;389nameHdl = GSS_C_NO_NAME;390391TRACE0("[GSSLibStub_importName]");392393initGSSBuffer(env, jnameVal, &nameVal);394if ((*env)->ExceptionCheck(env)) {395return jlong_zero;396}397398nameType = newGSSOID(env, jnameType);399if ((*env)->ExceptionCheck(env)) {400resetGSSBuffer(&nameVal);401return jlong_zero;402}403404/* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME,405GSS_S_BAD_MECH */406major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl);407408TRACE1("[GSSLibStub_importName] %" PRIuPTR "", (uintptr_t) nameHdl);409410/* release intermediate buffers */411deleteGSSOID(nameType);412resetGSSBuffer(&nameVal);413414checkStatus(env, jobj, major, minor, "[GSSLibStub_importName]");415if ((*env)->ExceptionCheck(env)) {416return jlong_zero;417}418return ptr_to_jlong(nameHdl);419}420421422/*423* Class: sun_security_jgss_wrapper_GSSLibStub424* Method: compareName425* Signature: (JJ)Z426*/427JNIEXPORT jboolean JNICALL428Java_sun_security_jgss_wrapper_GSSLibStub_compareName(JNIEnv *env,429jobject jobj,430jlong pName1,431jlong pName2)432{433OM_uint32 minor, major;434gss_name_t nameHdl1, nameHdl2;435int isEqual;436437isEqual = 0;438nameHdl1 = (gss_name_t) jlong_to_ptr(pName1);439nameHdl2 = (gss_name_t) jlong_to_ptr(pName2);440441TRACE2("[GSSLibStub_compareName] %ld %ld", (long)pName1, (long)pName2);442443if ((nameHdl1 != GSS_C_NO_NAME) && (nameHdl2 != GSS_C_NO_NAME)) {444445/* gss_compare_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME(!) */446major = (*ftab->compareName)(&minor, nameHdl1, nameHdl2, &isEqual);447448checkStatus(env, jobj, major, minor, "[GSSLibStub_compareName]");449}450return (isEqual != 0);451}452453/*454* Class: sun_security_jgss_wrapper_GSSLibStub455* Method: canonicalizeName456* Signature: (J)J457*/458JNIEXPORT jlong JNICALL459Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName(JNIEnv *env,460jobject jobj,461jlong pName)462{463OM_uint32 minor, major;464gss_name_t nameHdl, mnNameHdl;465gss_OID mech;466467nameHdl = (gss_name_t) jlong_to_ptr(pName);468469TRACE1("[GSSLibStub_canonicalizeName] %ld", (long) pName);470471if (nameHdl != GSS_C_NO_NAME) {472mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));473mnNameHdl = GSS_C_NO_NAME;474475/* gss_canonicalize_name(...) may return GSS_S_BAD_NAMETYPE,476GSS_S_BAD_NAME, GSS_S_BAD_MECH */477major = (*ftab->canonicalizeName)(&minor, nameHdl, mech, &mnNameHdl);478479TRACE1("[GSSLibStub_canonicalizeName] MN=%" PRIuPTR "", (uintptr_t)mnNameHdl);480481checkStatus(env, jobj, major, minor, "[GSSLibStub_canonicalizeName]");482if ((*env)->ExceptionCheck(env)) {483return ptr_to_jlong(GSS_C_NO_NAME);484}485return ptr_to_jlong(mnNameHdl);486}487return ptr_to_jlong(GSS_C_NO_NAME);488}489490/*491* Class: sun_security_jgss_wrapper_GSSLibStub492* Method: exportName493* Signature: (J)[B494*/495JNIEXPORT jbyteArray JNICALL496Java_sun_security_jgss_wrapper_GSSLibStub_exportName(JNIEnv *env,497jobject jobj,498jlong pName) {499OM_uint32 minor, major;500gss_name_t nameHdl, mNameHdl;501gss_buffer_desc outBuf;502jbyteArray jresult;503504nameHdl = (gss_name_t) jlong_to_ptr(pName);505506TRACE1("[GSSLibStub_exportName] %ld", (long) pName);507508/* gss_export_name(...) => GSS_S_NAME_NOT_MN, GSS_S_BAD_NAMETYPE,509GSS_S_BAD_NAME */510major = (*ftab->exportName)(&minor, nameHdl, &outBuf);511512/* canonicalize the internal name to MN and retry */513if (major == GSS_S_NAME_NOT_MN) {514/* release intermediate buffers before retrying */515(*ftab->releaseBuffer)(&minor, &outBuf);516517TRACE0("[GSSLibStub_exportName] canonicalize and re-try");518519mNameHdl = (gss_name_t)jlong_to_ptr(520Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName521(env, jobj, pName));522if ((*env)->ExceptionCheck(env)) {523return NULL;524}525526major = (*ftab->exportName)(&minor, mNameHdl, &outBuf);527Java_sun_security_jgss_wrapper_GSSLibStub_releaseName528(env, jobj, ptr_to_jlong(mNameHdl));529if ((*env)->ExceptionCheck(env)) {530/* release intermediate buffers */531(*ftab->releaseBuffer)(&minor, &outBuf);532return NULL;533}534}535536/* release intermediate buffers before checking status */537jresult = getJavaBuffer(env, &outBuf);538if ((*env)->ExceptionCheck(env)) {539return NULL;540}541542checkStatus(env, jobj, major, minor, "[GSSLibStub_exportName]");543if ((*env)->ExceptionCheck(env)) {544return NULL;545}546return jresult;547}548549/*550* Class: sun_security_jgss_wrapper_GSSLibStub551* Method: displayName552* Signature: (J)[Ljava/lang/Object;553*/554JNIEXPORT jobjectArray JNICALL555Java_sun_security_jgss_wrapper_GSSLibStub_displayName(JNIEnv *env,556jobject jobj,557jlong pName) {558OM_uint32 minor, major;559gss_name_t nameHdl;560gss_buffer_desc outNameBuf;561gss_OID outNameType;562jstring jname;563jobject jtype;564jobjectArray jresult;565566nameHdl = (gss_name_t) jlong_to_ptr(pName);567568TRACE1("[GSSLibStub_displayName] %ld", (long) pName);569570if (nameHdl == GSS_C_NO_NAME) {571checkStatus(env, jobj, GSS_S_BAD_NAME, 0, "[GSSLibStub_displayName]");572return NULL;573}574575/* gss_display_name(...) => GSS_S_BAD_NAME */576major = (*ftab->displayName)(&minor, nameHdl, &outNameBuf, &outNameType);577578/* release intermediate buffers before checking status */579jname = getJavaString(env, &outNameBuf);580if ((*env)->ExceptionCheck(env)) {581return NULL;582}583584checkStatus(env, jobj, major, minor, "[GSSLibStub_displayName]");585if ((*env)->ExceptionCheck(env)) {586return NULL;587}588589jtype = getJavaOID(env, outNameType);590if ((*env)->ExceptionCheck(env)) {591return NULL;592}593594jresult = (*env)->NewObjectArray(env, 2, CLS_Object, NULL);595/* return immediately if an exception has occurred */596if ((*env)->ExceptionCheck(env)) {597return NULL;598}599600(*env)->SetObjectArrayElement(env, jresult, 0, jname);601if ((*env)->ExceptionCheck(env)) {602return NULL;603}604(*env)->SetObjectArrayElement(env, jresult, 1, jtype);605if ((*env)->ExceptionCheck(env)) {606return NULL;607}608609return jresult;610}611612/*613* Class: sun_security_jgss_wrapper_GSSLibStub614* Method: acquireCred615* Signature: (JII)J616*/617JNIEXPORT jlong JNICALL618Java_sun_security_jgss_wrapper_GSSLibStub_acquireCred(JNIEnv *env,619jobject jobj,620jlong pName,621jint reqTime,622jint usage)623{624OM_uint32 minor, major;625gss_OID mech;626gss_OID_set mechs;627gss_cred_usage_t credUsage;628gss_name_t nameHdl;629gss_cred_id_t credHdl;630credHdl = GSS_C_NO_CREDENTIAL;631632TRACE0("[GSSLibStub_acquireCred]");633634mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));635mechs = newGSSOIDSet(mech);636credUsage = (gss_cred_usage_t) usage;637nameHdl = (gss_name_t) jlong_to_ptr(pName);638639TRACE2("[GSSLibStub_acquireCred] pName=%ld, usage=%d", (long)pName, usage);640641/* gss_acquire_cred(...) => GSS_S_BAD_MECH, GSS_S_BAD_NAMETYPE,642GSS_S_BAD_NAME, GSS_S_CREDENTIALS_EXPIRED, GSS_S_NO_CRED */643major =644(*ftab->acquireCred)(&minor, nameHdl, reqTime, mechs,645credUsage, &credHdl, NULL, NULL);646/* release intermediate buffers */647deleteGSSOIDSet(mechs);648649TRACE1("[GSSLibStub_acquireCred] pCred=%" PRIuPTR "", (uintptr_t) credHdl);650651checkStatus(env, jobj, major, minor, "[GSSLibStub_acquireCred]");652if ((*env)->ExceptionCheck(env)) {653return jlong_zero;654}655return ptr_to_jlong(credHdl);656}657658/*659* Class: sun_security_jgss_wrapper_GSSLibStub660* Method: releaseCred661* Signature: (J)J662*/663JNIEXPORT jlong JNICALL664Java_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env,665jobject jobj,666jlong pCred)667{668OM_uint32 minor, major;669gss_cred_id_t credHdl;670671credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);672673TRACE1("[GSSLibStub_releaseCred] %ld", (long int)pCred);674675if (credHdl != GSS_C_NO_CREDENTIAL) {676/* gss_release_cred(...) => GSS_S_NO_CRED(!) */677major = (*ftab->releaseCred)(&minor, &credHdl);678679checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseCred]");680if ((*env)->ExceptionCheck(env)) {681return jlong_zero;682}683}684return ptr_to_jlong(credHdl);685}686687/*688* Utility routine for obtaining info about a credential.689*/690void inquireCred(JNIEnv *env, jobject jobj, gss_cred_id_t pCred,691jint type, void *result) {692OM_uint32 minor=0, major=0;693OM_uint32 routineErr;694gss_cred_id_t credHdl;695696credHdl = pCred;697698TRACE1("[gss_inquire_cred] %" PRIuPTR "", (uintptr_t) pCred);699700/* gss_inquire_cred(...) => GSS_S_DEFECTIVE_CREDENTIAL(!),701GSS_S_CREDENTIALS_EXPIRED(!), GSS_S_NO_CRED(!) */702if (type == TYPE_CRED_NAME) {703major = (*ftab->inquireCred)(&minor, credHdl, result, NULL, NULL, NULL);704} else if (type == TYPE_CRED_TIME) {705major = (*ftab->inquireCred)(&minor, credHdl, NULL, result, NULL, NULL);706} else if (type == TYPE_CRED_USAGE) {707major = (*ftab->inquireCred)(&minor, credHdl, NULL, NULL, result, NULL);708}709710routineErr = GSS_ROUTINE_ERROR(major);711if (routineErr == GSS_S_CREDENTIALS_EXPIRED) {712/* ignore GSS_S_CREDENTIALS_EXPIRED for query */713major = GSS_CALLING_ERROR(major) |714GSS_SUPPLEMENTARY_INFO(major);715} else if (routineErr == GSS_S_NO_CRED) {716/* twik since Java API throws BAD_MECH instead of NO_CRED */717major = GSS_CALLING_ERROR(major) |718GSS_S_BAD_MECH | GSS_SUPPLEMENTARY_INFO(major);719}720checkStatus(env, jobj, major, minor, "[gss_inquire_cred]");721}722723/*724* Class: sun_security_jgss_wrapper_GSSLibStub725* Method: getCredName726* Signature: (J)J727*/728JNIEXPORT jlong JNICALL729Java_sun_security_jgss_wrapper_GSSLibStub_getCredName(JNIEnv *env,730jobject jobj,731jlong pCred)732{733gss_name_t nameHdl;734gss_cred_id_t credHdl;735736credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);737738TRACE1("[GSSLibStub_getCredName] %ld", (long int)pCred);739740nameHdl = GSS_C_NO_NAME;741inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl);742/* return immediately if an exception has occurred */743if ((*env)->ExceptionCheck(env)) {744return jlong_zero;745}746747TRACE1("[GSSLibStub_getCredName] pName=%" PRIuPTR "", (uintptr_t) nameHdl);748return ptr_to_jlong(nameHdl);749}750751/*752* Class: sun_security_jgss_wrapper_GSSLibStub753* Method: getCredTime754* Signature: (J)I755*/756JNIEXPORT jint JNICALL757Java_sun_security_jgss_wrapper_GSSLibStub_getCredTime(JNIEnv *env,758jobject jobj,759jlong pCred)760{761gss_cred_id_t credHdl;762OM_uint32 lifetime;763764credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);765766TRACE1("[GSSLibStub_getCredTime] %ld", (long int)pCred);767768lifetime = 0;769inquireCred(env, jobj, credHdl, TYPE_CRED_TIME, &lifetime);770/* return immediately if an exception has occurred */771if ((*env)->ExceptionCheck(env)) {772return 0;773}774return getJavaTime(lifetime);775}776777/*778* Class: sun_security_jgss_wrapper_GSSLibStub779* Method: getCredUsage780* Signature: (J)I781*/782JNIEXPORT jint JNICALL783Java_sun_security_jgss_wrapper_GSSLibStub_getCredUsage(JNIEnv *env,784jobject jobj,785jlong pCred)786{787gss_cred_usage_t usage;788gss_cred_id_t credHdl;789790credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);791792TRACE1("[GSSLibStub_getCredUsage] %ld", (long int)pCred);793794inquireCred(env, jobj, credHdl, TYPE_CRED_USAGE, &usage);795/* return immediately if an exception has occurred */796if ((*env)->ExceptionCheck(env)) {797return -1;798}799return (jint) usage;800}801/*802* Class: sun_security_jgss_wrapper_GSSLibStub803* Method: importContext804* Signature: ([B)Lsun/security/jgss/wrapper/NativeGSSContext;805*/806JNIEXPORT jobject JNICALL807Java_sun_security_jgss_wrapper_GSSLibStub_importContext(JNIEnv *env,808jobject jobj,809jbyteArray jctxtToken)810{811OM_uint32 minor, major;812gss_buffer_desc ctxtToken;813gss_ctx_id_t contextHdl;814gss_OID mech, mech2;815816TRACE0("[GSSLibStub_importContext]");817818contextHdl = GSS_C_NO_CONTEXT;819initGSSBuffer(env, jctxtToken, &ctxtToken);820if ((*env)->ExceptionCheck(env)) {821return NULL;822}823824/* gss_import_sec_context(...) => GSS_S_NO_CONTEXT, GSS_S_DEFECTIVE_TOKEN,825GSS_S_UNAVAILABLE, GSS_S_UNAUTHORIZED */826major = (*ftab->importSecContext)(&minor, &ctxtToken, &contextHdl);827828TRACE1("[GSSLibStub_importContext] pContext=%" PRIuPTR "", (uintptr_t) contextHdl);829830/* release intermediate buffers */831resetGSSBuffer(&ctxtToken);832833checkStatus(env, jobj, major, minor, "[GSSLibStub_importContext]");834/* return immediately if an exception has occurred */835if ((*env)->ExceptionCheck(env)) {836return NULL;837}838839/* now that the context has been imported, proceed to find out840its mech */841major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL,842NULL, &mech, NULL, NULL, NULL);843844checkStatus(env, jobj, major, minor, "[GSSLibStub_importContext] getMech");845/* return immediately if an exception has occurred */846if ((*env)->ExceptionCheck(env)) {847return NULL;848}849850mech2 = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj,851FID_GSSLibStub_pMech));852853if (sameMech(mech, mech2) == JNI_TRUE) {854/* mech match - return the context object */855return (*env)->NewObject(env, CLS_NativeGSSContext,856MID_NativeGSSContext_ctor,857ptr_to_jlong(contextHdl), jobj);858} else {859/* mech mismatch - clean up then return null */860major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER);861checkStatus(env, jobj, major, minor,862"[GSSLibStub_importContext] cleanup");863return NULL;864}865}866867/*868* Class: sun_security_jgss_wrapper_GSSLibStub869* Method: initContext870* Signature: (JJLorg/ietf/jgss/ChannelBinding;[BLsun/security/jgss/wrapper/NativeGSSContext;)[B871*/872JNIEXPORT jbyteArray JNICALL873Java_sun_security_jgss_wrapper_GSSLibStub_initContext(JNIEnv *env,874jobject jobj,875jlong pCred,876jlong pName,877jobject jcb,878jbyteArray jinToken,879jobject jcontextSpi)880{881OM_uint32 minor, major;882gss_cred_id_t credHdl ;883gss_ctx_id_t contextHdl, contextHdlSave;884gss_name_t targetName;885gss_OID mech;886OM_uint32 flags, aFlags;887OM_uint32 time, aTime;888gss_channel_bindings_t cb;889gss_buffer_desc inToken;890gss_buffer_desc outToken;891jbyteArray jresult;892/* UNCOMMENT after SEAM bug#6287358 is backported to S10893gss_OID aMech;894jobject jMech;895*/896897TRACE0("[GSSLibStub_initContext]");898899credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);900contextHdl = contextHdlSave = (gss_ctx_id_t) jlong_to_ptr(901(*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext));902targetName = (gss_name_t) jlong_to_ptr(pName);903mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));904flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi,905FID_NativeGSSContext_flags);906time = getGSSTime((*env)->GetIntField(env, jcontextSpi,907FID_NativeGSSContext_lifetime));908cb = newGSSCB(env, jcb);909if ((*env)->ExceptionCheck(env)) {910return NULL;911}912913initGSSBuffer(env, jinToken, &inToken);914if ((*env)->ExceptionCheck(env)) {915deleteGSSCB(cb);916return NULL;917}918919TRACE2( "[GSSLibStub_initContext] before: pCred=%" PRIuPTR ", pContext=%" PRIuPTR "",920(uintptr_t)credHdl, (uintptr_t)contextHdl);921922/* gss_init_sec_context(...) => GSS_S_CONTINUE_NEEDED(!),923GSS_S_DEFECTIVE_TOKEN, GSS_S_NO_CRED, GSS_S_DEFECTIVE_CREDENTIAL(!),924GSS_S_CREDENTIALS_EXPIRED, GSS_S_BAD_BINDINGS, GSS_S_BAD_MIC,925GSS_S_OLD_TOKEN, GSS_S_DUPLICATE_TOKEN, GSS_S_NO_CONTEXT(!),926GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME(!), GSS_S_BAD_MECH */927major = (*ftab->initSecContext)(&minor, credHdl,928&contextHdl, targetName, mech,929flags, time, cb, &inToken, NULL /*aMech*/,930&outToken, &aFlags, &aTime);931932TRACE2("[GSSLibStub_initContext] after: pContext=%" PRIuPTR ", outToken len=%ld",933(uintptr_t)contextHdl, (long)outToken.length);934935// update context handle with the latest value if changed936// this is to work with both MIT and Solaris. Former deletes half-built937// context if error occurs938if (contextHdl != contextHdlSave) {939(*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext,940ptr_to_jlong(contextHdl));941TRACE1("[GSSLibStub_initContext] set pContext=%" PRIuPTR "", (uintptr_t)contextHdl);942}943944if (GSS_ERROR(major) == GSS_S_COMPLETE) {945/* update member values if needed */946(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags);947TRACE1("[GSSLibStub_initContext] set flags=0x%x", aFlags);948949if (major == GSS_S_COMPLETE) {950(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,951getJavaTime(aTime));952TRACE0("[GSSLibStub_initContext] context established");953954(*env)->SetBooleanField(env, jcontextSpi,955FID_NativeGSSContext_isEstablished,956JNI_TRUE);957958/* UNCOMMENT after SEAM bug#6287358 is backported to S10959jMech = getJavaOID(env, aMech);960(*env)->SetObjectField(env, jcontextSpi,961FID_NativeGSSContext_actualMech, jMech);962*/963} else if (major & GSS_S_CONTINUE_NEEDED) {964TRACE0("[GSSLibStub_initContext] context not established");965major -= GSS_S_CONTINUE_NEEDED;966}967}968969/* release intermediate buffers before checking status */970deleteGSSCB(cb);971resetGSSBuffer(&inToken);972jresult = getJavaBuffer(env, &outToken);973if ((*env)->ExceptionCheck(env)) {974return NULL;975}976977checkStatus(env, jobj, major, minor, "[GSSLibStub_initContext]");978if ((*env)->ExceptionCheck(env)) {979return NULL;980}981return jresult;982}983984/*985* Class: sun_security_jgss_wrapper_GSSLibStub986* Method: acceptContext987* Signature: (JLorg/ietf/jgss/ChannelBinding;[BLsun/security/jgss/wrapper/NativeGSSContext;)[B988*/989JNIEXPORT jbyteArray JNICALL990Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env,991jobject jobj,992jlong pCred,993jobject jcb,994jbyteArray jinToken,995jobject jcontextSpi)996{997OM_uint32 minor, major;998OM_uint32 minor2, major2;999gss_ctx_id_t contextHdl, contextHdlSave;1000gss_cred_id_t credHdl;1001gss_buffer_desc inToken;1002gss_channel_bindings_t cb;1003gss_name_t srcName;1004gss_buffer_desc outToken;1005gss_OID aMech;1006OM_uint32 aFlags;1007OM_uint32 aTime;1008gss_cred_id_t delCred;1009jobject jsrcName = NULL;1010jobject jdelCred;1011jobject jMech;1012jboolean setTarget;1013gss_name_t targetName;1014jobject jtargetName;10151016TRACE0("[GSSLibStub_acceptContext]");10171018contextHdl = contextHdlSave = (gss_ctx_id_t)jlong_to_ptr(1019(*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext));1020credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);1021initGSSBuffer(env, jinToken, &inToken);1022if ((*env)->ExceptionCheck(env)) {1023return NULL;1024}1025cb = newGSSCB(env, jcb);1026if ((*env)->ExceptionCheck(env)) {1027resetGSSBuffer(&inToken);1028return NULL;1029}1030srcName = targetName = GSS_C_NO_NAME;1031delCred = GSS_C_NO_CREDENTIAL;1032setTarget = (credHdl == GSS_C_NO_CREDENTIAL);1033aFlags = 0;10341035TRACE2( "[GSSLibStub_acceptContext] before: pCred=%" PRIuPTR ", pContext=%" PRIuPTR "",1036(uintptr_t) credHdl, (uintptr_t) contextHdl);10371038/* gss_accept_sec_context(...) => GSS_S_CONTINUE_NEEDED(!),1039GSS_S_DEFECTIVE_TOKEN, GSS_S_DEFECTIVE_CREDENTIAL(!),1040GSS_S_NO_CRED, GSS_S_CREDENTIALS_EXPIRED, GSS_S_BAD_BINDINGS,1041GSS_S_NO_CONTEXT(!), GSS_S_BAD_MIC, GSS_S_OLD_TOKEN,1042GSS_S_DUPLICATE_TOKEN, GSS_S_BAD_MECH */1043major =1044(*ftab->acceptSecContext)(&minor, &contextHdl, credHdl,1045&inToken, cb, &srcName, &aMech, &outToken,1046&aFlags, &aTime, &delCred);1047/* release intermediate buffers before checking status */10481049deleteGSSCB(cb);1050resetGSSBuffer(&inToken);10511052TRACE3("[GSSLibStub_acceptContext] after: pCred=%" PRIuPTR ", pContext=%" PRIuPTR ", pDelegCred=%" PRIuPTR "",1053(uintptr_t)credHdl, (uintptr_t)contextHdl, (uintptr_t) delCred);10541055// update context handle with the latest value if changed1056// this is to work with both MIT and Solaris. Former deletes half-built1057// context if error occurs1058if (contextHdl != contextHdlSave) {1059(*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext,1060ptr_to_jlong(contextHdl));1061TRACE1("[GSSLibStub_acceptContext] set pContext=%" PRIuPTR "", (uintptr_t)contextHdl);1062}10631064if (GSS_ERROR(major) == GSS_S_COMPLETE) {1065/* update member values if needed */1066// WORKAROUND for a Heimdal bug1067if (delCred == GSS_C_NO_CREDENTIAL) {1068aFlags &= 0xfffffffe;1069}1070(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags);1071TRACE1("[GSSLibStub_acceptContext] set flags=0x%x", aFlags);10721073if (setTarget) {1074major2 = (*ftab->inquireContext)(&minor2, contextHdl, NULL,1075&targetName, NULL, NULL, NULL,1076NULL, NULL);1077checkStatus(env, jobj, major2, minor2,1078"[GSSLibStub_acceptContext] inquire");1079if ((*env)->ExceptionCheck(env)) {1080goto error;1081}10821083jtargetName = (*env)->NewObject(env, CLS_GSSNameElement,1084MID_GSSNameElement_ctor,1085ptr_to_jlong(targetName), jobj);1086if ((*env)->ExceptionCheck(env)) {1087goto error;1088}10891090TRACE1("[GSSLibStub_acceptContext] set targetName=%" PRIuPTR "",1091(uintptr_t)targetName);10921093(*env)->SetObjectField(env, jcontextSpi, FID_NativeGSSContext_targetName,1094jtargetName);1095if ((*env)->ExceptionCheck(env)) {1096goto error;1097}1098}1099if (srcName != GSS_C_NO_NAME) {1100jsrcName = (*env)->NewObject(env, CLS_GSSNameElement,1101MID_GSSNameElement_ctor,1102ptr_to_jlong(srcName), jobj);1103if ((*env)->ExceptionCheck(env)) {1104goto error;1105}11061107TRACE1("[GSSLibStub_acceptContext] set srcName=%" PRIuPTR "", (uintptr_t)srcName);11081109(*env)->SetObjectField(env, jcontextSpi, FID_NativeGSSContext_srcName,1110jsrcName);1111if ((*env)->ExceptionCheck(env)) {1112goto error;1113}1114}1115if (major == GSS_S_COMPLETE) {1116TRACE0("[GSSLibStub_acceptContext] context established");11171118(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,1119getJavaTime(aTime));1120(*env)->SetBooleanField(env, jcontextSpi,1121FID_NativeGSSContext_isEstablished,1122JNI_TRUE);1123jMech = getJavaOID(env, aMech);1124if ((*env)->ExceptionCheck(env)) {1125goto error;1126}1127(*env)->SetObjectField(env, jcontextSpi,1128FID_NativeGSSContext_actualMech, jMech);1129if ((*env)->ExceptionCheck(env)) {1130goto error;1131}1132if (delCred != GSS_C_NO_CREDENTIAL) {1133jdelCred = (*env)->NewObject(env, CLS_GSSCredElement,1134MID_GSSCredElement_ctor,1135ptr_to_jlong(delCred), jsrcName, jMech);1136if ((*env)->ExceptionCheck(env)) {1137goto error;1138}1139(*env)->SetObjectField(env, jcontextSpi,1140FID_NativeGSSContext_delegatedCred,1141jdelCred);1142TRACE1("[GSSLibStub_acceptContext] set delegatedCred=%" PRIuPTR "",1143(uintptr_t) delCred);11441145if ((*env)->ExceptionCheck(env)) {1146goto error;1147}1148}1149} else if (major & GSS_S_CONTINUE_NEEDED) {1150TRACE0("[GSSLibStub_acceptContext] context not established");11511152if (aFlags & GSS_C_PROT_READY_FLAG) {1153(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,1154getJavaTime(aTime));1155}1156major -= GSS_S_CONTINUE_NEEDED;1157}1158}1159return getJavaBuffer(env, &outToken);11601161error:1162(*ftab->releaseBuffer)(&minor, &outToken);1163if (srcName != GSS_C_NO_NAME) {1164(*ftab->releaseName)(&minor, &srcName);1165}1166if (targetName != GSS_C_NO_NAME) {1167(*ftab->releaseName)(&minor, &targetName);1168}1169if (delCred != GSS_C_NO_CREDENTIAL) {1170(*ftab->releaseCred) (&minor, &delCred);1171}1172return NULL;1173}11741175/*1176* Class: sun_security_jgss_wrapper_GSSLibStub1177* Method: inquireContext1178* Signature: (J)[J1179*/1180JNIEXPORT jlongArray JNICALL1181Java_sun_security_jgss_wrapper_GSSLibStub_inquireContext(JNIEnv *env,1182jobject jobj,1183jlong pContext)1184{1185OM_uint32 minor, major;1186gss_ctx_id_t contextHdl;1187gss_name_t srcName, targetName;1188OM_uint32 time;1189OM_uint32 flags;1190int isInitiator, isEstablished;1191#if defined (_WIN32) && defined (_MSC_VER)1192__declspec(align(8))1193#endif1194jlong result[6];1195jlongArray jresult;11961197contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);11981199TRACE1("[GSSLibStub_inquireContext] %" PRIuPTR "", (uintptr_t)contextHdl);12001201srcName = targetName = GSS_C_NO_NAME;1202time = 0;1203flags = isInitiator = isEstablished = 0;12041205/* gss_inquire_context(...) => GSS_S_NO_CONTEXT(!) */1206major = (*ftab->inquireContext)(&minor, contextHdl, &srcName,1207&targetName, &time, NULL, &flags,1208&isInitiator, &isEstablished);1209/* update member values if needed */1210TRACE2("[GSSLibStub_inquireContext] srcName %" PRIuPTR ", targetName %" PRIuPTR "",1211(uintptr_t)srcName, (uintptr_t)targetName);12121213checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContext]");1214if ((*env)->ExceptionCheck(env)) {1215return NULL;1216}1217result[0] = ptr_to_jlong(srcName);1218result[1] = ptr_to_jlong(targetName);1219result[2] = (jlong) isInitiator;1220result[3] = (jlong) isEstablished;1221result[4] = (jlong) flags;1222result[5] = (jlong) getJavaTime(time);12231224jresult = (*env)->NewLongArray(env, 6);1225if (jresult == NULL) {1226return NULL;1227}1228(*env)->SetLongArrayRegion(env, jresult, 0, 6, result);1229if ((*env)->ExceptionCheck(env)) {1230return NULL;1231}1232return jresult;1233}12341235/*1236* Class: sun_security_jgss_wrapper_GSSLibStub1237* Method: getContextMech1238* Signature: (J)Lorg/ietf/jgss/Oid;1239*/1240JNIEXPORT jobject JNICALL1241Java_sun_security_jgss_wrapper_GSSLibStub_getContextMech(JNIEnv *env,1242jobject jobj,1243jlong pContext)1244{1245OM_uint32 minor, major;1246gss_OID mech;1247gss_ctx_id_t contextHdl;12481249contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);12501251TRACE1("[GSSLibStub_getContextMech] %ld", (long int)pContext);12521253major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL,1254NULL, &mech, NULL, NULL, NULL);12551256checkStatus(env, jobj, major, minor, "[GSSLibStub_getContextMech]");1257/* return immediately if an exception has occurred */1258if ((*env)->ExceptionCheck(env)) {1259return NULL;1260}12611262return getJavaOID(env, mech);1263}12641265/*1266* Class: sun_security_jgss_wrapper_GSSLibStub1267* Method: getContextName1268* Signature: (JZ)J1269*/1270JNIEXPORT jlong JNICALL1271Java_sun_security_jgss_wrapper_GSSLibStub_getContextName(JNIEnv *env,1272jobject jobj, jlong pContext, jboolean isSrc)1273{1274OM_uint32 minor, major;1275gss_name_t nameHdl;1276gss_ctx_id_t contextHdl;12771278contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);12791280TRACE2("[GSSLibStub_getContextName] %" PRIuPTR ", isSrc=%d",1281(uintptr_t)contextHdl, isSrc);12821283nameHdl = GSS_C_NO_NAME;1284if (isSrc == JNI_TRUE) {1285major = (*ftab->inquireContext)(&minor, contextHdl, &nameHdl, NULL,1286NULL, NULL, NULL, NULL, NULL);1287} else {1288major = (*ftab->inquireContext)(&minor, contextHdl, NULL, &nameHdl,1289NULL, NULL, NULL, NULL, NULL);1290}12911292checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]");1293/* return immediately if an exception has occurred */1294if ((*env)->ExceptionCheck(env)) {1295return jlong_zero;1296}12971298TRACE1("[GSSLibStub_getContextName] pName=%" PRIuPTR "", (uintptr_t) nameHdl);12991300return ptr_to_jlong(nameHdl);1301}13021303/*1304* Class: sun_security_jgss_wrapper_GSSLibStub1305* Method: getContextTime1306* Signature: (J)I1307*/1308JNIEXPORT jint JNICALL1309Java_sun_security_jgss_wrapper_GSSLibStub_getContextTime(JNIEnv *env,1310jobject jobj,1311jlong pContext) {1312OM_uint32 minor, major;1313gss_ctx_id_t contextHdl;1314OM_uint32 time;13151316contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);13171318TRACE1("[GSSLibStub_getContextTime] %" PRIuPTR "", (uintptr_t)contextHdl);13191320if (contextHdl == GSS_C_NO_CONTEXT) return 0;13211322/* gss_context_time(...) => GSS_S_CONTEXT_EXPIRED(!),1323GSS_S_NO_CONTEXT(!) */1324major = (*ftab->contextTime)(&minor, contextHdl, &time);1325if (GSS_ROUTINE_ERROR(major) == GSS_S_CONTEXT_EXPIRED) {1326major = GSS_CALLING_ERROR(major) | GSS_SUPPLEMENTARY_INFO(major);1327}1328checkStatus(env, jobj, major, minor, "[GSSLibStub_getContextTime]");1329if ((*env)->ExceptionCheck(env)) {1330return 0;1331}1332return getJavaTime(time);1333}13341335/*1336* Class: sun_security_jgss_wrapper_GSSLibStub1337* Method: deleteContext1338* Signature: (J)J1339*/1340JNIEXPORT jlong JNICALL1341Java_sun_security_jgss_wrapper_GSSLibStub_deleteContext(JNIEnv *env,1342jobject jobj,1343jlong pContext)1344{1345OM_uint32 minor, major;1346gss_ctx_id_t contextHdl;13471348contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);13491350TRACE1("[GSSLibStub_deleteContext] %" PRIuPTR "", (uintptr_t)contextHdl);13511352if (contextHdl == GSS_C_NO_CONTEXT) return ptr_to_jlong(GSS_C_NO_CONTEXT);13531354/* gss_delete_sec_context(...) => GSS_S_NO_CONTEXT(!) */1355major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER);13561357checkStatus(env, jobj, major, minor, "[GSSLibStub_deleteContext]");1358if ((*env)->ExceptionCheck(env)) {1359return jlong_zero;1360}1361return (jlong) ptr_to_jlong(contextHdl);1362}13631364/*1365* Class: sun_security_jgss_wrapper_GSSLibStub1366* Method: wrapSizeLimit1367* Signature: (JIII)I1368*/1369JNIEXPORT jint JNICALL1370Java_sun_security_jgss_wrapper_GSSLibStub_wrapSizeLimit(JNIEnv *env,1371jobject jobj,1372jlong pContext,1373jint reqFlag,1374jint jqop,1375jint joutSize)1376{1377OM_uint32 minor, major;1378gss_ctx_id_t contextHdl;1379OM_uint32 outSize, maxInSize;1380gss_qop_t qop;13811382contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);13831384TRACE1("[GSSLibStub_wrapSizeLimit] %" PRIuPTR "", (uintptr_t)contextHdl);13851386if (contextHdl == GSS_C_NO_CONTEXT) {1387// Twik per javadoc1388checkStatus(env, jobj, GSS_S_NO_CONTEXT, 0,1389"[GSSLibStub_wrapSizeLimit]");1390return 0;1391}13921393qop = (gss_qop_t) jqop;1394outSize = (OM_uint32) joutSize;1395/* gss_wrap_size_limit(...) => GSS_S_NO_CONTEXT(!), GSS_S_CONTEXT_EXPIRED,1396GSS_S_BAD_QOP */1397major = (*ftab->wrapSizeLimit)(&minor, contextHdl, reqFlag,1398qop, outSize, &maxInSize);13991400checkStatus(env, jobj, major, minor, "[GSSLibStub_wrapSizeLimit]");1401if ((*env)->ExceptionCheck(env)) {1402return 0;1403}1404return (jint) maxInSize;1405}14061407/*1408* Class: sun_security_jgss_wrapper_GSSLibStub1409* Method: exportContext1410* Signature: (J)[B1411*/1412JNIEXPORT jbyteArray JNICALL1413Java_sun_security_jgss_wrapper_GSSLibStub_exportContext(JNIEnv *env,1414jobject jobj,1415jlong pContext)1416{1417OM_uint32 minor, major;1418gss_ctx_id_t contextHdl;1419gss_buffer_desc interProcToken;1420jbyteArray jresult;14211422contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);14231424TRACE1("[GSSLibStub_exportContext] %" PRIuPTR "", (uintptr_t)contextHdl);14251426if (contextHdl == GSS_C_NO_CONTEXT) {1427// Twik per javadoc1428checkStatus(env, jobj, GSS_S_NO_CONTEXT, 0, "[GSSLibStub_exportContext]");1429return NULL;1430}1431/* gss_export_sec_context(...) => GSS_S_CONTEXT_EXPIRED,1432GSS_S_NO_CONTEXT, GSS_S_UNAVAILABLE */1433major =1434(*ftab->exportSecContext)(&minor, &contextHdl, &interProcToken);14351436/* release intermediate buffers */1437jresult = getJavaBuffer(env, &interProcToken);1438if ((*env)->ExceptionCheck(env)) {1439return NULL;1440}1441checkStatus(env, jobj, major, minor, "[GSSLibStub_exportContext]");1442if ((*env)->ExceptionCheck(env)) {1443return NULL;1444}14451446return jresult;1447}14481449/*1450* Class: sun_security_jgss_wrapper_GSSLibStub1451* Method: getMic1452* Signature: (JI[B)[B1453*/1454JNIEXPORT jbyteArray JNICALL1455Java_sun_security_jgss_wrapper_GSSLibStub_getMic(JNIEnv *env, jobject jobj,1456jlong pContext, jint jqop,1457jbyteArray jmsg)1458{1459OM_uint32 minor, major;1460gss_ctx_id_t contextHdl;1461gss_qop_t qop;1462gss_buffer_desc msg;1463gss_buffer_desc msgToken;1464jbyteArray jresult;14651466contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);14671468TRACE1("[GSSLibStub_getMic] %" PRIuPTR "", (uintptr_t)contextHdl);14691470if (contextHdl == GSS_C_NO_CONTEXT) {1471// Twik per javadoc1472checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_getMic]");1473return NULL;1474}1475qop = (gss_qop_t) jqop;1476initGSSBuffer(env, jmsg, &msg);1477if ((*env)->ExceptionCheck(env)) {1478return NULL;1479}14801481/* gss_get_mic(...) => GSS_S_CONTEXT_EXPIRED, GSS_S_NO_CONTEXT(!),1482GSS_S_BAD_QOP */1483major =1484(*ftab->getMic)(&minor, contextHdl, qop, &msg, &msgToken);14851486/* release intermediate buffers */1487resetGSSBuffer(&msg);1488jresult = getJavaBuffer(env, &msgToken);1489if ((*env)->ExceptionCheck(env)) {1490return NULL;1491}1492checkStatus(env, jobj, major, minor, "[GSSLibStub_getMic]");1493if ((*env)->ExceptionCheck(env)) {1494return NULL;1495}14961497return jresult;1498}14991500/*1501* Class: sun_security_jgss_wrapper_GSSLibStub1502* Method: verifyMic1503* Signature: (J[B[BLorg/ietf/jgss/MessageProp;)V1504*/1505JNIEXPORT void JNICALL1506Java_sun_security_jgss_wrapper_GSSLibStub_verifyMic(JNIEnv *env,1507jobject jobj,1508jlong pContext,1509jbyteArray jmsgToken,1510jbyteArray jmsg,1511jobject jprop)1512{1513OM_uint32 minor, major;1514gss_ctx_id_t contextHdl;1515gss_buffer_desc msg;1516gss_buffer_desc msgToken;1517gss_qop_t qop;15181519contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);15201521TRACE1("[GSSLibStub_verifyMic] %" PRIuPTR "", (uintptr_t)contextHdl);15221523if (contextHdl == GSS_C_NO_CONTEXT) {1524// Twik per javadoc1525checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0,1526"[GSSLibStub_verifyMic]");1527return;1528}15291530qop = (gss_qop_t) (*env)->CallIntMethod(env, jprop, MID_MessageProp_getQOP);1531if ((*env)->ExceptionCheck(env)) { return; }15321533initGSSBuffer(env, jmsg, &msg);1534if ((*env)->ExceptionCheck(env)) { return; }15351536initGSSBuffer(env, jmsgToken, &msgToken);1537if ((*env)->ExceptionCheck(env)) {1538resetGSSBuffer(&msg);1539return;1540}15411542/* gss_verify_mic(...) => GSS_S_DEFECTIVE_TOKEN, GSS_S_BAD_MIC,1543GSS_S_CONTEXT_EXPIRED, GSS_S_DUPLICATE_TOKEN(!), GSS_S_OLD_TOKEN(!),1544GSS_S_UNSEQ_TOKEN(!), GSS_S_GAP_TOKEN(!), GSS_S_NO_CONTEXT(!) */1545major =1546(*ftab->verifyMic)(&minor, contextHdl, &msg, &msgToken, &qop);15471548/* release intermediate buffers */1549resetGSSBuffer(&msg);1550resetGSSBuffer(&msgToken);15511552checkStatus(env, jobj, GSS_ERROR(major), minor, "[GSSLibStub_verifyMic]");1553if ((*env)->ExceptionCheck(env)) {1554return;1555}15561557(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setQOP, qop);1558if ((*env)->ExceptionCheck(env)) {1559return;1560}15611562setSupplementaryInfo(env, jobj, jprop, GSS_SUPPLEMENTARY_INFO(major),1563minor);1564if ((*env)->ExceptionCheck(env)) {1565return;1566}1567}15681569/*1570* Class: sun_security_jgss_wrapper_GSSLibStub1571* Method: wrap1572* Signature: (J[BLorg/ietf/jgss/MessageProp;)[B1573*/1574JNIEXPORT jbyteArray JNICALL1575Java_sun_security_jgss_wrapper_GSSLibStub_wrap(JNIEnv *env,1576jobject jobj,1577jlong pContext,1578jbyteArray jmsg,1579jobject jprop)1580{1581OM_uint32 minor, major;1582jboolean confFlag;1583gss_qop_t qop;1584gss_buffer_desc msg;1585gss_buffer_desc msgToken;1586int confState;1587gss_ctx_id_t contextHdl;1588jbyteArray jresult;15891590contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);15911592TRACE1("[GSSLibStub_wrap] %" PRIuPTR "", (uintptr_t)contextHdl);15931594if (contextHdl == GSS_C_NO_CONTEXT) {1595// Twik per javadoc1596checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_wrap]");1597return NULL;1598}15991600confFlag =1601(*env)->CallBooleanMethod(env, jprop, MID_MessageProp_getPrivacy);1602if ((*env)->ExceptionCheck(env)) {1603return NULL;1604}16051606qop = (gss_qop_t)1607(*env)->CallIntMethod(env, jprop, MID_MessageProp_getQOP);1608if ((*env)->ExceptionCheck(env)) {1609return NULL;1610}16111612initGSSBuffer(env, jmsg, &msg);1613if ((*env)->ExceptionCheck(env)) {1614return NULL;1615}16161617/* gss_wrap(...) => GSS_S_CONTEXT_EXPIRED, GSS_S_NO_CONTEXT(!),1618GSS_S_BAD_QOP */1619major = (*ftab->wrap)(&minor, contextHdl, confFlag, qop, &msg, &confState,1620&msgToken);16211622/* release intermediate buffers */1623resetGSSBuffer(&msg);1624jresult = getJavaBuffer(env, &msgToken);1625if ((*env)->ExceptionCheck(env)) {1626return NULL;1627}16281629checkStatus(env, jobj, major, minor, "[GSSLibStub_wrap]");1630if ((*env)->ExceptionCheck(env)) {1631return NULL;1632}16331634(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setPrivacy,1635(confState? JNI_TRUE:JNI_FALSE));1636if ((*env)->ExceptionCheck(env)) {1637return NULL;1638}1639return jresult;1640}16411642/*1643* Class: sun_security_jgss_wrapper_GSSLibStub1644* Method: unwrap1645* Signature: (J[BLorg/ietf/jgss/MessageProp;)[B1646*/1647JNIEXPORT jbyteArray JNICALL1648Java_sun_security_jgss_wrapper_GSSLibStub_unwrap(JNIEnv *env,1649jobject jobj,1650jlong pContext,1651jbyteArray jmsgToken,1652jobject jprop)1653{1654OM_uint32 minor, major;1655gss_ctx_id_t contextHdl;1656gss_buffer_desc msgToken;1657gss_buffer_desc msg;1658int confState;1659gss_qop_t qop;1660jbyteArray jresult;16611662contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);16631664TRACE1("[GSSLibStub_unwrap] %" PRIuPTR "", (uintptr_t)contextHdl);16651666if (contextHdl == GSS_C_NO_CONTEXT) {1667// Twik per javadoc1668checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_unwrap]");1669return NULL;1670}16711672initGSSBuffer(env, jmsgToken, &msgToken);1673if ((*env)->ExceptionCheck(env)) {1674return NULL;1675}16761677confState = 0;1678qop = GSS_C_QOP_DEFAULT;1679/* gss_unwrap(...) => GSS_S_DEFECTIVE_TOKEN, GSS_S_BAD_MIC,1680GSS_S_CONTEXT_EXPIRED, GSS_S_DUPLICATE_TOKEN(!), GSS_S_OLD_TOKEN(!),1681GSS_S_UNSEQ_TOKEN(!), GSS_S_GAP_TOKEN(!), GSS_S_NO_CONTEXT(!) */1682major =1683(*ftab->unwrap)(&minor, contextHdl, &msgToken, &msg, &confState, &qop);16841685/* release intermediate buffers */1686resetGSSBuffer(&msgToken);1687jresult = getJavaBuffer(env, &msg);1688if ((*env)->ExceptionCheck(env)) {1689return NULL;1690}16911692checkStatus(env, jobj, GSS_ERROR(major), minor, "[GSSLibStub_unwrap]");1693if ((*env)->ExceptionCheck(env)) {1694return NULL;1695}16961697/* update the message prop with relevant info */1698(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setPrivacy,1699(confState != 0));1700if ((*env)->ExceptionCheck(env)) {1701return NULL;1702}1703(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setQOP, qop);1704if ((*env)->ExceptionCheck(env)) {1705return NULL;1706}1707setSupplementaryInfo(env, jobj, jprop, GSS_SUPPLEMENTARY_INFO(major),1708minor);1709if ((*env)->ExceptionCheck(env)) {1710return NULL;1711}17121713return jresult;1714}171517161717