@@ -302,29 +302,30 @@ void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) {
302
302
CK_TLS12_KEY_MAT_PARAMS * tlsKmTmp ;
303
303
304
304
if (mechPtr != NULL ) {
305
- TRACE2 ("DEBUG: free mech %lX (mech id = 0x%lX)\n" ,
306
- ptr_to_jlong ( mechPtr ) , mechPtr -> mechanism );
305
+ TRACE2 ("DEBUG freeCKMechanismPtr : free pMech %p (mech 0x%lX)\n" ,
306
+ mechPtr , mechPtr -> mechanism );
307
307
if (mechPtr -> pParameter != NULL ) {
308
+ tmp = mechPtr -> pParameter ;
308
309
switch (mechPtr -> mechanism ) {
309
310
case CKM_AES_GCM :
310
- tmp = mechPtr -> pParameter ;
311
- TRACE1 ("\t=> free GCM_PARAMS %lX\n" ,
312
- ptr_to_jlong (tmp ));
313
- free (((CK_GCM_PARAMS * )tmp )-> pIv );
314
- free (((CK_GCM_PARAMS * )tmp )-> pAAD );
311
+ if (mechPtr -> ulParameterLen == sizeof (CK_GCM_PARAMS_NO_IVBITS )) {
312
+ TRACE0 ("[ GCM_PARAMS w/o ulIvBits ]\n" );
313
+ free (((CK_GCM_PARAMS_NO_IVBITS * )tmp )-> pIv );
314
+ free (((CK_GCM_PARAMS_NO_IVBITS * )tmp )-> pAAD );
315
+ } else if (mechPtr -> ulParameterLen == sizeof (CK_GCM_PARAMS )) {
316
+ TRACE0 ("[ GCM_PARAMS ]\n" );
317
+ free (((CK_GCM_PARAMS * )tmp )-> pIv );
318
+ free (((CK_GCM_PARAMS * )tmp )-> pAAD );
319
+ }
315
320
break ;
316
321
case CKM_AES_CCM :
317
- tmp = mechPtr -> pParameter ;
318
- TRACE1 ("\t=> free CK_CCM_PARAMS %lX\n" ,
319
- ptr_to_jlong (tmp ));
322
+ TRACE0 ("[ CK_CCM_PARAMS ]\n" );
320
323
free (((CK_CCM_PARAMS * )tmp )-> pNonce );
321
324
free (((CK_CCM_PARAMS * )tmp )-> pAAD );
322
325
break ;
323
326
case CKM_TLS_PRF :
324
327
case CKM_NSS_TLS_PRF_GENERAL :
325
- tmp = mechPtr -> pParameter ;
326
- TRACE1 ("\t=> free CK_TLS_PRF_PARAMS %lX\n" ,
327
- ptr_to_jlong (tmp ));
328
+ TRACE0 ("[ CK_TLS_PRF_PARAMS ]\n" );
328
329
free (((CK_TLS_PRF_PARAMS * )tmp )-> pSeed );
329
330
free (((CK_TLS_PRF_PARAMS * )tmp )-> pLabel );
330
331
free (((CK_TLS_PRF_PARAMS * )tmp )-> pulOutputLen );
@@ -334,18 +335,16 @@ void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) {
334
335
case CKM_TLS_MASTER_KEY_DERIVE :
335
336
case CKM_SSL3_MASTER_KEY_DERIVE_DH :
336
337
case CKM_TLS_MASTER_KEY_DERIVE_DH :
337
- sslMkdTmp = mechPtr -> pParameter ;
338
- TRACE1 ("\t=> free CK_SSL3_MASTER_KEY_DERIVE_PARAMS %lX\n" ,
339
- ptr_to_jlong (sslMkdTmp ));
338
+ sslMkdTmp = tmp ;
339
+ TRACE0 ("[ CK_SSL3_MASTER_KEY_DERIVE_PARAMS ]\n" );
340
340
free (sslMkdTmp -> RandomInfo .pClientRandom );
341
341
free (sslMkdTmp -> RandomInfo .pServerRandom );
342
342
free (sslMkdTmp -> pVersion );
343
343
break ;
344
344
case CKM_SSL3_KEY_AND_MAC_DERIVE :
345
345
case CKM_TLS_KEY_AND_MAC_DERIVE :
346
- sslKmTmp = mechPtr -> pParameter ;
347
- TRACE1 ("\t=> free CK_SSL3_KEY_MAT_PARAMS %lX\n" ,
348
- ptr_to_jlong (sslKmTmp ));
346
+ sslKmTmp = tmp ;
347
+ TRACE0 ("[ CK_SSL3_KEY_MAT_PARAMS ]\n" );
349
348
free (sslKmTmp -> RandomInfo .pClientRandom );
350
349
free (sslKmTmp -> RandomInfo .pServerRandom );
351
350
if (sslKmTmp -> pReturnedKeyMaterial != NULL ) {
@@ -356,17 +355,15 @@ void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) {
356
355
break ;
357
356
case CKM_TLS12_MASTER_KEY_DERIVE :
358
357
case CKM_TLS12_MASTER_KEY_DERIVE_DH :
359
- tlsMkdTmp = mechPtr -> pParameter ;
360
- TRACE1 ("\t=> CK_TLS12_MASTER_KEY_DERIVE_PARAMS %lX\n" ,
361
- ptr_to_jlong (tlsMkdTmp ));
358
+ tlsMkdTmp = tmp ;
359
+ TRACE0 ("[ CK_TLS12_MASTER_KEY_DERIVE_PARAMS ]\n" );
362
360
free (tlsMkdTmp -> RandomInfo .pClientRandom );
363
361
free (tlsMkdTmp -> RandomInfo .pServerRandom );
364
362
free (tlsMkdTmp -> pVersion );
365
363
break ;
366
364
case CKM_TLS12_KEY_AND_MAC_DERIVE :
367
- tlsKmTmp = mechPtr -> pParameter ;
368
- TRACE1 ("\t=> free CK_TLS12_KEY_MAT_PARAMS %lX\n" ,
369
- ptr_to_jlong (tlsKmTmp ));
365
+ tlsKmTmp = tmp ;
366
+ TRACE0 ("[ CK_TLS12_KEY_MAT_PARAMS ]\n" );
370
367
free (tlsKmTmp -> RandomInfo .pClientRandom );
371
368
free (tlsKmTmp -> RandomInfo .pServerRandom );
372
369
if (tlsKmTmp -> pReturnedKeyMaterial != NULL ) {
@@ -377,17 +374,14 @@ void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) {
377
374
break ;
378
375
case CKM_ECDH1_DERIVE :
379
376
case CKM_ECDH1_COFACTOR_DERIVE :
380
- tmp = mechPtr -> pParameter ;
381
- TRACE1 ("\t=> free CK_ECDH1_DERIVE_PARAMS %lX\n" ,
382
- ptr_to_jlong (tmp ));
377
+ TRACE0 ("[ CK_ECDH1_DERIVE_PARAMS ]\n" );
383
378
free (((CK_ECDH1_DERIVE_PARAMS * )tmp )-> pSharedData );
384
379
free (((CK_ECDH1_DERIVE_PARAMS * )tmp )-> pPublicData );
385
380
break ;
386
381
case CKM_TLS_MAC :
387
382
case CKM_AES_CTR :
388
383
case CKM_RSA_PKCS_PSS :
389
384
case CKM_CAMELLIA_CTR :
390
- TRACE0 ("\t=> NO OP\n" );
391
385
// params do not contain pointers
392
386
break ;
393
387
default :
@@ -399,17 +393,59 @@ void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr) {
399
393
// CKM_EXTRACT_KEY_FROM_KEY, CKM_OTP, CKM_KIP,
400
394
// CKM_DSA_PARAMETER_GEN?, CKM_GOSTR3410_*
401
395
// CK_any_CBC_ENCRYPT_DATA?
402
- TRACE0 ("\t=> ERROR UNSUPPORTED CK PARAMS \n" );
396
+ TRACE0 ("ERROR: UNSUPPORTED CK_MECHANISM \n" );
403
397
break ;
404
398
}
405
- free (mechPtr -> pParameter );
399
+ TRACE1 ("\t=> freed param %p\n" , tmp );
400
+ free (tmp );
406
401
} else {
407
- TRACE0 ("DEBUG => Parameter NULL\n" );
402
+ TRACE0 ("\t => param NULL\n" );
408
403
}
409
404
free (mechPtr );
405
+ TRACE0 ("FINISHED\n" );
410
406
}
411
407
}
412
408
409
+ /* This function replaces the CK_GCM_PARAMS_NO_IVBITS structure associated
410
+ * with the specified CK_MECHANISM structure with CK_GCM_PARAMS
411
+ * structure.
412
+ *
413
+ * @param mechPtr pointer to the CK_MECHANISM structure containing
414
+ * the to-be-converted CK_GCM_PARAMS_NO_IVBITS structure.
415
+ * @return pointer to the CK_MECHANISM structure containing the
416
+ * converted CK_GCM_PARAMS structure or NULL if no conversion took place.
417
+ */
418
+ CK_MECHANISM_PTR updateGCMParams (JNIEnv * env , CK_MECHANISM_PTR mechPtr ) {
419
+ CK_GCM_PARAMS * pGcmParams2 = NULL ;
420
+ CK_GCM_PARAMS_NO_IVBITS * pParams = NULL ;
421
+ if ((mechPtr -> mechanism == CKM_AES_GCM ) &&
422
+ (mechPtr -> pParameter != NULL_PTR ) &&
423
+ (mechPtr -> ulParameterLen == sizeof (CK_GCM_PARAMS_NO_IVBITS ))) {
424
+ pGcmParams2 = calloc (1 , sizeof (CK_GCM_PARAMS ));
425
+ if (pGcmParams2 == NULL ) {
426
+ throwOutOfMemoryError (env , 0 );
427
+ return NULL ;
428
+ }
429
+ pParams = (CK_GCM_PARAMS_NO_IVBITS * ) mechPtr -> pParameter ;
430
+ pGcmParams2 -> pIv = pParams -> pIv ;
431
+ pGcmParams2 -> ulIvLen = pParams -> ulIvLen ;
432
+ pGcmParams2 -> ulIvBits = (pGcmParams2 -> ulIvLen << 3 );
433
+ pGcmParams2 -> pAAD = pParams -> pAAD ;
434
+ pGcmParams2 -> ulAADLen = pParams -> ulAADLen ;
435
+ pGcmParams2 -> ulTagBits = pParams -> ulTagBits ;
436
+ TRACE1 ("DEBUG updateGCMParams: pMech %p\n" , mechPtr );
437
+ TRACE2 ("\t=> GCM param w/o ulIvBits %p => GCM param %p\n" , pParams ,
438
+ pGcmParams2 );
439
+ free (pParams );
440
+ mechPtr -> pParameter = pGcmParams2 ;
441
+ mechPtr -> ulParameterLen = sizeof (CK_GCM_PARAMS );
442
+ return mechPtr ;
443
+ } else {
444
+ TRACE0 ("DEBUG updateGCMParams: no conversion done\n" );
445
+ }
446
+ return NULL ;
447
+ }
448
+
413
449
/*
414
450
* the following functions convert Java arrays to PKCS#11 array pointers and
415
451
* their array length and vice versa
0 commit comments