Wed, 14 Aug 2019 01:40:29 +0000
8228835: Memory leak in PKCS11 provider when using AES GCM
Summary: updated freeCKMechanismPtr to free mechanism-specific memories
Reviewed-by: jnimeh, andrew
1.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c Mon Nov 12 08:33:59 2018 -0800 1.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c Wed Aug 14 01:40:29 2019 +0000 1.3 @@ -73,7 +73,7 @@ 1.4 1.5 1.6 /* 1.7 - * converts a pointer to a CK_DATE structure into a Java CK_DATE Object. 1.8 + * converts a CK_DATE pointer into a Java CK_DATE Object. 1.9 * 1.10 * @param env - used to call JNI funktions to create the new Java object 1.11 * @param ckpValue - the pointer to the CK_DATE structure 1.12 @@ -119,11 +119,11 @@ 1.13 } 1.14 1.15 /* 1.16 - * converts a pointer to a CK_VERSION structure into a Java CK_VERSION Object. 1.17 + * converts a CK_VERSION pointer into a Java CK_VERSION Object. 1.18 * 1.19 * @param env - used to call JNI funktions to create the new Java object 1.20 * @param ckpVersion - the pointer to the CK_VERSION structure 1.21 - * @return - the new Java CK_VERSION object 1.22 + * @return the new Java CK_VERSION object 1.23 */ 1.24 jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion) 1.25 { 1.26 @@ -157,11 +157,11 @@ 1.27 } 1.28 1.29 /* 1.30 - * converts a pointer to a CK_SESSION_INFO structure into a Java CK_SESSION_INFO Object. 1.31 + * converts a CK_SESSION_INFO pointer into a Java CK_SESSION_INFO Object. 1.32 * 1.33 * @param env - used to call JNI funktions to create the new Java object 1.34 * @param ckpSessionInfo - the pointer to the CK_SESSION_INFO structure 1.35 - * @return - the new Java CK_SESSION_INFO object 1.36 + * @return the new Java CK_SESSION_INFO object 1.37 */ 1.38 jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo) 1.39 { 1.40 @@ -200,11 +200,11 @@ 1.41 } 1.42 1.43 /* 1.44 - * converts a pointer to a CK_ATTRIBUTE structure into a Java CK_ATTRIBUTE Object. 1.45 + * converts a CK_ATTRIBUTE pointer into a Java CK_ATTRIBUTE Object. 1.46 * 1.47 * @param env - used to call JNI funktions to create the new Java object 1.48 * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure 1.49 - * @return - the new Java CK_ATTRIBUTE object 1.50 + * @return the new Java CK_ATTRIBUTE object 1.51 */ 1.52 jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute) 1.53 { 1.54 @@ -240,13 +240,14 @@ 1.55 1.56 1.57 /* 1.58 - * converts a Java CK_VERSION object into a pointer to a CK_VERSION structure 1.59 + * converts a Java CK_VERSION object into a CK_VERSION pointer 1.60 * 1.61 * @param env - used to call JNI funktions to get the values out of the Java object 1.62 * @param jVersion - the Java CK_VERSION object to convert 1.63 - * @return - the pointer to the new CK_VERSION structure 1.64 + * @return pointer to the new CK_VERSION structure 1.65 */ 1.66 -CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion) 1.67 +CK_VERSION_PTR 1.68 +jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion) 1.69 { 1.70 CK_VERSION_PTR ckpVersion; 1.71 jclass jVersionClass; 1.72 @@ -257,80 +258,73 @@ 1.73 return NULL; 1.74 } 1.75 1.76 - /* get CK_VERSION class */ 1.77 + // retrieve java values 1.78 jVersionClass = (*env)->GetObjectClass(env, jVersion); 1.79 if (jVersionClass == NULL) { return NULL; } 1.80 - 1.81 - /* get Major */ 1.82 jFieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B"); 1.83 if (jFieldID == NULL) { return NULL; } 1.84 jMajor = (*env)->GetByteField(env, jVersion, jFieldID); 1.85 - 1.86 - /* get Minor */ 1.87 jFieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B"); 1.88 if (jFieldID == NULL) { return NULL; } 1.89 jMinor = (*env)->GetByteField(env, jVersion, jFieldID); 1.90 1.91 - /* allocate memory for CK_VERSION pointer */ 1.92 - ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION)); 1.93 + // allocate memory for CK_VERSION pointer 1.94 + ckpVersion = (CK_VERSION_PTR) calloc(1, sizeof(CK_VERSION)); 1.95 if (ckpVersion == NULL) { 1.96 throwOutOfMemoryError(env, 0); 1.97 return NULL; 1.98 } 1.99 + 1.100 + // populate using java values 1.101 ckpVersion->major = jByteToCKByte(jMajor); 1.102 ckpVersion->minor = jByteToCKByte(jMinor); 1.103 1.104 - return ckpVersion ; 1.105 + return ckpVersion; 1.106 } 1.107 1.108 1.109 /* 1.110 - * converts a Java CK_DATE object into a pointer to a CK_DATE structure 1.111 + * converts a Java CK_DATE object into a CK_DATE pointer 1.112 * 1.113 - * @param env - used to call JNI funktions to get the values out of the Java object 1.114 - * @param jVersion - the Java CK_DATE object to convert 1.115 - * @return - the pointer to the new CK_DATE structure 1.116 + * @param env - used to call JNI functions to get the values out of the Java object 1.117 + * @param jDate - the Java CK_DATE object to convert 1.118 + * @return pointer to the new CK_DATE structure 1.119 */ 1.120 -CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate) 1.121 +CK_DATE * jDateObjectToCKDatePtr(JNIEnv *env, jobject jDate) 1.122 { 1.123 - CK_DATE * ckpDate; 1.124 + CK_DATE * ckpDate = NULL; 1.125 CK_ULONG ckLength; 1.126 jclass jDateClass; 1.127 jfieldID jFieldID; 1.128 jobject jYear, jMonth, jDay; 1.129 - jchar *jTempChars; 1.130 + jchar *jTempChars = NULL; 1.131 CK_ULONG i; 1.132 1.133 if (jDate == NULL) { 1.134 return NULL; 1.135 } 1.136 1.137 - /* get CK_DATE class */ 1.138 + // retrieve java values 1.139 jDateClass = (*env)->FindClass(env, CLASS_DATE); 1.140 if (jDateClass == NULL) { return NULL; } 1.141 - 1.142 - /* get Year */ 1.143 jFieldID = (*env)->GetFieldID(env, jDateClass, "year", "[C"); 1.144 if (jFieldID == NULL) { return NULL; } 1.145 jYear = (*env)->GetObjectField(env, jDate, jFieldID); 1.146 - 1.147 - /* get Month */ 1.148 jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C"); 1.149 if (jFieldID == NULL) { return NULL; } 1.150 jMonth = (*env)->GetObjectField(env, jDate, jFieldID); 1.151 - 1.152 - /* get Day */ 1.153 jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C"); 1.154 if (jFieldID == NULL) { return NULL; } 1.155 jDay = (*env)->GetObjectField(env, jDate, jFieldID); 1.156 1.157 - /* allocate memory for CK_DATE pointer */ 1.158 - ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE)); 1.159 + // allocate memory for CK_DATE pointer 1.160 + ckpDate = (CK_DATE *) calloc(1, sizeof(CK_DATE)); 1.161 if (ckpDate == NULL) { 1.162 throwOutOfMemoryError(env, 0); 1.163 return NULL; 1.164 } 1.165 1.166 + // populate using java values 1.167 if (jYear == NULL) { 1.168 ckpDate->year[0] = 0; 1.169 ckpDate->year[1] = 0; 1.170 @@ -338,17 +332,14 @@ 1.171 ckpDate->year[3] = 0; 1.172 } else { 1.173 ckLength = (*env)->GetArrayLength(env, jYear); 1.174 - jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar)); 1.175 + jTempChars = (jchar*) calloc(ckLength, sizeof(jchar)); 1.176 if (jTempChars == NULL) { 1.177 - free(ckpDate); 1.178 throwOutOfMemoryError(env, 0); 1.179 - return NULL; 1.180 + goto cleanup; 1.181 } 1.182 (*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars); 1.183 if ((*env)->ExceptionCheck(env)) { 1.184 - free(ckpDate); 1.185 - free(jTempChars); 1.186 - return NULL; 1.187 + goto cleanup; 1.188 } 1.189 1.190 for (i = 0; (i < ckLength) && (i < 4) ; i++) { 1.191 @@ -362,17 +353,14 @@ 1.192 ckpDate->month[1] = 0; 1.193 } else { 1.194 ckLength = (*env)->GetArrayLength(env, jMonth); 1.195 - jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar)); 1.196 + jTempChars = (jchar*) calloc(ckLength, sizeof(jchar)); 1.197 if (jTempChars == NULL) { 1.198 - free(ckpDate); 1.199 throwOutOfMemoryError(env, 0); 1.200 - return NULL; 1.201 + goto cleanup; 1.202 } 1.203 (*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars); 1.204 if ((*env)->ExceptionCheck(env)) { 1.205 - free(ckpDate); 1.206 - free(jTempChars); 1.207 - return NULL; 1.208 + goto cleanup; 1.209 } 1.210 1.211 for (i = 0; (i < ckLength) && (i < 2) ; i++) { 1.212 @@ -386,17 +374,14 @@ 1.213 ckpDate->day[1] = 0; 1.214 } else { 1.215 ckLength = (*env)->GetArrayLength(env, jDay); 1.216 - jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar)); 1.217 + jTempChars = (jchar*) calloc(ckLength, sizeof(jchar)); 1.218 if (jTempChars == NULL) { 1.219 - free(ckpDate); 1.220 throwOutOfMemoryError(env, 0); 1.221 - return NULL; 1.222 + goto cleanup; 1.223 } 1.224 (*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars); 1.225 if ((*env)->ExceptionCheck(env)) { 1.226 - free(ckpDate); 1.227 - free(jTempChars); 1.228 - return NULL; 1.229 + goto cleanup; 1.230 } 1.231 1.232 for (i = 0; (i < ckLength) && (i < 2) ; i++) { 1.233 @@ -405,7 +390,11 @@ 1.234 free(jTempChars); 1.235 } 1.236 1.237 - return ckpDate ; 1.238 + return ckpDate; 1.239 +cleanup: 1.240 + free(jTempChars); 1.241 + free(ckpDate); 1.242 + return NULL; 1.243 } 1.244 1.245 1.246 @@ -414,7 +403,7 @@ 1.247 * 1.248 * @param env - used to call JNI funktions to get the values out of the Java object 1.249 * @param jAttribute - the Java CK_ATTRIBUTE object to convert 1.250 - * @return - the new CK_ATTRIBUTE structure 1.251 + * @return the new CK_ATTRIBUTE structure 1.252 */ 1.253 CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute) 1.254 { 1.255 @@ -423,6 +412,7 @@ 1.256 jfieldID jFieldID; 1.257 jlong jType; 1.258 jobject jPValue; 1.259 + 1.260 memset(&ckAttribute, 0, sizeof(CK_ATTRIBUTE)); 1.261 1.262 // TBD: what if jAttribute == NULL?! 1.263 @@ -466,187 +456,279 @@ 1.264 jclass jSsl3RandomDataClass; 1.265 jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion; 1.266 1.267 - /* get RandomInfo */ 1.268 + // retrieve java values 1.269 fieldID = (*env)->GetFieldID(env, masterKeyDeriveParamClass, "RandomInfo", 1.270 "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;"); 1.271 if (fieldID == NULL) { return; } 1.272 jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID); 1.273 - 1.274 - /* get pClientRandom and ulClientRandomLength out of RandomInfo */ 1.275 jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA); 1.276 if (jSsl3RandomDataClass == NULL) { return; } 1.277 fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B"); 1.278 if (fieldID == NULL) { return; } 1.279 jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); 1.280 - 1.281 - /* get pServerRandom and ulServerRandomLength out of RandomInfo */ 1.282 fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B"); 1.283 if (fieldID == NULL) { return; } 1.284 jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); 1.285 - 1.286 - /* get pVersion */ 1.287 fieldID = (*env)->GetFieldID(env, masterKeyDeriveParamClass, "pVersion", 1.288 "Lsun/security/pkcs11/wrapper/CK_VERSION;"); 1.289 if (fieldID == NULL) { return; } 1.290 jVersion = (*env)->GetObjectField(env, jParam, fieldID); 1.291 1.292 - /* populate java values */ 1.293 + // populate using java values 1.294 *cKMasterKeyDeriveParamVersion = jVersionToCKVersionPtr(env, jVersion); 1.295 if ((*env)->ExceptionCheck(env)) { return; } 1.296 jByteArrayToCKByteArray(env, jRIClientRandom, 1.297 &(cKMasterKeyDeriveParamRandomInfo->pClientRandom), 1.298 &(cKMasterKeyDeriveParamRandomInfo->ulClientRandomLen)); 1.299 if ((*env)->ExceptionCheck(env)) { 1.300 - free(*cKMasterKeyDeriveParamVersion); 1.301 - return; 1.302 + goto cleanup; 1.303 } 1.304 jByteArrayToCKByteArray(env, jRIServerRandom, 1.305 &(cKMasterKeyDeriveParamRandomInfo->pServerRandom), 1.306 &(cKMasterKeyDeriveParamRandomInfo->ulServerRandomLen)); 1.307 if ((*env)->ExceptionCheck(env)) { 1.308 - free(*cKMasterKeyDeriveParamVersion); 1.309 - free(cKMasterKeyDeriveParamRandomInfo->pClientRandom); 1.310 - return; 1.311 + goto cleanup; 1.312 } 1.313 + return; 1.314 +cleanup: 1.315 + free(*cKMasterKeyDeriveParamVersion); 1.316 + free(cKMasterKeyDeriveParamRandomInfo->pClientRandom); 1.317 + cKMasterKeyDeriveParamRandomInfo->ulClientRandomLen = 0L; 1.318 + free(cKMasterKeyDeriveParamRandomInfo->pServerRandom); 1.319 + cKMasterKeyDeriveParamRandomInfo->ulServerRandomLen = 0L; 1.320 + // explicitly set to NULL to ensure no double free possible 1.321 + *cKMasterKeyDeriveParamVersion = NULL; 1.322 + cKMasterKeyDeriveParamRandomInfo->pClientRandom = NULL; 1.323 + cKMasterKeyDeriveParamRandomInfo->pServerRandom = NULL; 1.324 } 1.325 1.326 /* 1.327 * converts the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to a 1.328 - * CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure 1.329 + * CK_SSL3_MASTER_KEY_DERIVE_PARAMS pointer 1.330 * 1.331 * @param env - used to call JNI functions to get the Java classes and objects 1.332 * @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert 1.333 - * @param ckParamPtr - pointer to the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure 1.334 + * @param pLength - length of the allocated memory of the returned pointer 1.335 + * @return pointer to the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure 1.336 */ 1.337 -void jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, 1.338 - jobject jParam, CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr) 1.339 +CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR 1.340 +jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParamPtr(JNIEnv *env, 1.341 + jobject jParam, CK_ULONG *pLength) 1.342 { 1.343 + CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr; 1.344 jclass jSsl3MasterKeyDeriveParamsClass; 1.345 - memset(ckParamPtr, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); 1.346 + 1.347 + if (pLength != NULL) { 1.348 + *pLength = 0L; 1.349 + } 1.350 + 1.351 + // allocate memory for CK_SSL3_MASTER_KEY_DERIVE_PARAMS pointer 1.352 + ckParamPtr = calloc(1, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); 1.353 + if (ckParamPtr == NULL) { 1.354 + throwOutOfMemoryError(env, 0); 1.355 + return NULL; 1.356 + } 1.357 + 1.358 + // retrieve and populate using java values 1.359 jSsl3MasterKeyDeriveParamsClass = 1.360 (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); 1.361 - if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; } 1.362 + if (jSsl3MasterKeyDeriveParamsClass == NULL) { 1.363 + goto cleanup; 1.364 + } 1.365 masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam, 1.366 jSsl3MasterKeyDeriveParamsClass, 1.367 &(ckParamPtr->pVersion), &(ckParamPtr->RandomInfo)); 1.368 + if ((*env)->ExceptionCheck(env)) { 1.369 + goto cleanup; 1.370 + } 1.371 + 1.372 + if (pLength != NULL) { 1.373 + *pLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS); 1.374 + } 1.375 + return ckParamPtr; 1.376 +cleanup: 1.377 + free(ckParamPtr); 1.378 + return NULL; 1.379 } 1.380 1.381 /* 1.382 * converts the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to a 1.383 - * CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure 1.384 + * CK_TLS12_MASTER_KEY_DERIVE_PARAMS pointer 1.385 * 1.386 * @param env - used to call JNI functions to get the Java classes and objects 1.387 * @param jParam - the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to convert 1.388 - * @param ckParamPtr - pointer to the new CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure 1.389 + * @param pLength - length of the allocated memory of the returned pointer 1.390 + * @return pointer to the new CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure 1.391 */ 1.392 -void jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(JNIEnv *env, 1.393 - jobject jParam, CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr) 1.394 +CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR 1.395 +jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParamPtr(JNIEnv *env, 1.396 + jobject jParam, CK_ULONG *pLength) 1.397 { 1.398 + CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr; 1.399 jclass jTls12MasterKeyDeriveParamsClass; 1.400 jfieldID fieldID; 1.401 - memset(ckParamPtr, 0, sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); 1.402 + jlong prfHashMechanism; 1.403 + 1.404 + if (pLength != NULL) { 1.405 + *pLength = 0L; 1.406 + } 1.407 + 1.408 + // retrieve java values 1.409 jTls12MasterKeyDeriveParamsClass = 1.410 - (*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); 1.411 - if (jTls12MasterKeyDeriveParamsClass == NULL) { return; } 1.412 + (*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); 1.413 + if (jTls12MasterKeyDeriveParamsClass == NULL) { return NULL; } 1.414 + fieldID = (*env)->GetFieldID(env, 1.415 + jTls12MasterKeyDeriveParamsClass, "prfHashMechanism", "J"); 1.416 + if (fieldID == NULL) { return NULL; } 1.417 + prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID); 1.418 + 1.419 + // allocate memory for CK_TLS12_MASTER_KEY_DERIVE_PARAMS pointer 1.420 + ckParamPtr = calloc(1, sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); 1.421 + if (ckParamPtr == NULL) { 1.422 + throwOutOfMemoryError(env, 0); 1.423 + return NULL; 1.424 + } 1.425 + 1.426 + // populate using java values 1.427 masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam, 1.428 jTls12MasterKeyDeriveParamsClass, &ckParamPtr->pVersion, 1.429 &ckParamPtr->RandomInfo); 1.430 - fieldID = (*env)->GetFieldID(env, 1.431 - jTls12MasterKeyDeriveParamsClass, "prfHashMechanism", "J"); 1.432 - if (fieldID != NULL) { 1.433 - jlong prfHashMechanism = 1.434 - (*env)->GetLongField(env, jParam, fieldID); 1.435 - ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; 1.436 + if ((*env)->ExceptionCheck(env)) { 1.437 + goto cleanup; 1.438 } 1.439 + 1.440 + ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE) prfHashMechanism; 1.441 + 1.442 + if (pLength != NULL) { 1.443 + *pLength = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); 1.444 + } 1.445 + return ckParamPtr; 1.446 +cleanup: 1.447 + free(ckParamPtr); 1.448 + return NULL; 1.449 } 1.450 1.451 /* 1.452 - * converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS structure 1.453 + * converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS pointer 1.454 + * 1.455 + * @param env - used to call JNI functions to get the Java classes and objects 1.456 + * @param jParam - the Java CK_TLS_PRF_PARAMS object to convert 1.457 + * @param pLength - length of the allocated memory of the returned pointer 1.458 + * @return pointer to the new CK_TLS_PRF_PARAMS structure 1.459 */ 1.460 -void jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam, 1.461 -CK_TLS_PRF_PARAMS_PTR ckParamPtr) 1.462 +CK_TLS_PRF_PARAMS_PTR 1.463 +jTlsPrfParamsToCKTlsPrfParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.464 { 1.465 + CK_TLS_PRF_PARAMS_PTR ckParamPtr; 1.466 jclass jTlsPrfParamsClass; 1.467 jfieldID fieldID; 1.468 jobject jSeed, jLabel, jOutput; 1.469 - memset(ckParamPtr, 0, sizeof(CK_TLS_PRF_PARAMS)); 1.470 1.471 - // TBD: what if jParam == NULL?! 1.472 + if (pLength != NULL) { 1.473 + *pLength = 0; 1.474 + } 1.475 1.476 - /* get pSeed */ 1.477 + // retrieve java values 1.478 jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS); 1.479 - if (jTlsPrfParamsClass == NULL) { return; } 1.480 + if (jTlsPrfParamsClass == NULL) { return NULL; } 1.481 fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B"); 1.482 - if (fieldID == NULL) { return; } 1.483 + if (fieldID == NULL) { return NULL; } 1.484 jSeed = (*env)->GetObjectField(env, jParam, fieldID); 1.485 - 1.486 - /* get pLabel */ 1.487 fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B"); 1.488 - if (fieldID == NULL) { return; } 1.489 + if (fieldID == NULL) { return NULL; } 1.490 jLabel = (*env)->GetObjectField(env, jParam, fieldID); 1.491 - 1.492 - /* get pOutput */ 1.493 fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B"); 1.494 - if (fieldID == NULL) { return; } 1.495 + if (fieldID == NULL) { return NULL; } 1.496 jOutput = (*env)->GetObjectField(env, jParam, fieldID); 1.497 1.498 - /* populate java values */ 1.499 + // allocate memory for CK_TLS_PRF_PARAMS pointer 1.500 + ckParamPtr = calloc(1, sizeof(CK_TLS_PRF_PARAMS)); 1.501 + if (ckParamPtr == NULL) { 1.502 + throwOutOfMemoryError(env, 0); 1.503 + return NULL; 1.504 + } 1.505 + 1.506 + // populate using java values 1.507 jByteArrayToCKByteArray(env, jSeed, &(ckParamPtr->pSeed), &(ckParamPtr->ulSeedLen)); 1.508 - if ((*env)->ExceptionCheck(env)) { return; } 1.509 + if ((*env)->ExceptionCheck(env)) { 1.510 + goto cleanup; 1.511 + } 1.512 jByteArrayToCKByteArray(env, jLabel, &(ckParamPtr->pLabel), &(ckParamPtr->ulLabelLen)); 1.513 if ((*env)->ExceptionCheck(env)) { 1.514 - free(ckParamPtr->pSeed); 1.515 - return; 1.516 + goto cleanup; 1.517 } 1.518 - ckParamPtr->pulOutputLen = malloc(sizeof(CK_ULONG)); 1.519 + ckParamPtr->pulOutputLen = calloc(1, sizeof(CK_ULONG)); 1.520 if (ckParamPtr->pulOutputLen == NULL) { 1.521 - free(ckParamPtr->pSeed); 1.522 - free(ckParamPtr->pLabel); 1.523 - throwOutOfMemoryError(env, 0); 1.524 - return; 1.525 + goto cleanup; 1.526 } 1.527 jByteArrayToCKByteArray(env, jOutput, &(ckParamPtr->pOutput), ckParamPtr->pulOutputLen); 1.528 if ((*env)->ExceptionCheck(env)) { 1.529 - free(ckParamPtr->pSeed); 1.530 - free(ckParamPtr->pLabel); 1.531 - free(ckParamPtr->pOutput); 1.532 - return; 1.533 + goto cleanup; 1.534 } 1.535 + 1.536 + if (pLength != NULL) { 1.537 + *pLength = sizeof(CK_TLS_PRF_PARAMS); 1.538 + } 1.539 + return ckParamPtr; 1.540 +cleanup: 1.541 + free(ckParamPtr->pSeed); 1.542 + free(ckParamPtr->pLabel); 1.543 + free(ckParamPtr->pOutput); 1.544 + free(ckParamPtr->pulOutputLen); 1.545 + free(ckParamPtr); 1.546 + return NULL; 1.547 } 1.548 1.549 /* 1.550 - * converts the Java CK_TLS_MAC_PARAMS object to a CK_TLS_MAC_PARAMS structure 1.551 + * converts the Java CK_TLS_MAC_PARAMS object to a CK_TLS_MAC_PARAMS pointer 1.552 + * 1.553 + * @param env - used to call JNI functions to get the Java classes and objects 1.554 + * @param jParam - the Java CK_TLS_MAC_PARAMS object to convert 1.555 + * @param pLength - length of the allocated memory of the returned pointer 1.556 + * @return pointer to the new CK_TLS_MAC_PARAMS structure 1.557 */ 1.558 -void jTlsMacParamsToCKTlsMacParam(JNIEnv *env, jobject jParam, 1.559 - CK_TLS_MAC_PARAMS_PTR ckParamPtr) 1.560 + 1.561 +CK_TLS_MAC_PARAMS_PTR 1.562 +jTlsMacParamsToCKTlsMacParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.563 { 1.564 + CK_TLS_MAC_PARAMS_PTR ckParamPtr; 1.565 jclass jTlsMacParamsClass; 1.566 jfieldID fieldID; 1.567 jlong jPrfMechanism, jUlMacLength, jUlServerOrClient; 1.568 - memset(ckParamPtr, 0, sizeof(CK_TLS_MAC_PARAMS)); 1.569 1.570 + if (pLength != NULL) { 1.571 + *pLength = 0L; 1.572 + } 1.573 + 1.574 + // retrieve java values 1.575 jTlsMacParamsClass = (*env)->FindClass(env, CLASS_TLS_MAC_PARAMS); 1.576 - if (jTlsMacParamsClass == NULL) { return; } 1.577 - 1.578 - /* get prfMechanism */ 1.579 + if (jTlsMacParamsClass == NULL) { return NULL; } 1.580 fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "prfMechanism", "J"); 1.581 - if (fieldID == NULL) { return; } 1.582 + if (fieldID == NULL) { return NULL; } 1.583 jPrfMechanism = (*env)->GetLongField(env, jParam, fieldID); 1.584 - 1.585 - /* get ulMacLength */ 1.586 fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulMacLength", "J"); 1.587 - if (fieldID == NULL) { return; } 1.588 + if (fieldID == NULL) { return NULL; } 1.589 jUlMacLength = (*env)->GetLongField(env, jParam, fieldID); 1.590 - 1.591 - /* get ulServerOrClient */ 1.592 fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulServerOrClient", "J"); 1.593 - if (fieldID == NULL) { return; } 1.594 + if (fieldID == NULL) { return NULL; } 1.595 jUlServerOrClient = (*env)->GetLongField(env, jParam, fieldID); 1.596 1.597 - /* populate java values */ 1.598 + // allocate memory for CK_TLS_MAC_PARAMS pointer 1.599 + ckParamPtr = calloc(1, sizeof(CK_TLS_MAC_PARAMS)); 1.600 + if (ckParamPtr == NULL) { 1.601 + throwOutOfMemoryError(env, 0); 1.602 + return NULL; 1.603 + } 1.604 + 1.605 + // populate using java values 1.606 ckParamPtr->prfMechanism = jLongToCKULong(jPrfMechanism); 1.607 ckParamPtr->ulMacLength = jLongToCKULong(jUlMacLength); 1.608 ckParamPtr->ulServerOrClient = jLongToCKULong(jUlServerOrClient); 1.609 + 1.610 + if (pLength != NULL) { 1.611 + *pLength = sizeof(CK_TLS_MAC_PARAMS); 1.612 + } 1.613 + return ckParamPtr; 1.614 } 1.615 1.616 void keyMatParamToCKKeyMatParam(JNIEnv *env, jobject jParam, 1.617 @@ -666,63 +748,47 @@ 1.618 jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer; 1.619 CK_ULONG ckTemp; 1.620 1.621 - /* get ulMacSizeInBits */ 1.622 + // the pointer arguments should already be initialized by caller 1.623 + 1.624 + // retrieve java values 1.625 fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulMacSizeInBits", "J"); 1.626 if (fieldID == NULL) { return; } 1.627 jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID); 1.628 - 1.629 - /* get ulKeySizeInBits */ 1.630 fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulKeySizeInBits", "J"); 1.631 if (fieldID == NULL) { return; } 1.632 jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID); 1.633 - 1.634 - /* get ulIVSizeInBits */ 1.635 fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulIVSizeInBits", "J"); 1.636 if (fieldID == NULL) { return; } 1.637 jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID); 1.638 - 1.639 - /* get bIsExport */ 1.640 fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "bIsExport", "Z"); 1.641 if (fieldID == NULL) { return; } 1.642 jIsExport = (*env)->GetBooleanField(env, jParam, fieldID); 1.643 - 1.644 - /* get RandomInfo */ 1.645 jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA); 1.646 if (jSsl3RandomDataClass == NULL) { return; } 1.647 fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "RandomInfo", 1.648 "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;"); 1.649 if (fieldID == NULL) { return; } 1.650 jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID); 1.651 - 1.652 - /* get pClientRandom and ulClientRandomLength out of RandomInfo */ 1.653 fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B"); 1.654 if (fieldID == NULL) { return; } 1.655 jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); 1.656 - 1.657 - /* get pServerRandom and ulServerRandomLength out of RandomInfo */ 1.658 fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B"); 1.659 if (fieldID == NULL) { return; } 1.660 jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); 1.661 - 1.662 - /* get pReturnedKeyMaterial */ 1.663 jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT); 1.664 if (jSsl3KeyMatOutClass == NULL) { return; } 1.665 fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "pReturnedKeyMaterial", 1.666 "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;"); 1.667 if (fieldID == NULL) { return; } 1.668 jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID); 1.669 - 1.670 - /* get pIVClient out of pReturnedKeyMaterial */ 1.671 fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B"); 1.672 if (fieldID == NULL) { return; } 1.673 jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID); 1.674 - 1.675 - /* get pIVServer out of pReturnedKeyMaterial */ 1.676 fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B"); 1.677 if (fieldID == NULL) { return; } 1.678 jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID); 1.679 1.680 - /* populate java values */ 1.681 + // populate the specified pointers using java values 1.682 *cKKeyMatParamUlMacSizeInBits = jLongToCKULong(jMacSizeInBits); 1.683 *cKKeyMatParamUlKeySizeInBits = jLongToCKULong(jKeySizeInBits); 1.684 *cKKeyMatParamUlIVSizeInBits = jLongToCKULong(jIVSizeInBits); 1.685 @@ -730,22 +796,22 @@ 1.686 jByteArrayToCKByteArray(env, jRIClientRandom, 1.687 &(cKKeyMatParamRandomInfo->pClientRandom), 1.688 &(cKKeyMatParamRandomInfo->ulClientRandomLen)); 1.689 - if ((*env)->ExceptionCheck(env)) { return; } 1.690 + if ((*env)->ExceptionCheck(env)) { 1.691 + // just return as no memory allocation yet 1.692 + return; 1.693 + } 1.694 jByteArrayToCKByteArray(env, jRIServerRandom, 1.695 &(cKKeyMatParamRandomInfo->pServerRandom), 1.696 &(cKKeyMatParamRandomInfo->ulServerRandomLen)); 1.697 if ((*env)->ExceptionCheck(env)) { 1.698 - free(cKKeyMatParamRandomInfo->pClientRandom); 1.699 - return; 1.700 + goto cleanup; 1.701 } 1.702 /* allocate memory for pReturnedKeyMaterial */ 1.703 *cKKeyMatParamPReturnedKeyMaterial = 1.704 - (CK_SSL3_KEY_MAT_OUT_PTR)malloc(sizeof(CK_SSL3_KEY_MAT_OUT)); 1.705 + (CK_SSL3_KEY_MAT_OUT_PTR) calloc(1, sizeof(CK_SSL3_KEY_MAT_OUT)); 1.706 if (*cKKeyMatParamPReturnedKeyMaterial == NULL) { 1.707 - free(cKKeyMatParamRandomInfo->pClientRandom); 1.708 - free(cKKeyMatParamRandomInfo->pServerRandom); 1.709 throwOutOfMemoryError(env, 0); 1.710 - return; 1.711 + goto cleanup; 1.712 } 1.713 1.714 // the handles are output params only, no need to fetch them from Java 1.715 @@ -757,219 +823,349 @@ 1.716 jByteArrayToCKByteArray(env, jRMIvClient, 1.717 &((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient), &ckTemp); 1.718 if ((*env)->ExceptionCheck(env)) { 1.719 - free(cKKeyMatParamRandomInfo->pClientRandom); 1.720 - free(cKKeyMatParamRandomInfo->pServerRandom); 1.721 - free((*cKKeyMatParamPReturnedKeyMaterial)); 1.722 - return; 1.723 + goto cleanup; 1.724 } 1.725 jByteArrayToCKByteArray(env, jRMIvServer, 1.726 &((*cKKeyMatParamPReturnedKeyMaterial)->pIVServer), &ckTemp); 1.727 if ((*env)->ExceptionCheck(env)) { 1.728 - free(cKKeyMatParamRandomInfo->pClientRandom); 1.729 - free(cKKeyMatParamRandomInfo->pServerRandom); 1.730 - free((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient); 1.731 - free((*cKKeyMatParamPReturnedKeyMaterial)); 1.732 - return; 1.733 + goto cleanup; 1.734 } 1.735 1.736 return; 1.737 +cleanup: 1.738 + free(cKKeyMatParamRandomInfo->pClientRandom); 1.739 + free(cKKeyMatParamRandomInfo->pServerRandom); 1.740 + if ((*cKKeyMatParamPReturnedKeyMaterial) != NULL) { 1.741 + free((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient); 1.742 + free(*cKKeyMatParamPReturnedKeyMaterial); 1.743 + } 1.744 + // explicitly set to NULL to ensure no double free possible 1.745 + cKKeyMatParamRandomInfo->pClientRandom = NULL; 1.746 + cKKeyMatParamRandomInfo->pServerRandom = NULL; 1.747 + *cKKeyMatParamPReturnedKeyMaterial = NULL; 1.748 + return; 1.749 } 1.750 /* 1.751 * converts the Java CK_SSL3_KEY_MAT_PARAMS object to a 1.752 - * CK_SSL3_KEY_MAT_PARAMS structure 1.753 + * CK_SSL3_KEY_MAT_PARAMS pointer 1.754 * 1.755 * @param env - used to call JNI funktions to get the Java classes and objects 1.756 * @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert 1.757 - * @param ckParamPtr - pointer to the new CK_SSL3_KEY_MAT_PARAMS structure 1.758 + * @param pLength - length of the allocated memory of the returned pointer 1.759 + * @return pointer to the new CK_SSL3_KEY_MAT_PARAMS structure 1.760 */ 1.761 -void jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam, 1.762 - CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr) 1.763 +CK_SSL3_KEY_MAT_PARAMS_PTR 1.764 +jSsl3KeyMatParamToCKSsl3KeyMatParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.765 { 1.766 + CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr; 1.767 jclass jSsl3KeyMatParamsClass; 1.768 - memset(ckParamPtr, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS)); 1.769 + 1.770 + if (pLength != NULL) { 1.771 + *pLength = 0; 1.772 + } 1.773 + 1.774 + // allocate memory for CK_SSL3_KEY_MAT_PARAMS pointer 1.775 + ckParamPtr = calloc(1, sizeof(CK_SSL3_KEY_MAT_PARAMS)); 1.776 + if (ckParamPtr == NULL) { 1.777 + throwOutOfMemoryError(env, 0); 1.778 + return NULL; 1.779 + } 1.780 + 1.781 + // retrieve and populate using java values 1.782 jSsl3KeyMatParamsClass = (*env)->FindClass(env, 1.783 CLASS_SSL3_KEY_MAT_PARAMS); 1.784 - if (jSsl3KeyMatParamsClass == NULL) { return; } 1.785 + if (jSsl3KeyMatParamsClass == NULL) { 1.786 + goto cleanup; 1.787 + } 1.788 keyMatParamToCKKeyMatParam(env, jParam, jSsl3KeyMatParamsClass, 1.789 &(ckParamPtr->ulMacSizeInBits), &(ckParamPtr->ulKeySizeInBits), 1.790 &(ckParamPtr->ulIVSizeInBits), &(ckParamPtr->bIsExport), 1.791 &(ckParamPtr->RandomInfo), &(ckParamPtr->pReturnedKeyMaterial)); 1.792 + if ((*env)->ExceptionCheck(env)) { 1.793 + goto cleanup; 1.794 + } 1.795 + 1.796 + if (pLength != NULL) { 1.797 + *pLength = sizeof(CK_SSL3_KEY_MAT_PARAMS); 1.798 + } 1.799 + return ckParamPtr; 1.800 +cleanup: 1.801 + free(ckParamPtr); 1.802 + return NULL; 1.803 } 1.804 1.805 /* 1.806 * converts the Java CK_TLS12_KEY_MAT_PARAMS object to a 1.807 - * CK_TLS12_KEY_MAT_PARAMS structure 1.808 + * CK_TLS12_KEY_MAT_PARAMS pointer 1.809 * 1.810 * @param env - used to call JNI functions to get the Java classes and objects 1.811 * @param jParam - the Java CK_TLS12_KEY_MAT_PARAMS object to convert 1.812 - * @param ckParamPtr - pointer to the new CK_TLS12_KEY_MAT_PARAMS structure 1.813 + * @param pLength - length of the allocated memory of the returned pointer 1.814 + * @return pointer to the new CK_TLS12_KEY_MAT_PARAMS structure 1.815 */ 1.816 -void jTls12KeyMatParamToCKTls12KeyMatParam(JNIEnv *env, 1.817 - jobject jParam, CK_TLS12_KEY_MAT_PARAMS_PTR ckParamPtr) 1.818 +CK_TLS12_KEY_MAT_PARAMS_PTR jTls12KeyMatParamToCKTls12KeyMatParamPtr(JNIEnv *env, 1.819 + jobject jParam, CK_ULONG *pLength) 1.820 { 1.821 + CK_TLS12_KEY_MAT_PARAMS_PTR ckParamPtr; 1.822 jclass jTls12KeyMatParamsClass; 1.823 jfieldID fieldID; 1.824 - memset(ckParamPtr, 0, sizeof(CK_TLS12_KEY_MAT_PARAMS)); 1.825 + jlong prfHashMechanism; 1.826 + 1.827 + if (pLength != NULL) { 1.828 + *pLength = 0; 1.829 + } 1.830 + 1.831 + // retrieve java values 1.832 jTls12KeyMatParamsClass = (*env)->FindClass(env, 1.833 CLASS_TLS12_KEY_MAT_PARAMS); 1.834 - if (jTls12KeyMatParamsClass == NULL) { return; } 1.835 + if (jTls12KeyMatParamsClass == NULL) { return NULL; } 1.836 + fieldID = (*env)->GetFieldID(env, jTls12KeyMatParamsClass, 1.837 + "prfHashMechanism", "J"); 1.838 + if (fieldID == NULL) { return NULL; } 1.839 + prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID); 1.840 + 1.841 + // allocate memory for CK_TLS12_KEY_MAT_PARAMS pointer 1.842 + ckParamPtr = calloc(1, sizeof(CK_TLS12_KEY_MAT_PARAMS)); 1.843 + if (ckParamPtr == NULL) { 1.844 + throwOutOfMemoryError(env, 0); 1.845 + return NULL; 1.846 + } 1.847 + 1.848 + // populate using java values 1.849 keyMatParamToCKKeyMatParam(env, jParam, jTls12KeyMatParamsClass, 1.850 &(ckParamPtr->ulMacSizeInBits), &(ckParamPtr->ulKeySizeInBits), 1.851 &(ckParamPtr->ulIVSizeInBits), &(ckParamPtr->bIsExport), 1.852 &(ckParamPtr->RandomInfo), &(ckParamPtr->pReturnedKeyMaterial)); 1.853 - fieldID = (*env)->GetFieldID(env, jTls12KeyMatParamsClass, 1.854 - "prfHashMechanism", "J"); 1.855 - if (fieldID != NULL) { 1.856 - jlong prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID); 1.857 - ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; 1.858 + if ((*env)->ExceptionCheck(env)) { 1.859 + goto cleanup; 1.860 } 1.861 + ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; 1.862 + 1.863 + if (pLength != NULL) { 1.864 + *pLength = sizeof(CK_TLS12_KEY_MAT_PARAMS); 1.865 + } 1.866 + return ckParamPtr; 1.867 +cleanup: 1.868 + free(ckParamPtr); 1.869 + return NULL; 1.870 } 1.871 1.872 /* 1.873 - * converts the Java CK_AES_CTR_PARAMS object to a CK_AES_CTR_PARAMS structure 1.874 + * converts the Java CK_AES_CTR_PARAMS object to a CK_AES_CTR_PARAMS pointer 1.875 * 1.876 * @param env - used to call JNI funktions to get the Java classes and objects 1.877 * @param jParam - the Java CK_AES_CTR_PARAMS object to convert 1.878 - * @param ckParamPtr - pointer to the new CK_AES_CTR_PARAMS structure 1.879 + * @param pLength - length of the allocated memory of the returned pointer 1.880 + * @return pointer to the new CK_AES_CTR_PARAMS structure 1.881 */ 1.882 -void jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam, 1.883 - CK_AES_CTR_PARAMS_PTR ckParamPtr) { 1.884 +CK_AES_CTR_PARAMS_PTR 1.885 +jAesCtrParamsToCKAesCtrParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.886 +{ 1.887 + CK_AES_CTR_PARAMS_PTR ckParamPtr; 1.888 jclass jAesCtrParamsClass; 1.889 jfieldID fieldID; 1.890 jlong jCounterBits; 1.891 jobject jCb; 1.892 - CK_BYTE_PTR ckBytes; 1.893 + CK_BYTE_PTR ckBytes = NULL; 1.894 CK_ULONG ckTemp; 1.895 1.896 - /* get ulCounterBits */ 1.897 + if (pLength != NULL) { 1.898 + *pLength = 0L; 1.899 + } 1.900 + 1.901 + // retrieve java values 1.902 jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS); 1.903 - if (jAesCtrParamsClass == NULL) { return; } 1.904 + if (jAesCtrParamsClass == NULL) { return NULL; } 1.905 if (!(*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) { 1.906 - return; 1.907 + return NULL; 1.908 } 1.909 fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "ulCounterBits", "J"); 1.910 - if (fieldID == NULL) { return; } 1.911 + if (fieldID == NULL) { return NULL; } 1.912 jCounterBits = (*env)->GetLongField(env, jParam, fieldID); 1.913 - 1.914 - /* get cb */ 1.915 fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "cb", "[B"); 1.916 - if (fieldID == NULL) { return; } 1.917 + if (fieldID == NULL) { return NULL; } 1.918 jCb = (*env)->GetObjectField(env, jParam, fieldID); 1.919 1.920 - /* populate java values */ 1.921 + // allocate memory for CK_AES_CTR_PARAMS pointer 1.922 + ckParamPtr = calloc(1, sizeof(CK_AES_CTR_PARAMS)); 1.923 + if (ckParamPtr == NULL) { 1.924 + throwOutOfMemoryError(env, 0); 1.925 + return NULL; 1.926 + } 1.927 + 1.928 + // populate using java values 1.929 + jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp); 1.930 + if ((*env)->ExceptionCheck(env) || ckTemp != 16) { 1.931 + goto cleanup; 1.932 + } 1.933 + memcpy(ckParamPtr->cb, ckBytes, ckTemp); 1.934 + free(ckBytes); 1.935 + 1.936 ckParamPtr->ulCounterBits = jLongToCKULong(jCounterBits); 1.937 - jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp); 1.938 - if ((*env)->ExceptionCheck(env)) { return; } 1.939 - if (ckTemp != 16) { 1.940 - TRACE1("\nERROR: WRONG CTR IV LENGTH %lu", ckTemp); 1.941 - } else { 1.942 - memcpy(ckParamPtr->cb, ckBytes, ckTemp); 1.943 - free(ckBytes); 1.944 + 1.945 + if (pLength != NULL) { 1.946 + *pLength = sizeof(CK_AES_CTR_PARAMS); 1.947 } 1.948 + return ckParamPtr; 1.949 +cleanup: 1.950 + free(ckBytes); 1.951 + free(ckParamPtr); 1.952 + return NULL; 1.953 } 1.954 1.955 /* 1.956 - * converts the Java CK_GCM_PARAMS object to a CK_GCM_PARAMS structure 1.957 + * converts the Java CK_GCM_PARAMS object to a CK_GCM_PARAMS pointer 1.958 * 1.959 * @param env - used to call JNI funktions to get the Java classes and objects 1.960 * @param jParam - the Java CK_GCM_PARAMS object to convert 1.961 - * @param ckpParam - pointer to the new CK_GCM_PARAMS structure 1.962 + * @param pLength - length of the allocated memory of the returned pointer 1.963 + * @return pointer to the new CK_GCM_PARAMS structure 1.964 */ 1.965 -void jGCMParamsToCKGCMParam(JNIEnv *env, jobject jParam, 1.966 - CK_GCM_PARAMS_PTR ckpParam) { 1.967 +CK_GCM_PARAMS_PTR 1.968 +jGCMParamsToCKGCMParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.969 +{ 1.970 + CK_GCM_PARAMS_PTR ckParamPtr; 1.971 jclass jGcmParamsClass; 1.972 jfieldID fieldID; 1.973 jobject jIv, jAad; 1.974 jlong jTagLen; 1.975 1.976 - /* get iv */ 1.977 - jGcmParamsClass = (*env)->FindClass(env, CLASS_GCM_PARAMS); 1.978 - if (jGcmParamsClass == NULL) { return; } 1.979 - if (!(*env)->IsInstanceOf(env, jParam, jGcmParamsClass)) { 1.980 - return; 1.981 + TRACE0("DEBUG jGCMParamsToCKGCMParam is called\n"); 1.982 + 1.983 + if (pLength != NULL) { 1.984 + *pLength = 0L; 1.985 } 1.986 1.987 + // retrieve java values 1.988 + jGcmParamsClass = (*env)->FindClass(env, CLASS_GCM_PARAMS); 1.989 + if (jGcmParamsClass == NULL) { return NULL; } 1.990 + if (!(*env)->IsInstanceOf(env, jParam, jGcmParamsClass)) { 1.991 + return NULL; 1.992 + } 1.993 fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "iv", "[B"); 1.994 - if (fieldID == NULL) { return; } 1.995 + if (fieldID == NULL) { return NULL; } 1.996 jIv = (*env)->GetObjectField(env, jParam, fieldID); 1.997 - 1.998 - /* get aad */ 1.999 fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "aad", "[B"); 1.1000 - if (fieldID == NULL) { return; } 1.1001 + if (fieldID == NULL) { return NULL; } 1.1002 jAad = (*env)->GetObjectField(env, jParam, fieldID); 1.1003 - 1.1004 - /* get tagLength */ 1.1005 fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "tagBits", "J"); 1.1006 - if (fieldID == NULL) { return; } 1.1007 + if (fieldID == NULL) { return NULL; } 1.1008 jTagLen = (*env)->GetLongField(env, jParam, fieldID); 1.1009 1.1010 + // allocate memory for CK_GCM_PARAMS pointer 1.1011 + ckParamPtr = calloc(1, sizeof(CK_GCM_PARAMS)); 1.1012 + if (ckParamPtr == NULL) { 1.1013 + throwOutOfMemoryError(env, 0); 1.1014 + return NULL; 1.1015 + } 1.1016 1.1017 - /* populate java values */ 1.1018 - jByteArrayToCKByteArray(env, jIv, &(ckpParam->pIv), &(ckpParam->ulIvLen)); 1.1019 - if ((*env)->ExceptionCheck(env)) { return; } 1.1020 + // populate using java values 1.1021 + jByteArrayToCKByteArray(env, jIv, &(ckParamPtr->pIv), &(ckParamPtr->ulIvLen)); 1.1022 + if ((*env)->ExceptionCheck(env)) { 1.1023 + goto cleanup; 1.1024 + } 1.1025 1.1026 - jByteArrayToCKByteArray(env, jAad, &(ckpParam->pAAD), &(ckpParam->ulAADLen)); 1.1027 - if ((*env)->ExceptionCheck(env)) { return; } 1.1028 + jByteArrayToCKByteArray(env, jAad, &(ckParamPtr->pAAD), &(ckParamPtr->ulAADLen)); 1.1029 + if ((*env)->ExceptionCheck(env)) { 1.1030 + goto cleanup; 1.1031 + } 1.1032 1.1033 - ckpParam->ulTagBits = jLongToCKULong(jTagLen); 1.1034 + ckParamPtr->ulTagBits = jLongToCKULong(jTagLen); 1.1035 + 1.1036 + if (pLength != NULL) { 1.1037 + *pLength = sizeof(CK_GCM_PARAMS); 1.1038 + } 1.1039 + TRACE1("Created inner GCM_PARAMS PTR %lX\n", ptr_to_jlong(ckParamPtr)); 1.1040 + return ckParamPtr; 1.1041 +cleanup: 1.1042 + free(ckParamPtr->pIv); 1.1043 + free(ckParamPtr->pAAD); 1.1044 + free(ckParamPtr); 1.1045 + return NULL; 1.1046 + 1.1047 } 1.1048 1.1049 /* 1.1050 - * converts the Java CK_CCM_PARAMS object to a CK_CCM_PARAMS structure 1.1051 + * converts the Java CK_CCM_PARAMS object to a CK_CCM_PARAMS pointer 1.1052 * 1.1053 * @param env - used to call JNI functions to get the Java classes and objects 1.1054 * @param jParam - the Java CK_CCM_PARAMS object to convert 1.1055 - * @param ckpParam - pointer to the new CK_CCM_PARAMS structure 1.1056 + * @param pLength - length of the allocated memory of the returned pointer 1.1057 + * @return pointer to the new CK_CCM_PARAMS structure 1.1058 */ 1.1059 -void jCCMParamsToCKCCMParam(JNIEnv *env, jobject jParam, 1.1060 - CK_CCM_PARAMS_PTR ckpParam) { 1.1061 +CK_CCM_PARAMS_PTR 1.1062 +jCCMParamsToCKCCMParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1063 +{ 1.1064 + CK_CCM_PARAMS_PTR ckParamPtr; 1.1065 jclass jCcmParamsClass; 1.1066 jfieldID fieldID; 1.1067 jobject jNonce, jAad; 1.1068 jlong jDataLen, jMacLen; 1.1069 1.1070 - /* get iv */ 1.1071 + if (pLength != NULL) { 1.1072 + *pLength = 0; 1.1073 + } 1.1074 + 1.1075 + // retrieve java values 1.1076 jCcmParamsClass = (*env)->FindClass(env, CLASS_CCM_PARAMS); 1.1077 - if (jCcmParamsClass == NULL) { return; } 1.1078 - 1.1079 + if (jCcmParamsClass == NULL) { return NULL; } 1.1080 if (!(*env)->IsInstanceOf(env, jParam, jCcmParamsClass)) { 1.1081 - return; 1.1082 + return NULL; 1.1083 } 1.1084 fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "dataLen", "J"); 1.1085 - if (fieldID == NULL) { return; } 1.1086 + if (fieldID == NULL) { return NULL; } 1.1087 jDataLen = (*env)->GetLongField(env, jParam, fieldID); 1.1088 - 1.1089 fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "nonce", "[B"); 1.1090 - if (fieldID == NULL) { return; } 1.1091 + if (fieldID == NULL) { return NULL; } 1.1092 jNonce = (*env)->GetObjectField(env, jParam, fieldID); 1.1093 - 1.1094 - /* get aad */ 1.1095 fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "aad", "[B"); 1.1096 - if (fieldID == NULL) { return; } 1.1097 + if (fieldID == NULL) { return NULL; } 1.1098 jAad = (*env)->GetObjectField(env, jParam, fieldID); 1.1099 - 1.1100 - /* get macLen */ 1.1101 fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "macLen", "J"); 1.1102 - if (fieldID == NULL) { return; } 1.1103 + if (fieldID == NULL) { return NULL; } 1.1104 jMacLen = (*env)->GetLongField(env, jParam, fieldID); 1.1105 1.1106 - /* populate java values */ 1.1107 - ckpParam->ulDataLen = jLongToCKULong(jDataLen); 1.1108 - jByteArrayToCKByteArray(env, jNonce, &(ckpParam->pNonce), 1.1109 - &(ckpParam->ulNonceLen)); 1.1110 - jByteArrayToCKByteArray(env, jAad, &(ckpParam->pAAD), 1.1111 - &(ckpParam->ulAADLen)); 1.1112 - ckpParam->ulMACLen = jLongToCKULong(jMacLen); 1.1113 - if ((*env)->ExceptionCheck(env)) { return; } 1.1114 + // allocate memory for CK_CCM_PARAMS pointer 1.1115 + ckParamPtr = calloc(1, sizeof(CK_CCM_PARAMS)); 1.1116 + if (ckParamPtr == NULL) { 1.1117 + throwOutOfMemoryError(env, 0); 1.1118 + return NULL; 1.1119 + } 1.1120 + 1.1121 + // populate using java values 1.1122 + ckParamPtr->ulDataLen = jLongToCKULong(jDataLen); 1.1123 + jByteArrayToCKByteArray(env, jNonce, &(ckParamPtr->pNonce), 1.1124 + &(ckParamPtr->ulNonceLen)); 1.1125 + if ((*env)->ExceptionCheck(env)) { 1.1126 + goto cleanup; 1.1127 + } 1.1128 + 1.1129 + jByteArrayToCKByteArray(env, jAad, &(ckParamPtr->pAAD), 1.1130 + &(ckParamPtr->ulAADLen)); 1.1131 + if ((*env)->ExceptionCheck(env)) { 1.1132 + goto cleanup; 1.1133 + } 1.1134 + 1.1135 + ckParamPtr->ulMACLen = jLongToCKULong(jMacLen); 1.1136 + 1.1137 + if (pLength != NULL) { 1.1138 + *pLength = sizeof(CK_CCM_PARAMS); 1.1139 + } 1.1140 + return ckParamPtr; 1.1141 +cleanup: 1.1142 + free(ckParamPtr->pNonce); 1.1143 + free(ckParamPtr->pAAD); 1.1144 + free(ckParamPtr); 1.1145 + return NULL; 1.1146 } 1.1147 1.1148 /* 1.1149 - * converts a Java CK_MECHANISM object into a pointer to a CK_MECHANISM 1.1150 - * structure. NOTE: CALLER IS RESPONSIBLE FOR FREEING THE RETURNED POINTER 1.1151 + * converts a Java CK_MECHANISM object into a CK_MECHANISM pointer 1.1152 + * pointer. 1.1153 * 1.1154 * @param env - used to call JNI funktions to get the values out of the Java object 1.1155 - * @param jMechanism - the Java CK_MECHANISM object to convert 1.1156 - * @return - pointer to the new CK_MECHANISM structure 1.1157 + * @param jMech - the Java CK_MECHANISM object to convert 1.1158 + * @return pointer to the new CK_MECHANISM structure 1.1159 */ 1.1160 CK_MECHANISM_PTR jMechanismToCKMechanismPtr(JNIEnv *env, jobject jMech) 1.1161 { 1.1162 @@ -978,7 +1174,7 @@ 1.1163 jobject jParam = (*env)->GetObjectField(env, jMech, mech_pParameterID); 1.1164 1.1165 /* allocate memory for CK_MECHANISM_PTR */ 1.1166 - ckpMech = (CK_MECHANISM_PTR) malloc(sizeof(CK_MECHANISM)); 1.1167 + ckpMech = (CK_MECHANISM_PTR) calloc(1, sizeof(CK_MECHANISM)); 1.1168 if (ckpMech == NULL) { 1.1169 throwOutOfMemoryError(env, 0); 1.1170 return NULL; 1.1171 @@ -1001,48 +1197,15 @@ 1.1172 } 1.1173 1.1174 /* 1.1175 - * the following functions convert Attribute and Mechanism value pointers 1.1176 - * 1.1177 - * jobject ckAttributeValueToJObject(JNIEnv *env, 1.1178 - * const CK_ATTRIBUTE_PTR ckpAttribute); 1.1179 - * 1.1180 - * CK_VOID_PTR jObjectToPrimitiveCKObjectPtr(JNIEnv *env, 1.1181 - * jobject jObject, 1.1182 - * CK_ULONG *pLength); 1.1183 - * 1.1184 - * CK_VOID_PTR jMechParamToCKMechParamPtr(JNIEnv *env, 1.1185 - * jobject jParam, 1.1186 - * CK_MECHANISM_TYPE ckMech, 1.1187 - * CK_ULONG *ckpLength); 1.1188 - * 1.1189 - * These functions are used if a PKCS#11 mechanism or attribute structure gets 1.1190 - * convertet to a Java attribute or mechanism object or vice versa. 1.1191 - * 1.1192 - * ckAttributeValueToJObject converts a PKCS#11 attribute value pointer to a Java 1.1193 - * object depending on the type of the Attribute. A PKCS#11 attribute value can 1.1194 + * converts the pValue of a CK_ATTRIBUTE structure into a Java Object by 1.1195 + * checking the type of the attribute. A PKCS#11 attribute value can 1.1196 * be a CK_ULONG, CK_BYTE[], CK_CHAR[], big integer, CK_BBOOL, CK_UTF8CHAR[], 1.1197 * CK_DATE or CK_FLAGS that gets converted to a corresponding Java object. 1.1198 * 1.1199 - * jObjectToPrimitiveCKObjectPtr is used by jAttributeToCKAttributePtr for 1.1200 - * converting the Java attribute value to a PKCS#11 attribute value pointer. 1.1201 - * For now only primitive datatypes and arrays of primitive datatypes can get 1.1202 - * converted. Otherwise this function throws a PKCS#11Exception with the 1.1203 - * errorcode CKR_VENDOR_DEFINED. 1.1204 - * 1.1205 - * jMechParamToCKMechParamPtr converts a Java mechanism parameter to a PKCS#11 1.1206 - * mechanism parameter. Based on the specified PKCS#11 mechanism type, this 1.1207 - * function will allocate memory for a PKCS#11 parameter structure and 1.1208 - * populate its field using the Java object. 1.1209 - */ 1.1210 - 1.1211 -/* 1.1212 - * converts the pValue of a CK_ATTRIBUTE structure into a Java Object by 1.1213 - * checking the type of the attribute. 1.1214 - * 1.1215 - * @param env - used to call JNI funktions to create the new Java object 1.1216 + * @param env - used to call JNI functions to create the new Java object 1.1217 * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure that contains the type 1.1218 * and the pValue to convert 1.1219 - * @return - the new Java object of the CK-type pValue 1.1220 + * @return the new Java object of the CK-type pValue 1.1221 */ 1.1222 jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute) 1.1223 { 1.1224 @@ -1185,9 +1348,8 @@ 1.1225 */ 1.1226 1.1227 /* 1.1228 - * converts the given Java mechanism parameter to a CK mechanism parameter structure 1.1229 - * and store the length in bytes in the length variable. 1.1230 - * The memory of *ckpParamPtr has to be freed after use! 1.1231 + * converts the given Java mechanism parameter to a CK mechanism parameter 1.1232 + * pointer and store the length in bytes in the length variable. 1.1233 * 1.1234 * @param env - used to call JNI funktions to get the Java classes and objects 1.1235 * @param jParam - the Java mechanism parameter object to convert 1.1236 @@ -1223,156 +1385,68 @@ 1.1237 * Most common cases, i.e. NULL/byte[]/long, are already handled by 1.1238 * jMechParamToCKMechParam before calling this method. 1.1239 */ 1.1240 - TRACE1("\nDEBUG: jMechParamToCKMechParamPtrSlow, mech=0x%lX", ckMech); 1.1241 + TRACE1("\nDEBUG: jMechParamToCKMechParamPtrSlow, mech=0x%lX\n", ckMech); 1.1242 1.1243 switch (ckMech) { 1.1244 case CKM_SSL3_PRE_MASTER_KEY_GEN: 1.1245 case CKM_TLS_PRE_MASTER_KEY_GEN: 1.1246 - *ckpLength = sizeof(CK_VERSION); 1.1247 ckpParamPtr = jVersionToCKVersionPtr(env, jParam); 1.1248 + if (ckpParamPtr != NULL) { 1.1249 + *ckpLength = sizeof(CK_VERSION); 1.1250 + } else { 1.1251 + *ckpLength = 0; 1.1252 + } 1.1253 break; 1.1254 case CKM_SSL3_MASTER_KEY_DERIVE: 1.1255 case CKM_TLS_MASTER_KEY_DERIVE: 1.1256 case CKM_SSL3_MASTER_KEY_DERIVE_DH: 1.1257 case CKM_TLS_MASTER_KEY_DERIVE_DH: 1.1258 - ckpParamPtr = 1.1259 - malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); 1.1260 - if (ckpParamPtr == NULL) { 1.1261 - throwOutOfMemoryError(env, 0); 1.1262 - return NULL; 1.1263 - } 1.1264 - *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS); 1.1265 - 1.1266 - jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam, 1.1267 - (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) ckpParamPtr); 1.1268 + ckpParamPtr = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParamPtr(env, jParam, 1.1269 + ckpLength); 1.1270 break; 1.1271 case CKM_SSL3_KEY_AND_MAC_DERIVE: 1.1272 case CKM_TLS_KEY_AND_MAC_DERIVE: 1.1273 - ckpParamPtr = 1.1274 - malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS)); 1.1275 - if (ckpParamPtr == NULL) { 1.1276 - throwOutOfMemoryError(env, 0); 1.1277 - return NULL; 1.1278 - } 1.1279 - *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS); 1.1280 - 1.1281 - jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam, 1.1282 - (CK_SSL3_KEY_MAT_PARAMS_PTR) ckpParamPtr); 1.1283 + ckpParamPtr = jSsl3KeyMatParamToCKSsl3KeyMatParamPtr(env, jParam, 1.1284 + ckpLength); 1.1285 break; 1.1286 case CKM_TLS12_KEY_AND_MAC_DERIVE: 1.1287 - ckpParamPtr = 1.1288 - malloc(sizeof(CK_TLS12_KEY_MAT_PARAMS)); 1.1289 - if (ckpParamPtr == NULL) { 1.1290 - throwOutOfMemoryError(env, 0); 1.1291 - return NULL; 1.1292 - } 1.1293 - *ckpLength = sizeof(CK_TLS12_KEY_MAT_PARAMS); 1.1294 - 1.1295 - jTls12KeyMatParamToCKTls12KeyMatParam(env, jParam, 1.1296 - (CK_TLS12_KEY_MAT_PARAMS_PTR) ckpParamPtr); 1.1297 + ckpParamPtr = jTls12KeyMatParamToCKTls12KeyMatParamPtr(env, jParam, 1.1298 + ckpLength); 1.1299 break; 1.1300 case CKM_TLS12_MASTER_KEY_DERIVE: 1.1301 case CKM_TLS12_MASTER_KEY_DERIVE_DH: 1.1302 - ckpParamPtr = 1.1303 - malloc(sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); 1.1304 - if (ckpParamPtr == NULL) { 1.1305 - throwOutOfMemoryError(env, 0); 1.1306 - return NULL; 1.1307 - } 1.1308 - *ckpLength = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); 1.1309 - 1.1310 - jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(env, jParam, 1.1311 - (CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR) ckpParamPtr); 1.1312 + ckpParamPtr = jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParamPtr(env, jParam, 1.1313 + ckpLength); 1.1314 break; 1.1315 case CKM_TLS_PRF: 1.1316 case CKM_NSS_TLS_PRF_GENERAL: 1.1317 - ckpParamPtr = malloc(sizeof(CK_TLS_PRF_PARAMS)); 1.1318 - if (ckpParamPtr == NULL) { 1.1319 - throwOutOfMemoryError(env, 0); 1.1320 - return NULL; 1.1321 - } 1.1322 - *ckpLength = sizeof(CK_TLS_PRF_PARAMS); 1.1323 - 1.1324 - jTlsPrfParamsToCKTlsPrfParam(env, jParam, 1.1325 - (CK_TLS_PRF_PARAMS_PTR) ckpParamPtr); 1.1326 + ckpParamPtr = jTlsPrfParamsToCKTlsPrfParamPtr(env, jParam, 1.1327 + ckpLength); 1.1328 break; 1.1329 case CKM_TLS_MAC: 1.1330 - ckpParamPtr = malloc(sizeof(CK_TLS_MAC_PARAMS)); 1.1331 - if (ckpParamPtr == NULL) { 1.1332 - throwOutOfMemoryError(env, 0); 1.1333 - return NULL; 1.1334 - } 1.1335 - *ckpLength = sizeof(CK_TLS_MAC_PARAMS); 1.1336 - 1.1337 - jTlsMacParamsToCKTlsMacParam(env, jParam, 1.1338 - (CK_TLS_MAC_PARAMS_PTR) ckpParamPtr); 1.1339 + ckpParamPtr = jTlsMacParamsToCKTlsMacParamPtr(env, jParam, 1.1340 + ckpLength); 1.1341 break; 1.1342 case CKM_AES_CTR: 1.1343 - ckpParamPtr = malloc(sizeof(CK_AES_CTR_PARAMS)); 1.1344 - if (ckpParamPtr == NULL) { 1.1345 - throwOutOfMemoryError(env, 0); 1.1346 - return NULL; 1.1347 - } 1.1348 - *ckpLength = sizeof(CK_AES_CTR_PARAMS); 1.1349 - 1.1350 - jAesCtrParamsToCKAesCtrParam(env, jParam, 1.1351 - (CK_AES_CTR_PARAMS_PTR) ckpParamPtr); 1.1352 + ckpParamPtr = jAesCtrParamsToCKAesCtrParamPtr(env, jParam, 1.1353 + ckpLength); 1.1354 break; 1.1355 case CKM_AES_GCM: 1.1356 - ckpParamPtr = malloc(sizeof(CK_GCM_PARAMS)); 1.1357 - if (ckpParamPtr == NULL) { 1.1358 - throwOutOfMemoryError(env, 0); 1.1359 - return NULL; 1.1360 - } 1.1361 - *ckpLength = sizeof(CK_GCM_PARAMS); 1.1362 - 1.1363 - jGCMParamsToCKGCMParam(env, jParam, (CK_GCM_PARAMS_PTR) ckpParamPtr); 1.1364 + ckpParamPtr = jGCMParamsToCKGCMParamPtr(env, jParam, ckpLength); 1.1365 break; 1.1366 case CKM_AES_CCM: 1.1367 - ckpParamPtr = malloc(sizeof(CK_CCM_PARAMS)); 1.1368 - if (ckpParamPtr == NULL) { 1.1369 - throwOutOfMemoryError(env, 0); 1.1370 - return NULL; 1.1371 - } 1.1372 - *ckpLength = sizeof(CK_CCM_PARAMS); 1.1373 - 1.1374 - jCCMParamsToCKCCMParam(env, jParam, 1.1375 - (CK_CCM_PARAMS_PTR) ckpParamPtr); 1.1376 + ckpParamPtr = jCCMParamsToCKCCMParamPtr(env, jParam, ckpLength); 1.1377 break; 1.1378 case CKM_RSA_PKCS_OAEP: 1.1379 - ckpParamPtr = malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS)); 1.1380 - if (ckpParamPtr == NULL) { 1.1381 - throwOutOfMemoryError(env, 0); 1.1382 - return NULL; 1.1383 - } 1.1384 - *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS); 1.1385 - 1.1386 - jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam, 1.1387 - (CK_RSA_PKCS_OAEP_PARAMS_PTR) ckpParamPtr); 1.1388 + ckpParamPtr = jRsaPkcsOaepParamToCKRsaPkcsOaepParamPtr(env, jParam, ckpLength); 1.1389 break; 1.1390 case CKM_PBE_SHA1_DES3_EDE_CBC: 1.1391 case CKM_PBE_SHA1_DES2_EDE_CBC: 1.1392 case CKM_PBA_SHA1_WITH_SHA1_HMAC: 1.1393 - ckpParamPtr = malloc(sizeof(CK_PBE_PARAMS)); 1.1394 - if (ckpParamPtr == NULL) { 1.1395 - throwOutOfMemoryError(env, 0); 1.1396 - return NULL; 1.1397 - } 1.1398 - 1.1399 - *ckpLength = sizeof(CK_PBE_PARAMS); 1.1400 - 1.1401 - jPbeParamToCKPbeParam(env, jParam, (CK_PBE_PARAMS_PTR) ckpParamPtr); 1.1402 + ckpParamPtr = jPbeParamToCKPbeParamPtr(env, jParam, ckpLength); 1.1403 break; 1.1404 case CKM_PKCS5_PBKD2: 1.1405 - ckpParamPtr = malloc(sizeof(CK_PKCS5_PBKD2_PARAMS)); 1.1406 - if (ckpParamPtr == NULL) { 1.1407 - throwOutOfMemoryError(env, 0); 1.1408 - return NULL; 1.1409 - } 1.1410 - *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS); 1.1411 - 1.1412 - jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam, 1.1413 - (CK_PKCS5_PBKD2_PARAMS_PTR) ckpParamPtr); 1.1414 + ckpParamPtr = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2ParamPtr(env, jParam, ckpLength); 1.1415 break; 1.1416 case CKM_RSA_PKCS_PSS: 1.1417 case CKM_SHA1_RSA_PKCS_PSS: 1.1418 @@ -1380,62 +1454,21 @@ 1.1419 case CKM_SHA384_RSA_PKCS_PSS: 1.1420 case CKM_SHA512_RSA_PKCS_PSS: 1.1421 case CKM_SHA224_RSA_PKCS_PSS: 1.1422 - ckpParamPtr = malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS)); 1.1423 - if (ckpParamPtr == NULL) { 1.1424 - throwOutOfMemoryError(env, 0); 1.1425 - return NULL; 1.1426 - } 1.1427 - *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS); 1.1428 - 1.1429 - jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam, 1.1430 - (CK_RSA_PKCS_PSS_PARAMS_PTR) ckpParamPtr); 1.1431 + ckpParamPtr = jRsaPkcsPssParamToCKRsaPkcsPssParamPtr(env, jParam, ckpLength); 1.1432 break; 1.1433 case CKM_ECDH1_DERIVE: 1.1434 case CKM_ECDH1_COFACTOR_DERIVE: 1.1435 - ckpParamPtr = malloc(sizeof(CK_ECDH1_DERIVE_PARAMS)); 1.1436 - if (ckpParamPtr == NULL) { 1.1437 - throwOutOfMemoryError(env, 0); 1.1438 - return NULL; 1.1439 - } 1.1440 - *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS); 1.1441 - 1.1442 - jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam, 1.1443 - (CK_ECDH1_DERIVE_PARAMS_PTR) ckpParamPtr); 1.1444 + ckpParamPtr = jEcdh1DeriveParamToCKEcdh1DeriveParamPtr(env, jParam, ckpLength); 1.1445 break; 1.1446 case CKM_ECMQV_DERIVE: 1.1447 - ckpParamPtr = malloc(sizeof(CK_ECDH2_DERIVE_PARAMS)); 1.1448 - if (ckpParamPtr == NULL) { 1.1449 - throwOutOfMemoryError(env, 0); 1.1450 - return NULL; 1.1451 - } 1.1452 - *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS); 1.1453 - 1.1454 - jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam, 1.1455 - (CK_ECDH2_DERIVE_PARAMS_PTR) ckpParamPtr); 1.1456 + ckpParamPtr = jEcdh2DeriveParamToCKEcdh2DeriveParamPtr(env, jParam, ckpLength); 1.1457 break; 1.1458 case CKM_X9_42_DH_DERIVE: 1.1459 - ckpParamPtr = malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); 1.1460 - if (ckpParamPtr == NULL) { 1.1461 - throwOutOfMemoryError(env, 0); 1.1462 - return NULL; 1.1463 - } 1.1464 - *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS); 1.1465 - 1.1466 - /* convert jParameter to CKParameter */ 1.1467 - jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam, 1.1468 - (CK_X9_42_DH1_DERIVE_PARAMS_PTR) ckpParamPtr); 1.1469 + ckpParamPtr = jX942Dh1DeriveParamToCKX942Dh1DeriveParamPtr(env, jParam, ckpLength); 1.1470 break; 1.1471 case CKM_X9_42_DH_HYBRID_DERIVE: 1.1472 case CKM_X9_42_MQV_DERIVE: 1.1473 - ckpParamPtr = malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); 1.1474 - if (ckpParamPtr == NULL) { 1.1475 - throwOutOfMemoryError(env, 0); 1.1476 - return NULL; 1.1477 - } 1.1478 - *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS); 1.1479 - 1.1480 - jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam, 1.1481 - (CK_X9_42_DH2_DERIVE_PARAMS_PTR) ckpParamPtr); 1.1482 + ckpParamPtr = jX942Dh2DeriveParamToCKX942Dh2DeriveParamPtr(env, jParam, ckpLength); 1.1483 break; 1.1484 // defined by pkcs11.h but we don't support 1.1485 case CKM_KEA_DERIVE: // CK_KEA_DERIVE_PARAMS 1.1486 @@ -1460,118 +1493,144 @@ 1.1487 TRACE0("\nDEBUG: jMechParamToCKMechParamPtrSlow FINISHED\n"); 1.1488 1.1489 if ((*env)->ExceptionCheck(env)) { 1.1490 - free(ckpParamPtr); 1.1491 - *ckpLength = 0; 1.1492 return NULL; 1.1493 } 1.1494 1.1495 return ckpParamPtr; 1.1496 } 1.1497 1.1498 -/* the mechanism parameter convertion functions: */ 1.1499 - 1.1500 /* 1.1501 - * converts the Java CK_RSA_PKCS_OAEP_PARAMS object to a CK_RSA_PKCS_OAEP_PARAMS structure 1.1502 + * converts the Java CK_RSA_PKCS_OAEP_PARAMS object to a 1.1503 + * CK_RSA_PKCS_OAEP_PARAMS pointer 1.1504 * 1.1505 * @param env - used to call JNI funktions to get the Java classes and objects 1.1506 * @param jParam - the Java CK_RSA_PKCS_OAEP_PARAMS object to convert 1.1507 - * @return - the new CK_RSA_PKCS_OAEP_PARAMS structure 1.1508 + * @param pLength - length of the allocated memory of the returned pointer 1.1509 + * @return pointer to the new CK_RSA_PKCS_OAEP_PARAMS structure 1.1510 */ 1.1511 -void jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam, 1.1512 -CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr) 1.1513 +CK_RSA_PKCS_OAEP_PARAMS_PTR 1.1514 +jRsaPkcsOaepParamToCKRsaPkcsOaepParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1515 { 1.1516 + CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr; 1.1517 jclass jRsaPkcsOaepParamsClass; 1.1518 jfieldID fieldID; 1.1519 jlong jHashAlg, jMgf, jSource; 1.1520 jobject jSourceData; 1.1521 - CK_BYTE_PTR ckpByte; 1.1522 - memset(ckParamPtr, 0, sizeof(CK_RSA_PKCS_OAEP_PARAMS)); 1.1523 1.1524 - /* get hashAlg */ 1.1525 + if (pLength!= NULL) { 1.1526 + *pLength = 0L; 1.1527 + } 1.1528 + 1.1529 + // retrieve java values 1.1530 jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS); 1.1531 - if (jRsaPkcsOaepParamsClass == NULL) { return; } 1.1532 + if (jRsaPkcsOaepParamsClass == NULL) { return NULL; } 1.1533 fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J"); 1.1534 - if (fieldID == NULL) { return; } 1.1535 + if (fieldID == NULL) { return NULL; } 1.1536 jHashAlg = (*env)->GetLongField(env, jParam, fieldID); 1.1537 - 1.1538 - /* get mgf */ 1.1539 fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J"); 1.1540 - if (fieldID == NULL) { return; } 1.1541 + if (fieldID == NULL) { return NULL; } 1.1542 jMgf = (*env)->GetLongField(env, jParam, fieldID); 1.1543 - 1.1544 - /* get source */ 1.1545 fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J"); 1.1546 - if (fieldID == NULL) { return; } 1.1547 + if (fieldID == NULL) { return NULL; } 1.1548 jSource = (*env)->GetLongField(env, jParam, fieldID); 1.1549 - 1.1550 - /* get sourceData and sourceDataLength */ 1.1551 fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B"); 1.1552 - if (fieldID == NULL) { return; } 1.1553 + if (fieldID == NULL) { return NULL; } 1.1554 jSourceData = (*env)->GetObjectField(env, jParam, fieldID); 1.1555 1.1556 - /* populate java values */ 1.1557 + // allocate memory for CK_RSA_PKCS_OAEP_PARAMS pointer 1.1558 + ckParamPtr = calloc(1, sizeof(CK_RSA_PKCS_OAEP_PARAMS)); 1.1559 + if (ckParamPtr == NULL) { 1.1560 + throwOutOfMemoryError(env, 0); 1.1561 + return NULL; 1.1562 + } 1.1563 + 1.1564 + // populate using java values 1.1565 ckParamPtr->hashAlg = jLongToCKULong(jHashAlg); 1.1566 ckParamPtr->mgf = jLongToCKULong(jMgf); 1.1567 ckParamPtr->source = jLongToCKULong(jSource); 1.1568 - jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParamPtr->ulSourceDataLen)); 1.1569 - if ((*env)->ExceptionCheck(env)) { return; } 1.1570 - ckParamPtr->pSourceData = (CK_VOID_PTR) ckpByte; 1.1571 + jByteArrayToCKByteArray(env, jSourceData, (CK_BYTE_PTR*) &(ckParamPtr->pSourceData), 1.1572 + &(ckParamPtr->ulSourceDataLen)); 1.1573 + if ((*env)->ExceptionCheck(env)) { 1.1574 + free(ckParamPtr); 1.1575 + return NULL; 1.1576 + } 1.1577 + 1.1578 + if (pLength!= NULL) { 1.1579 + *pLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS); 1.1580 + } 1.1581 + return ckParamPtr; 1.1582 } 1.1583 1.1584 /* 1.1585 - * converts the Java CK_PBE_PARAMS object to a CK_PBE_PARAMS structure 1.1586 + * converts the Java CK_PBE_PARAMS object to a CK_PBE_PARAMS pointer 1.1587 * 1.1588 * @param env - used to call JNI funktions to get the Java classes and objects 1.1589 * @param jParam - the Java CK_PBE_PARAMS object to convert 1.1590 - * @param ckParamPtr pointer to the new CK_PBE_PARAMS structure 1.1591 + * @param pLength - length of the allocated memory of the returned pointer 1.1592 + * @return pointer to the new CK_PBE_PARAMS structure 1.1593 */ 1.1594 -void jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam, 1.1595 -CK_PBE_PARAMS_PTR ckParamPtr) 1.1596 +CK_PBE_PARAMS_PTR 1.1597 +jPbeParamToCKPbeParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1598 { 1.1599 + CK_PBE_PARAMS_PTR ckParamPtr; 1.1600 jclass jPbeParamsClass; 1.1601 jfieldID fieldID; 1.1602 jlong jIteration; 1.1603 jobject jInitVector, jPassword, jSalt; 1.1604 CK_ULONG ckTemp; 1.1605 - memset(ckParamPtr, 0, sizeof(CK_PBE_PARAMS)); 1.1606 1.1607 - /* get pInitVector */ 1.1608 + if (pLength != NULL) { 1.1609 + *pLength = 0; 1.1610 + } 1.1611 + 1.1612 + // retrieve java values 1.1613 jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS); 1.1614 - if (jPbeParamsClass == NULL) { return; } 1.1615 + if (jPbeParamsClass == NULL) { return NULL; } 1.1616 fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C"); 1.1617 - if (fieldID == NULL) { return; } 1.1618 + if (fieldID == NULL) { return NULL; } 1.1619 jInitVector = (*env)->GetObjectField(env, jParam, fieldID); 1.1620 - 1.1621 - /* get pPassword and ulPasswordLength */ 1.1622 fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C"); 1.1623 - if (fieldID == NULL) { return; } 1.1624 + if (fieldID == NULL) { return NULL; } 1.1625 jPassword = (*env)->GetObjectField(env, jParam, fieldID); 1.1626 - 1.1627 - /* get pSalt and ulSaltLength */ 1.1628 fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C"); 1.1629 - if (fieldID == NULL) { return; } 1.1630 + if (fieldID == NULL) { return NULL; } 1.1631 jSalt = (*env)->GetObjectField(env, jParam, fieldID); 1.1632 - 1.1633 - /* get ulIteration */ 1.1634 fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J"); 1.1635 - if (fieldID == NULL) { return; } 1.1636 + if (fieldID == NULL) { return NULL; } 1.1637 jIteration = (*env)->GetLongField(env, jParam, fieldID); 1.1638 1.1639 - /* populate java values */ 1.1640 + // allocate memory for CK_PBE_PARAMS pointer 1.1641 + ckParamPtr = calloc(1, sizeof(CK_PBE_PARAMS)); 1.1642 + if (ckParamPtr == NULL) { 1.1643 + throwOutOfMemoryError(env, 0); 1.1644 + return NULL; 1.1645 + } 1.1646 + 1.1647 + // populate using java values 1.1648 ckParamPtr->ulIteration = jLongToCKULong(jIteration); 1.1649 jCharArrayToCKCharArray(env, jInitVector, &(ckParamPtr->pInitVector), &ckTemp); 1.1650 - if ((*env)->ExceptionCheck(env)) { return; } 1.1651 + if ((*env)->ExceptionCheck(env)) { 1.1652 + goto cleanup; 1.1653 + } 1.1654 jCharArrayToCKCharArray(env, jPassword, &(ckParamPtr->pPassword), &(ckParamPtr->ulPasswordLen)); 1.1655 if ((*env)->ExceptionCheck(env)) { 1.1656 - free(ckParamPtr->pInitVector); 1.1657 - return; 1.1658 + goto cleanup; 1.1659 } 1.1660 jCharArrayToCKCharArray(env, jSalt, &(ckParamPtr->pSalt), &(ckParamPtr->ulSaltLen)); 1.1661 if ((*env)->ExceptionCheck(env)) { 1.1662 - free(ckParamPtr->pInitVector); 1.1663 - free(ckParamPtr->pPassword); 1.1664 - return; 1.1665 + goto cleanup; 1.1666 } 1.1667 + 1.1668 + if (pLength != NULL) { 1.1669 + *pLength = sizeof(CK_PBE_PARAMS); 1.1670 + } 1.1671 + return ckParamPtr; 1.1672 +cleanup: 1.1673 + free(ckParamPtr->pInitVector); 1.1674 + free(ckParamPtr->pPassword); 1.1675 + free(ckParamPtr->pSalt); 1.1676 + free(ckParamPtr); 1.1677 + return NULL; 1.1678 } 1.1679 1.1680 /* 1.1681 @@ -1602,7 +1661,7 @@ 1.1682 jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); 1.1683 ckMechanismType = jLongToCKULong(jMechanismType); 1.1684 if (ckMechanismType != ckMechanism->mechanism) { 1.1685 - /* we do not have maching types, this should not occur */ 1.1686 + /* we do not have matching types, this should not occur */ 1.1687 return; 1.1688 } 1.1689 1.1690 @@ -1637,321 +1696,426 @@ 1.1691 } 1.1692 1.1693 /* 1.1694 - * converts the Java CK_PKCS5_PBKD2_PARAMS object to a CK_PKCS5_PBKD2_PARAMS structure 1.1695 + * converts the Java CK_PKCS5_PBKD2_PARAMS object to a CK_PKCS5_PBKD2_PARAMS 1.1696 + * pointer 1.1697 * 1.1698 * @param env - used to call JNI funktions to get the Java classes and objects 1.1699 * @param jParam - the Java CK_PKCS5_PBKD2_PARAMS object to convert 1.1700 - * @param ckParamPtr - pointer to the new CK_PKCS5_PBKD2_PARAMS structure 1.1701 + * @param pLength - length of the allocated memory of the returned pointer 1.1702 + * @return pointer to the new CK_PKCS5_PBKD2_PARAMS structure 1.1703 */ 1.1704 -void jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam, 1.1705 -CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr) 1.1706 +CK_PKCS5_PBKD2_PARAMS_PTR 1.1707 +jPkcs5Pbkd2ParamToCKPkcs5Pbkd2ParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1708 { 1.1709 + CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr; 1.1710 jclass jPkcs5Pbkd2ParamsClass; 1.1711 jfieldID fieldID; 1.1712 jlong jSaltSource, jIteration, jPrf; 1.1713 jobject jSaltSourceData, jPrfData; 1.1714 - memset(ckParamPtr, 0, sizeof(CK_PKCS5_PBKD2_PARAMS)); 1.1715 1.1716 - /* get saltSource */ 1.1717 + if (pLength != NULL) { 1.1718 + *pLength = 0L; 1.1719 + } 1.1720 + 1.1721 + // retrieve java values 1.1722 jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS); 1.1723 - if (jPkcs5Pbkd2ParamsClass == NULL) { return; } 1.1724 + if (jPkcs5Pbkd2ParamsClass == NULL) { return NULL; } 1.1725 fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J"); 1.1726 - if (fieldID == NULL) { return; } 1.1727 + if (fieldID == NULL) { return NULL; } 1.1728 jSaltSource = (*env)->GetLongField(env, jParam, fieldID); 1.1729 - 1.1730 - /* get pSaltSourceData */ 1.1731 fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B"); 1.1732 - if (fieldID == NULL) { return; } 1.1733 + if (fieldID == NULL) { return NULL; } 1.1734 jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID); 1.1735 - 1.1736 - /* get iterations */ 1.1737 fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J"); 1.1738 - if (fieldID == NULL) { return; } 1.1739 + if (fieldID == NULL) { return NULL; } 1.1740 jIteration = (*env)->GetLongField(env, jParam, fieldID); 1.1741 - 1.1742 - /* get prf */ 1.1743 fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J"); 1.1744 - if (fieldID == NULL) { return; } 1.1745 + if (fieldID == NULL) { return NULL; } 1.1746 jPrf = (*env)->GetLongField(env, jParam, fieldID); 1.1747 - 1.1748 - /* get pPrfData and ulPrfDataLength in byte */ 1.1749 fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B"); 1.1750 - if (fieldID == NULL) { return; } 1.1751 + if (fieldID == NULL) { return NULL; } 1.1752 jPrfData = (*env)->GetObjectField(env, jParam, fieldID); 1.1753 1.1754 - /* populate java values */ 1.1755 + // allocate memory for CK_PKCS5_PBKD2_PARAMS pointer 1.1756 + ckParamPtr = calloc(1, sizeof(CK_PKCS5_PBKD2_PARAMS)); 1.1757 + if (ckParamPtr == NULL) { 1.1758 + throwOutOfMemoryError(env, 0); 1.1759 + return NULL; 1.1760 + } 1.1761 + 1.1762 + // populate using java values 1.1763 ckParamPtr->saltSource = jLongToCKULong(jSaltSource); 1.1764 - jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParamPtr->pSaltSourceData), &(ckParamPtr->ulSaltSourceDataLen)); 1.1765 - if ((*env)->ExceptionCheck(env)) { return; } 1.1766 + jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) 1.1767 + &(ckParamPtr->pSaltSourceData), &(ckParamPtr->ulSaltSourceDataLen)); 1.1768 + if ((*env)->ExceptionCheck(env)) { 1.1769 + goto cleanup; 1.1770 + } 1.1771 ckParamPtr->iterations = jLongToCKULong(jIteration); 1.1772 ckParamPtr->prf = jLongToCKULong(jPrf); 1.1773 - jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParamPtr->pPrfData), &(ckParamPtr->ulPrfDataLen)); 1.1774 + jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) 1.1775 + &(ckParamPtr->pPrfData), &(ckParamPtr->ulPrfDataLen)); 1.1776 if ((*env)->ExceptionCheck(env)) { 1.1777 - free(ckParamPtr->pSaltSourceData); 1.1778 - return; 1.1779 + goto cleanup; 1.1780 } 1.1781 + 1.1782 + if (pLength != NULL) { 1.1783 + *pLength = sizeof(CK_PKCS5_PBKD2_PARAMS); 1.1784 + } 1.1785 + return ckParamPtr; 1.1786 +cleanup: 1.1787 + free(ckParamPtr->pSaltSourceData); 1.1788 + free(ckParamPtr->pPrfData); 1.1789 + free(ckParamPtr); 1.1790 + return NULL; 1.1791 + 1.1792 } 1.1793 1.1794 /* 1.1795 - * converts the Java CK_RSA_PKCS_PSS_PARAMS object to a CK_RSA_PKCS_PSS_PARAMS structure 1.1796 + * converts the Java CK_RSA_PKCS_PSS_PARAMS object to a CK_RSA_PKCS_PSS_PARAMS 1.1797 + * pointer 1.1798 * 1.1799 * @param env - used to call JNI funktions to get the Java classes and objects 1.1800 * @param jParam - the Java CK_RSA_PKCS_PSS_PARAMS object to convert 1.1801 - * @param ckParamPtr - pointer to the new CK_RSA_PKCS_PSS_PARAMS structure 1.1802 + * @param pLength - length of the allocated memory of the returned pointer 1.1803 + * @return pointer to the new CK_RSA_PKCS_PSS_PARAMS structure 1.1804 */ 1.1805 -void jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam, 1.1806 -CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr) 1.1807 +CK_RSA_PKCS_PSS_PARAMS_PTR 1.1808 +jRsaPkcsPssParamToCKRsaPkcsPssParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1809 { 1.1810 + CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr; 1.1811 jclass jRsaPkcsPssParamsClass; 1.1812 jfieldID fieldID; 1.1813 jlong jHashAlg, jMgf, jSLen; 1.1814 - memset(ckParamPtr, 0, sizeof(CK_RSA_PKCS_PSS_PARAMS)); 1.1815 1.1816 - /* get hashAlg */ 1.1817 + if (pLength != NULL) { 1.1818 + *pLength = 0; 1.1819 + } 1.1820 + 1.1821 + // retrieve java values 1.1822 jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS); 1.1823 - if (jRsaPkcsPssParamsClass == NULL) { return; } 1.1824 + if (jRsaPkcsPssParamsClass == NULL) { return NULL; } 1.1825 fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J"); 1.1826 - if (fieldID == NULL) { return; } 1.1827 + if (fieldID == NULL) { return NULL; } 1.1828 jHashAlg = (*env)->GetLongField(env, jParam, fieldID); 1.1829 - 1.1830 - /* get mgf */ 1.1831 fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J"); 1.1832 - if (fieldID == NULL) { return; } 1.1833 + if (fieldID == NULL) { return NULL; } 1.1834 jMgf = (*env)->GetLongField(env, jParam, fieldID); 1.1835 - 1.1836 - /* get sLen */ 1.1837 fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J"); 1.1838 - if (fieldID == NULL) { return; } 1.1839 + if (fieldID == NULL) { return NULL; } 1.1840 jSLen = (*env)->GetLongField(env, jParam, fieldID); 1.1841 1.1842 - /* populate java values */ 1.1843 + // allocate memory for CK_RSA_PKCS_PSS_PARAMS pointer 1.1844 + ckParamPtr = calloc(1, sizeof(CK_RSA_PKCS_PSS_PARAMS)); 1.1845 + if (ckParamPtr == NULL) { 1.1846 + throwOutOfMemoryError(env, 0); 1.1847 + return NULL; 1.1848 + } 1.1849 + 1.1850 + // populate using java values 1.1851 ckParamPtr->hashAlg = jLongToCKULong(jHashAlg); 1.1852 ckParamPtr->mgf = jLongToCKULong(jMgf); 1.1853 ckParamPtr->sLen = jLongToCKULong(jSLen); 1.1854 TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, hashAlg=0x%lX\n", ckParamPtr->hashAlg); 1.1855 TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, mgf=0x%lX\n", ckParamPtr->mgf); 1.1856 TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, sLen=%lu\n", ckParamPtr->sLen); 1.1857 + 1.1858 + if (pLength != NULL) { 1.1859 + *pLength = sizeof(CK_RSA_PKCS_PSS_PARAMS); 1.1860 + } 1.1861 + return ckParamPtr; 1.1862 + 1.1863 } 1.1864 1.1865 /* 1.1866 - * converts the Java CK_ECDH1_DERIVE_PARAMS object to a CK_ECDH1_DERIVE_PARAMS structure 1.1867 + * converts the Java CK_ECDH1_DERIVE_PARAMS object to a CK_ECDH1_DERIVE_PARAMS 1.1868 + * pointer 1.1869 * 1.1870 * @param env - used to call JNI funktions to get the Java classes and objects 1.1871 * @param jParam - the Java CK_ECDH1_DERIVE_PARAMS object to convert 1.1872 - * @param ckParamPtr - the new CK_ECDH1_DERIVE_PARAMS structure 1.1873 + * @param pLength - length of the allocated memory of the returned pointer 1.1874 + * @retur pointer to nthe new CK_ECDH1_DERIVE_PARAMS structure 1.1875 */ 1.1876 -void jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam, 1.1877 -CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr) 1.1878 +CK_ECDH1_DERIVE_PARAMS_PTR 1.1879 +jEcdh1DeriveParamToCKEcdh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1880 { 1.1881 + CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr; 1.1882 jclass jEcdh1DeriveParamsClass; 1.1883 jfieldID fieldID; 1.1884 jlong jLong; 1.1885 jobject jSharedData, jPublicData; 1.1886 - memset(ckParamPtr, 0, sizeof(CK_ECDH1_DERIVE_PARAMS)); 1.1887 1.1888 - /* get kdf */ 1.1889 + if (pLength != NULL) { 1.1890 + *pLength = 0; 1.1891 + } 1.1892 + 1.1893 + // retrieve java values 1.1894 jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS); 1.1895 - if (jEcdh1DeriveParamsClass == NULL) { return; } 1.1896 + if (jEcdh1DeriveParamsClass == NULL) { return NULL; } 1.1897 fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J"); 1.1898 - if (fieldID == NULL) { return; } 1.1899 + if (fieldID == NULL) { return NULL; } 1.1900 jLong = (*env)->GetLongField(env, jParam, fieldID); 1.1901 - ckParamPtr->kdf = jLongToCKULong(jLong); 1.1902 - 1.1903 - /* get pSharedData and ulSharedDataLen */ 1.1904 fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B"); 1.1905 - if (fieldID == NULL) { return; } 1.1906 + if (fieldID == NULL) { return NULL; } 1.1907 jSharedData = (*env)->GetObjectField(env, jParam, fieldID); 1.1908 - 1.1909 - /* get pPublicData and ulPublicDataLen */ 1.1910 fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B"); 1.1911 - if (fieldID == NULL) { return; } 1.1912 + if (fieldID == NULL) { return NULL; } 1.1913 jPublicData = (*env)->GetObjectField(env, jParam, fieldID); 1.1914 1.1915 - /* populate java values */ 1.1916 + // allocate memory for CK_ECDH1_DERIVE_PARAMS pointer 1.1917 + ckParamPtr = calloc(1, sizeof(CK_ECDH1_DERIVE_PARAMS)); 1.1918 + if (ckParamPtr == NULL) { 1.1919 + throwOutOfMemoryError(env, 0); 1.1920 + return NULL; 1.1921 + } 1.1922 + 1.1923 + // populate using java values 1.1924 ckParamPtr->kdf = jLongToCKULong(jLong); 1.1925 - jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData), &(ckParamPtr->ulSharedDataLen)); 1.1926 - if ((*env)->ExceptionCheck(env)) { return; } 1.1927 - jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); 1.1928 + jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData), 1.1929 + &(ckParamPtr->ulSharedDataLen)); 1.1930 if ((*env)->ExceptionCheck(env)) { 1.1931 - free(ckParamPtr->pSharedData); 1.1932 - return; 1.1933 + goto cleanup; 1.1934 } 1.1935 + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), 1.1936 + &(ckParamPtr->ulPublicDataLen)); 1.1937 + if ((*env)->ExceptionCheck(env)) { 1.1938 + goto cleanup; 1.1939 + } 1.1940 + 1.1941 + if (pLength != NULL) { 1.1942 + *pLength = sizeof(CK_ECDH1_DERIVE_PARAMS); 1.1943 + } 1.1944 + return ckParamPtr; 1.1945 +cleanup: 1.1946 + free(ckParamPtr->pSharedData); 1.1947 + free(ckParamPtr->pPublicData); 1.1948 + free(ckParamPtr); 1.1949 + return NULL; 1.1950 } 1.1951 1.1952 /* 1.1953 - * converts the Java CK_ECDH2_DERIVE_PARAMS object to a CK_ECDH2_DERIVE_PARAMS structure 1.1954 + * converts the Java CK_ECDH2_DERIVE_PARAMS object to a CK_ECDH2_DERIVE_PARAMS 1.1955 + * pointer 1.1956 * 1.1957 * @param env - used to call JNI funktions to get the Java classes and objects 1.1958 * @param jParam - the Java CK_ECDH2_DERIVE_PARAMS object to convert 1.1959 - * @param ckParamPtr - pointer to the new CK_ECDH2_DERIVE_PARAMS structure 1.1960 + * @param pLength - length of the allocated memory of the returned pointer 1.1961 + * @return pointer to the new CK_ECDH2_DERIVE_PARAMS structure 1.1962 */ 1.1963 -void jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam, 1.1964 -CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr) 1.1965 +CK_ECDH2_DERIVE_PARAMS_PTR 1.1966 +jEcdh2DeriveParamToCKEcdh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.1967 { 1.1968 + CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr; 1.1969 jclass jEcdh2DeriveParamsClass; 1.1970 jfieldID fieldID; 1.1971 jlong jKdf, jPrivateDataLen, jPrivateData; 1.1972 jobject jSharedData, jPublicData, jPublicData2; 1.1973 - memset(ckParamPtr, 0, sizeof(CK_ECDH2_DERIVE_PARAMS)); 1.1974 1.1975 - /* get kdf */ 1.1976 + // retrieve java values 1.1977 jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS); 1.1978 - if (jEcdh2DeriveParamsClass == NULL) { return; } 1.1979 + if (jEcdh2DeriveParamsClass == NULL) { return NULL; } 1.1980 fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J"); 1.1981 - if (fieldID == NULL) { return; } 1.1982 + if (fieldID == NULL) { return NULL; } 1.1983 jKdf = (*env)->GetLongField(env, jParam, fieldID); 1.1984 - 1.1985 - /* get pSharedData and ulSharedDataLen */ 1.1986 fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B"); 1.1987 - if (fieldID == NULL) { return; } 1.1988 + if (fieldID == NULL) { return NULL; } 1.1989 jSharedData = (*env)->GetObjectField(env, jParam, fieldID); 1.1990 - 1.1991 - /* get pPublicData and ulPublicDataLen */ 1.1992 fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B"); 1.1993 - if (fieldID == NULL) { return; } 1.1994 + if (fieldID == NULL) { return NULL; } 1.1995 jPublicData = (*env)->GetObjectField(env, jParam, fieldID); 1.1996 - 1.1997 - /* get ulPrivateDataLen */ 1.1998 fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J"); 1.1999 - if (fieldID == NULL) { return; } 1.2000 + if (fieldID == NULL) { return NULL; } 1.2001 jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID); 1.2002 - 1.2003 - /* get hPrivateData */ 1.2004 fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J"); 1.2005 - if (fieldID == NULL) { return; } 1.2006 + if (fieldID == NULL) { return NULL; } 1.2007 jPrivateData = (*env)->GetLongField(env, jParam, fieldID); 1.2008 - 1.2009 - /* get pPublicData2 and ulPublicDataLen2 */ 1.2010 fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B"); 1.2011 - if (fieldID == NULL) { return; } 1.2012 + if (fieldID == NULL) { return NULL; } 1.2013 jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID); 1.2014 1.2015 - /* populate java values */ 1.2016 + // allocate memory for CK_ECDH2_DERIVE_PARAMS pointer 1.2017 + ckParamPtr = calloc(1, sizeof(CK_ECDH2_DERIVE_PARAMS)); 1.2018 + if (ckParamPtr == NULL) { 1.2019 + throwOutOfMemoryError(env, 0); 1.2020 + return NULL; 1.2021 + } 1.2022 + 1.2023 + // populate using java values 1.2024 ckParamPtr->kdf = jLongToCKULong(jKdf); 1.2025 - jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData), &(ckParamPtr->ulSharedDataLen)); 1.2026 - if ((*env)->ExceptionCheck(env)) { return; } 1.2027 - jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); 1.2028 + jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData), 1.2029 + &(ckParamPtr->ulSharedDataLen)); 1.2030 if ((*env)->ExceptionCheck(env)) { 1.2031 - free(ckParamPtr->pSharedData); 1.2032 - return; 1.2033 + goto cleanup; 1.2034 + } 1.2035 + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), 1.2036 + &(ckParamPtr->ulPublicDataLen)); 1.2037 + if ((*env)->ExceptionCheck(env)) { 1.2038 + goto cleanup; 1.2039 } 1.2040 ckParamPtr->ulPrivateDataLen = jLongToCKULong(jPrivateDataLen); 1.2041 ckParamPtr->hPrivateData = jLongToCKULong(jPrivateData); 1.2042 - jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2), &(ckParamPtr->ulPublicDataLen2)); 1.2043 + jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2), 1.2044 + &(ckParamPtr->ulPublicDataLen2)); 1.2045 if ((*env)->ExceptionCheck(env)) { 1.2046 - free(ckParamPtr->pSharedData); 1.2047 - free(ckParamPtr->pPublicData); 1.2048 - return; 1.2049 + goto cleanup; 1.2050 } 1.2051 + 1.2052 + if (pLength != NULL) { 1.2053 + *pLength = sizeof(CK_ECDH2_DERIVE_PARAMS); 1.2054 + } 1.2055 + return ckParamPtr; 1.2056 +cleanup: 1.2057 + free(ckParamPtr->pSharedData); 1.2058 + free(ckParamPtr->pPublicData); 1.2059 + free(ckParamPtr->pPublicData2); 1.2060 + free(ckParamPtr); 1.2061 + return NULL; 1.2062 } 1.2063 1.2064 /* 1.2065 - * converts the Java CK_X9_42_DH1_DERIVE_PARAMS object to a CK_X9_42_DH1_DERIVE_PARAMS structure 1.2066 + * converts the Java CK_X9_42_DH1_DERIVE_PARAMS object to a 1.2067 + * CK_X9_42_DH1_DERIVE_PARAMS pointer 1.2068 * 1.2069 * @param env - used to call JNI funktions to get the Java classes and objects 1.2070 * @param jParam - the Java CK_X9_42_DH1_DERIVE_PARAMS object to convert 1.2071 - * @param ckParamPtr - pointer to the new CK_X9_42_DH1_DERIVE_PARAMS structure 1.2072 + * @param pLength - length of the allocated memory of the returned pointer 1.2073 + * @return pointer to the new CK_X9_42_DH1_DERIVE_PARAMS structure 1.2074 */ 1.2075 -void jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam, 1.2076 - CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr) 1.2077 +CK_X9_42_DH1_DERIVE_PARAMS_PTR 1.2078 +jX942Dh1DeriveParamToCKX942Dh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.2079 { 1.2080 + CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr; 1.2081 jclass jX942Dh1DeriveParamsClass; 1.2082 jfieldID fieldID; 1.2083 jlong jKdf; 1.2084 jobject jOtherInfo, jPublicData; 1.2085 - memset(ckParamPtr, 0, sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); 1.2086 1.2087 - /* get kdf */ 1.2088 + if (pLength != NULL) { 1.2089 + *pLength = 0; 1.2090 + } 1.2091 + 1.2092 + // retrieve java values 1.2093 jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS); 1.2094 - if (jX942Dh1DeriveParamsClass == NULL) { return; } 1.2095 + if (jX942Dh1DeriveParamsClass == NULL) { return NULL; } 1.2096 fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J"); 1.2097 - if (fieldID == NULL) { return; } 1.2098 + if (fieldID == NULL) { return NULL; } 1.2099 jKdf = (*env)->GetLongField(env, jParam, fieldID); 1.2100 - 1.2101 - /* get pOtherInfo and ulOtherInfoLen */ 1.2102 fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B"); 1.2103 - if (fieldID == NULL) { return; } 1.2104 + if (fieldID == NULL) { return NULL; } 1.2105 jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID); 1.2106 - 1.2107 - /* get pPublicData and ulPublicDataLen */ 1.2108 fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B"); 1.2109 - if (fieldID == NULL) { return; } 1.2110 + if (fieldID == NULL) { return NULL; } 1.2111 jPublicData = (*env)->GetObjectField(env, jParam, fieldID); 1.2112 1.2113 - /* populate java values */ 1.2114 + // allocate memory for CK_X9_42_DH1_DERIVE_PARAMS pointer 1.2115 + ckParamPtr = calloc(1, sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); 1.2116 + if (ckParamPtr == NULL) { 1.2117 + throwOutOfMemoryError(env, 0); 1.2118 + return NULL; 1.2119 + } 1.2120 + 1.2121 + // populate using java values 1.2122 ckParamPtr->kdf = jLongToCKULong(jKdf); 1.2123 - jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo), &(ckParamPtr->ulOtherInfoLen)); 1.2124 - if ((*env)->ExceptionCheck(env)) { return; } 1.2125 - jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); 1.2126 + jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo), 1.2127 + &(ckParamPtr->ulOtherInfoLen)); 1.2128 if ((*env)->ExceptionCheck(env)) { 1.2129 - free(ckParamPtr->pOtherInfo); 1.2130 - return; 1.2131 + goto cleanup; 1.2132 } 1.2133 + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), 1.2134 + &(ckParamPtr->ulPublicDataLen)); 1.2135 + if ((*env)->ExceptionCheck(env)) { 1.2136 + goto cleanup; 1.2137 + } 1.2138 + 1.2139 + if (pLength != NULL) { 1.2140 + *pLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS); 1.2141 + } 1.2142 + return ckParamPtr; 1.2143 +cleanup: 1.2144 + free(ckParamPtr->pOtherInfo); 1.2145 + free(ckParamPtr->pPublicData); 1.2146 + free(ckParamPtr); 1.2147 + return NULL; 1.2148 } 1.2149 1.2150 /* 1.2151 - * converts the Java CK_X9_42_DH2_DERIVE_PARAMS object to a CK_X9_42_DH2_DERIVE_PARAMS structure 1.2152 + * converts the Java CK_X9_42_DH2_DERIVE_PARAMS object to a 1.2153 + * CK_X9_42_DH2_DERIVE_PARAMS pointer 1.2154 * 1.2155 * @param env - used to call JNI funktions to get the Java classes and objects 1.2156 * @param jParam - the Java CK_X9_42_DH2_DERIVE_PARAMS object to convert 1.2157 - * @param ckParamPtr - pointer to the new CK_X9_42_DH2_DERIVE_PARAMS structure 1.2158 + * @param pLength - length of the allocated memory of the returned pointer 1.2159 + * @return pointer to the new CK_X9_42_DH2_DERIVE_PARAMS structure 1.2160 */ 1.2161 -void jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam, 1.2162 - CK_X9_42_DH2_DERIVE_PARAMS_PTR ckParamPtr) 1.2163 +CK_X9_42_DH2_DERIVE_PARAMS_PTR 1.2164 +jX942Dh2DeriveParamToCKX942Dh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength) 1.2165 { 1.2166 + CK_X9_42_DH2_DERIVE_PARAMS_PTR ckParamPtr; 1.2167 jclass jX942Dh2DeriveParamsClass; 1.2168 jfieldID fieldID; 1.2169 jlong jKdf, jPrivateDataLen, jPrivateData; 1.2170 jobject jOtherInfo, jPublicData, jPublicData2; 1.2171 - memset(ckParamPtr, 0, sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); 1.2172 1.2173 - /* get kdf */ 1.2174 + if (pLength != NULL) { 1.2175 + *pLength = 0L; 1.2176 + } 1.2177 + 1.2178 + // retrieve java values 1.2179 jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS); 1.2180 - if (jX942Dh2DeriveParamsClass == NULL) { return; } 1.2181 + if (jX942Dh2DeriveParamsClass == NULL) { return NULL; } 1.2182 fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J"); 1.2183 - if (fieldID == NULL) { return; } 1.2184 + if (fieldID == NULL) { return NULL; } 1.2185 jKdf = (*env)->GetLongField(env, jParam, fieldID); 1.2186 - 1.2187 - /* get pOtherInfo and ulOtherInfoLen */ 1.2188 fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B"); 1.2189 - if (fieldID == NULL) { return; } 1.2190 + if (fieldID == NULL) { return NULL; } 1.2191 jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID); 1.2192 - 1.2193 - /* get pPublicData and ulPublicDataLen */ 1.2194 fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B"); 1.2195 - if (fieldID == NULL) { return; } 1.2196 + if (fieldID == NULL) { return NULL; } 1.2197 jPublicData = (*env)->GetObjectField(env, jParam, fieldID); 1.2198 - 1.2199 - /* get ulPrivateDataLen */ 1.2200 fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J"); 1.2201 - if (fieldID == NULL) { return; } 1.2202 + if (fieldID == NULL) { return NULL; } 1.2203 jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID); 1.2204 - 1.2205 - /* get hPrivateData */ 1.2206 fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J"); 1.2207 - if (fieldID == NULL) { return; } 1.2208 + if (fieldID == NULL) { return NULL; } 1.2209 jPrivateData = (*env)->GetLongField(env, jParam, fieldID); 1.2210 - 1.2211 - /* get pPublicData2 and ulPublicDataLen2 */ 1.2212 fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B"); 1.2213 - if (fieldID == NULL) { return; } 1.2214 + if (fieldID == NULL) { return NULL; } 1.2215 jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID); 1.2216 1.2217 - /* populate java values */ 1.2218 + // allocate memory for CK_DATE pointer 1.2219 + ckParamPtr = calloc(1, sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); 1.2220 + if (ckParamPtr == NULL) { 1.2221 + throwOutOfMemoryError(env, 0); 1.2222 + return NULL; 1.2223 + } 1.2224 + 1.2225 + // populate using java values 1.2226 ckParamPtr->kdf = jLongToCKULong(jKdf); 1.2227 - jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo), &(ckParamPtr->ulOtherInfoLen)); 1.2228 - if ((*env)->ExceptionCheck(env)) { return; } 1.2229 - jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); 1.2230 + jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo), 1.2231 + &(ckParamPtr->ulOtherInfoLen)); 1.2232 if ((*env)->ExceptionCheck(env)) { 1.2233 - free(ckParamPtr->pOtherInfo); 1.2234 - return; 1.2235 + goto cleanup; 1.2236 + } 1.2237 + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), 1.2238 + &(ckParamPtr->ulPublicDataLen)); 1.2239 + if ((*env)->ExceptionCheck(env)) { 1.2240 + goto cleanup; 1.2241 } 1.2242 ckParamPtr->ulPrivateDataLen = jLongToCKULong(jPrivateDataLen); 1.2243 ckParamPtr->hPrivateData = jLongToCKULong(jPrivateData); 1.2244 - jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2), &(ckParamPtr->ulPublicDataLen2)); 1.2245 + jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2), 1.2246 + &(ckParamPtr->ulPublicDataLen2)); 1.2247 if ((*env)->ExceptionCheck(env)) { 1.2248 - free(ckParamPtr->pOtherInfo); 1.2249 - free(ckParamPtr->pPublicData); 1.2250 - return; 1.2251 + goto cleanup; 1.2252 } 1.2253 + 1.2254 + if (pLength != NULL) { 1.2255 + *pLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS); 1.2256 + } 1.2257 + return ckParamPtr; 1.2258 +cleanup: 1.2259 + free(ckParamPtr->pOtherInfo); 1.2260 + free(ckParamPtr->pPublicData); 1.2261 + free(ckParamPtr->pPublicData2); 1.2262 + free(ckParamPtr); 1.2263 + return NULL; 1.2264 }
2.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c Mon Nov 12 08:33:59 2018 -0800 2.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c Wed Aug 14 01:40:29 2019 +0000 2.3 @@ -198,8 +198,8 @@ 2.4 TRACE0("DEBUG: override CKA_NETSCAPE_DB attr value to TRUE\n"); 2.5 } 2.6 2.7 - ckpAttributes = (CK_ATTRIBUTE_PTR)malloc( 2.8 - CK_ATTRIBUTES_TEMPLATE_LENGTH * sizeof(CK_ATTRIBUTE)); 2.9 + ckpAttributes = (CK_ATTRIBUTE_PTR) calloc( 2.10 + CK_ATTRIBUTES_TEMPLATE_LENGTH, sizeof(CK_ATTRIBUTE)); 2.11 if (ckpAttributes == NULL) { 2.12 throwOutOfMemoryError(env, 0); 2.13 goto cleanup; 2.14 @@ -597,7 +597,7 @@ 2.15 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); 2.16 if ((*env)->ExceptionCheck(env)) { return NULL; } 2.17 2.18 - ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) malloc(2 * sizeof(CK_OBJECT_HANDLE)); 2.19 + ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) calloc(2, sizeof(CK_OBJECT_HANDLE)); 2.20 if (ckpKeyHandles == NULL) { 2.21 throwOutOfMemoryError(env, 0); 2.22 goto cleanup; 2.23 @@ -671,7 +671,8 @@ 2.24 2.25 rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, ckpMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength); 2.26 if (rv == CKR_BUFFER_TOO_SMALL) { 2.27 - ckpWrappedKey = (CK_BYTE_PTR) malloc(ckWrappedKeyLength); 2.28 + ckpWrappedKey = (CK_BYTE_PTR) 2.29 + calloc(ckWrappedKeyLength, sizeof(CK_BYTE)); 2.30 if (ckpWrappedKey == NULL) { 2.31 throwOutOfMemoryError(env, 0); 2.32 goto cleanup; 2.33 @@ -766,51 +767,6 @@ 2.34 2.35 #ifdef P11_ENABLE_C_DERIVEKEY 2.36 2.37 -static void freeMasterKeyDeriveParams(CK_SSL3_RANDOM_DATA *RandomInfo, CK_VERSION_PTR pVersion) { 2.38 - if (RandomInfo->pClientRandom != NULL) { 2.39 - free(RandomInfo->pClientRandom); 2.40 - } 2.41 - if (RandomInfo->pServerRandom != NULL) { 2.42 - free(RandomInfo->pServerRandom); 2.43 - } 2.44 - if (pVersion != NULL) { 2.45 - free(pVersion); 2.46 - } 2.47 -} 2.48 - 2.49 -void ssl3FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckpMechanism) { 2.50 - CK_SSL3_MASTER_KEY_DERIVE_PARAMS *params = 2.51 - (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *) ckpMechanism->pParameter; 2.52 - if (params == NULL) { 2.53 - return; 2.54 - } 2.55 - freeMasterKeyDeriveParams(&(params->RandomInfo), params->pVersion); 2.56 -} 2.57 - 2.58 -void tls12FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckpMechanism) { 2.59 - CK_TLS12_MASTER_KEY_DERIVE_PARAMS *params = 2.60 - (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckpMechanism->pParameter; 2.61 - if (params == NULL) { 2.62 - return; 2.63 - } 2.64 - freeMasterKeyDeriveParams(&(params->RandomInfo), params->pVersion); 2.65 -} 2.66 - 2.67 -void freeEcdh1DeriveParams(CK_MECHANISM_PTR ckpMechanism) { 2.68 - CK_ECDH1_DERIVE_PARAMS *params = 2.69 - (CK_ECDH1_DERIVE_PARAMS *)ckpMechanism->pParameter; 2.70 - if (params == NULL) { 2.71 - return; 2.72 - } 2.73 - 2.74 - if (params->pSharedData != NULL) { 2.75 - free(params->pSharedData); 2.76 - } 2.77 - if (params->pPublicData != NULL) { 2.78 - free(params->pPublicData); 2.79 - } 2.80 -} 2.81 - 2.82 /* 2.83 * Copy back the PRF output to Java. 2.84 */ 2.85 @@ -870,12 +826,6 @@ 2.86 /* copy back the Java buffer to the object */ 2.87 (*env)->ReleaseByteArrayElements(env, jOutput, jBytes, 0); 2.88 } 2.89 - 2.90 - // free malloc'd data 2.91 - free(ckTLSPrfParams->pSeed); 2.92 - free(ckTLSPrfParams->pLabel); 2.93 - free(ckTLSPrfParams->pulOutputLen); 2.94 - free(ckTLSPrfParams->pOutput); 2.95 } 2.96 } 2.97 2.98 @@ -941,18 +891,9 @@ 2.99 case CKM_TLS_MASTER_KEY_DERIVE: 2.100 /* we must copy back the client version */ 2.101 ssl3CopyBackClientVersion(env, ckpMechanism, jMechanism); 2.102 - ssl3FreeMasterKeyDeriveParams(ckpMechanism); 2.103 break; 2.104 case CKM_TLS12_MASTER_KEY_DERIVE: 2.105 tls12CopyBackClientVersion(env, ckpMechanism, jMechanism); 2.106 - tls12FreeMasterKeyDeriveParams(ckpMechanism); 2.107 - break; 2.108 - case CKM_SSL3_MASTER_KEY_DERIVE_DH: 2.109 - case CKM_TLS_MASTER_KEY_DERIVE_DH: 2.110 - ssl3FreeMasterKeyDeriveParams(ckpMechanism); 2.111 - break; 2.112 - case CKM_TLS12_MASTER_KEY_DERIVE_DH: 2.113 - tls12FreeMasterKeyDeriveParams(ckpMechanism); 2.114 break; 2.115 case CKM_SSL3_KEY_AND_MAC_DERIVE: 2.116 case CKM_TLS_KEY_AND_MAC_DERIVE: 2.117 @@ -966,9 +907,6 @@ 2.118 case CKM_TLS_PRF: 2.119 copyBackTLSPrfParams(env, ckpMechanism, jMechanism); 2.120 break; 2.121 - case CKM_ECDH1_DERIVE: 2.122 - freeEcdh1DeriveParams(ckpMechanism); 2.123 - break; 2.124 default: 2.125 // empty 2.126 break; 2.127 @@ -1104,14 +1042,6 @@ 2.128 return; 2.129 } 2.130 2.131 - // free malloc'd data 2.132 - if (RandomInfo->pClientRandom != NULL) { 2.133 - free(RandomInfo->pClientRandom); 2.134 - } 2.135 - if (RandomInfo->pServerRandom != NULL) { 2.136 - free(RandomInfo->pServerRandom); 2.137 - } 2.138 - 2.139 if (ckSSL3KeyMatOut != NULL_PTR) { 2.140 /* get the Java params object (pParameter) */ 2.141 fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", 2.142 @@ -1173,8 +1103,6 @@ 2.143 /* copy back the Java buffer to the object */ 2.144 (*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0); 2.145 } 2.146 - // free malloc'd data 2.147 - free(ckSSL3KeyMatOut->pIVClient); 2.148 2.149 /* copy back the server IV */ 2.150 fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVServer", "[B"); 2.151 @@ -1193,9 +1121,6 @@ 2.152 /* copy back the Java buffer to the object */ 2.153 (*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0); 2.154 } 2.155 - // free malloc'd data 2.156 - free(ckSSL3KeyMatOut->pIVServer); 2.157 - free(ckSSL3KeyMatOut); 2.158 } 2.159 } 2.160
3.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_util.c Mon Nov 12 08:33:59 2018 -0800 3.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_util.c Wed Aug 14 01:40:29 2019 +0000 3.3 @@ -290,17 +290,122 @@ 3.4 } 3.5 3.6 /* This function frees the specified CK_MECHANISM_PTR pointer and its 3.7 - * pParameter. NOTE: mechanism-specific memory allocations have to be 3.8 - * freed before this call as this method only frees the generic 3.9 - * memory associated with CK_MECHANISM structure. 3.10 + * pParameter including mechanism-specific memory allocations. 3.11 * 3.12 * @param mechPtr pointer to the to-be-freed CK_MECHANISM structure. 3.13 */ 3.14 +void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) { 3.15 + void *tmp; 3.16 + CK_SSL3_MASTER_KEY_DERIVE_PARAMS *sslMkdTmp; 3.17 + CK_SSL3_KEY_MAT_PARAMS* sslKmTmp; 3.18 + CK_TLS12_MASTER_KEY_DERIVE_PARAMS *tlsMkdTmp; 3.19 + CK_TLS12_KEY_MAT_PARAMS* tlsKmTmp; 3.20 3.21 -void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) { 3.22 if (mechPtr != NULL) { 3.23 - TRACE1("DEBUG: free CK_MECHANISM %x", mechPtr); 3.24 - free(mechPtr->pParameter); 3.25 + TRACE2("DEBUG: free mech %lX (mech id = 0x%lX)\n", 3.26 + ptr_to_jlong(mechPtr), mechPtr->mechanism); 3.27 + if (mechPtr->pParameter != NULL) { 3.28 + switch (mechPtr->mechanism) { 3.29 + case CKM_AES_GCM: 3.30 + tmp = mechPtr->pParameter; 3.31 + TRACE1("\t=> free GCM_PARAMS %lX\n", 3.32 + ptr_to_jlong(tmp)); 3.33 + free(((CK_GCM_PARAMS*)tmp)->pIv); 3.34 + free(((CK_GCM_PARAMS*)tmp)->pAAD); 3.35 + break; 3.36 + case CKM_AES_CCM: 3.37 + tmp = mechPtr->pParameter; 3.38 + TRACE1("\t=> free CK_CCM_PARAMS %lX\n", 3.39 + ptr_to_jlong(tmp)); 3.40 + free(((CK_CCM_PARAMS*)tmp)->pNonce); 3.41 + free(((CK_CCM_PARAMS*)tmp)->pAAD); 3.42 + break; 3.43 + case CKM_TLS_PRF: 3.44 + case CKM_NSS_TLS_PRF_GENERAL: 3.45 + tmp = mechPtr->pParameter; 3.46 + TRACE1("\t=> free CK_TLS_PRF_PARAMS %lX\n", 3.47 + ptr_to_jlong(tmp)); 3.48 + free(((CK_TLS_PRF_PARAMS*)tmp)->pSeed); 3.49 + free(((CK_TLS_PRF_PARAMS*)tmp)->pLabel); 3.50 + free(((CK_TLS_PRF_PARAMS*)tmp)->pulOutputLen); 3.51 + free(((CK_TLS_PRF_PARAMS*)tmp)->pOutput); 3.52 + break; 3.53 + case CKM_SSL3_MASTER_KEY_DERIVE: 3.54 + case CKM_TLS_MASTER_KEY_DERIVE: 3.55 + case CKM_SSL3_MASTER_KEY_DERIVE_DH: 3.56 + case CKM_TLS_MASTER_KEY_DERIVE_DH: 3.57 + sslMkdTmp = mechPtr->pParameter; 3.58 + TRACE1("\t=> free CK_SSL3_MASTER_KEY_DERIVE_PARAMS %lX\n", 3.59 + ptr_to_jlong(sslMkdTmp)); 3.60 + free(sslMkdTmp->RandomInfo.pClientRandom); 3.61 + free(sslMkdTmp->RandomInfo.pServerRandom); 3.62 + free(sslMkdTmp->pVersion); 3.63 + break; 3.64 + case CKM_SSL3_KEY_AND_MAC_DERIVE: 3.65 + case CKM_TLS_KEY_AND_MAC_DERIVE: 3.66 + sslKmTmp = mechPtr->pParameter; 3.67 + TRACE1("\t=> free CK_SSL3_KEY_MAT_PARAMS %lX\n", 3.68 + ptr_to_jlong(sslKmTmp)); 3.69 + free(sslKmTmp->RandomInfo.pClientRandom); 3.70 + free(sslKmTmp->RandomInfo.pServerRandom); 3.71 + if (sslKmTmp->pReturnedKeyMaterial != NULL) { 3.72 + free(sslKmTmp->pReturnedKeyMaterial->pIVClient); 3.73 + free(sslKmTmp->pReturnedKeyMaterial->pIVServer); 3.74 + free(sslKmTmp->pReturnedKeyMaterial); 3.75 + } 3.76 + break; 3.77 + case CKM_TLS12_MASTER_KEY_DERIVE: 3.78 + case CKM_TLS12_MASTER_KEY_DERIVE_DH: 3.79 + tlsMkdTmp = mechPtr->pParameter; 3.80 + TRACE1("\t=> CK_TLS12_MASTER_KEY_DERIVE_PARAMS %lX\n", 3.81 + ptr_to_jlong(tlsMkdTmp)); 3.82 + free(tlsMkdTmp->RandomInfo.pClientRandom); 3.83 + free(tlsMkdTmp->RandomInfo.pServerRandom); 3.84 + free(tlsMkdTmp->pVersion); 3.85 + break; 3.86 + case CKM_TLS12_KEY_AND_MAC_DERIVE: 3.87 + tlsKmTmp = mechPtr->pParameter; 3.88 + TRACE1("\t=> free CK_TLS12_KEY_MAT_PARAMS %lX\n", 3.89 + ptr_to_jlong(tlsKmTmp)); 3.90 + free(tlsKmTmp->RandomInfo.pClientRandom); 3.91 + free(tlsKmTmp->RandomInfo.pServerRandom); 3.92 + if (tlsKmTmp->pReturnedKeyMaterial != NULL) { 3.93 + free(tlsKmTmp->pReturnedKeyMaterial->pIVClient); 3.94 + free(tlsKmTmp->pReturnedKeyMaterial->pIVServer); 3.95 + free(tlsKmTmp->pReturnedKeyMaterial); 3.96 + } 3.97 + break; 3.98 + case CKM_ECDH1_DERIVE: 3.99 + case CKM_ECDH1_COFACTOR_DERIVE: 3.100 + tmp = mechPtr->pParameter; 3.101 + TRACE1("\t=> free CK_ECDH1_DERIVE_PARAMS %lX\n", 3.102 + ptr_to_jlong(tmp)); 3.103 + free(((CK_ECDH1_DERIVE_PARAMS *)tmp)->pSharedData); 3.104 + free(((CK_ECDH1_DERIVE_PARAMS *)tmp)->pPublicData); 3.105 + break; 3.106 + case CKM_TLS_MAC: 3.107 + case CKM_AES_CTR: 3.108 + case CKM_RSA_PKCS_PSS: 3.109 + case CKM_CAMELLIA_CTR: 3.110 + TRACE0("\t=> NO OP\n"); 3.111 + // params do not contain pointers 3.112 + break; 3.113 + default: 3.114 + // currently unsupported mechs by SunPKCS11 provider 3.115 + // CKM_RSA_PKCS_OAEP, CKM_ECMQV_DERIVE, 3.116 + // CKM_X9_42_*, CKM_KEA_DERIVE, CKM_RC2_*, CKM_RC5_*, 3.117 + // CKM_SKIPJACK_*, CKM_KEY_WRAP_SET_OAEP, CKM_PKCS5_PBKD2, 3.118 + // PBE mechs, WTLS mechs, CMS mechs, 3.119 + // CKM_EXTRACT_KEY_FROM_KEY, CKM_OTP, CKM_KIP, 3.120 + // CKM_DSA_PARAMETER_GEN?, CKM_GOSTR3410_* 3.121 + // CK_any_CBC_ENCRYPT_DATA? 3.122 + TRACE0("\t=> ERROR UNSUPPORTED CK PARAMS\n"); 3.123 + break; 3.124 + } 3.125 + free(mechPtr->pParameter); 3.126 + } else { 3.127 + TRACE0("DEBUG => Parameter NULL\n"); 3.128 + } 3.129 free(mechPtr); 3.130 } 3.131 } 3.132 @@ -356,7 +461,7 @@ 3.133 return; 3.134 } 3.135 *ckpLength = (*env)->GetArrayLength(env, jArray); 3.136 - jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean)); 3.137 + jpTemp = (jboolean*) calloc(*ckpLength, sizeof(jboolean)); 3.138 if (jpTemp == NULL) { 3.139 throwOutOfMemoryError(env, 0); 3.140 return; 3.141 @@ -367,7 +472,7 @@ 3.142 return; 3.143 } 3.144 3.145 - *ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL)); 3.146 + *ckpArray = (CK_BBOOL*) calloc (*ckpLength, sizeof(CK_BBOOL)); 3.147 if (*ckpArray == NULL) { 3.148 free(jpTemp); 3.149 throwOutOfMemoryError(env, 0); 3.150 @@ -398,7 +503,7 @@ 3.151 return; 3.152 } 3.153 *ckpLength = (*env)->GetArrayLength(env, jArray); 3.154 - jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte)); 3.155 + jpTemp = (jbyte*) calloc(*ckpLength, sizeof(jbyte)); 3.156 if (jpTemp == NULL) { 3.157 throwOutOfMemoryError(env, 0); 3.158 return; 3.159 @@ -413,7 +518,7 @@ 3.160 if (sizeof(CK_BYTE) == sizeof(jbyte)) { 3.161 *ckpArray = (CK_BYTE_PTR) jpTemp; 3.162 } else { 3.163 - *ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE)); 3.164 + *ckpArray = (CK_BYTE_PTR) calloc (*ckpLength, sizeof(CK_BYTE)); 3.165 if (*ckpArray == NULL) { 3.166 free(jpTemp); 3.167 throwOutOfMemoryError(env, 0); 3.168 @@ -445,7 +550,7 @@ 3.169 return; 3.170 } 3.171 *ckpLength = (*env)->GetArrayLength(env, jArray); 3.172 - jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong)); 3.173 + jTemp = (jlong*) calloc(*ckpLength, sizeof(jlong)); 3.174 if (jTemp == NULL) { 3.175 throwOutOfMemoryError(env, 0); 3.176 return; 3.177 @@ -456,7 +561,7 @@ 3.178 return; 3.179 } 3.180 3.181 - *ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG)); 3.182 + *ckpArray = (CK_ULONG_PTR) calloc(*ckpLength, sizeof(CK_ULONG)); 3.183 if (*ckpArray == NULL) { 3.184 free(jTemp); 3.185 throwOutOfMemoryError(env, 0); 3.186 @@ -487,7 +592,7 @@ 3.187 return; 3.188 } 3.189 *ckpLength = (*env)->GetArrayLength(env, jArray); 3.190 - jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar)); 3.191 + jpTemp = (jchar*) calloc(*ckpLength, sizeof(jchar)); 3.192 if (jpTemp == NULL) { 3.193 throwOutOfMemoryError(env, 0); 3.194 return; 3.195 @@ -498,7 +603,7 @@ 3.196 return; 3.197 } 3.198 3.199 - *ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR)); 3.200 + *ckpArray = (CK_CHAR_PTR) calloc (*ckpLength, sizeof(CK_CHAR)); 3.201 if (*ckpArray == NULL) { 3.202 free(jpTemp); 3.203 throwOutOfMemoryError(env, 0); 3.204 @@ -529,7 +634,7 @@ 3.205 return; 3.206 } 3.207 *ckpLength = (*env)->GetArrayLength(env, jArray); 3.208 - jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar)); 3.209 + jTemp = (jchar*) calloc(*ckpLength, sizeof(jchar)); 3.210 if (jTemp == NULL) { 3.211 throwOutOfMemoryError(env, 0); 3.212 return; 3.213 @@ -540,7 +645,7 @@ 3.214 return; 3.215 } 3.216 3.217 - *ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR)); 3.218 + *ckpArray = (CK_UTF8CHAR_PTR) calloc(*ckpLength, sizeof(CK_UTF8CHAR)); 3.219 if (*ckpArray == NULL) { 3.220 free(jTemp); 3.221 throwOutOfMemoryError(env, 0); 3.222 @@ -575,7 +680,7 @@ 3.223 if (pCharArray == NULL) { return; } 3.224 3.225 *ckpLength = strlen(pCharArray); 3.226 - *ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR)); 3.227 + *ckpArray = (CK_UTF8CHAR_PTR) calloc(*ckpLength + 1, sizeof(CK_UTF8CHAR)); 3.228 if (*ckpArray == NULL) { 3.229 (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray); 3.230 throwOutOfMemoryError(env, 0); 3.231 @@ -609,7 +714,7 @@ 3.232 } 3.233 jLength = (*env)->GetArrayLength(env, jArray); 3.234 *ckpLength = jLongToCKULong(jLength); 3.235 - *ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE)); 3.236 + *ckpArray = (CK_ATTRIBUTE_PTR) calloc(*ckpLength, sizeof(CK_ATTRIBUTE)); 3.237 if (*ckpArray == NULL) { 3.238 throwOutOfMemoryError(env, 0); 3.239 return; 3.240 @@ -651,7 +756,7 @@ 3.241 if (sizeof(CK_BYTE) == sizeof(jbyte)) { 3.242 jpTemp = (jbyte*) ckpArray; 3.243 } else { 3.244 - jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte)); 3.245 + jpTemp = (jbyte*) calloc(ckLength, sizeof(jbyte)); 3.246 if (jpTemp == NULL) { 3.247 throwOutOfMemoryError(env, 0); 3.248 return NULL; 3.249 @@ -685,7 +790,7 @@ 3.250 jlong* jpTemp; 3.251 jlongArray jArray; 3.252 3.253 - jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong)); 3.254 + jpTemp = (jlong*) calloc(ckLength, sizeof(jlong)); 3.255 if (jpTemp == NULL) { 3.256 throwOutOfMemoryError(env, 0); 3.257 return NULL; 3.258 @@ -716,7 +821,7 @@ 3.259 jchar* jpTemp; 3.260 jcharArray jArray; 3.261 3.262 - jpTemp = (jchar*) malloc(ckLength * sizeof(jchar)); 3.263 + jpTemp = (jchar*) calloc(ckLength, sizeof(jchar)); 3.264 if (jpTemp == NULL) { 3.265 throwOutOfMemoryError(env, 0); 3.266 return NULL; 3.267 @@ -747,7 +852,7 @@ 3.268 jchar* jpTemp; 3.269 jcharArray jArray; 3.270 3.271 - jpTemp = (jchar*) malloc(ckLength * sizeof(jchar)); 3.272 + jpTemp = (jchar*) calloc(ckLength, sizeof(jchar)); 3.273 if (jpTemp == NULL) { 3.274 throwOutOfMemoryError(env, 0); 3.275 return NULL; 3.276 @@ -1051,7 +1156,7 @@ 3.277 jDateClass = (*env)->FindClass(env, CLASS_DATE); 3.278 if (jDateClass == NULL) { return NULL; } 3.279 if ((*env)->IsInstanceOf(env, jObject, jDateClass)) { 3.280 - ckpObject = jDateObjectPtrToCKDatePtr(env, jObject); 3.281 + ckpObject = jDateObjectToCKDatePtr(env, jObject); 3.282 *ckpLength = sizeof(CK_DATE); 3.283 TRACE3("<converted date value %.4s-%.2s-%.2s>", ((CK_DATE *) ckpObject)->year, 3.284 ((CK_DATE *) ckpObject)->month, ((CK_DATE *) ckpObject)->day); 3.285 @@ -1123,7 +1228,7 @@ 3.286 if (classNameString == NULL) { return NULL; } 3.287 exceptionMsgPrefix = "Java object of this class cannot be converted to native PKCS#11 type: "; 3.288 exceptionMsg = (char *) 3.289 - malloc((strlen(exceptionMsgPrefix) + strlen(classNameString) + 1)); 3.290 + malloc(strlen(exceptionMsgPrefix) + strlen(classNameString) + 1); 3.291 if (exceptionMsg == NULL) { 3.292 (*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString); 3.293 throwOutOfMemoryError(env, 0); 3.294 @@ -1143,16 +1248,26 @@ 3.295 #ifdef P11_MEMORYDEBUG 3.296 3.297 #undef malloc 3.298 +#undef calloc 3.299 #undef free 3.300 3.301 void *p11malloc(size_t c, char *file, int line) { 3.302 void *p = malloc(c); 3.303 - printf("malloc\t%08x\t%d\t%s:%d\n", p, c, file, line); fflush(stdout); 3.304 + fprintf(stdout, "malloc\t%08lX\t%lX\t%s:%d\n", ptr_to_jlong(p), c, file, line); 3.305 + fflush(stdout); 3.306 + return p; 3.307 +} 3.308 + 3.309 +void *p11calloc(size_t c, size_t s, char *file, int line) { 3.310 + void *p = calloc(c, s); 3.311 + fprintf(stdout, "calloc\t%08lX\t%lX\t%lX\t%s:%d\n", ptr_to_jlong(p), c, s, file, line); 3.312 + fflush(stdout); 3.313 return p; 3.314 } 3.315 3.316 void p11free(void *p, char *file, int line) { 3.317 - printf("free\t%08x\t\t%s:%d\n", p, file, line); fflush(stdout); 3.318 + fprintf(stdout, "free\t%08lX\t\t%s:%d\n", ptr_to_jlong(p), file, line); 3.319 + fflush(stdout); 3.320 free(p); 3.321 } 3.322
4.1 --- a/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h Mon Nov 12 08:33:59 2018 -0800 4.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h Wed Aug 14 01:40:29 2019 +0000 4.3 @@ -203,6 +203,10 @@ 4.4 #define ckULongToJSize(x) ((jsize) x) 4.5 #define unsignedIntToCKULong(x) ((CK_ULONG) x) 4.6 4.7 +//#define TRACE0d(s) { printf(s); fflush(stdout); } 4.8 +//#define TRACE1d(s, p1) { printf(s, p1); fflush(stdout); } 4.9 +//#define TRACE2d(s, p1, p2) { printf(s, p1, p2); fflush(stdout); } 4.10 + 4.11 #ifdef P11_DEBUG 4.12 #define TRACE0(s) { printf(s); fflush(stdout); } 4.13 #define TRACE1(s, p1) { printf(s, p1); fflush(stdout); } 4.14 @@ -344,7 +348,7 @@ 4.15 CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject); 4.16 CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject); 4.17 CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion); 4.18 -CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate); 4.19 +CK_DATE * jDateObjectToCKDatePtr(JNIEnv *env, jobject jDate); 4.20 CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute); 4.21 CK_MECHANISM_PTR jMechanismToCKMechanismPtr(JNIEnv *env, jobject jMechanism); 4.22 4.23 @@ -355,26 +359,29 @@ 4.24 *ckpLength); 4.25 4.26 4.27 -/* functions to convert a specific Java mechanism parameter object to a CK-mechanism parameter structure */ 4.28 +/* functions to convert a specific Java mechanism parameter object to a CK-mechanism parameter pointer */ 4.29 4.30 -void jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam, CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr); 4.31 -void jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam, CK_PBE_PARAMS_PTR ckParamPtr); 4.32 +CK_RSA_PKCS_OAEP_PARAMS_PTR jRsaPkcsOaepParamToCKRsaPkcsOaepParamPtr(JNIEnv *env, 4.33 + jobject jParam, CK_ULONG* pLength); 4.34 +CK_PBE_PARAMS_PTR jPbeParamToCKPbeParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.35 +CK_PKCS5_PBKD2_PARAMS_PTR jPkcs5Pbkd2ParamToCKPkcs5Pbkd2ParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.36 +CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.37 +CK_SSL3_KEY_MAT_PARAMS_PTR jSsl3KeyMatParamToCKSsl3KeyMatParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.38 +CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); 4.39 +CK_RSA_PKCS_PSS_PARAMS_PTR jRsaPkcsPssParamToCKRsaPkcsPssParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.40 +CK_ECDH1_DERIVE_PARAMS_PTR jEcdh1DeriveParamToCKEcdh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.41 +CK_ECDH2_DERIVE_PARAMS_PTR jEcdh2DeriveParamToCKEcdh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.42 +CK_X9_42_DH1_DERIVE_PARAMS_PTR jX942Dh1DeriveParamToCKX942Dh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.43 +CK_X9_42_DH2_DERIVE_PARAMS_PTR jX942Dh2DeriveParamToCKX942Dh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 4.44 + 4.45 +/* functions to copy the returned values inside CK-mechanism back to Java object */ 4.46 + 4.47 void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 4.48 -void jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam, CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr); 4.49 void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 4.50 -void jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam, CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr); 4.51 void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 4.52 void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 4.53 -void jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam, CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr); 4.54 void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 4.55 void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 4.56 -CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); 4.57 -void jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam, CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr); 4.58 -void jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam, CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr); 4.59 -void jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam, 4.60 -CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr); 4.61 -void jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam, CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr); 4.62 -void jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam, CK_X9_42_DH2_DERIVE_PARAMS_PTR ckParamPtr); 4.63 4.64 4.65 /* functions to convert the InitArgs object for calling the right Java mutex functions */ 4.66 @@ -454,8 +461,9 @@ 4.67 #ifdef P11_MEMORYDEBUG 4.68 #include <stdlib.h> 4.69 4.70 -/* Simple malloc/free dumper */ 4.71 +/* Simple malloc/calloc/free dumper */ 4.72 void *p11malloc(size_t c, char *file, int line); 4.73 +void *p11calloc(size_t c, size_t s, char *file, int line); 4.74 void p11free(void *p, char *file, int line); 4.75 4.76 /* Use THIS_FILE when it is available. */ 4.77 @@ -464,6 +472,7 @@ 4.78 #endif 4.79 4.80 #define malloc(c) (p11malloc((c), THIS_FILE, __LINE__)) 4.81 +#define calloc(c, s) (p11calloc((c), (s), THIS_FILE, __LINE__)) 4.82 #define free(c) (p11free((c), THIS_FILE, __LINE__)) 4.83 4.84 #endif