1 /* 2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 3 */ 4 5 /* Copyright (c) 2002 Graz University of Technology. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright notice, 11 * this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright notice, 14 * this list of conditions and the following disclaimer in the documentation 15 * and/or other materials provided with the distribution. 16 * 17 * 3. The end-user documentation included with the redistribution, if any, must 18 * include the following acknowledgment: 19 * 20 * "This product includes software developed by IAIK of Graz University of 21 * Technology." 22 * 23 * Alternately, this acknowledgment may appear in the software itself, if 24 * and wherever such third-party acknowledgments normally appear. 25 * 26 * 4. The names "Graz University of Technology" and "IAIK of Graz University of 27 * Technology" must not be used to endorse or promote products derived from 28 * this software without prior written permission. 29 * 30 * 5. Products derived from this software may not be called 31 * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior 32 * written permission of Graz University of Technology. 33 * 34 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 35 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 36 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 37 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE 38 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 39 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 40 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 41 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 42 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 43 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 44 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 45 * POSSIBILITY OF SUCH DAMAGE. 46 * =========================================================================== 47 */ 48 49 #include "pkcs11wrapper.h" 50 51 #include <stdio.h> 52 #include <stdlib.h> 53 #include <string.h> 54 #include <assert.h> 55 56 #include "sun_security_pkcs11_wrapper_PKCS11.h" 57 58 #ifdef P11_ENABLE_C_DIGESTENCRYPTUPDATE 59 /* 60 * Class: sun_security_pkcs11_wrapper_PKCS11 61 * Method: C_DigestEncryptUpdate 62 * Signature: (J[B)[B 63 * Parametermapping: *PKCS11* 64 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession 65 * @param jbyteArray jPart CK_BYTE_PTR pPart 66 * CK_ULONG ulPartLen 67 * @return jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart 68 * CK_ULONG_PTR pulEncryptedPartLen 69 */ 70 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestEncryptUpdate 71 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jPart) 72 { 73 CK_SESSION_HANDLE ckSessionHandle; 74 CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart; 75 CK_ULONG ckPartLength, ckEncryptedPartLength = 0; 76 jbyteArray jEncryptedPart = NULL; 77 CK_RV rv; 78 79 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); 80 if (ckpFunctions == NULL) { return NULL; } 81 82 ckSessionHandle = jLongToCKULong(jSessionHandle); 83 jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength); 84 if ((*env)->ExceptionCheck(env)) { return NULL; } 85 86 rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength); 87 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { 88 free(ckpPart); 89 return NULL; 90 } 91 92 ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE)); 93 if (ckpEncryptedPart == NULL) { 94 free(ckpPart); 95 throwOutOfMemoryError(env, 0); 96 return NULL; 97 } 98 99 rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength); 100 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { 101 jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength); 102 } 103 free(ckpPart); 104 free(ckpEncryptedPart); 105 106 return jEncryptedPart ; 107 } 108 #endif 109 110 #ifdef P11_ENABLE_C_DECRYPTDIGESTUPDATE 111 /* 112 * Class: sun_security_pkcs11_wrapper_PKCS11 113 * Method: C_DecryptDigestUpdate 114 * Signature: (J[B)[B 115 * Parametermapping: *PKCS11* 116 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession 117 * @param jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart 118 * CK_ULONG ulEncryptedPartLen 119 * @return jbyteArray jPart CK_BYTE_PTR pPart 120 * CK_ULONG_PTR pulPartLen 121 */ 122 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptDigestUpdate 123 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jEncryptedPart) 124 { 125 CK_SESSION_HANDLE ckSessionHandle; 126 CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR; 127 CK_ULONG ckPartLength = 0, ckEncryptedPartLength; 128 jbyteArray jPart = NULL; 129 CK_RV rv; 130 131 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); 132 if (ckpFunctions == NULL) { return NULL; } 133 134 ckSessionHandle = jLongToCKULong(jSessionHandle); 135 jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength); 136 if ((*env)->ExceptionCheck(env)) { return NULL; } 137 138 rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength); 139 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { 140 free(ckpEncryptedPart); 141 return NULL; 142 } 143 144 ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE)); 145 if (ckpPart == NULL) { 146 free(ckpEncryptedPart); 147 throwOutOfMemoryError(env, 0); 148 return NULL; 149 } 150 151 rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength); 152 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { 153 jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength); 154 } 155 free(ckpEncryptedPart); 156 free(ckpPart); 157 158 return jPart ; 159 } 160 #endif 161 162 #ifdef P11_ENABLE_C_SIGNENCRYPTUPDATE 163 /* 164 * Class: sun_security_pkcs11_wrapper_PKCS11 165 * Method: C_SignEncryptUpdate 166 * Signature: (J[B)[B 167 * Parametermapping: *PKCS11* 168 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession 169 * @param jbyteArray jPart CK_BYTE_PTR pPart 170 * CK_ULONG ulPartLen 171 * @return jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart 172 * CK_ULONG_PTR pulEncryptedPartLen 173 */ 174 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignEncryptUpdate 175 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jPart) 176 { 177 CK_SESSION_HANDLE ckSessionHandle; 178 CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart; 179 CK_ULONG ckPartLength, ckEncryptedPartLength = 0; 180 jbyteArray jEncryptedPart = NULL; 181 CK_RV rv; 182 183 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); 184 if (ckpFunctions == NULL) { return NULL; } 185 186 ckSessionHandle = jLongToCKULong(jSessionHandle); 187 jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength); 188 if ((*env)->ExceptionCheck(env)) { return NULL; } 189 190 rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength); 191 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { 192 free(ckpPart); 193 return NULL; 194 } 195 196 ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE)); 197 if (ckpEncryptedPart == NULL) { 198 free(ckpPart); 199 throwOutOfMemoryError(env, 0); 200 return NULL; 201 } 202 203 rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength); 204 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { 205 jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength); 206 } 207 free(ckpPart); 208 free(ckpEncryptedPart); 209 210 return jEncryptedPart ; 211 } 212 #endif 213 214 #ifdef P11_ENABLE_C_DECRYPTVERIFYUPDATE 215 /* 216 * Class: sun_security_pkcs11_wrapper_PKCS11 217 * Method: C_DecryptVerifyUpdate 218 * Signature: (J[B)[B 219 * Parametermapping: *PKCS11* 220 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession 221 * @param jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart 222 * CK_ULONG ulEncryptedPartLen 223 * @return jbyteArray jPart CK_BYTE_PTR pPart 224 * CK_ULONG_PTR pulPartLen 225 */ 226 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptVerifyUpdate 227 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jEncryptedPart) 228 { 229 CK_SESSION_HANDLE ckSessionHandle; 230 CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR; 231 CK_ULONG ckPartLength = 0, ckEncryptedPartLength; 232 jbyteArray jPart = NULL; 233 CK_RV rv; 234 235 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); 236 if (ckpFunctions == NULL) { return NULL; } 237 238 ckSessionHandle = jLongToCKULong(jSessionHandle); 239 jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength); 240 if ((*env)->ExceptionCheck(env)) { return NULL; } 241 242 rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength); 243 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { 244 free(ckpEncryptedPart); 245 return NULL; 246 } 247 248 ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE)); 249 if (ckpPart == NULL) { 250 free(ckpEncryptedPart); 251 throwOutOfMemoryError(env, 0); 252 return NULL; 253 } 254 255 rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength); 256 257 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { 258 jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength); 259 } 260 free(ckpEncryptedPart); 261 free(ckpPart); 262 263 return jPart ; 264 } 265 #endif 266 267 #ifdef P11_ENABLE_C_GETFUNCTIONSTATUS 268 /* 269 * Class: sun_security_pkcs11_wrapper_PKCS11 270 * Method: C_GetFunctionStatus 271 * Signature: (J)V 272 * Parametermapping: *PKCS11* 273 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession 274 */ 275 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetFunctionStatus 276 (JNIEnv *env, jobject obj, jlong jSessionHandle) 277 { 278 CK_SESSION_HANDLE ckSessionHandle; 279 CK_RV rv; 280 281 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); 282 if (ckpFunctions == NULL) { return; } 283 284 ckSessionHandle = jLongToCKULong(jSessionHandle); 285 286 /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */ 287 rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle); 288 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } 289 } 290 #endif 291 292 #ifdef P11_ENABLE_C_CANCELFUNCTION 293 /* 294 * Class: sun_security_pkcs11_wrapper_PKCS11 295 * Method: C_CancelFunction 296 * Signature: (J)V 297 * Parametermapping: *PKCS11* 298 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession 299 */ 300 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CancelFunction 301 (JNIEnv *env, jobject obj, jlong jSessionHandle) 302 { 303 CK_SESSION_HANDLE ckSessionHandle; 304 CK_RV rv; 305 306 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); 307 if (ckpFunctions == NULL) { return; } 308 309 ckSessionHandle = jLongToCKULong(jSessionHandle); 310 311 /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */ 312 rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle); 313 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } 314 } 315 #endif