jdk/src/share/native/sun/security/jgss/wrapper/NativeUtil.c
author michaelm
Thu, 06 Feb 2014 22:12:09 +0000
changeset 22940 56b3ab8ec81c
parent 16488 816b9df68a9f
child 23010 6dadb192ad81
permissions -rw-r--r--
8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending Reviewed-by: chegar, mullan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     2
 * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
#include "NativeUtil.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
#include "NativeFunc.h"
14414
f338be3ef659 8001579: Cleanup warnings in security native code
jzavgren
parents: 5506
diff changeset
    28
#include "jlong.h"
16488
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
    29
#include <jni.h>
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
    30
#include "jni_util.h"
16488
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
    31
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
    32
extern void throwOutOfMemoryError(JNIEnv *env, const char *message);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
const int JAVA_DUPLICATE_TOKEN_CODE = 19; /* DUPLICATE_TOKEN */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
const int JAVA_OLD_TOKEN_CODE = 20; /* OLD_TOKEN */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
const int JAVA_UNSEQ_TOKEN_CODE = 21; /* UNSEQ_TOKEN */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
const int JAVA_GAP_TOKEN_CODE = 22; /* GAP_TOKEN */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
const int JAVA_ERROR_CODE[] = {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
  2,  /* BAD_MECH */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
  3,  /* BAD_NAME */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
  4,  /* BAD_NAMETYPE */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
  1,  /* BAD_BINDINGS */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
  5,  /* BAD_STATUS */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
  6,  /* BAD_MIC */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
  13, /* NO_CRED */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
  12, /* NO_CONTEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
  10, /* DEFECTIVE_TOKEN */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
  9,  /* DEFECTIVE_CREDENTIAL */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
  8,  /* CREDENTIAL_EXPIRED */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
  7,  /* CONTEXT_EXPIRED */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
  11, /* FAILURE */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
  14, /* BAD_QOP */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
  15, /* UNAUTHORIZED */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
  16, /* UNAVAILABLE */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
  17, /* DUPLICATE_ELEMENT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
  18, /* NAME_NOT_MN */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
};
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
const char SPNEGO_BYTES[] = {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
 0x2b, 0x06, 0x01, 0x05, 0x05, 0x02
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
};
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
jclass CLS_Object;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
jclass CLS_String;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
jclass CLS_Oid;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
jclass CLS_GSSException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
jclass CLS_GSSNameElement;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
jclass CLS_GSSCredElement;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
jclass CLS_NativeGSSContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
jclass CLS_SunNativeProvider;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
jmethodID MID_String_ctor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
jmethodID MID_Oid_ctor1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
jmethodID MID_Oid_getDER;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
jmethodID MID_MessageProp_getPrivacy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
jmethodID MID_MessageProp_getQOP;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
jmethodID MID_MessageProp_setPrivacy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
jmethodID MID_MessageProp_setQOP;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
jmethodID MID_MessageProp_setSupplementaryStates;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
jmethodID MID_GSSException_ctor3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
jmethodID MID_ChannelBinding_getInitiatorAddr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
jmethodID MID_ChannelBinding_getAcceptorAddr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
jmethodID MID_ChannelBinding_getAppData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
jmethodID MID_InetAddress_getAddr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
jmethodID MID_GSSNameElement_ctor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
jmethodID MID_GSSCredElement_ctor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
jmethodID MID_NativeGSSContext_ctor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
jmethodID MID_SunNativeProvider_debug;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
jfieldID FID_GSSLibStub_pMech;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
jfieldID FID_NativeGSSContext_pContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
jfieldID FID_NativeGSSContext_srcName;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
jfieldID FID_NativeGSSContext_targetName;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
jfieldID FID_NativeGSSContext_isInitiator;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
jfieldID FID_NativeGSSContext_isEstablished;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
jfieldID FID_NativeGSSContext_delegatedCred;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
jfieldID FID_NativeGSSContext_flags;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
jfieldID FID_NativeGSSContext_lifetime;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
jfieldID FID_NativeGSSContext_actualMech;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
char debugBuf[256];
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
JNIEXPORT jint JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
JNI_OnLoad(JavaVM *jvm, void *reserved) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
  JNIEnv *env;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
  jclass cls;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
  if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
    return JNI_EVERSION; /* JNI version not supported */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
  /* Retrieve and store the classes in global ref */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
  cls = (*env)->FindClass(env, "java/lang/Object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
    printf("Couldn't find Object class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
  CLS_Object = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
  if (CLS_Object == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
  cls = (*env)->FindClass(env, "java/lang/String");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
    printf("Couldn't find String class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
  CLS_String = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
  if (CLS_String == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
  cls = (*env)->FindClass(env, "org/ietf/jgss/Oid");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
    printf("Couldn't find org.ietf.jgss.Oid class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
  CLS_Oid = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
  if (CLS_Oid == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
  cls = (*env)->FindClass(env, "org/ietf/jgss/GSSException");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
    printf("Couldn't find org.ietf.jgss.GSSException class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
  CLS_GSSException = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
  if (CLS_GSSException == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
  cls = (*env)->FindClass(env, "sun/security/jgss/wrapper/GSSNameElement");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
    printf("Couldn't find sun.security.jgss.wrapper.GSSNameElement class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
  CLS_GSSNameElement = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
  if (CLS_GSSException == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
  cls = (*env)->FindClass(env, "sun/security/jgss/wrapper/GSSCredElement");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
    printf("Couldn't find sun.security.jgss.wrapper.GSSCredElement class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
  CLS_GSSCredElement = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
  if (CLS_GSSCredElement == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
  cls = (*env)->FindClass(env, "sun/security/jgss/wrapper/NativeGSSContext");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
    printf("Couldn't find sun.security.jgss.wrapper.NativeGSSContext class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
  CLS_NativeGSSContext = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
  if (CLS_NativeGSSContext == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
  cls = (*env)->FindClass(env, "sun/security/jgss/wrapper/SunNativeProvider");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
    printf("Couldn't find sun.security.jgss.wrapper.SunNativeProvider class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
  CLS_SunNativeProvider = (*env)->NewGlobalRef(env, cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
  if (CLS_SunNativeProvider == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
  /* Compute and cache the method ID */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
  MID_String_ctor = (*env)->GetMethodID(env, CLS_String,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
                                        "<init>", "([B)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
  if (MID_String_ctor == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
    printf("Couldn't find String(byte[]) constructor\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
  MID_Oid_ctor1 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
    (*env)->GetMethodID(env, CLS_Oid, "<init>", "([B)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
  if (MID_Oid_ctor1 == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
    printf("Couldn't find Oid(byte[]) constructor\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
  MID_Oid_getDER = (*env)->GetMethodID(env, CLS_Oid, "getDER", "()[B");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
  if (MID_Oid_getDER == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
    printf("Couldn't find Oid.getDER() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
  cls = (*env)->FindClass(env, "org/ietf/jgss/MessageProp");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
    printf("Couldn't find org.ietf.jgss.MessageProp class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
  MID_MessageProp_getPrivacy =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
    (*env)->GetMethodID(env, cls, "getPrivacy", "()Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
  if (MID_MessageProp_getPrivacy == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
    printf("Couldn't find MessageProp.getPrivacy() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
  MID_MessageProp_getQOP = (*env)->GetMethodID(env, cls, "getQOP", "()I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
  if (MID_MessageProp_getQOP == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
    printf("Couldn't find MessageProp.getQOP() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
  MID_MessageProp_setPrivacy =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
    (*env)->GetMethodID(env, cls, "setPrivacy", "(Z)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
  if (MID_MessageProp_setPrivacy == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
    printf("Couldn't find MessageProp.setPrivacy(boolean) method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
  MID_MessageProp_setQOP = (*env)->GetMethodID(env, cls, "setQOP", "(I)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
  if (MID_MessageProp_setQOP == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
    printf("Couldn't find MessageProp.setQOP(int) method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
  MID_MessageProp_setSupplementaryStates =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
    (*env)->GetMethodID(env, cls, "setSupplementaryStates",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
                        "(ZZZZILjava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
  if (MID_MessageProp_setSupplementaryStates == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
    printf("Couldn't find MessageProp.setSupplementaryStates(...) method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
  MID_GSSException_ctor3 = (*env)->GetMethodID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
    (env, CLS_GSSException, "<init>", "(IILjava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
  if (MID_GSSException_ctor3 == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
    printf("Couldn't find GSSException(int, int, String) constructor\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
  cls = (*env)->FindClass(env, "org/ietf/jgss/ChannelBinding");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
    printf("Couldn't find org.ietf.jgss.ChannelBinding class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
  MID_ChannelBinding_getInitiatorAddr =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
    (*env)->GetMethodID(env, cls, "getInitiatorAddress",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
                        "()Ljava/net/InetAddress;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
  if (MID_ChannelBinding_getInitiatorAddr == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
    printf("Couldn't find ChannelBinding.getInitiatorAddress() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
  MID_ChannelBinding_getAcceptorAddr =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
    (*env)->GetMethodID(env, cls, "getAcceptorAddress",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
                        "()Ljava/net/InetAddress;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
  if (MID_ChannelBinding_getAcceptorAddr == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
    printf("Couldn't find ChannelBinding.getAcceptorAddress() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
  MID_ChannelBinding_getAppData =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
    (*env)->GetMethodID(env, cls, "getApplicationData", "()[B");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
  if (MID_ChannelBinding_getAppData == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    printf("Couldn't find ChannelBinding.getApplicationData() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
  cls = (*env)->FindClass(env, "java/net/InetAddress");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
    printf("Couldn't find java.net.InetAddress class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
  MID_InetAddress_getAddr = (*env)->GetMethodID(env, cls, "getAddress",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
                                                "()[B");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
  if (MID_InetAddress_getAddr == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
    printf("Couldn't find InetAddress.getAddress() method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
  MID_GSSNameElement_ctor =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
    (*env)->GetMethodID(env, CLS_GSSNameElement,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
                        "<init>", "(JLsun/security/jgss/wrapper/GSSLibStub;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
  if (MID_GSSNameElement_ctor == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
    printf("Couldn't find GSSNameElement(long, GSSLibStub) constructor\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
  MID_GSSCredElement_ctor =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
    (*env)->GetMethodID(env, CLS_GSSCredElement, "<init>",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
        "(JLsun/security/jgss/wrapper/GSSNameElement;Lorg/ietf/jgss/Oid;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
  if (MID_GSSCredElement_ctor == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    printf("Couldn't find GSSCredElement(long, GSSLibStub) constructor\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
  MID_NativeGSSContext_ctor =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
    (*env)->GetMethodID(env, CLS_NativeGSSContext, "<init>",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
                        "(JLsun/security/jgss/wrapper/GSSLibStub;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
  if (MID_NativeGSSContext_ctor == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
    printf("Couldn't find NativeGSSContext(long, GSSLibStub) constructor\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
  MID_SunNativeProvider_debug =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    (*env)->GetStaticMethodID(env, CLS_SunNativeProvider, "debug",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
                              "(Ljava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
  if (MID_SunNativeProvider_debug == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
    printf("Couldn't find SunNativeProvider.debug(String) method\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
  /* Compute and cache the field ID */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
  cls = (*env)->FindClass(env, "sun/security/jgss/wrapper/GSSLibStub");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
  if (cls == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
    printf("Couldn't find sun.security.jgss.wrapper.GSSLibStub class\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
  FID_GSSLibStub_pMech =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
    (*env)->GetFieldID(env, cls, "pMech", "J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
  if (FID_GSSLibStub_pMech == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
    printf("Couldn't find GSSLibStub.pMech field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
  FID_NativeGSSContext_pContext =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "pContext", "J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
  if (FID_NativeGSSContext_pContext == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
    printf("Couldn't find NativeGSSContext.pContext field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
  FID_NativeGSSContext_srcName =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "srcName",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
                       "Lsun/security/jgss/wrapper/GSSNameElement;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
  if (FID_NativeGSSContext_srcName == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
    printf("Couldn't find NativeGSSContext.srcName field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
   return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
  FID_NativeGSSContext_targetName =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "targetName",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
                       "Lsun/security/jgss/wrapper/GSSNameElement;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
  if (FID_NativeGSSContext_targetName == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
    printf("Couldn't find NativeGSSContext.targetName field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
  FID_NativeGSSContext_isInitiator =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "isInitiator", "Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
  if (FID_NativeGSSContext_isInitiator == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
    printf("Couldn't find NativeGSSContext.isInitiator field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
  FID_NativeGSSContext_isEstablished =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "isEstablished", "Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
  if (FID_NativeGSSContext_isEstablished == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
    printf("Couldn't find NativeGSSContext.isEstablished field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
  FID_NativeGSSContext_delegatedCred =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "delegatedCred",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
                       "Lsun/security/jgss/wrapper/GSSCredElement;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
  if (FID_NativeGSSContext_delegatedCred == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
    printf("Couldn't find NativeGSSContext.delegatedCred field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
  FID_NativeGSSContext_flags =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "flags", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
  if (FID_NativeGSSContext_flags == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
    printf("Couldn't find NativeGSSContext.flags field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
  FID_NativeGSSContext_lifetime =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "lifetime", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
  if (FID_NativeGSSContext_lifetime == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
    printf("Couldn't find NativeGSSContext.lifetime field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
  FID_NativeGSSContext_actualMech =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
    (*env)->GetFieldID(env, CLS_NativeGSSContext, "actualMech",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
                       "Lorg/ietf/jgss/Oid;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
  if (FID_NativeGSSContext_actualMech == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
    printf("Couldn't find NativeGSSContext.actualMech field\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
    return JNI_ERR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
  return JNI_VERSION_1_2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
JNI_OnUnload(JavaVM *jvm, void *reserved) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
  JNIEnv *env;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
  if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
  /* Delete the global refs */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
  (*env)->DeleteGlobalRef(env, CLS_Object);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
  (*env)->DeleteGlobalRef(env, CLS_String);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
  (*env)->DeleteGlobalRef(env, CLS_Oid);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
  (*env)->DeleteGlobalRef(env, CLS_GSSException);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
  (*env)->DeleteGlobalRef(env, CLS_GSSNameElement);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
  (*env)->DeleteGlobalRef(env, CLS_GSSCredElement);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
  (*env)->DeleteGlobalRef(env, CLS_SunNativeProvider);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
  return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
const OM_uint32 JAVA_MAX = GSS_C_INDEFINITE/2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
 * Utility routine for converting the C unsigned integer time
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
 * to Java signed integer time.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
jint getJavaTime(OM_uint32 ctime) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
  jint result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
  /* special handle values equals or more than JAVA_MAX */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
  if (ctime == GSS_C_INDEFINITE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
    result = JAVA_MAX;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
  } else if (ctime >= JAVA_MAX) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
    result = JAVA_MAX-1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
    result = ctime;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
  return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
 * Utility routine for converting the Java signed integer time
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
 * to C unsigned integer time.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
OM_uint32 getGSSTime(jint jtime) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
  OM_uint32 result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
  /* special handle values equal to JAVA_MAX */
14414
f338be3ef659 8001579: Cleanup warnings in security native code
jzavgren
parents: 5506
diff changeset
   420
  if (jtime == (jint)JAVA_MAX) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
    result = GSS_C_INDEFINITE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
    result = jtime;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
  return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
 * Utility routine for mapping the C error code to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
 * Java one. The routine errors really should have
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
 * shared the same values but unfortunately don't.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
jint getJavaErrorCode(int cNonCallingErr) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
  int cRoutineErr, cSuppStatus;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
  /* map the routine errors */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
  cRoutineErr = GSS_ROUTINE_ERROR(cNonCallingErr) >> 16;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
  if (cRoutineErr != GSS_S_COMPLETE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
    return JAVA_ERROR_CODE[cRoutineErr-1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
  /* map the supplementary infos */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
  cSuppStatus = GSS_SUPPLEMENTARY_INFO(cNonCallingErr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
  if (cSuppStatus & GSS_S_DUPLICATE_TOKEN) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
    return JAVA_DUPLICATE_TOKEN_CODE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
  } else if (cSuppStatus & GSS_S_OLD_TOKEN) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
    return JAVA_OLD_TOKEN_CODE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
  } else if (cSuppStatus & GSS_S_UNSEQ_TOKEN) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
    return JAVA_UNSEQ_TOKEN_CODE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
  } else if (cSuppStatus & GSS_S_GAP_TOKEN) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
    return JAVA_GAP_TOKEN_CODE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
  return GSS_S_COMPLETE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
 * Utility routine for creating a java.lang.String object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
 * using the specified gss_buffer_t structure. After the,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
 * String object is created, the specified gss_buffer_t
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
 * structure is released.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
jstring getJavaString(JNIEnv *env, gss_buffer_t bytes) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
  jstring result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
  OM_uint32 minor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
  int len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
  jbyteArray jbytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
  if (bytes != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
    /* constructs the String object with new String(byte[])
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
       NOTE: do NOT include the trailing NULL */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
    len = bytes->length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
    jbytes = (*env)->NewByteArray(env, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
    (*env)->SetByteArrayRegion(env, jbytes, 0, len, (jbyte *) bytes->value);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
    result = (*env)->NewObject(env, CLS_String, MID_String_ctor,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
                               jbytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
    (*env)->DeleteLocalRef(env, jbytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
    (*ftab->releaseBuffer)(&minor, bytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
    return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
  } /* else fall through */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
  return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
 * Utility routine for generate message for the specified minor
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
 * status code.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
jstring getMinorMessage(JNIEnv *env, jobject jstub, OM_uint32 statusValue) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
  OM_uint32 messageContext, minor, major;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
  gss_buffer_desc statusString;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
  gss_OID mech;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
  jstring msg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
  messageContext = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
  if (jstub != NULL) {
14414
f338be3ef659 8001579: Cleanup warnings in security native code
jzavgren
parents: 5506
diff changeset
   490
    mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jstub, FID_GSSLibStub_pMech));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
    mech = GSS_C_NO_OID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
  /* gss_display_status(...) => GSS_S_BAD_MECH, GSS_S_BAD_STATUS */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
  major = (*ftab->displayStatus)(&minor, statusValue, GSS_C_MECH_CODE, mech,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
                             &messageContext, &statusString);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
  /* release intermediate buffers */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
  msg = getJavaString(env, &statusString);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   499
  if (msg == NULL && !(*env)->ExceptionCheck(env)) {
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   500
    throwOutOfMemoryError(env, NULL);
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   501
  }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
  (*ftab->releaseBuffer)(&minor, &statusString);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
  return msg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
 * Utility routine checking the specified major and minor
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
 * status codes. GSSExceptions will be thrown if they are
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
 * not GSS_S_COMPLETE (i.e. 0).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
void checkStatus(JNIEnv *env, jobject jstub, OM_uint32 major,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
                 OM_uint32 minor, char* methodName) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
  int callingErr, routineErr, supplementaryInfo;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
  jint jmajor, jminor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
  char* msg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
  jstring jmsg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
  jthrowable gssEx;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
  if (major == GSS_S_COMPLETE) return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
  callingErr = GSS_CALLING_ERROR(major);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
  routineErr = GSS_ROUTINE_ERROR(major);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
  supplementaryInfo = GSS_SUPPLEMENTARY_INFO(major);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
  sprintf(debugBuf, "%s Status major/minor = %x/%d", methodName, major, minor);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
  debug(env, debugBuf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
  sprintf(debugBuf, "%s Status c/r/s = %d/%d/%d ", methodName, callingErr>>24,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
          routineErr>>16, supplementaryInfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
  debug(env, debugBuf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
  jmajor = getJavaErrorCode(routineErr | supplementaryInfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
  jminor = minor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
  if (jmajor != GSS_S_COMPLETE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
    jmsg = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
    if (minor != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
      jmsg = getMinorMessage(env, jstub, minor);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   536
      CHECK_NULL(jmsg);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
    gssEx = (*env)->NewObject(env, CLS_GSSException,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
                              MID_GSSException_ctor3,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
                              jmajor, jminor, jmsg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
    (*env)->Throw(env, gssEx);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
    /* Error in calling the GSS api */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
    if (callingErr == GSS_S_CALL_INACCESSIBLE_READ) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
      msg = "A required input parameter cannot be read";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
    } else if (callingErr == GSS_S_CALL_INACCESSIBLE_WRITE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
      msg = "A required output parameter cannot be write";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
      msg = "A parameter was malformed";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
    jmajor = 13; /* use GSSException.FAILURE for now */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
    jmsg = (*env)->NewStringUTF(env, msg);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   553
    CHECK_NULL(jmsg);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
    gssEx = (*env)->NewObject(env, CLS_GSSException,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
                              MID_GSSException_ctor3,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
                              jmajor, jminor, jmsg);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   557
    CHECK_NULL(gssEx);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
    (*env)->Throw(env, gssEx);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
}
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   561
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
 * Utility routine for initializing gss_buffer_t structure
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
 * with the byte[] in the specified jbyteArray object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
 * NOTE: need to call resetGSSBuffer(...) to free up
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
 * the resources.
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   567
 * Return JNI_TRUE if GetByteArrayElements() returns ok, JNI_FALSE otherwise
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   568
 * If JNI_FALSE returned, then an exception has been thrown.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
 */
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   570
int initGSSBuffer(JNIEnv *env, jbyteArray jbytes,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
                   gss_buffer_t cbytes) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
  if (jbytes != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
    cbytes->length = (*env)->GetArrayLength(env, jbytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
    cbytes->value = (*env)->GetByteArrayElements(env, jbytes, NULL);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   575
    if (cbytes->value == NULL) {
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   576
        if (!(*env)->ExceptionCheck(env)) {
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   577
            throwOutOfMemoryError(env, NULL);
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   578
        }
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   579
        return JNI_FALSE;
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   580
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
    cbytes->length = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
    cbytes->value = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
  }
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   585
  return JNI_TRUE;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
}
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   587
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
 * Utility routine for unpinning/releasing the byte[]
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
 * associated with the specified jbyteArray object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
 * NOTE: used in conjunction with initGSSBuffer(...).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
void resetGSSBuffer(JNIEnv *env, jbyteArray jbytes,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
                    gss_buffer_t cbytes) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
  if ((cbytes != NULL) && (cbytes != GSS_C_NO_BUFFER) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
      (cbytes->length != 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
    (*env)->ReleaseByteArrayElements(env, jbytes, cbytes->value,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
                                     JNI_ABORT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
 * Utility routine for creating a jbyteArray object using
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
 * the byte[] value in specified gss_buffer_t structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
 * NOTE: the specified gss_buffer_t structure will be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
 * released in this routine.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
jbyteArray getJavaBuffer(JNIEnv *env, gss_buffer_t cbytes) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
  jbyteArray result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
  OM_uint32 minor; // don't care, just so it compiles
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
  if ((cbytes != NULL) && (cbytes != GSS_C_NO_BUFFER) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
      (cbytes->length != 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
    result = (*env)->NewByteArray(env, cbytes->length);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   614
    if (result != NULL)
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   615
        (*env)->SetByteArrayRegion(env, result, 0, cbytes->length,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
                               cbytes->value);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
    (*ftab->releaseBuffer)(&minor, cbytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
    return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
  return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
 * Utility routine for creating a non-mech gss_OID using
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
 * the specified org.ietf.jgss.Oid object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
 * NOTE: need to call deleteGSSOID(...) afterwards to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
 * release the created gss_OID structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
gss_OID newGSSOID(JNIEnv *env, jobject jOid) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
  jbyteArray jbytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
  gss_OID cOid;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
  jthrowable gssEx;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
  if (jOid != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
    jbytes = (*env)->CallObjectMethod(env, jOid, MID_Oid_getDER);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
    if ((*env)->ExceptionCheck(env)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
      gssEx = (*env)->ExceptionOccurred(env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
      (*env)->Throw(env, gssEx);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   638
      return GSS_C_NO_OID;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
    cOid = malloc(sizeof(struct gss_OID_desc_struct));
16488
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   641
    if (cOid == NULL) {
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   642
      throwOutOfMemoryError(env,NULL);
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   643
      return GSS_C_NO_OID;
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   644
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
    cOid->length = (*env)->GetArrayLength(env, jbytes) - 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
    cOid->elements = malloc(cOid->length);
16488
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   647
    if (cOid->elements == NULL) {
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   648
      throwOutOfMemoryError(env,NULL);
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   649
      free(cOid);
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   650
      return GSS_C_NO_OID;
816b9df68a9f 8007607: security native code doesn't always use malloc, realloc, and calloc correctly
jzavgren
parents: 14414
diff changeset
   651
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
    (*env)->GetByteArrayRegion(env, jbytes, 2, cOid->length,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
                               cOid->elements);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
    (*env)->DeleteLocalRef(env, jbytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
    return cOid;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
    return GSS_C_NO_OID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
 * Utility routine for releasing the specified gss_OID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
 * structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
 * NOTE: used in conjunction with newGSSOID(...).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
void deleteGSSOID(gss_OID oid) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
  if (oid != GSS_C_NO_OID) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
    free(oid->elements);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
    free(oid);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
 * Utility routine for creating a org.ietf.jgss.Oid
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
 * object using the specified gss_OID structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
jobject getJavaOID(JNIEnv *env, gss_OID cOid) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
  int cLen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
  char oidHdr[2];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
  jbyteArray jbytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
  jobject result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
  if ((cOid == NULL) || (cOid == GSS_C_NO_OID)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
    return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
  cLen = cOid->length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
  oidHdr[0] = 6;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
  oidHdr[1] = cLen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
  jbytes = (*env)->NewByteArray(env, cLen+2);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   688
  CHECK_NULL_RETURN(jbytes, NULL);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
  (*env)->SetByteArrayRegion(env, jbytes, 0, 2, (jbyte *) oidHdr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
  (*env)->SetByteArrayRegion(env, jbytes, 2, cLen, (jbyte *) cOid->elements);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
  result = (*env)->NewObject(env, CLS_Oid, MID_Oid_ctor1, jbytes);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   693
  JNU_CHECK_EXCEPTION_RETURN(env, NULL);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
  (*env)->DeleteLocalRef(env, jbytes);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
  return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
 * Utility routine for creating a gss_OID_set structure
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
 * using the specified gss_OID.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
 * NOTE: need to call deleteGSSOIDSet(...) afterwards
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
 * to release the created gss_OID_set structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
gss_OID_set newGSSOIDSet(JNIEnv *env, gss_OID oid) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
  gss_OID_set oidSet;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
  OM_uint32 minor; // don't care; just so it compiles
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
  if (oid->length != 6 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
      memcmp(oid->elements, SPNEGO_BYTES, 6) != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
      (*ftab->createEmptyOidSet)(&minor, &oidSet);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
      (*ftab->addOidSetMember)(&minor, oid, &oidSet);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
      return oidSet;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
      // Use all mechs for SPNEGO in order to work with
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
      // various native GSS impls
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
      return (ftab->mechs);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
 * Utility routine for releasing a gss_OID_set structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
 * NOTE: used in conjunction with newGSSOIDSet(...).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
void deleteGSSOIDSet(gss_OID_set oidSet) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
  OM_uint32 minor; /* don't care; just so it compiles */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
  if ((oidSet != ftab->mechs) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
      (oidSet != NULL) && (oidSet != GSS_C_NO_OID_SET)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
    (*ftab->releaseOidSet)(&minor, &oidSet);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
 * Utility routine for creating a org.ietf.jgss.Oid[]
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
 * using the specified gss_OID_set structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
jobjectArray getJavaOIDArray(JNIEnv *env, gss_OID_set cOidSet) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
  int numOfOids = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
  jobjectArray jOidSet;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
  jobject jOid;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
  int i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
  jthrowable gssEx;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
  if (cOidSet != NULL && cOidSet != GSS_C_NO_OID_SET) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
    numOfOids = cOidSet->count;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
    jOidSet = (*env)->NewObjectArray(env, numOfOids, CLS_Oid, NULL);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   744
    if (jOidSet == NULL) {
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   745
      return NULL;
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   746
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
    if (jOidSet != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
      for (i = 0; i < numOfOids; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
        jOid = getJavaOID(env, &(cOidSet->elements[i]));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
        (*env)->SetObjectArrayElement(env, jOidSet, i, jOid);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
        (*env)->DeleteLocalRef(env, jOid);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
    return jOidSet;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
  return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
void debug(JNIEnv *env, char *msg) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
  jstring jmsg = (*env)->NewStringUTF(env, msg);
22940
56b3ab8ec81c 8031588: warnings from b03 for jdk/src/share/native/sun/security/jgss/wrapper: JNI exception pending
michaelm
parents: 16488
diff changeset
   761
  CHECK_NULL(jmsg);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
  (*env)->CallStaticVoidMethod(env, CLS_SunNativeProvider,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
                               MID_SunNativeProvider_debug, jmsg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
  (*env)->DeleteLocalRef(env, jmsg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
int sameMech(JNIEnv *env, gss_OID mech, gss_OID mech2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
  int result = JNI_FALSE; // default to not equal
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
  if (mech->length == mech2->length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
    result = (memcmp(mech->elements, mech2->elements, mech->length) == 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
  return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
}