Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c
38918 views
/*1* Copyright (c) 2005, 2017, 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;3536/*37* Class: sun_security_jgss_wrapper_GSSLibStub38* Method: init39* Signature: (Ljava/lang/String;Z)Z40*/41JNIEXPORT jboolean JNICALL42Java_sun_security_jgss_wrapper_GSSLibStub_init(JNIEnv *env,43jclass jcls,44jstring jlibName,45jboolean jDebug) {46const char *libName;47char *error = NULL;4849if (!jDebug) {50JGSS_DEBUG = 0;51} else {52JGSS_DEBUG = 1;53}5455if (jlibName == NULL) {56TRACE0("[GSSLibStub_init] GSS lib name is NULL");57return JNI_FALSE;58}5960libName = (*env)->GetStringUTFChars(env, jlibName, NULL);61if (libName == NULL) {62return JNI_FALSE;63}64TRACE1("[GSSLibStub_init] libName=%s", libName);6566/* initialize global function table */67error = loadNative(libName);68(*env)->ReleaseStringUTFChars(env, jlibName, libName);6970if (error == NULL) {71return JNI_TRUE;72} else {73TRACE0(error);74return JNI_FALSE;75}76}7778/*79* Class: sun_security_jgss_wrapper_GSSLibStub80* Method: getMechPtr81* Signature: ([B)J82*/83JNIEXPORT jlong JNICALL84Java_sun_security_jgss_wrapper_GSSLibStub_getMechPtr(JNIEnv *env,85jclass jcls,86jbyteArray jbytes) {87gss_OID cOid;88unsigned int i, len;89jbyte* bytes;90jthrowable gssEx;91int found;9293if (jbytes != NULL) {94found = 0;95len = (unsigned int)((*env)->GetArrayLength(env, jbytes) - 2);96bytes = (*env)->GetByteArrayElements(env, jbytes, NULL);97if (bytes == NULL) {98return ptr_to_jlong(NULL);99}100for (i = 0; i < ftab->mechs->count; i++) {101cOid = &(ftab->mechs->elements[i]);102if (len == cOid->length &&103(memcmp(cOid->elements, (bytes + 2), len) == 0)) {104// Found a match105found = 1;106break;107}108}109(*env)->ReleaseByteArrayElements(env, jbytes, bytes, 0);110111if (found != 1) {112checkStatus(env, NULL, GSS_S_BAD_MECH, 0, "[GSSLibStub_getMechPtr]");113return ptr_to_jlong(NULL);114} else {115return ptr_to_jlong(cOid);116}117} else {118return ptr_to_jlong(GSS_C_NO_OID);119}120}121122/*123* Utility routine which releases the specified gss_channel_bindings_t124* structure.125*/126void deleteGSSCB(gss_channel_bindings_t cb) {127jobject jinetAddr;128jbyteArray value;129130if (cb == GSS_C_NO_CHANNEL_BINDINGS) return;131132/* release initiator address */133if (cb->initiator_addrtype != GSS_C_AF_NULLADDR) {134resetGSSBuffer(&(cb->initiator_address));135}136/* release acceptor address */137if (cb->acceptor_addrtype != GSS_C_AF_NULLADDR) {138resetGSSBuffer(&(cb->acceptor_address));139}140/* release application data */141if (cb->application_data.length != 0) {142resetGSSBuffer(&(cb->application_data));143}144free(cb);145}146147/*148* Utility routine which creates a gss_channel_bindings_t structure149* using the specified org.ietf.jgss.ChannelBinding object.150* NOTE: must call deleteGSSCB() to free up the resources.151*/152gss_channel_bindings_t newGSSCB(JNIEnv *env, jobject jcb) {153gss_channel_bindings_t cb;154jobject jinetAddr;155jbyteArray value;156int i;157158if (jcb == NULL) {159return GSS_C_NO_CHANNEL_BINDINGS;160}161162cb = malloc(sizeof(struct gss_channel_bindings_struct));163if (cb == NULL) {164throwOutOfMemoryError(env,NULL);165return NULL;166}167168// initialize addrtype in CB first169cb->initiator_addrtype = GSS_C_AF_NULLADDR;170cb->acceptor_addrtype = GSS_C_AF_NULLADDR;171172/* set up initiator address */173jinetAddr = (*env)->CallObjectMethod(env, jcb,174MID_ChannelBinding_getInitiatorAddr);175if ((*env)->ExceptionCheck(env)) {176goto cleanup;177}178if (jinetAddr != NULL) {179value = (*env)->CallObjectMethod(env, jinetAddr,180MID_InetAddress_getAddr);181if ((*env)->ExceptionCheck(env)) {182goto cleanup;183}184cb->initiator_addrtype = GSS_C_AF_INET;185initGSSBuffer(env, value, &(cb->initiator_address));186if ((*env)->ExceptionCheck(env)) {187goto cleanup;188}189}190/* set up acceptor address */191jinetAddr = (*env)->CallObjectMethod(env, jcb,192MID_ChannelBinding_getAcceptorAddr);193if ((*env)->ExceptionCheck(env)) {194goto cleanup;195}196if (jinetAddr != NULL) {197value = (*env)->CallObjectMethod(env, jinetAddr,198MID_InetAddress_getAddr);199if ((*env)->ExceptionCheck(env)) {200goto cleanup;201}202cb->acceptor_addrtype = GSS_C_AF_INET;203initGSSBuffer(env, value, &(cb->acceptor_address));204if ((*env)->ExceptionCheck(env)) {205goto cleanup;206}207}208/* set up application data */209value = (*env)->CallObjectMethod(env, jcb,210MID_ChannelBinding_getAppData);211if ((*env)->ExceptionCheck(env)) {212goto cleanup;213}214initGSSBuffer(env, value, &(cb->application_data));215if ((*env)->ExceptionCheck(env)) {216goto cleanup;217}218return cb;219cleanup:220deleteGSSCB(cb);221return NULL;222}223224/*225* Utility routine for storing the supplementary information226* into the specified org.ietf.jgss.MessageProp object.227*/228void setSupplementaryInfo(JNIEnv *env, jobject jstub, jobject jprop,229int suppInfo, int minor) {230jboolean isDuplicate, isOld, isUnseq, hasGap;231jstring minorMsg;232233if (suppInfo != GSS_S_COMPLETE) {234isDuplicate = ((suppInfo & GSS_S_DUPLICATE_TOKEN) != 0);235isOld = ((suppInfo & GSS_S_OLD_TOKEN) != 0);236isUnseq = ((suppInfo & GSS_S_UNSEQ_TOKEN) != 0);237hasGap = ((suppInfo & GSS_S_GAP_TOKEN) != 0);238minorMsg = getMinorMessage(env, jstub, minor);239if ((*env)->ExceptionCheck(env)) {240return;241}242(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setSupplementaryStates,243isDuplicate, isOld, isUnseq, hasGap, minor,244minorMsg);245}246}247248/*249* Class: sun_security_jgss_wrapper_GSSLibStub250* Method: indicateMechs251* Signature: ()[Lorg/ietf/jgss/Oid;252*/253JNIEXPORT jobjectArray JNICALL254Java_sun_security_jgss_wrapper_GSSLibStub_indicateMechs(JNIEnv *env,255jclass jcls)256{257if (ftab->mechs != NULL && ftab->mechs != GSS_C_NO_OID_SET) {258return getJavaOIDArray(env, ftab->mechs);259} else return NULL;260}261262/*263* Class: sun_security_jgss_wrapper_GSSLibStub264* Method: inquireNamesForMech265* Signature: ()[Lorg/ietf/jgss/Oid;266*/267JNIEXPORT jobjectArray JNICALL268Java_sun_security_jgss_wrapper_GSSLibStub_inquireNamesForMech(JNIEnv *env,269jobject jobj)270{271OM_uint32 minor, major;272gss_OID mech;273gss_OID_set nameTypes;274jobjectArray result;275276if (ftab->inquireNamesForMech != NULL) {277mech = (gss_OID)jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));278nameTypes = GSS_C_NO_OID_SET;279280/* gss_inquire_names_for_mech(...) => N/A */281major = (*ftab->inquireNamesForMech)(&minor, mech, &nameTypes);282283/* release intermediate buffers before checking status */284result = getJavaOIDArray(env, nameTypes);285deleteGSSOIDSet(nameTypes);286if ((*env)->ExceptionCheck(env)) {287return NULL;288}289290checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireNamesForMech]");291if ((*env)->ExceptionCheck(env)) {292return NULL;293}294return result;295}296return NULL;297}298299/*300* Class: sun_security_jgss_wrapper_GSSLibStub301* Method: releaseName302* Signature: (J)V303*/304JNIEXPORT void JNICALL305Java_sun_security_jgss_wrapper_GSSLibStub_releaseName(JNIEnv *env,306jobject jobj,307jlong pName)308{309OM_uint32 minor, major;310gss_name_t nameHdl;311312nameHdl = (gss_name_t) jlong_to_ptr(pName);313314TRACE1("[GSSLibStub_releaseName] %ld", (long) pName);315316if (nameHdl != GSS_C_NO_NAME) {317/* gss_release_name(...) => GSS_S_BAD_NAME */318major = (*ftab->releaseName)(&minor, &nameHdl);319checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseName]");320}321}322323/*324* Class: sun_security_jgss_wrapper_GSSLibStub325* Method: importName326* Signature: ([BLorg/ietf/jgss/Oid;)J327*/328JNIEXPORT jlong JNICALL329Java_sun_security_jgss_wrapper_GSSLibStub_importName(JNIEnv *env,330jobject jobj,331jbyteArray jnameVal,332jobject jnameType)333{334OM_uint32 minor, major;335gss_buffer_desc nameVal;336gss_OID nameType;337gss_name_t nameHdl;338nameHdl = GSS_C_NO_NAME;339340TRACE0("[GSSLibStub_importName]");341342initGSSBuffer(env, jnameVal, &nameVal);343if ((*env)->ExceptionCheck(env)) {344return jlong_zero;345}346347nameType = newGSSOID(env, jnameType);348if ((*env)->ExceptionCheck(env)) {349resetGSSBuffer(&nameVal);350return jlong_zero;351}352353/* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME,354GSS_S_BAD_MECH */355major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl);356357TRACE1("[GSSLibStub_importName] %ld", (long) nameHdl);358359/* release intermediate buffers */360deleteGSSOID(nameType);361resetGSSBuffer(&nameVal);362363checkStatus(env, jobj, major, minor, "[GSSLibStub_importName]");364if ((*env)->ExceptionCheck(env)) {365return jlong_zero;366}367return ptr_to_jlong(nameHdl);368}369370371/*372* Class: sun_security_jgss_wrapper_GSSLibStub373* Method: compareName374* Signature: (JJ)Z375*/376JNIEXPORT jboolean JNICALL377Java_sun_security_jgss_wrapper_GSSLibStub_compareName(JNIEnv *env,378jobject jobj,379jlong pName1,380jlong pName2)381{382OM_uint32 minor, major;383gss_name_t nameHdl1, nameHdl2;384int isEqual;385386isEqual = 0;387nameHdl1 = (gss_name_t) jlong_to_ptr(pName1);388nameHdl2 = (gss_name_t) jlong_to_ptr(pName2);389390TRACE2("[GSSLibStub_compareName] %ld %ld", (long)pName1, (long)pName2);391392if ((nameHdl1 != GSS_C_NO_NAME) && (nameHdl2 != GSS_C_NO_NAME)) {393394/* gss_compare_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME(!) */395major = (*ftab->compareName)(&minor, nameHdl1, nameHdl2, &isEqual);396397checkStatus(env, jobj, major, minor, "[GSSLibStub_compareName]");398}399return (isEqual != 0);400}401402/*403* Class: sun_security_jgss_wrapper_GSSLibStub404* Method: canonicalizeName405* Signature: (J)J406*/407JNIEXPORT jlong JNICALL408Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName(JNIEnv *env,409jobject jobj,410jlong pName)411{412OM_uint32 minor, major;413gss_name_t nameHdl, mnNameHdl;414gss_OID mech;415416nameHdl = (gss_name_t) jlong_to_ptr(pName);417418TRACE1("[GSSLibStub_canonicalizeName] %ld", (long) pName);419420if (nameHdl != GSS_C_NO_NAME) {421mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));422mnNameHdl = GSS_C_NO_NAME;423424/* gss_canonicalize_name(...) may return GSS_S_BAD_NAMETYPE,425GSS_S_BAD_NAME, GSS_S_BAD_MECH */426major = (*ftab->canonicalizeName)(&minor, nameHdl, mech, &mnNameHdl);427428TRACE1("[GSSLibStub_canonicalizeName] MN=%ld", (long)mnNameHdl);429430checkStatus(env, jobj, major, minor, "[GSSLibStub_canonicalizeName]");431if ((*env)->ExceptionCheck(env)) {432return (jlong) GSS_C_NO_NAME;433}434return ptr_to_jlong(mnNameHdl);435}436return (jlong) GSS_C_NO_NAME;437}438439/*440* Class: sun_security_jgss_wrapper_GSSLibStub441* Method: exportName442* Signature: (J)[B443*/444JNIEXPORT jbyteArray JNICALL445Java_sun_security_jgss_wrapper_GSSLibStub_exportName(JNIEnv *env,446jobject jobj,447jlong pName) {448OM_uint32 minor, major;449gss_name_t nameHdl, mNameHdl;450gss_buffer_desc outBuf;451jbyteArray jresult;452453nameHdl = (gss_name_t) jlong_to_ptr(pName);454455TRACE1("[GSSLibStub_exportName] %ld", (long) pName);456457/* gss_export_name(...) => GSS_S_NAME_NOT_MN, GSS_S_BAD_NAMETYPE,458GSS_S_BAD_NAME */459major = (*ftab->exportName)(&minor, nameHdl, &outBuf);460461/* canonicalize the internal name to MN and retry */462if (major == GSS_S_NAME_NOT_MN) {463/* release intermediate buffers before retrying */464(*ftab->releaseBuffer)(&minor, &outBuf);465466TRACE0("[GSSLibStub_exportName] canonicalize and re-try");467468mNameHdl = (gss_name_t)jlong_to_ptr(469Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName470(env, jobj, pName));471if ((*env)->ExceptionCheck(env)) {472return NULL;473}474475major = (*ftab->exportName)(&minor, mNameHdl, &outBuf);476Java_sun_security_jgss_wrapper_GSSLibStub_releaseName477(env, jobj, ptr_to_jlong(mNameHdl));478if ((*env)->ExceptionCheck(env)) {479/* release intermediate buffers */480(*ftab->releaseBuffer)(&minor, &outBuf);481return NULL;482}483}484485/* release intermediate buffers before checking status */486jresult = getJavaBuffer(env, &outBuf);487if ((*env)->ExceptionCheck(env)) {488return NULL;489}490491checkStatus(env, jobj, major, minor, "[GSSLibStub_exportName]");492if ((*env)->ExceptionCheck(env)) {493return NULL;494}495return jresult;496}497498/*499* Class: sun_security_jgss_wrapper_GSSLibStub500* Method: displayName501* Signature: (J)[Ljava/lang/Object;502*/503JNIEXPORT jobjectArray JNICALL504Java_sun_security_jgss_wrapper_GSSLibStub_displayName(JNIEnv *env,505jobject jobj,506jlong pName) {507OM_uint32 minor, major;508gss_name_t nameHdl;509gss_buffer_desc outNameBuf;510gss_OID outNameType;511jstring jname;512jobject jtype;513jobjectArray jresult;514515nameHdl = (gss_name_t) jlong_to_ptr(pName);516517TRACE1("[GSSLibStub_displayName] %ld", (long) pName);518519if (nameHdl == GSS_C_NO_NAME) {520checkStatus(env, jobj, GSS_S_BAD_NAME, 0, "[GSSLibStub_displayName]");521return NULL;522}523524/* gss_display_name(...) => GSS_S_BAD_NAME */525major = (*ftab->displayName)(&minor, nameHdl, &outNameBuf, &outNameType);526527/* release intermediate buffers before checking status */528jname = getJavaString(env, &outNameBuf);529if ((*env)->ExceptionCheck(env)) {530return NULL;531}532533checkStatus(env, jobj, major, minor, "[GSSLibStub_displayName]");534if ((*env)->ExceptionCheck(env)) {535return NULL;536}537538jtype = getJavaOID(env, outNameType);539if ((*env)->ExceptionCheck(env)) {540return NULL;541}542543jresult = (*env)->NewObjectArray(env, 2, CLS_Object, NULL);544/* return immediately if an exception has occurred */545if ((*env)->ExceptionCheck(env)) {546return NULL;547}548549(*env)->SetObjectArrayElement(env, jresult, 0, jname);550if ((*env)->ExceptionCheck(env)) {551return NULL;552}553(*env)->SetObjectArrayElement(env, jresult, 1, jtype);554if ((*env)->ExceptionCheck(env)) {555return NULL;556}557558return jresult;559}560561/*562* Class: sun_security_jgss_wrapper_GSSLibStub563* Method: acquireCred564* Signature: (JII)J565*/566JNIEXPORT jlong JNICALL567Java_sun_security_jgss_wrapper_GSSLibStub_acquireCred(JNIEnv *env,568jobject jobj,569jlong pName,570jint reqTime,571jint usage)572{573OM_uint32 minor, major;574gss_OID mech;575gss_OID_set mechs;576gss_cred_usage_t credUsage;577gss_name_t nameHdl;578gss_cred_id_t credHdl;579credHdl = GSS_C_NO_CREDENTIAL;580581TRACE0("[GSSLibStub_acquireCred]");582583mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));584mechs = newGSSOIDSet(mech);585credUsage = (gss_cred_usage_t) usage;586nameHdl = (gss_name_t) jlong_to_ptr(pName);587588TRACE2("[GSSLibStub_acquireCred] pName=%ld, usage=%d", (long)pName, usage);589590/* gss_acquire_cred(...) => GSS_S_BAD_MECH, GSS_S_BAD_NAMETYPE,591GSS_S_BAD_NAME, GSS_S_CREDENTIALS_EXPIRED, GSS_S_NO_CRED */592major =593(*ftab->acquireCred)(&minor, nameHdl, reqTime, mechs,594credUsage, &credHdl, NULL, NULL);595/* release intermediate buffers */596deleteGSSOIDSet(mechs);597598TRACE1("[GSSLibStub_acquireCred] pCred=%ld", (long) credHdl);599600checkStatus(env, jobj, major, minor, "[GSSLibStub_acquireCred]");601if ((*env)->ExceptionCheck(env)) {602return jlong_zero;603}604return ptr_to_jlong(credHdl);605}606607/*608* Class: sun_security_jgss_wrapper_GSSLibStub609* Method: releaseCred610* Signature: (J)J611*/612JNIEXPORT jlong JNICALL613Java_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env,614jobject jobj,615jlong pCred)616{617OM_uint32 minor, major;618gss_cred_id_t credHdl;619620credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);621622TRACE1("[GSSLibStub_releaseCred] %ld", (long int)pCred);623624if (credHdl != GSS_C_NO_CREDENTIAL) {625/* gss_release_cred(...) => GSS_S_NO_CRED(!) */626major = (*ftab->releaseCred)(&minor, &credHdl);627628checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseCred]");629if ((*env)->ExceptionCheck(env)) {630return jlong_zero;631}632}633return ptr_to_jlong(credHdl);634}635636/*637* Utility routine for obtaining info about a credential.638*/639void inquireCred(JNIEnv *env, jobject jobj, gss_cred_id_t pCred,640jint type, void *result) {641OM_uint32 minor=0, major=0;642OM_uint32 routineErr;643gss_cred_id_t credHdl;644645credHdl = pCred;646647TRACE1("[gss_inquire_cred] %ld", (long) pCred);648649/* gss_inquire_cred(...) => GSS_S_DEFECTIVE_CREDENTIAL(!),650GSS_S_CREDENTIALS_EXPIRED(!), GSS_S_NO_CRED(!) */651if (type == TYPE_CRED_NAME) {652major = (*ftab->inquireCred)(&minor, credHdl, result, NULL, NULL, NULL);653} else if (type == TYPE_CRED_TIME) {654major = (*ftab->inquireCred)(&minor, credHdl, NULL, result, NULL, NULL);655} else if (type == TYPE_CRED_USAGE) {656major = (*ftab->inquireCred)(&minor, credHdl, NULL, NULL, result, NULL);657}658659routineErr = GSS_ROUTINE_ERROR(major);660if (routineErr == GSS_S_CREDENTIALS_EXPIRED) {661/* ignore GSS_S_CREDENTIALS_EXPIRED for query */662major = GSS_CALLING_ERROR(major) |663GSS_SUPPLEMENTARY_INFO(major);664} else if (routineErr == GSS_S_NO_CRED) {665/* twik since Java API throws BAD_MECH instead of NO_CRED */666major = GSS_CALLING_ERROR(major) |667GSS_S_BAD_MECH | GSS_SUPPLEMENTARY_INFO(major);668}669checkStatus(env, jobj, major, minor, "[gss_inquire_cred]");670}671672/*673* Class: sun_security_jgss_wrapper_GSSLibStub674* Method: getCredName675* Signature: (J)J676*/677JNIEXPORT jlong JNICALL678Java_sun_security_jgss_wrapper_GSSLibStub_getCredName(JNIEnv *env,679jobject jobj,680jlong pCred)681{682gss_name_t nameHdl;683gss_cred_id_t credHdl;684685credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);686687TRACE1("[GSSLibStub_getCredName] %ld", (long int)pCred);688689nameHdl = GSS_C_NO_NAME;690inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl);691/* return immediately if an exception has occurred */692if ((*env)->ExceptionCheck(env)) {693return jlong_zero;694}695696TRACE1("[GSSLibStub_getCredName] pName=%ld", (long) nameHdl);697return ptr_to_jlong(nameHdl);698}699700/*701* Class: sun_security_jgss_wrapper_GSSLibStub702* Method: getCredTime703* Signature: (J)I704*/705JNIEXPORT jint JNICALL706Java_sun_security_jgss_wrapper_GSSLibStub_getCredTime(JNIEnv *env,707jobject jobj,708jlong pCred)709{710gss_cred_id_t credHdl;711OM_uint32 lifetime;712713credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);714715TRACE1("[GSSLibStub_getCredTime] %ld", (long int)pCred);716717lifetime = 0;718inquireCred(env, jobj, credHdl, TYPE_CRED_TIME, &lifetime);719/* return immediately if an exception has occurred */720if ((*env)->ExceptionCheck(env)) {721return 0;722}723return getJavaTime(lifetime);724}725726/*727* Class: sun_security_jgss_wrapper_GSSLibStub728* Method: getCredUsage729* Signature: (J)I730*/731JNIEXPORT jint JNICALL732Java_sun_security_jgss_wrapper_GSSLibStub_getCredUsage(JNIEnv *env,733jobject jobj,734jlong pCred)735{736gss_cred_usage_t usage;737gss_cred_id_t credHdl;738739credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);740741TRACE1("[GSSLibStub_getCredUsage] %ld", (long int)pCred);742743inquireCred(env, jobj, credHdl, TYPE_CRED_USAGE, &usage);744/* return immediately if an exception has occurred */745if ((*env)->ExceptionCheck(env)) {746return -1;747}748return (jint) usage;749}750/*751* Class: sun_security_jgss_wrapper_GSSLibStub752* Method: importContext753* Signature: ([B)Lsun/security/jgss/wrapper/NativeGSSContext;754*/755JNIEXPORT jobject JNICALL756Java_sun_security_jgss_wrapper_GSSLibStub_importContext(JNIEnv *env,757jobject jobj,758jbyteArray jctxtToken)759{760OM_uint32 minor, major;761gss_buffer_desc ctxtToken;762gss_ctx_id_t contextHdl;763gss_OID mech, mech2;764765TRACE0("[GSSLibStub_importContext]");766767contextHdl = GSS_C_NO_CONTEXT;768initGSSBuffer(env, jctxtToken, &ctxtToken);769if ((*env)->ExceptionCheck(env)) {770return NULL;771}772773/* gss_import_sec_context(...) => GSS_S_NO_CONTEXT, GSS_S_DEFECTIVE_TOKEN,774GSS_S_UNAVAILABLE, GSS_S_UNAUTHORIZED */775major = (*ftab->importSecContext)(&minor, &ctxtToken, &contextHdl);776777TRACE1("[GSSLibStub_importContext] pContext=%ld", (long) contextHdl);778779/* release intermediate buffers */780resetGSSBuffer(&ctxtToken);781782checkStatus(env, jobj, major, minor, "[GSSLibStub_importContext]");783/* return immediately if an exception has occurred */784if ((*env)->ExceptionCheck(env)) {785return NULL;786}787788/* now that the context has been imported, proceed to find out789its mech */790major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL,791NULL, &mech, NULL, NULL, NULL);792793checkStatus(env, jobj, major, minor, "[GSSLibStub_importContext] getMech");794/* return immediately if an exception has occurred */795if ((*env)->ExceptionCheck(env)) {796return NULL;797}798799mech2 = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj,800FID_GSSLibStub_pMech));801802if (sameMech(mech, mech2) == JNI_TRUE) {803/* mech match - return the context object */804return (*env)->NewObject(env, CLS_NativeGSSContext,805MID_NativeGSSContext_ctor,806ptr_to_jlong(contextHdl), jobj);807} else {808/* mech mismatch - clean up then return null */809major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER);810checkStatus(env, jobj, major, minor,811"[GSSLibStub_importContext] cleanup");812return NULL;813}814}815816/*817* Class: sun_security_jgss_wrapper_GSSLibStub818* Method: initContext819* Signature: (JJLorg/ietf/jgss/ChannelBinding;[BLsun/security/jgss/wrapper/NativeGSSContext;)[B820*/821JNIEXPORT jbyteArray JNICALL822Java_sun_security_jgss_wrapper_GSSLibStub_initContext(JNIEnv *env,823jobject jobj,824jlong pCred,825jlong pName,826jobject jcb,827jbyteArray jinToken,828jobject jcontextSpi)829{830OM_uint32 minor, major;831gss_cred_id_t credHdl ;832gss_ctx_id_t contextHdl, contextHdlSave;833gss_name_t targetName;834gss_OID mech;835OM_uint32 flags, aFlags;836OM_uint32 time, aTime;837gss_channel_bindings_t cb;838gss_buffer_desc inToken;839gss_buffer_desc outToken;840jbyteArray jresult;841/* UNCOMMENT after SEAM bug#6287358 is backported to S10842gss_OID aMech;843jobject jMech;844*/845846TRACE0("[GSSLibStub_initContext]");847848credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);849contextHdl = contextHdlSave = (gss_ctx_id_t) jlong_to_ptr(850(*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext));851targetName = (gss_name_t) jlong_to_ptr(pName);852mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));853flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi,854FID_NativeGSSContext_flags);855time = getGSSTime((*env)->GetIntField(env, jcontextSpi,856FID_NativeGSSContext_lifetime));857cb = newGSSCB(env, jcb);858if ((*env)->ExceptionCheck(env)) {859return NULL;860}861862initGSSBuffer(env, jinToken, &inToken);863if ((*env)->ExceptionCheck(env)) {864deleteGSSCB(cb);865return NULL;866}867868TRACE2( "[GSSLibStub_initContext] before: pCred=%ld, pContext=%ld",869(long)credHdl, (long)contextHdl);870871/* gss_init_sec_context(...) => GSS_S_CONTINUE_NEEDED(!),872GSS_S_DEFECTIVE_TOKEN, GSS_S_NO_CRED, GSS_S_DEFECTIVE_CREDENTIAL(!),873GSS_S_CREDENTIALS_EXPIRED, GSS_S_BAD_BINDINGS, GSS_S_BAD_MIC,874GSS_S_OLD_TOKEN, GSS_S_DUPLICATE_TOKEN, GSS_S_NO_CONTEXT(!),875GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME(!), GSS_S_BAD_MECH */876major = (*ftab->initSecContext)(&minor, credHdl,877&contextHdl, targetName, mech,878flags, time, cb, &inToken, NULL /*aMech*/,879&outToken, &aFlags, &aTime);880881TRACE2("[GSSLibStub_initContext] after: pContext=%ld, outToken len=%ld",882(long)contextHdl, (long)outToken.length);883884// update context handle with the latest value if changed885// this is to work with both MIT and Solaris. Former deletes half-built886// context if error occurs887if (contextHdl != contextHdlSave) {888(*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext,889ptr_to_jlong(contextHdl));890TRACE1("[GSSLibStub_initContext] set pContext=%ld", (long)contextHdl);891}892893if (GSS_ERROR(major) == GSS_S_COMPLETE) {894/* update member values if needed */895(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags);896TRACE1("[GSSLibStub_initContext] set flags=0x%x", aFlags);897898if (major == GSS_S_COMPLETE) {899(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,900getJavaTime(aTime));901TRACE0("[GSSLibStub_initContext] context established");902903(*env)->SetBooleanField(env, jcontextSpi,904FID_NativeGSSContext_isEstablished,905JNI_TRUE);906907/* UNCOMMENT after SEAM bug#6287358 is backported to S10908jMech = getJavaOID(env, aMech);909(*env)->SetObjectField(env, jcontextSpi,910FID_NativeGSSContext_actualMech, jMech);911*/912} else if (major & GSS_S_CONTINUE_NEEDED) {913TRACE0("[GSSLibStub_initContext] context not established");914major -= GSS_S_CONTINUE_NEEDED;915}916}917918/* release intermediate buffers before checking status */919deleteGSSCB(cb);920resetGSSBuffer(&inToken);921jresult = getJavaBuffer(env, &outToken);922if ((*env)->ExceptionCheck(env)) {923return NULL;924}925926checkStatus(env, jobj, major, minor, "[GSSLibStub_initContext]");927if ((*env)->ExceptionCheck(env)) {928return NULL;929}930return jresult;931}932933/*934* Class: sun_security_jgss_wrapper_GSSLibStub935* Method: acceptContext936* Signature: (JLorg/ietf/jgss/ChannelBinding;[BLsun/security/jgss/wrapper/NativeGSSContext;)[B937*/938JNIEXPORT jbyteArray JNICALL939Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env,940jobject jobj,941jlong pCred,942jobject jcb,943jbyteArray jinToken,944jobject jcontextSpi)945{946OM_uint32 minor, major;947OM_uint32 minor2, major2;948gss_ctx_id_t contextHdl, contextHdlSave;949gss_cred_id_t credHdl;950gss_buffer_desc inToken;951gss_channel_bindings_t cb;952gss_name_t srcName;953gss_buffer_desc outToken;954gss_OID aMech;955OM_uint32 aFlags;956OM_uint32 aTime;957gss_cred_id_t delCred;958jobject jsrcName=GSS_C_NO_NAME;959jobject jdelCred;960jobject jMech;961jbyteArray jresult;962jboolean setTarget;963gss_name_t targetName;964jobject jtargetName;965966TRACE0("[GSSLibStub_acceptContext]");967968contextHdl = contextHdlSave = (gss_ctx_id_t)jlong_to_ptr(969(*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext));970credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);971initGSSBuffer(env, jinToken, &inToken);972if ((*env)->ExceptionCheck(env)) {973return NULL;974}975cb = newGSSCB(env, jcb);976if ((*env)->ExceptionCheck(env)) {977resetGSSBuffer(&inToken);978return NULL;979}980srcName = targetName = GSS_C_NO_NAME;981delCred = GSS_C_NO_CREDENTIAL;982setTarget = (credHdl == GSS_C_NO_CREDENTIAL);983aFlags = 0;984985TRACE2( "[GSSLibStub_acceptContext] before: pCred=%ld, pContext=%ld",986(long) credHdl, (long) contextHdl);987988/* gss_accept_sec_context(...) => GSS_S_CONTINUE_NEEDED(!),989GSS_S_DEFECTIVE_TOKEN, GSS_S_DEFECTIVE_CREDENTIAL(!),990GSS_S_NO_CRED, GSS_S_CREDENTIALS_EXPIRED, GSS_S_BAD_BINDINGS,991GSS_S_NO_CONTEXT(!), GSS_S_BAD_MIC, GSS_S_OLD_TOKEN,992GSS_S_DUPLICATE_TOKEN, GSS_S_BAD_MECH */993major =994(*ftab->acceptSecContext)(&minor, &contextHdl, credHdl,995&inToken, cb, &srcName, &aMech, &outToken,996&aFlags, &aTime, &delCred);997/* release intermediate buffers before checking status */998999deleteGSSCB(cb);1000resetGSSBuffer(&inToken);10011002TRACE3("[GSSLibStub_acceptContext] after: pCred=%ld, pContext=%ld, pDelegCred=%ld",1003(long)credHdl, (long)contextHdl, (long) delCred);10041005// update context handle with the latest value if changed1006// this is to work with both MIT and Solaris. Former deletes half-built1007// context if error occurs1008if (contextHdl != contextHdlSave) {1009(*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext,1010ptr_to_jlong(contextHdl));1011TRACE1("[GSSLibStub_acceptContext] set pContext=%ld", (long)contextHdl);1012}10131014if (GSS_ERROR(major) == GSS_S_COMPLETE) {1015/* update member values if needed */1016// WORKAROUND for a Heimdal bug1017if (delCred == GSS_C_NO_CREDENTIAL) {1018aFlags &= 0xfffffffe;1019}1020(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags);1021TRACE1("[GSSLibStub_acceptContext] set flags=0x%x", aFlags);10221023if (setTarget) {1024major2 = (*ftab->inquireContext)(&minor2, contextHdl, NULL,1025&targetName, NULL, NULL, NULL,1026NULL, NULL);1027checkStatus(env, jobj, major2, minor2,1028"[GSSLibStub_acceptContext] inquire");1029if ((*env)->ExceptionCheck(env)) {1030goto error;1031}10321033jtargetName = (*env)->NewObject(env, CLS_GSSNameElement,1034MID_GSSNameElement_ctor,1035ptr_to_jlong(targetName), jobj);1036if ((*env)->ExceptionCheck(env)) {1037goto error;1038}10391040TRACE1("[GSSLibStub_acceptContext] set targetName=%ld",1041(long)targetName);10421043(*env)->SetObjectField(env, jcontextSpi, FID_NativeGSSContext_targetName,1044jtargetName);1045if ((*env)->ExceptionCheck(env)) {1046goto error;1047}1048}1049if (srcName != GSS_C_NO_NAME) {1050jsrcName = (*env)->NewObject(env, CLS_GSSNameElement,1051MID_GSSNameElement_ctor,1052ptr_to_jlong(srcName), jobj);1053if ((*env)->ExceptionCheck(env)) {1054goto error;1055}10561057TRACE1("[GSSLibStub_acceptContext] set srcName=%ld", (long)srcName);10581059(*env)->SetObjectField(env, jcontextSpi, FID_NativeGSSContext_srcName,1060jsrcName);1061if ((*env)->ExceptionCheck(env)) {1062goto error;1063}1064}1065if (major == GSS_S_COMPLETE) {1066TRACE0("[GSSLibStub_acceptContext] context established");10671068(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,1069getJavaTime(aTime));1070(*env)->SetBooleanField(env, jcontextSpi,1071FID_NativeGSSContext_isEstablished,1072JNI_TRUE);1073jMech = getJavaOID(env, aMech);1074if ((*env)->ExceptionCheck(env)) {1075goto error;1076}1077(*env)->SetObjectField(env, jcontextSpi,1078FID_NativeGSSContext_actualMech, jMech);1079if ((*env)->ExceptionCheck(env)) {1080goto error;1081}1082if (delCred != GSS_C_NO_CREDENTIAL) {1083jdelCred = (*env)->NewObject(env, CLS_GSSCredElement,1084MID_GSSCredElement_ctor,1085ptr_to_jlong(delCred), jsrcName, jMech);1086if ((*env)->ExceptionCheck(env)) {1087goto error;1088}1089(*env)->SetObjectField(env, jcontextSpi,1090FID_NativeGSSContext_delegatedCred,1091jdelCred);1092TRACE1("[GSSLibStub_acceptContext] set delegatedCred=%ld",1093(long) delCred);10941095if ((*env)->ExceptionCheck(env)) {1096goto error;1097}1098}1099} else if (major & GSS_S_CONTINUE_NEEDED) {1100TRACE0("[GSSLibStub_acceptContext] context not established");11011102if (aFlags & GSS_C_PROT_READY_FLAG) {1103(*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_lifetime,1104getJavaTime(aTime));1105}1106major -= GSS_S_CONTINUE_NEEDED;1107}1108}1109return getJavaBuffer(env, &outToken);11101111error:1112(*ftab->releaseBuffer)(&minor, &outToken);1113if (srcName != GSS_C_NO_NAME) {1114(*ftab->releaseName)(&minor, &srcName);1115}1116if (targetName != GSS_C_NO_NAME) {1117(*ftab->releaseName)(&minor, &targetName);1118}1119if (delCred != GSS_C_NO_CREDENTIAL) {1120(*ftab->releaseCred) (&minor, &delCred);1121}1122return NULL;1123}11241125/*1126* Class: sun_security_jgss_wrapper_GSSLibStub1127* Method: inquireContext1128* Signature: (J)[J1129*/1130JNIEXPORT jlongArray JNICALL1131Java_sun_security_jgss_wrapper_GSSLibStub_inquireContext(JNIEnv *env,1132jobject jobj,1133jlong pContext)1134{1135OM_uint32 minor, major;1136gss_ctx_id_t contextHdl;1137gss_name_t srcName, targetName;1138OM_uint32 time;1139OM_uint32 flags;1140int isInitiator, isEstablished;1141jlong result[6];1142jlongArray jresult;11431144contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);11451146TRACE1("[GSSLibStub_inquireContext] %ld", (long)contextHdl);11471148srcName = targetName = GSS_C_NO_NAME;1149time = 0;1150flags = isInitiator = isEstablished = 0;11511152/* gss_inquire_context(...) => GSS_S_NO_CONTEXT(!) */1153major = (*ftab->inquireContext)(&minor, contextHdl, &srcName,1154&targetName, &time, NULL, &flags,1155&isInitiator, &isEstablished);1156/* update member values if needed */1157TRACE2("[GSSLibStub_inquireContext] srcName %ld, targetName %ld",1158(long)srcName, (long)targetName);11591160checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContext]");1161if ((*env)->ExceptionCheck(env)) {1162return NULL;1163}1164result[0] = ptr_to_jlong(srcName);1165result[1] = ptr_to_jlong(targetName);1166result[2] = (jlong) isInitiator;1167result[3] = (jlong) isEstablished;1168result[4] = (jlong) flags;1169result[5] = (jlong) getJavaTime(time);11701171jresult = (*env)->NewLongArray(env, 6);1172if (jresult == NULL) {1173return NULL;1174}1175(*env)->SetLongArrayRegion(env, jresult, 0, 6, result);1176if ((*env)->ExceptionCheck(env)) {1177return NULL;1178}1179return jresult;1180}11811182/*1183* Class: sun_security_jgss_wrapper_GSSLibStub1184* Method: getContextMech1185* Signature: (J)Lorg/ietf/jgss/Oid;1186*/1187JNIEXPORT jobject JNICALL1188Java_sun_security_jgss_wrapper_GSSLibStub_getContextMech(JNIEnv *env,1189jobject jobj,1190jlong pContext)1191{1192OM_uint32 minor, major;1193gss_OID mech;1194gss_ctx_id_t contextHdl;11951196contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);11971198TRACE1("[GSSLibStub_getContextMech] %ld", (long int)pContext);11991200major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL,1201NULL, &mech, NULL, NULL, NULL);12021203checkStatus(env, jobj, major, minor, "[GSSLibStub_getContextMech]");1204/* return immediately if an exception has occurred */1205if ((*env)->ExceptionCheck(env)) {1206return NULL;1207}12081209return getJavaOID(env, mech);1210}12111212/*1213* Class: sun_security_jgss_wrapper_GSSLibStub1214* Method: getContextName1215* Signature: (JZ)J1216*/1217JNIEXPORT jlong JNICALL1218Java_sun_security_jgss_wrapper_GSSLibStub_getContextName(JNIEnv *env,1219jobject jobj, jlong pContext, jboolean isSrc)1220{1221OM_uint32 minor, major;1222gss_name_t nameHdl;1223gss_ctx_id_t contextHdl;12241225contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);12261227TRACE2("[GSSLibStub_getContextName] %ld, isSrc=%d",1228(long)contextHdl, isSrc);12291230nameHdl = GSS_C_NO_NAME;1231if (isSrc == JNI_TRUE) {1232major = (*ftab->inquireContext)(&minor, contextHdl, &nameHdl, NULL,1233NULL, NULL, NULL, NULL, NULL);1234} else {1235major = (*ftab->inquireContext)(&minor, contextHdl, NULL, &nameHdl,1236NULL, NULL, NULL, NULL, NULL);1237}12381239checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]");1240/* return immediately if an exception has occurred */1241if ((*env)->ExceptionCheck(env)) {1242return jlong_zero;1243}12441245TRACE1("[GSSLibStub_getContextName] pName=%ld", (long) nameHdl);12461247return ptr_to_jlong(nameHdl);1248}12491250/*1251* Class: sun_security_jgss_wrapper_GSSLibStub1252* Method: getContextTime1253* Signature: (J)I1254*/1255JNIEXPORT jint JNICALL1256Java_sun_security_jgss_wrapper_GSSLibStub_getContextTime(JNIEnv *env,1257jobject jobj,1258jlong pContext) {1259OM_uint32 minor, major;1260gss_ctx_id_t contextHdl;1261OM_uint32 time;12621263contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);12641265TRACE1("[GSSLibStub_getContextTime] %ld", (long)contextHdl);12661267if (contextHdl == GSS_C_NO_CONTEXT) return 0;12681269/* gss_context_time(...) => GSS_S_CONTEXT_EXPIRED(!),1270GSS_S_NO_CONTEXT(!) */1271major = (*ftab->contextTime)(&minor, contextHdl, &time);1272if (GSS_ROUTINE_ERROR(major) == GSS_S_CONTEXT_EXPIRED) {1273major = GSS_CALLING_ERROR(major) | GSS_SUPPLEMENTARY_INFO(major);1274}1275checkStatus(env, jobj, major, minor, "[GSSLibStub_getContextTime]");1276if ((*env)->ExceptionCheck(env)) {1277return 0;1278}1279return getJavaTime(time);1280}12811282/*1283* Class: sun_security_jgss_wrapper_GSSLibStub1284* Method: deleteContext1285* Signature: (J)J1286*/1287JNIEXPORT jlong JNICALL1288Java_sun_security_jgss_wrapper_GSSLibStub_deleteContext(JNIEnv *env,1289jobject jobj,1290jlong pContext)1291{1292OM_uint32 minor, major;1293gss_ctx_id_t contextHdl;12941295contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);12961297TRACE1("[GSSLibStub_deleteContext] %ld", (long)contextHdl);12981299if (contextHdl == GSS_C_NO_CONTEXT) return ptr_to_jlong(GSS_C_NO_CONTEXT);13001301/* gss_delete_sec_context(...) => GSS_S_NO_CONTEXT(!) */1302major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER);13031304checkStatus(env, jobj, major, minor, "[GSSLibStub_deleteContext]");1305if ((*env)->ExceptionCheck(env)) {1306return jlong_zero;1307}1308return (jlong) ptr_to_jlong(contextHdl);1309}13101311/*1312* Class: sun_security_jgss_wrapper_GSSLibStub1313* Method: wrapSizeLimit1314* Signature: (JIII)I1315*/1316JNIEXPORT jint JNICALL1317Java_sun_security_jgss_wrapper_GSSLibStub_wrapSizeLimit(JNIEnv *env,1318jobject jobj,1319jlong pContext,1320jint reqFlag,1321jint jqop,1322jint joutSize)1323{1324OM_uint32 minor, major;1325gss_ctx_id_t contextHdl;1326OM_uint32 outSize, maxInSize;1327gss_qop_t qop;13281329contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);13301331TRACE1("[GSSLibStub_wrapSizeLimit] %ld", (long)contextHdl);13321333if (contextHdl == GSS_C_NO_CONTEXT) {1334// Twik per javadoc1335checkStatus(env, jobj, GSS_S_NO_CONTEXT, 0,1336"[GSSLibStub_wrapSizeLimit]");1337return 0;1338}13391340qop = (gss_qop_t) jqop;1341outSize = (OM_uint32) joutSize;1342/* gss_wrap_size_limit(...) => GSS_S_NO_CONTEXT(!), GSS_S_CONTEXT_EXPIRED,1343GSS_S_BAD_QOP */1344major = (*ftab->wrapSizeLimit)(&minor, contextHdl, reqFlag,1345qop, outSize, &maxInSize);13461347checkStatus(env, jobj, major, minor, "[GSSLibStub_wrapSizeLimit]");1348if ((*env)->ExceptionCheck(env)) {1349return 0;1350}1351return (jint) maxInSize;1352}13531354/*1355* Class: sun_security_jgss_wrapper_GSSLibStub1356* Method: exportContext1357* Signature: (J)[B1358*/1359JNIEXPORT jbyteArray JNICALL1360Java_sun_security_jgss_wrapper_GSSLibStub_exportContext(JNIEnv *env,1361jobject jobj,1362jlong pContext)1363{1364OM_uint32 minor, major;1365gss_ctx_id_t contextHdl;1366gss_buffer_desc interProcToken;1367jbyteArray jresult;13681369contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);13701371TRACE1("[GSSLibStub_exportContext] %ld", (long)contextHdl);13721373if (contextHdl == GSS_C_NO_CONTEXT) {1374// Twik per javadoc1375checkStatus(env, jobj, GSS_S_NO_CONTEXT, 0, "[GSSLibStub_exportContext]");1376return NULL;1377}1378/* gss_export_sec_context(...) => GSS_S_CONTEXT_EXPIRED,1379GSS_S_NO_CONTEXT, GSS_S_UNAVAILABLE */1380major =1381(*ftab->exportSecContext)(&minor, &contextHdl, &interProcToken);13821383/* release intermediate buffers */1384jresult = getJavaBuffer(env, &interProcToken);1385if ((*env)->ExceptionCheck(env)) {1386return NULL;1387}1388checkStatus(env, jobj, major, minor, "[GSSLibStub_exportContext]");1389if ((*env)->ExceptionCheck(env)) {1390return NULL;1391}13921393return jresult;1394}13951396/*1397* Class: sun_security_jgss_wrapper_GSSLibStub1398* Method: getMic1399* Signature: (JI[B)[B1400*/1401JNIEXPORT jbyteArray JNICALL1402Java_sun_security_jgss_wrapper_GSSLibStub_getMic(JNIEnv *env, jobject jobj,1403jlong pContext, jint jqop,1404jbyteArray jmsg)1405{1406OM_uint32 minor, major;1407gss_ctx_id_t contextHdl;1408gss_qop_t qop;1409gss_buffer_desc msg;1410gss_buffer_desc msgToken;1411jbyteArray jresult;14121413contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);14141415TRACE1("[GSSLibStub_getMic] %ld", (long)contextHdl);14161417if (contextHdl == GSS_C_NO_CONTEXT) {1418// Twik per javadoc1419checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_getMic]");1420return NULL;1421}1422contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);1423qop = (gss_qop_t) jqop;1424initGSSBuffer(env, jmsg, &msg);1425if ((*env)->ExceptionCheck(env)) {1426return NULL;1427}14281429/* gss_get_mic(...) => GSS_S_CONTEXT_EXPIRED, GSS_S_NO_CONTEXT(!),1430GSS_S_BAD_QOP */1431major =1432(*ftab->getMic)(&minor, contextHdl, qop, &msg, &msgToken);14331434/* release intermediate buffers */1435resetGSSBuffer(&msg);1436jresult = getJavaBuffer(env, &msgToken);1437if ((*env)->ExceptionCheck(env)) {1438return NULL;1439}1440checkStatus(env, jobj, major, minor, "[GSSLibStub_getMic]");1441if ((*env)->ExceptionCheck(env)) {1442return NULL;1443}14441445return jresult;1446}14471448/*1449* Class: sun_security_jgss_wrapper_GSSLibStub1450* Method: verifyMic1451* Signature: (J[B[BLorg/ietf/jgss/MessageProp;)V1452*/1453JNIEXPORT void JNICALL1454Java_sun_security_jgss_wrapper_GSSLibStub_verifyMic(JNIEnv *env,1455jobject jobj,1456jlong pContext,1457jbyteArray jmsgToken,1458jbyteArray jmsg,1459jobject jprop)1460{1461OM_uint32 minor, major;1462gss_ctx_id_t contextHdl;1463gss_buffer_desc msg;1464gss_buffer_desc msgToken;1465gss_qop_t qop;14661467contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);14681469TRACE1("[GSSLibStub_verifyMic] %ld", (long)contextHdl);14701471if (contextHdl == GSS_C_NO_CONTEXT) {1472// Twik per javadoc1473checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0,1474"[GSSLibStub_verifyMic]");1475return;1476}14771478qop = (gss_qop_t) (*env)->CallIntMethod(env, jprop, MID_MessageProp_getQOP);1479if ((*env)->ExceptionCheck(env)) { return; }14801481initGSSBuffer(env, jmsg, &msg);1482if ((*env)->ExceptionCheck(env)) { return; }14831484initGSSBuffer(env, jmsgToken, &msgToken);1485if ((*env)->ExceptionCheck(env)) {1486resetGSSBuffer(&msg);1487return;1488}14891490/* gss_verify_mic(...) => GSS_S_DEFECTIVE_TOKEN, GSS_S_BAD_MIC,1491GSS_S_CONTEXT_EXPIRED, GSS_S_DUPLICATE_TOKEN(!), GSS_S_OLD_TOKEN(!),1492GSS_S_UNSEQ_TOKEN(!), GSS_S_GAP_TOKEN(!), GSS_S_NO_CONTEXT(!) */1493major =1494(*ftab->verifyMic)(&minor, contextHdl, &msg, &msgToken, &qop);14951496/* release intermediate buffers */1497resetGSSBuffer(&msg);1498resetGSSBuffer(&msgToken);14991500checkStatus(env, jobj, GSS_ERROR(major), minor, "[GSSLibStub_verifyMic]");1501if ((*env)->ExceptionCheck(env)) {1502return;1503}15041505(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setQOP, qop);1506if ((*env)->ExceptionCheck(env)) {1507return;1508}15091510setSupplementaryInfo(env, jobj, jprop, GSS_SUPPLEMENTARY_INFO(major),1511minor);1512if ((*env)->ExceptionCheck(env)) {1513return;1514}1515}15161517/*1518* Class: sun_security_jgss_wrapper_GSSLibStub1519* Method: wrap1520* Signature: (J[BLorg/ietf/jgss/MessageProp;)[B1521*/1522JNIEXPORT jbyteArray JNICALL1523Java_sun_security_jgss_wrapper_GSSLibStub_wrap(JNIEnv *env,1524jobject jobj,1525jlong pContext,1526jbyteArray jmsg,1527jobject jprop)1528{1529OM_uint32 minor, major;1530jboolean confFlag;1531gss_qop_t qop;1532gss_buffer_desc msg;1533gss_buffer_desc msgToken;1534int confState;1535gss_ctx_id_t contextHdl;1536jbyteArray jresult;15371538contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);15391540TRACE1("[GSSLibStub_wrap] %ld", (long)contextHdl);15411542if (contextHdl == GSS_C_NO_CONTEXT) {1543// Twik per javadoc1544checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_wrap]");1545return NULL;1546}15471548confFlag =1549(*env)->CallBooleanMethod(env, jprop, MID_MessageProp_getPrivacy);1550if ((*env)->ExceptionCheck(env)) {1551return NULL;1552}15531554qop = (gss_qop_t)1555(*env)->CallIntMethod(env, jprop, MID_MessageProp_getQOP);1556if ((*env)->ExceptionCheck(env)) {1557return NULL;1558}15591560initGSSBuffer(env, jmsg, &msg);1561if ((*env)->ExceptionCheck(env)) {1562return NULL;1563}15641565/* gss_wrap(...) => GSS_S_CONTEXT_EXPIRED, GSS_S_NO_CONTEXT(!),1566GSS_S_BAD_QOP */1567major = (*ftab->wrap)(&minor, contextHdl, confFlag, qop, &msg, &confState,1568&msgToken);15691570/* release intermediate buffers */1571resetGSSBuffer(&msg);1572jresult = getJavaBuffer(env, &msgToken);1573if ((*env)->ExceptionCheck(env)) {1574return NULL;1575}15761577checkStatus(env, jobj, major, minor, "[GSSLibStub_wrap]");1578if ((*env)->ExceptionCheck(env)) {1579return NULL;1580}15811582(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setPrivacy,1583(confState? JNI_TRUE:JNI_FALSE));1584if ((*env)->ExceptionCheck(env)) {1585return NULL;1586}1587return jresult;1588}15891590/*1591* Class: sun_security_jgss_wrapper_GSSLibStub1592* Method: unwrap1593* Signature: (J[BLorg/ietf/jgss/MessageProp;)[B1594*/1595JNIEXPORT jbyteArray JNICALL1596Java_sun_security_jgss_wrapper_GSSLibStub_unwrap(JNIEnv *env,1597jobject jobj,1598jlong pContext,1599jbyteArray jmsgToken,1600jobject jprop)1601{1602OM_uint32 minor, major;1603gss_ctx_id_t contextHdl;1604gss_buffer_desc msgToken;1605gss_buffer_desc msg;1606int confState;1607gss_qop_t qop;1608jbyteArray jresult;16091610contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext);16111612TRACE1("[GSSLibStub_unwrap] %ld", (long)contextHdl);16131614if (contextHdl == GSS_C_NO_CONTEXT) {1615// Twik per javadoc1616checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_unwrap]");1617return NULL;1618}16191620initGSSBuffer(env, jmsgToken, &msgToken);1621if ((*env)->ExceptionCheck(env)) {1622return NULL;1623}16241625confState = 0;1626qop = GSS_C_QOP_DEFAULT;1627/* gss_unwrap(...) => GSS_S_DEFECTIVE_TOKEN, GSS_S_BAD_MIC,1628GSS_S_CONTEXT_EXPIRED, GSS_S_DUPLICATE_TOKEN(!), GSS_S_OLD_TOKEN(!),1629GSS_S_UNSEQ_TOKEN(!), GSS_S_GAP_TOKEN(!), GSS_S_NO_CONTEXT(!) */1630major =1631(*ftab->unwrap)(&minor, contextHdl, &msgToken, &msg, &confState, &qop);16321633/* release intermediate buffers */1634resetGSSBuffer(&msgToken);1635jresult = getJavaBuffer(env, &msg);1636if ((*env)->ExceptionCheck(env)) {1637return NULL;1638}16391640checkStatus(env, jobj, GSS_ERROR(major), minor, "[GSSLibStub_unwrap]");1641if ((*env)->ExceptionCheck(env)) {1642return NULL;1643}16441645/* update the message prop with relevant info */1646(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setPrivacy,1647(confState != 0));1648if ((*env)->ExceptionCheck(env)) {1649return NULL;1650}1651(*env)->CallVoidMethod(env, jprop, MID_MessageProp_setQOP, qop);1652if ((*env)->ExceptionCheck(env)) {1653return NULL;1654}1655setSupplementaryInfo(env, jobj, jprop, GSS_SUPPLEMENTARY_INFO(major),1656minor);1657if ((*env)->ExceptionCheck(env)) {1658return NULL;1659}16601661return jresult;1662}166316641665