3939#include "debug_p11.h"
4040#include "../common/util.h"
4141#include "../common/openssl-compat.h"
42+ #include "../common/insecure_memzero.h"
4243
4344#ifdef _MSVC
4445#define gettimeofday (a , b ) gettimeofday_win(a)
@@ -1459,33 +1460,22 @@ static CK_RV get_attribute_public_key(CK_ATTRIBUTE_TYPE type,
14591460 return CKR_OK ;
14601461}
14611462
1462- CK_RV get_attribute (CK_ATTRIBUTE_TYPE type , yh_object_descriptor * object ,
1463- CK_VOID_PTR value , CK_ULONG_PTR length ,
1464- yh_session * session ) {
1465-
1466- CK_BYTE tmp [2048 ];
1467- CK_VOID_PTR ptr ;
1468- if (value == NULL ) {
1469- // NOTE(adma): we just need the length, use a scratchpad for the data
1470- ptr = tmp ;
1471- * length = sizeof (tmp );
1472- } else {
1473- // NOTE(adma): otherwise actually save the data
1474- ptr = value ;
1475- }
1463+ static CK_RV get_attribute (CK_ATTRIBUTE_TYPE type , yh_object_descriptor * object ,
1464+ CK_BYTE_PTR value , CK_ULONG_PTR length ,
1465+ yh_session * session ) {
14761466
14771467 switch (object -> type ) {
14781468 case YH_OPAQUE :
1479- return get_attribute_opaque (type , object , ptr , length , session );
1469+ return get_attribute_opaque (type , object , value , length , session );
14801470
14811471 case YH_WRAP_KEY :
14821472 case YH_HMAC_KEY :
1483- return get_attribute_secret_key (type , object , ptr , length );
1473+ return get_attribute_secret_key (type , object , value , length );
14841474
14851475 case YH_ASYMMETRIC_KEY :
1486- return get_attribute_private_key (type , object , ptr , length , session );
1476+ return get_attribute_private_key (type , object , value , length , session );
14871477 case 0x80 | YH_ASYMMETRIC_KEY :
1488- return get_attribute_public_key (type , object , ptr , length , session );
1478+ return get_attribute_public_key (type , object , value , length , session );
14891479
14901480 case YH_TEMPLATE :
14911481 case YH_AUTHENTICATION_KEY :
@@ -1497,50 +1487,43 @@ CK_RV get_attribute(CK_ATTRIBUTE_TYPE type, yh_object_descriptor *object,
14971487 return CKR_OK ;
14981488}
14991489
1500- CK_RV get_attribute_ecsession_key (CK_ATTRIBUTE_TYPE type , ecdh_session_key * key ,
1501- CK_VOID_PTR value , CK_ULONG_PTR length ) {
1502-
1503- CK_BYTE tmp [2048 ];
1504- CK_VOID_PTR ptr ;
1505- if (value == NULL ) {
1506- ptr = tmp ;
1507- * length = sizeof (tmp );
1508- } else {
1509- ptr = value ;
1510- }
1490+ static CK_RV get_attribute_ecsession_key (CK_ATTRIBUTE_TYPE type ,
1491+ ecdh_session_key * key ,
1492+ CK_BYTE_PTR value ,
1493+ CK_ULONG_PTR length ) {
15111494
15121495 switch (type ) {
15131496 case CKA_CLASS :
1514- * ((CK_OBJECT_CLASS * ) ptr ) = CKO_SECRET_KEY ;
1497+ * ((CK_OBJECT_CLASS * ) value ) = CKO_SECRET_KEY ;
15151498 * length = sizeof (CK_OBJECT_CLASS );
15161499 break ;
15171500
15181501 case CKA_KEY_TYPE :
1519- * ((CK_KEY_TYPE * ) ptr ) = CKK_GENERIC_SECRET ;
1502+ * ((CK_KEY_TYPE * ) value ) = CKK_GENERIC_SECRET ;
15201503 * length = sizeof (CK_KEY_TYPE );
15211504 break ;
15221505
15231506 case CKA_ID : {
1524- CK_OBJECT_HANDLE * id = ptr ;
1507+ CK_OBJECT_HANDLE * id = ( CK_OBJECT_HANDLE * ) value ;
15251508 * id = key -> id ;
15261509 * length = sizeof (CK_OBJECT_HANDLE );
15271510 break ;
15281511 }
15291512
15301513 case CKA_LABEL :
15311514 * length = strlen (key -> label );
1532- memcpy (ptr , key -> label , * length );
1515+ memcpy (value , key -> label , * length );
15331516 break ;
15341517
15351518 case CKA_LOCAL :
15361519 case CKA_TOKEN :
1537- * ((CK_BBOOL * ) ptr ) = CK_FALSE ;
1520+ * ((CK_BBOOL * ) value ) = CK_FALSE ;
15381521 * length = sizeof (CK_BBOOL );
15391522 break ;
15401523
15411524 case CKA_DESTROYABLE :
15421525 case CKA_EXTRACTABLE :
1543- * ((CK_BBOOL * ) ptr ) = CK_TRUE ;
1526+ * ((CK_BBOOL * ) value ) = CK_TRUE ;
15441527 * length = sizeof (CK_BBOOL );
15451528 break ;
15461529
@@ -1558,12 +1541,12 @@ CK_RV get_attribute_ecsession_key(CK_ATTRIBUTE_TYPE type, ecdh_session_key *key,
15581541 case CKA_WRAP_WITH_TRUSTED :
15591542 case CKA_VERIFY :
15601543 case CKA_ENCRYPT :
1561- * ((CK_BBOOL * ) ptr ) = CK_FALSE ;
1544+ * ((CK_BBOOL * ) value ) = CK_FALSE ;
15621545 * length = sizeof (CK_BBOOL );
15631546 break ;
15641547
15651548 case CKA_VALUE :
1566- memcpy (ptr , key -> ecdh_key , key -> len );
1549+ memcpy (value , key -> ecdh_key , key -> len );
15671550 * length = key -> len ;
15681551 break ;
15691552
@@ -3879,31 +3862,37 @@ CK_RV populate_template(int type, void *object, CK_ATTRIBUTE_PTR pTemplate,
38793862 CK_ULONG ulCount , yh_session * session ) {
38803863
38813864 CK_RV rv = CKR_OK ;
3865+ CK_BYTE tmp [8192 ];
38823866
38833867 for (CK_ULONG i = 0 ; i < ulCount ; i ++ ) {
38843868 DBG_INFO ("Getting attribute 0x%lx" , pTemplate [i ].type );
3885-
3886- CK_VOID_PTR object_ptr ;
3887- if (pTemplate [i ].pValue == NULL ) {
3888- // NOTE(adma): just asking for the length
3889- object_ptr = NULL ;
3890- DBG_INFO ("Retrieving length" );
3891- } else {
3892- // NOTE(adma): actually get the attribute
3893- object_ptr = pTemplate [i ].pValue ;
3894- DBG_INFO ("Retrieving attribute" );
3895- }
3896-
3869+ CK_ULONG len = sizeof (tmp );
38973870 CK_RV attribute_rc ;
3871+
38983872 if (type == ECDH_KEY_TYPE ) {
38993873 ecdh_session_key * key = object ;
39003874 attribute_rc =
3901- get_attribute_ecsession_key (pTemplate [i ].type , key , object_ptr ,
3902- & pTemplate [i ].ulValueLen );
3875+ get_attribute_ecsession_key (pTemplate [i ].type , key , tmp , & len );
39033876 } else {
39043877 yubihsm_pkcs11_object_desc * desc = object ;
3905- attribute_rc = get_attribute (pTemplate [i ].type , & desc -> object , object_ptr ,
3906- & pTemplate [i ].ulValueLen , session );
3878+ attribute_rc =
3879+ get_attribute (pTemplate [i ].type , & desc -> object , tmp , & len , session );
3880+ }
3881+
3882+ if (attribute_rc == CKR_OK ) {
3883+ if (pTemplate [i ].pValue == NULL ) {
3884+ DBG_INFO ("Retrieving only length which is %lu" , len );
3885+ pTemplate [i ].ulValueLen = len ;
3886+ } else if (len > pTemplate [i ].ulValueLen ) {
3887+ DBG_WARN ("Skipping attribute, buffer to small %lu > %lu" , len ,
3888+ pTemplate [i ].ulValueLen );
3889+ attribute_rc = CKR_BUFFER_TOO_SMALL ;
3890+ pTemplate [i ].ulValueLen = CK_UNAVAILABLE_INFORMATION ;
3891+ } else {
3892+ DBG_INFO ("Retrieving attribute value, length is %lu" , len );
3893+ memcpy (pTemplate [i ].pValue , tmp , len );
3894+ pTemplate [i ].ulValueLen = len ;
3895+ }
39073896 }
39083897
39093898 if (attribute_rc != CKR_OK ) {
@@ -3913,7 +3902,7 @@ CK_RV populate_template(int type, void *object, CK_ATTRIBUTE_PTR pTemplate,
39133902 } else if (attribute_rc == CKR_BUFFER_TOO_SMALL ) {
39143903 DBG_ERR ("Skipping attribute because buffer is too small" );
39153904 } else {
3916- DBG_ERR ("Get attribute failed. %s" , yh_strerror ( attribute_rc ) );
3905+ DBG_ERR ("Get attribute failed." );
39173906 }
39183907 } else {
39193908 DBG_INFO ("Attribute/length successfully returned with length %lu" ,
@@ -3940,6 +3929,8 @@ CK_RV populate_template(int type, void *object, CK_ATTRIBUTE_PTR pTemplate,
39403929 * type having the CKF_ARRAY_ATTRIBUTE bit set.*/
39413930 }
39423931
3932+ insecure_memzero (tmp , sizeof (tmp ));
3933+
39433934 return rv ;
39443935}
39453936
0 commit comments