25 |
25 |
26 #include "sun_security_jgss_wrapper_GSSLibStub.h" |
26 #include "sun_security_jgss_wrapper_GSSLibStub.h" |
27 #include "NativeUtil.h" |
27 #include "NativeUtil.h" |
28 #include "NativeFunc.h" |
28 #include "NativeFunc.h" |
29 #include "jlong.h" |
29 #include "jlong.h" |
30 |
30 #include <jni.h> |
31 /* Constants for indicating what type of info is needed for inqueries */ |
31 |
|
32 /* Throws a Java Exception by name */ |
|
33 |
|
34 void throwByName(JNIEnv *env, const char *name, const char *msg) { |
|
35 jclass cls = (*env)->FindClass(env, name); |
|
36 |
|
37 if (cls != 0) /* Otherwise an exception has already been thrown */ |
|
38 (*env)->ThrowNew(env, cls, msg); |
|
39 } |
|
40 |
|
41 void throwOutOfMemoryError(JNIEnv *env, const char *message) { |
|
42 throwByName(env, "java/lang/OutOfMemoryError", message); |
|
43 } |
|
44 |
|
45 /* Constants for indicating what type of info is needed for inquiries */ |
32 const int TYPE_CRED_NAME = 10; |
46 const int TYPE_CRED_NAME = 10; |
33 const int TYPE_CRED_TIME = 11; |
47 const int TYPE_CRED_TIME = 11; |
34 const int TYPE_CRED_USAGE = 12; |
48 const int TYPE_CRED_USAGE = 12; |
35 |
49 |
36 /* |
50 /* |
115 jbyteArray value; |
129 jbyteArray value; |
116 |
130 |
117 if (jcb == NULL) { |
131 if (jcb == NULL) { |
118 return GSS_C_NO_CHANNEL_BINDINGS; |
132 return GSS_C_NO_CHANNEL_BINDINGS; |
119 } |
133 } |
|
134 |
120 cb = malloc(sizeof(struct gss_channel_bindings_struct)); |
135 cb = malloc(sizeof(struct gss_channel_bindings_struct)); |
|
136 |
|
137 if (cb == NULL) { |
|
138 throwOutOfMemoryError(env,NULL); |
|
139 return NULL; |
|
140 } |
|
141 |
121 /* set up initiator address */ |
142 /* set up initiator address */ |
122 jinetAddr = |
143 jinetAddr = |
123 (*env)->CallObjectMethod(env, jcb, |
144 (*env)->CallObjectMethod(env, jcb, |
124 MID_ChannelBinding_getInitiatorAddr); |
145 MID_ChannelBinding_getInitiatorAddr); |
125 if (jinetAddr != NULL) { |
146 if (jinetAddr != NULL) { |
299 { |
320 { |
300 OM_uint32 minor, major; |
321 OM_uint32 minor, major; |
301 gss_buffer_desc nameVal; |
322 gss_buffer_desc nameVal; |
302 gss_OID nameType; |
323 gss_OID nameType; |
303 gss_name_t nameHdl; |
324 gss_name_t nameHdl; |
|
325 nameHdl = GSS_C_NO_NAME; |
304 |
326 |
305 debug(env, "[GSSLibStub_importName]"); |
327 debug(env, "[GSSLibStub_importName]"); |
306 |
328 |
307 initGSSBuffer(env, jnameVal, &nameVal); |
329 initGSSBuffer(env, jnameVal, &nameVal); |
308 nameType = newGSSOID(env, jnameType); |
330 nameType = newGSSOID(env, jnameType); |
309 nameHdl = GSS_C_NO_NAME; |
331 if ((*env)->ExceptionCheck(env)) { |
|
332 return jlong_zero; |
|
333 } |
310 |
334 |
311 /* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME, |
335 /* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME, |
312 GSS_S_BAD_MECH */ |
336 GSS_S_BAD_MECH */ |
313 major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl); |
337 major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl); |
314 |
338 |
507 gss_OID mech; |
531 gss_OID mech; |
508 gss_OID_set mechs; |
532 gss_OID_set mechs; |
509 gss_cred_usage_t credUsage; |
533 gss_cred_usage_t credUsage; |
510 gss_name_t nameHdl; |
534 gss_name_t nameHdl; |
511 gss_cred_id_t credHdl; |
535 gss_cred_id_t credHdl; |
|
536 credHdl = GSS_C_NO_CREDENTIAL; |
512 |
537 |
513 debug(env, "[GSSLibStub_acquireCred]"); |
538 debug(env, "[GSSLibStub_acquireCred]"); |
514 |
539 |
515 |
540 |
516 mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); |
541 mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); |
517 mechs = newGSSOIDSet(env, mech); |
542 mechs = newGSSOIDSet(env, mech); |
|
543 if ((*env)->ExceptionCheck(env)) { |
|
544 return jlong_zero; |
|
545 } |
518 credUsage = (gss_cred_usage_t) usage; |
546 credUsage = (gss_cred_usage_t) usage; |
519 nameHdl = (gss_name_t) jlong_to_ptr(pName); |
547 nameHdl = (gss_name_t) jlong_to_ptr(pName); |
520 credHdl = GSS_C_NO_CREDENTIAL; |
|
521 |
548 |
522 sprintf(debugBuf, "[GSSLibStub_acquireCred] pName=%ld, usage=%d", |
549 sprintf(debugBuf, "[GSSLibStub_acquireCred] pName=%ld, usage=%d", |
523 (long) pName, usage); |
550 (long) pName, usage); |
524 debug(env, debugBuf); |
551 debug(env, debugBuf); |
525 |
552 |
626 nameHdl = GSS_C_NO_NAME; |
653 nameHdl = GSS_C_NO_NAME; |
627 inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl); |
654 inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl); |
628 |
655 |
629 /* return immediately if an exception has occurred */ |
656 /* return immediately if an exception has occurred */ |
630 if ((*env)->ExceptionCheck(env)) { |
657 if ((*env)->ExceptionCheck(env)) { |
631 return 0; |
658 return jlong_zero; |
632 } |
659 } |
633 |
660 |
634 sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl); |
661 sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl); |
635 debug(env, debugBuf); |
662 debug(env, debugBuf); |
636 |
663 |
793 flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi, |
820 flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi, |
794 FID_NativeGSSContext_flags); |
821 FID_NativeGSSContext_flags); |
795 time = getGSSTime((*env)->GetIntField(env, jcontextSpi, |
822 time = getGSSTime((*env)->GetIntField(env, jcontextSpi, |
796 FID_NativeGSSContext_lifetime)); |
823 FID_NativeGSSContext_lifetime)); |
797 cb = getGSSCB(env, jcb); |
824 cb = getGSSCB(env, jcb); |
|
825 if ((*env)->ExceptionCheck(env)) { |
|
826 return NULL; |
|
827 } |
|
828 |
798 initGSSBuffer(env, jinToken, &inToken); |
829 initGSSBuffer(env, jinToken, &inToken); |
799 |
830 |
800 sprintf(debugBuf, |
831 sprintf(debugBuf, |
801 "[GSSLibStub_initContext] before: pCred=%ld, pContext=%ld", |
832 "[GSSLibStub_initContext] before: pCred=%ld, pContext=%ld", |
802 (long)credHdl, (long)contextHdl); |
833 (long)credHdl, (long)contextHdl); |
893 contextHdl = (gss_ctx_id_t)jlong_to_ptr( |
924 contextHdl = (gss_ctx_id_t)jlong_to_ptr( |
894 (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext)); |
925 (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext)); |
895 credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); |
926 credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); |
896 initGSSBuffer(env, jinToken, &inToken); |
927 initGSSBuffer(env, jinToken, &inToken); |
897 cb = getGSSCB(env, jcb); |
928 cb = getGSSCB(env, jcb); |
|
929 if ((*env)->ExceptionCheck(env)) { |
|
930 return NULL; |
|
931 } |
898 srcName = GSS_C_NO_NAME; |
932 srcName = GSS_C_NO_NAME; |
899 delCred = GSS_C_NO_CREDENTIAL; |
933 delCred = GSS_C_NO_CREDENTIAL; |
900 setTarget = (credHdl == GSS_C_NO_CREDENTIAL); |
934 setTarget = (credHdl == GSS_C_NO_CREDENTIAL); |
901 aFlags = 0; |
935 aFlags = 0; |
902 |
936 |
1128 } |
1162 } |
1129 |
1163 |
1130 checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]"); |
1164 checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]"); |
1131 /* return immediately if an exception has occurred */ |
1165 /* return immediately if an exception has occurred */ |
1132 if ((*env)->ExceptionCheck(env)) { |
1166 if ((*env)->ExceptionCheck(env)) { |
1133 return ptr_to_jlong(NULL); |
1167 return jlong_zero; |
1134 } |
1168 } |
1135 |
1169 |
1136 sprintf(debugBuf, "[GSSLibStub_getContextName] pName=%ld", (long) nameHdl); |
1170 sprintf(debugBuf, "[GSSLibStub_getContextName] pName=%ld", (long) nameHdl); |
1137 debug(env, debugBuf); |
1171 debug(env, debugBuf); |
1138 |
1172 |