summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason King <jason.king@joyent.com>2018-01-22 19:28:10 +0000
committerJason King <jason.king@joyent.com>2018-05-08 17:12:50 -0500
commit28cd1d4864940265e40eecac8df838b0dd72ca5c (patch)
treea2800d8bb5c96efd07515c55ddbd05938e35511d
parent1b2c15a7560df76b763b5eebcf9b645296c0234e (diff)
downloadillumos-joyent-28cd1d4864940265e40eecac8df838b0dd72ca5c.tar.gz
OS-6325 PKCS#11 softtoken should use explicit_bzero
Reviewed by: Dan McDonald <danmcd@joyent.com> Reviewed by: Alex Wilson <alex.wilson@joyent.com> Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r--usr/src/lib/pkcs11/libpkcs11/common/metaAttrManager.c10
-rw-r--r--usr/src/lib/pkcs11/libpkcs11/common/metaObjectManager.c9
-rw-r--r--usr/src/lib/pkcs11/pkcs11_kernel/common/kernelKeys.c15
-rw-r--r--usr/src/lib/pkcs11/pkcs11_kernel/common/kernelObjectUtil.c4
-rw-r--r--usr/src/lib/pkcs11/pkcs11_kernel/common/kernelSoftCommon.c17
-rw-r--r--usr/src/lib/pkcs11/pkcs11_kernel/common/kernelUtil.c7
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softAESCrypt.c33
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softASN1.c49
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softAttributeUtil.c56
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softBlowfishCrypt.c29
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softDESCrypt.c24
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softDecryptUtil.c55
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softDigestUtil.c3
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softEncryptUtil.c68
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeysUtil.c40
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c95
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystoreUtil.c146
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softMAC.c9
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softSSL.c7
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softSignUtil.c19
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softSlotToken.c8
21 files changed, 317 insertions, 386 deletions
diff --git a/usr/src/lib/pkcs11/libpkcs11/common/metaAttrManager.c b/usr/src/lib/pkcs11/libpkcs11/common/metaAttrManager.c
index d404b567c3..1b1aadff25 100644
--- a/usr/src/lib/pkcs11/libpkcs11/common/metaAttrManager.c
+++ b/usr/src/lib/pkcs11/libpkcs11/common/metaAttrManager.c
@@ -22,6 +22,7 @@
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2012 Milan Jurik. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <string.h>
@@ -526,7 +527,8 @@ dealloc_attributes(generic_attr_t *attributes, size_t num_attributes)
* extra work to just do them all. [Most attributes are just
* 1 or 4 bytes]
*/
- bzero(attr->attribute.pValue, attr->attribute.ulValueLen);
+ explicit_bzero(attr->attribute.pValue,
+ attr->attribute.ulValueLen);
if (attr->isMalloced)
free(attr->attribute.pValue);
@@ -564,13 +566,15 @@ attribute_set_value(CK_ATTRIBUTE *new_attr,
/* Existing storage is sufficient to store new value. */
/* bzero() out any data that won't be overwritten. */
- bzero((char *)attr->attribute.pValue + new_attr->ulValueLen,
+ explicit_bzero((char *)attr->attribute.pValue +
+ new_attr->ulValueLen,
attr->attribute.ulValueLen - new_attr->ulValueLen);
} else if (new_attr->ulValueLen <= sizeof (attr->generic_data)) {
/* Use generic storage to avoid a malloc. */
- bzero(attr->attribute.pValue, attr->attribute.ulValueLen);
+ explicit_bzero(attr->attribute.pValue,
+ attr->attribute.ulValueLen);
if (attr->isMalloced) {
/*
* If app sets a large value (triggering a malloc),
diff --git a/usr/src/lib/pkcs11/libpkcs11/common/metaObjectManager.c b/usr/src/lib/pkcs11/libpkcs11/common/metaObjectManager.c
index b50b912056..cb1b813097 100644
--- a/usr/src/lib/pkcs11/libpkcs11/common/metaObjectManager.c
+++ b/usr/src/lib/pkcs11/libpkcs11/common/metaObjectManager.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
@@ -596,7 +597,8 @@ meta_object_dealloc(meta_session_t *session, meta_object_t *object,
if (object->clone_template) {
for (i = 0; i < object->clone_template_size; i++) {
- free(((object->clone_template)[i]).pValue);
+ freezero((object->clone_template)[i].pValue,
+ (object->clone_template)[i].ulValueLen);
}
free(object->clone_template);
}
@@ -859,7 +861,8 @@ finish:
if (attrs_with_val) {
for (i = 0; i < num_attrs; i++) {
if (attrs_with_val[i].pValue != NULL) {
- free(attrs_with_val[i].pValue);
+ freezero(attrs_with_val[i].pValue,
+ attrs_with_val[i].ulValueLen);
}
}
free(attrs_with_val);
@@ -1491,7 +1494,7 @@ finish:
}
if (wrappedKey) {
- free(wrappedKey);
+ freezero(wrappedKey, wrappedKeyLen);
}
if (src_slot_session) {
diff --git a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelKeys.c b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelKeys.c
index 530b3fd8a4..52de5fc359 100644
--- a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelKeys.c
+++ b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelKeys.c
@@ -21,6 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2018, Joyent, Inc.
*/
#include <strings.h>
@@ -343,21 +344,15 @@ key_gen_by_value(CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate,
}
new_objp->is_lib_obj = B_TRUE;
new_objp->session_handle = (CK_SESSION_HANDLE)session_p;
- (void) free(newTemplate);
- bzero(key_buf, key_len);
- (void) free(key_buf);
+ free(newTemplate);
+ freezero(key_buf, key_len);
return (CKR_OK);
failed_exit:
free_attributes(obj_ngk.ngk_in_attributes, &obj_ngk.ngk_in_count);
free_attributes(obj_ngk.ngk_out_attributes, &obj_ngk.ngk_out_count);
- if (key_buf != NULL) {
- bzero(key_buf, key_len);
- (void) free(key_buf);
- }
- if (newTemplate != NULL) {
- (void) free(newTemplate);
- }
+ freezero(key_buf, key_len);
+ free(newTemplate);
return (rv);
}
diff --git a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelObjectUtil.c b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelObjectUtil.c
index a8c16f2e60..a9c54adbcd 100644
--- a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelObjectUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelObjectUtil.c
@@ -21,6 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <stdio.h>
@@ -77,8 +78,7 @@ kernel_cleanup_object(kernel_object_t *objp)
*/
if (objp->class == CKO_SECRET_KEY) {
if (OBJ_SEC(objp) != NULL && OBJ_SEC_VALUE(objp) != NULL) {
- bzero(OBJ_SEC_VALUE(objp), OBJ_SEC_VALUE_LEN(objp));
- free(OBJ_SEC_VALUE(objp));
+ freezero(OBJ_SEC_VALUE(objp), OBJ_SEC_VALUE_LEN(objp));
OBJ_SEC_VALUE(objp) = NULL;
OBJ_SEC_VALUE_LEN(objp) = 0;
}
diff --git a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelSoftCommon.c b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelSoftCommon.c
index 84af97182a..ba3b7499c2 100644
--- a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelSoftCommon.c
+++ b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelSoftCommon.c
@@ -22,10 +22,9 @@
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2018, Joyent, Inc.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <pthread.h>
#include <errno.h>
#include <stdio.h>
@@ -234,22 +233,16 @@ free_soft_ctx(void *s, int opflag)
return;
if (opflag & OP_SIGN) {
- if (session_p->sign.context == NULL)
- return;
- bzero(session_p->sign.context, sizeof (soft_hmac_ctx_t));
- free(session_p->sign.context);
+ freezero(session_p->sign.context,
+ sizeof (soft_hmac_ctx_t));
session_p->sign.context = NULL;
session_p->sign.flags = 0;
} else if (opflag & OP_VERIFY) {
- if (session_p->verify.context == NULL)
- return;
- bzero(session_p->verify.context, sizeof (soft_hmac_ctx_t));
- free(session_p->verify.context);
+ freezero(session_p->verify.context,
+ sizeof (soft_hmac_ctx_t));
session_p->verify.context = NULL;
session_p->verify.flags = 0;
} else {
- if (session_p->digest.context == NULL)
- return;
free(session_p->digest.context);
session_p->digest.context = NULL;
session_p->digest.flags = 0;
diff --git a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelUtil.c b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelUtil.c
index 143f488490..670a6c7666 100644
--- a/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelUtil.c
@@ -372,11 +372,8 @@ free_key_attributes(crypto_key_t *key)
if (key->ck_format == CRYPTO_KEY_ATTR_LIST &&
(key->ck_count > 0) && key->ck_attrs != NULL) {
for (i = 0; i < key->ck_count; i++) {
- if (key->ck_attrs[i].oa_value != NULL) {
- bzero(key->ck_attrs[i].oa_value,
- key->ck_attrs[i].oa_value_len);
- free(key->ck_attrs[i].oa_value);
- }
+ freezero(key->ck_attrs[i].oa_value,
+ key->ck_attrs[i].oa_value_len);
}
free(key->ck_attrs);
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAESCrypt.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAESCrypt.c
index bc8edcdc4c..fd27206e75 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAESCrypt.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAESCrypt.c
@@ -22,6 +22,7 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <pthread.h>
@@ -488,14 +489,21 @@ encrypt_failed:
cleanup:
(void) pthread_mutex_lock(&session_p->session_mutex);
aes_ctx = (aes_ctx_t *)soft_aes_ctx->aes_cbc;
- if (aes_ctx != NULL) {
- bzero(aes_ctx->ac_keysched, aes_ctx->ac_keysched_len);
- free(soft_aes_ctx->aes_cbc);
+ switch (mechanism) {
+ case CKM_AES_ECB:
+ freezero(aes_ctx, sizeof (ecb_ctx_t));
+ break;
+ case CKM_AES_CMAC:
+ case CKM_AES_CBC:
+ case CKM_AES_CBC_PAD:
+ freezero(aes_ctx, sizeof (cbc_ctx_t));
+ break;
+ case CKM_AES_CTR:
+ freezero(aes_ctx, sizeof (ctr_ctx_t));
+ break;
}
-
- bzero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
- free(session_p->encrypt.context);
+ freezero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
+ freezero(session_p->encrypt.context, sizeof (soft_aes_ctx_t));
session_p->encrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
@@ -851,14 +859,9 @@ decrypt_failed:
cleanup:
(void) pthread_mutex_lock(&session_p->session_mutex);
aes_ctx = (aes_ctx_t *)soft_aes_ctx->aes_cbc;
- if (aes_ctx != NULL) {
- bzero(aes_ctx->ac_keysched, aes_ctx->ac_keysched_len);
- free(soft_aes_ctx->aes_cbc);
- }
-
- bzero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
- free(session_p->decrypt.context);
+ free(aes_ctx);
+ freezero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
+ freezero(session_p->decrypt.context, sizeof (soft_aes_ctx_t));
session_p->decrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softASN1.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softASN1.c
index 4e5f5ddca4..5fe9105383 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softASN1.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softASN1.c
@@ -22,6 +22,7 @@
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012 Milan Jurik. All rights reserved.
+ * Copyright (c) 2018, Joyent. Inc.
*/
#include <stdlib.h>
@@ -87,7 +88,7 @@ pad_bigint_attr(biginteger_t *src, biginteger_t *dst)
* clear out potentially sensitive data before that happens.
*/
if (dst->big_value != NULL)
- (void) memset(dst->big_value, 0x0, dst->big_value_len);
+ explicit_bzero(dst->big_value, dst->big_value_len);
padding = (src->big_value[0] < 0x80) ? 0 : 1;
dst->big_value_len = src->big_value_len + padding;
@@ -338,10 +339,7 @@ rsa_pri_to_asn1(soft_object_t *objp, uchar_t *buf, ulong_t *buf_len)
cleanup_rsapri2asn:
- if (tmp_pad.big_value != NULL) {
- (void) memset(tmp_pad.big_value, 0x0, tmp_pad.big_value_len);
- free(tmp_pad.big_value);
- }
+ freezero(tmp_pad.big_value, tmp_pad.big_value_len);
if (key_asn != NULLBER)
ber_free(key_asn, 1);
@@ -527,10 +525,7 @@ dsa_pri_to_asn1(soft_object_t *objp, uchar_t *buf, ulong_t *buf_len)
cleanup_dsapri2asn:
- if (tmp_pad.big_value != NULL) {
- (void) memset(tmp_pad.big_value, 0x0, tmp_pad.big_value_len);
- free(tmp_pad.big_value);
- }
+ freezero(tmp_pad.big_value, tmp_pad.big_value_len);
if (key_asn != NULLBER)
ber_free(key_asn, 1);
@@ -701,10 +696,7 @@ dh_pri_to_asn1(soft_object_t *objp, uchar_t *buf, ulong_t *buf_len)
cleanup_dhpri2asn:
- if (tmp_pad.big_value != NULL) {
- (void) memset(tmp_pad.big_value, 0x0, tmp_pad.big_value_len);
- free(tmp_pad.big_value);
- }
+ freezero(tmp_pad.big_value, tmp_pad.big_value_len);
if (key_asn != NULLBER)
ber_free(key_asn, 1);
@@ -893,10 +885,7 @@ x942_dh_pri_to_asn1(soft_object_t *objp, uchar_t *buf, ulong_t *buf_len)
cleanup_x942dhpri2asn:
- if (tmp_pad.big_value != NULL) {
- (void) memset(tmp_pad.big_value, 0x0, tmp_pad.big_value_len);
- free(tmp_pad.big_value);
- }
+ freezero(tmp_pad.big_value, tmp_pad.big_value_len);
if (key_asn != NULLBER)
ber_free(key_asn, 1);
@@ -1240,11 +1229,7 @@ error_asn2rsapri:
cleanup_asn2rsapri:
- if (tmp_nopad.big_value != NULL) {
- (void) memset(tmp_nopad.big_value, 0x0,
- tmp_nopad.big_value_len);
- free(tmp_nopad.big_value);
- }
+ freezero(tmp_nopad.big_value, tmp_nopad.big_value_len);
if (p8obj_asn != NULLBER)
ber_free(p8obj_asn, 1);
@@ -1448,11 +1433,7 @@ error_asn2dsapri:
cleanup_asn2dsapri:
- if (tmp_nopad.big_value != NULL) {
- (void) memset(tmp_nopad.big_value, 0x0,
- tmp_nopad.big_value_len);
- free(tmp_nopad.big_value);
- }
+ freezero(tmp_nopad.big_value, tmp_nopad.big_value_len);
if (p8obj_asn != NULLBER)
ber_free(p8obj_asn, 1);
@@ -1632,11 +1613,7 @@ error_asn2dhpri:
cleanup_asn2dhpri:
- if (tmp_nopad.big_value != NULL) {
- (void) memset(tmp_nopad.big_value, 0x0,
- tmp_nopad.big_value_len);
- free(tmp_nopad.big_value);
- }
+ freezero(tmp_nopad.big_value, tmp_nopad.big_value_len);
if (p8obj_asn != NULLBER)
ber_free(p8obj_asn, 1);
@@ -1840,11 +1817,7 @@ error_asn2x942dhpri:
cleanup_asn2x942dhpri:
- if (tmp_nopad.big_value != NULL) {
- (void) memset(tmp_nopad.big_value, 0x0,
- tmp_nopad.big_value_len);
- free(tmp_nopad.big_value);
- }
+ freezero(tmp_nopad.big_value, tmp_nopad.big_value_len);
if (p8obj_asn != NULLBER)
ber_free(p8obj_asn, 1);
@@ -1864,7 +1837,7 @@ cleanup_asn2x942dhpri:
CK_RV
soft_asn1_to_object(soft_object_t *objp, uchar_t *buf, ulong_t buf_len)
{
- CK_RV rv = CKR_OK;
+ CK_RV rv = CKR_OK;
CK_OBJECT_CLASS class = objp->class;
CK_KEY_TYPE keytype = objp->key_type;
private_key_obj_t *pvk;
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAttributeUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAttributeUtil.c
index d6e77c8016..f015b4999f 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAttributeUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softAttributeUtil.c
@@ -22,6 +22,7 @@
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2012 Milan Jurik. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <stdlib.h>
@@ -322,11 +323,8 @@ soft_validate_attr(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum,
static void
cleanup_cert_attr(cert_attr_t *attr)
{
- if (attr) {
- if (attr->value) {
- (void) memset(attr->value, 0, attr->length);
- free(attr->value);
- }
+ if (attr != NULL) {
+ freezero(attr->value, attr->length);
attr->value = NULL;
attr->length = 0;
}
@@ -345,8 +343,7 @@ copy_cert_attr(cert_attr_t *src_attr, cert_attr_t **dest_attr)
/* free memory if its already allocated */
if (*dest_attr != NULL) {
- if ((*dest_attr)->value != (CK_BYTE *)NULL)
- free((*dest_attr)->value);
+ cleanup_cert_attr(*dest_attr);
} else {
*dest_attr = malloc(sizeof (cert_attr_t));
if (*dest_attr == NULL)
@@ -421,14 +418,16 @@ soft_cleanup_extra_attr(soft_object_t *object_p)
extra_attr = object_p->extra_attrlistp;
while (extra_attr) {
tmp = extra_attr->next;
- if (extra_attr->attr.pValue)
+ if (extra_attr->attr.pValue != NULL) {
/*
* All extra attributes in the extra attribute
* list have pValue points to the value of the
* attribute (with simple byte array type).
* Free the storage for the value of the attribute.
*/
- free(extra_attr->attr.pValue);
+ freezero(extra_attr->attr.pValue,
+ extra_attr->attr.ulValueLen);
+ }
/* Free the storage for the attribute_info struct. */
free(extra_attr);
@@ -672,9 +671,11 @@ set_extra_attr_to_object(soft_object_t *object_p, CK_ATTRIBUTE_TYPE type,
(template->ulValueLen > 0)) {
if (template->ulValueLen > extra_attr->attr.ulValueLen) {
/* The old buffer is too small to hold the new value. */
- if (extra_attr->attr.pValue != NULL)
+ if (extra_attr->attr.pValue != NULL) {
/* Free storage for the old attribute value. */
- free(extra_attr->attr.pValue);
+ freezero(extra_attr->attr.pValue,
+ extra_attr->attr.ulValueLen);
+ }
/* Allocate storage for the new attribute value. */
extra_attr->attr.pValue = malloc(template->ulValueLen);
@@ -930,11 +931,7 @@ get_cert_attr_from_template(cert_attr_t **dest, CK_ATTRIBUTE_PTR src)
* existing value and release the memory.
*/
if (*dest != NULL) {
- if ((*dest)->value != NULL) {
- (void) memset((*dest)->value, 0,
- (*dest)->length);
- free((*dest)->value);
- }
+ cleanup_cert_attr(*dest);
} else {
*dest = malloc(sizeof (cert_attr_t));
if (*dest == NULL) {
@@ -987,12 +984,9 @@ get_cert_attr_from_object(cert_attr_t *src, CK_ATTRIBUTE_PTR template)
void
string_attr_cleanup(CK_ATTRIBUTE_PTR template)
{
-
- if (template->pValue) {
- free(template->pValue);
- template->pValue = NULL;
- template->ulValueLen = 0;
- }
+ freezero(template->pValue, template->ulValueLen);
+ template->pValue = NULL;
+ template->ulValueLen = 0;
}
/*
@@ -1006,12 +1000,9 @@ bigint_attr_cleanup(biginteger_t *big)
if (big == NULL)
return;
- if (big->big_value) {
- (void) memset(big->big_value, 0, big->big_value_len);
- free(big->big_value);
- big->big_value = NULL;
- big->big_value_len = 0;
- }
+ freezero(big->big_value, big->big_value_len);
+ big->big_value = NULL;
+ big->big_value_len = 0;
}
@@ -1151,16 +1142,14 @@ soft_cleanup_object_bigint_attrs(soft_object_t *object_p)
/* cleanup key data area */
if (OBJ_SEC_VALUE(object_p) != NULL &&
OBJ_SEC_VALUE_LEN(object_p) > 0) {
- (void) memset(OBJ_SEC_VALUE(object_p), 0,
+ freezero(OBJ_SEC_VALUE(object_p),
OBJ_SEC_VALUE_LEN(object_p));
- free(OBJ_SEC_VALUE(object_p));
}
/* cleanup key schedule data area */
if (OBJ_KEY_SCHED(object_p) != NULL &&
OBJ_KEY_SCHED_LEN(object_p) > 0) {
- (void) memset(OBJ_KEY_SCHED(object_p), 0,
+ freezero(OBJ_KEY_SCHED(object_p),
OBJ_KEY_SCHED_LEN(object_p));
- free(OBJ_KEY_SCHED(object_p));
}
/* Release Secret Key Object struct. */
@@ -6319,7 +6308,7 @@ soft_copy_secret_key_attr(secret_key_obj_t *old_secret_key_obj_p,
(void) memcpy(sk, old_secret_key_obj_p, sizeof (secret_key_obj_t));
/* copy the secret key value */
- sk->sk_value = malloc((sizeof (CK_BYTE) * sk->sk_value_len));
+ sk->sk_value = malloc(sk->sk_value_len);
if (sk->sk_value == NULL) {
free(sk);
return (CKR_HOST_MEMORY);
@@ -6334,6 +6323,7 @@ soft_copy_secret_key_attr(secret_key_obj_t *old_secret_key_obj_p,
old_secret_key_obj_p->keysched_len > 0) {
sk->key_sched = malloc(old_secret_key_obj_p->keysched_len);
if (sk->key_sched == NULL) {
+ freezero(sk->sk_value, sk->sk_value_len);
free(sk);
return (CKR_HOST_MEMORY);
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softBlowfishCrypt.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softBlowfishCrypt.c
index 9abbce2592..e903cee693 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softBlowfishCrypt.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softBlowfishCrypt.c
@@ -21,6 +21,7 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <pthread.h>
@@ -297,15 +298,11 @@ soft_blowfish_encrypt_common(soft_session_t *session_p, CK_BYTE_PTR pData,
cleanup:
(void) pthread_mutex_lock(&session_p->session_mutex);
blowfish_ctx = (blowfish_ctx_t *)soft_blowfish_ctx->blowfish_cbc;
- if (blowfish_ctx != NULL) {
- bzero(blowfish_ctx->bc_keysched,
- blowfish_ctx->bc_keysched_len);
- free(soft_blowfish_ctx->blowfish_cbc);
- }
-
- bzero(soft_blowfish_ctx->key_sched, soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
- free(session_p->encrypt.context);
+ freezero(blowfish_ctx, sizeof (cbc_ctx_t));
+ freezero(soft_blowfish_ctx->key_sched,
+ soft_blowfish_ctx->keysched_len);
+ freezero(session_p->encrypt.context,
+ sizeof (soft_blowfish_ctx_t));
session_p->encrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
@@ -465,15 +462,11 @@ soft_blowfish_decrypt_common(soft_session_t *session_p, CK_BYTE_PTR pEncrypted,
cleanup:
(void) pthread_mutex_lock(&session_p->session_mutex);
blowfish_ctx = (blowfish_ctx_t *)soft_blowfish_ctx->blowfish_cbc;
- if (blowfish_ctx != NULL) {
- bzero(blowfish_ctx->bc_keysched,
- blowfish_ctx->bc_keysched_len);
- free(soft_blowfish_ctx->blowfish_cbc);
- }
-
- bzero(soft_blowfish_ctx->key_sched, soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
- free(session_p->decrypt.context);
+ free(blowfish_ctx);
+ freezero(soft_blowfish_ctx->key_sched,
+ soft_blowfish_ctx->keysched_len);
+ freezero(session_p->decrypt.context,
+ sizeof (soft_blowfish_ctx_t));
session_p->decrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDESCrypt.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDESCrypt.c
index 8159e93624..a6a40dc743 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDESCrypt.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDESCrypt.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <pthread.h>
@@ -448,14 +449,9 @@ encrypt_failed:
cleanup:
(void) pthread_mutex_lock(&session_p->session_mutex);
des_ctx = (des_ctx_t *)soft_des_ctx->des_cbc;
- if (des_ctx != NULL) {
- bzero(des_ctx->dc_keysched, des_ctx->dc_keysched_len);
- free(soft_des_ctx->des_cbc);
- }
-
- bzero(soft_des_ctx->key_sched, soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
- free(session_p->encrypt.context);
+ free(des_ctx);
+ freezero(soft_des_ctx->key_sched, soft_des_ctx->keysched_len);
+ freezero(session_p->encrypt.context, sizeof (soft_des_ctx_t));
session_p->encrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
@@ -777,15 +773,9 @@ decrypt_failed:
cleanup:
(void) pthread_mutex_lock(&session_p->session_mutex);
des_ctx = (des_ctx_t *)soft_des_ctx->des_cbc;
- if (des_ctx != NULL) {
- bzero(des_ctx->dc_keysched, des_ctx->dc_keysched_len);
- free(soft_des_ctx->des_cbc);
- }
-
- bzero(soft_des_ctx->key_sched, soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
- free(session_p->decrypt.context);
- session_p->decrypt.context = NULL;
+ free(des_ctx);
+ freezero(soft_des_ctx->key_sched, soft_des_ctx->keysched_len);
+ freezero(session_p->decrypt.context, sizeof (soft_des_ctx_t));
(void) pthread_mutex_unlock(&session_p->session_mutex);
return (rv);
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDecryptUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDecryptUtil.c
index 355c3b5bdd..1896f1689b 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDecryptUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDecryptUtil.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <pthread.h>
@@ -151,10 +152,10 @@ cbc_common:
soft_des_ctx->ivec, key_p->key_type);
if (soft_des_ctx->des_cbc == NULL) {
- bzero(soft_des_ctx->key_sched,
+ freezero(soft_des_ctx->key_sched,
soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
- free(session_p->decrypt.context);
+ freezero(session_p->decrypt.context,
+ sizeof (soft_des_ctx_t));
session_p->decrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
return (CKR_HOST_MEMORY);
@@ -207,10 +208,10 @@ cbc_common:
soft_aes_ctx->ivec);
if (soft_aes_ctx->aes_cbc == NULL) {
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
- free(session_p->decrypt.context);
+ freezero(session_p->decrypt.context,
+ sizeof (soft_aes_ctx_t));
session_p->decrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
return (CKR_HOST_MEMORY);
@@ -247,10 +248,10 @@ cbc_common:
pMechanism->pParameter);
if (soft_aes_ctx->aes_cbc == NULL) {
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
- free(session_p->decrypt.context);
+ freezero(session_p->decrypt.context,
+ sizeof (soft_aes_ctx_t));
session_p->decrypt.context = NULL;
rv = CKR_HOST_MEMORY;
}
@@ -292,10 +293,11 @@ cbc_common:
soft_blowfish_ctx->ivec);
if (soft_blowfish_ctx->blowfish_cbc == NULL) {
- bzero(soft_blowfish_ctx->key_sched,
+ freezero(soft_blowfish_ctx->key_sched,
soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
- free(session_p->decrypt.context = NULL);
+ freezero(session_p->decrypt.context,
+ sizeof (soft_blowfish_ctx_t));
+ session_p->decrypt.context = NULL;
(void) pthread_mutex_unlock(&session_p->session_mutex);
return (CKR_HOST_MEMORY);
}
@@ -554,9 +556,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
rv = CKR_ENCRYPTED_DATA_LEN_RANGE;
/* Cleanup memory space. */
free(soft_des_ctx->des_cbc);
- bzero(soft_des_ctx->key_sched,
+ freezero(soft_des_ctx->key_sched,
soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
goto clean1;
}
@@ -608,9 +609,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
/* Cleanup memory space. */
free(soft_des_ctx->des_cbc);
- bzero(soft_des_ctx->key_sched,
+ freezero(soft_des_ctx->key_sched,
soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
}
@@ -641,8 +641,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
/* Cleanup memory space. */
free(soft_des_ctx->des_cbc);
- bzero(soft_des_ctx->key_sched, soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
+ freezero(soft_des_ctx->key_sched,
+ soft_des_ctx->keysched_len);
break;
}
@@ -663,9 +663,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
rv = CKR_ENCRYPTED_DATA_LEN_RANGE;
/* Cleanup memory space. */
free(soft_aes_ctx->aes_cbc);
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
goto clean1;
}
@@ -717,9 +716,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
/* Cleanup memory space. */
free(soft_aes_ctx->aes_cbc);
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
}
@@ -747,8 +745,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
/* Cleanup memory space. */
free(soft_aes_ctx->aes_cbc);
- bzero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
+ freezero(soft_aes_ctx->key_sched,
+ soft_aes_ctx->keysched_len);
break;
}
@@ -784,8 +782,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
/* Cleanup memory space. */
free(ctr_ctx);
- bzero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
+ freezero(soft_aes_ctx->key_sched,
+ soft_aes_ctx->keysched_len);
break;
}
@@ -805,9 +803,8 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
}
free(soft_blowfish_ctx->blowfish_cbc);
- bzero(soft_blowfish_ctx->key_sched,
+ freezero(soft_blowfish_ctx->key_sched,
soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
break;
}
@@ -815,7 +812,7 @@ soft_decrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastPart,
case CKM_RC4:
{
ARCFour_key *key = (ARCFour_key *)session_p->decrypt.context;
- bzero(key, sizeof (*key));
+ explicit_bzero(key, sizeof (*key));
*pulLastPartLen = 0;
break;
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDigestUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDigestUtil.c
index f1f685ed40..d1d0dbd17b 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDigestUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDigestUtil.c
@@ -21,6 +21,7 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <strings.h>
@@ -302,7 +303,7 @@ soft_digest_common(soft_session_t *session_p, CK_BYTE_PTR pData,
/* Paranoia on behalf of C_DigestKey callers: bzero the context */
if (session_p->digest.flags & CRYPTO_KEY_DIGESTED) {
- bzero(session_p->digest.context, len);
+ explicit_bzero(session_p->digest.context, len);
session_p->digest.flags &= ~CRYPTO_KEY_DIGESTED;
}
*pulDigestLen = digestLen;
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softEncryptUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softEncryptUtil.c
index aebacaa868..fb7da5af3b 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softEncryptUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softEncryptUtil.c
@@ -22,6 +22,7 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <pthread.h>
@@ -175,10 +176,10 @@ cbc_common:
soft_des_ctx->ivec, key_p->key_type);
if (soft_des_ctx->des_cbc == NULL) {
- bzero(soft_des_ctx->key_sched,
+ freezero(soft_des_ctx->key_sched,
soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
- free(session_p->encrypt.context);
+ freezero(session_p->encrypt.context,
+ sizeof (soft_des_ctx_t));
session_p->encrypt.context = NULL;
rv = CKR_HOST_MEMORY;
}
@@ -239,10 +240,10 @@ cbc_common:
soft_aes_ctx->ivec);
}
if (soft_aes_ctx->aes_cbc == NULL) {
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
- free(session_p->encrypt.context);
+ freezero(session_p->encrypt.context,
+ sizeof (soft_aes_ctx_t));
session_p->encrypt.context = NULL;
rv = CKR_HOST_MEMORY;
}
@@ -278,10 +279,10 @@ cbc_common:
pMechanism->pParameter);
if (soft_aes_ctx->aes_cbc == NULL) {
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
- free(session_p->encrypt.context);
+ freezero(session_p->encrypt.context,
+ sizeof (soft_aes_ctx_t));
session_p->encrypt.context = NULL;
rv = CKR_HOST_MEMORY;
}
@@ -341,10 +342,10 @@ cbc_common:
soft_blowfish_ctx->ivec);
if (soft_blowfish_ctx->blowfish_cbc == NULL) {
- bzero(soft_blowfish_ctx->key_sched,
+ freezero(soft_blowfish_ctx->key_sched,
soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
- free(session_p->encrypt.context);
+ freezero(session_p->encrypt.context,
+ sizeof (soft_blowfish_ctx_t));
session_p->encrypt.context = NULL;
rv = CKR_HOST_MEMORY;
}
@@ -628,9 +629,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
/* Cleanup memory space. */
free(soft_des_ctx->des_cbc);
- bzero(soft_des_ctx->key_sched,
+ freezero(soft_des_ctx->key_sched,
soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
}
break;
@@ -659,8 +659,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
/* Cleanup memory space. */
free(soft_des_ctx->des_cbc);
- bzero(soft_des_ctx->key_sched, soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
+ freezero(soft_des_ctx->key_sched,
+ soft_des_ctx->keysched_len);
break;
}
@@ -723,9 +723,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
/* Cleanup memory space. */
free(soft_aes_ctx->aes_cbc);
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
}
break;
@@ -763,9 +762,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
/* Cleanup memory space. */
free(soft_aes_ctx->aes_cbc);
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
}
break;
@@ -791,8 +789,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
/* Cleanup memory space. */
free(soft_aes_ctx->aes_cbc);
- bzero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
+ freezero(soft_aes_ctx->key_sched,
+ soft_aes_ctx->keysched_len);
break;
}
@@ -827,8 +825,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
/* Cleanup memory space. */
free(ctr_ctx);
- bzero(soft_aes_ctx->key_sched, soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
+ freezero(soft_aes_ctx->key_sched,
+ soft_aes_ctx->keysched_len);
break;
}
@@ -852,9 +850,8 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
}
free(soft_blowfish_ctx->blowfish_cbc);
- bzero(soft_blowfish_ctx->key_sched,
+ freezero(soft_blowfish_ctx->key_sched,
soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
break;
}
@@ -865,7 +862,7 @@ soft_encrypt_final(soft_session_t *session_p, CK_BYTE_PTR pLastEncryptedPart,
*pulLastEncryptedPartLen = 0;
if (pLastEncryptedPart == NULL)
goto clean1;
- bzero(key, sizeof (*key));
+ explicit_bzero(key, sizeof (*key));
break;
}
default:
@@ -921,13 +918,12 @@ soft_crypt_cleanup(soft_session_t *session_p, boolean_t encrypt,
if (soft_des_ctx != NULL) {
des_ctx = (des_ctx_t *)soft_des_ctx->des_cbc;
if (des_ctx != NULL) {
- bzero(des_ctx->dc_keysched,
+ explicit_bzero(des_ctx->dc_keysched,
des_ctx->dc_keysched_len);
free(soft_des_ctx->des_cbc);
}
- bzero(soft_des_ctx->key_sched,
+ freezero(soft_des_ctx->key_sched,
soft_des_ctx->keysched_len);
- free(soft_des_ctx->key_sched);
}
break;
}
@@ -944,13 +940,12 @@ soft_crypt_cleanup(soft_session_t *session_p, boolean_t encrypt,
if (soft_aes_ctx != NULL) {
aes_ctx = (aes_ctx_t *)soft_aes_ctx->aes_cbc;
if (aes_ctx != NULL) {
- bzero(aes_ctx->ac_keysched,
+ explicit_bzero(aes_ctx->ac_keysched,
aes_ctx->ac_keysched_len);
free(soft_aes_ctx->aes_cbc);
}
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
}
break;
}
@@ -965,14 +960,13 @@ soft_crypt_cleanup(soft_session_t *session_p, boolean_t encrypt,
blowfish_ctx =
(blowfish_ctx_t *)soft_blowfish_ctx->blowfish_cbc;
if (blowfish_ctx != NULL) {
- bzero(blowfish_ctx->bc_keysched,
+ explicit_bzero(blowfish_ctx->bc_keysched,
blowfish_ctx->bc_keysched_len);
free(soft_blowfish_ctx->blowfish_cbc);
}
- bzero(soft_blowfish_ctx->key_sched,
+ freezero(soft_blowfish_ctx->key_sched,
soft_blowfish_ctx->keysched_len);
- free(soft_blowfish_ctx->key_sched);
}
break;
}
@@ -982,7 +976,7 @@ soft_crypt_cleanup(soft_session_t *session_p, boolean_t encrypt,
ARCFour_key *key = (ARCFour_key *)active_op->context;
if (key != NULL)
- bzero(key, sizeof (*key));
+ explicit_bzero(key, sizeof (*key));
break;
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeysUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeysUtil.c
index a48ade7224..c476752942 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeysUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeysUtil.c
@@ -21,6 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <pthread.h>
@@ -822,26 +823,11 @@ digest_done:
(void) memcpy(keybuf, A, keysize);
cleanup:
- if (A) {
- bzero(A, Alen);
- free(A);
- }
- if (Ai) {
- bzero(Ai, AiLen);
- free(Ai);
- }
- if (B) {
- bzero(B, Blen);
- free(B);
- }
- if (D) {
- bzero(D, Dlen);
- free(D);
- }
- if (I) {
- bzero(I, Ilen);
- free(I);
- }
+ freezero(A, Alen);
+ freezero(Ai, AiLen);
+ freezero(B, Blen);
+ freezero(D, Dlen);
+ freezero(I, Ilen);
return (rv);
}
@@ -1400,7 +1386,7 @@ soft_generate_pkcs5_pbkdf2_key(soft_session_t *session_p,
keydata += hLen;
}
(void) soft_delete_object(session_p, hmac_key, B_FALSE, B_FALSE);
- free(salt);
+ freezero(salt, params->ulSaltSourceDataLen);
return (rv);
}
@@ -1535,14 +1521,12 @@ soft_wrapkey(soft_session_t *session_p, CK_MECHANISM_PTR pMechanism,
cleanup_wrap:
if (padded_data != NULL && padded_len != plain_len) {
/* Clear buffer before returning to memory pool. */
- (void) memset(padded_data, 0x0, padded_len);
- free(padded_data);
+ freezero(padded_data, padded_len);
}
if ((hkey_p->class != CKO_SECRET_KEY) && (plain_data != NULL)) {
/* Clear buffer before returning to memory pool. */
- (void) memset(plain_data, 0x0, plain_len);
- free(plain_data);
+ freezero(plain_data, plain_len);
}
return (rv);
@@ -1822,8 +1806,7 @@ soft_unwrapkey(soft_session_t *session_p, CK_MECHANISM_PTR pMechanism,
if (new_objp->class != CKO_SECRET_KEY) {
/* Clear buffer before returning to memory pool. */
- (void) memset(plain_data, 0x0, plain_len);
- free(plain_data);
+ freezero(plain_data, plain_len);
}
*phKey = (CK_OBJECT_HANDLE)new_objp;
@@ -1834,8 +1817,7 @@ cleanup_unwrap:
/* The decrypted private key buffer must be freed explicitly. */
if ((new_objp->class != CKO_SECRET_KEY) && (plain_data != NULL)) {
/* Clear buffer before returning to memory pool. */
- (void) memset(plain_data, 0x0, plain_len);
- free(plain_data);
+ freezero(plain_data, plain_len);
}
/* sck and new_objp are indirectly free()d inside these functions */
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c
index cab06ce41d..7bafbc1eea 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
*/
#include <crypt.h>
@@ -98,8 +99,11 @@ soft_gen_hashed_pin(CK_UTF8CHAR_PTR pPin, char **result, char **salt)
}
if ((*result = crypt((char *)pPin, *salt)) == NULL) {
- if (new_salt)
- free(*salt);
+ if (new_salt) {
+ size_t saltlen = strlen(*salt) + 1;
+
+ freezero(*salt, saltlen);
+ }
return (-1);
}
@@ -119,6 +123,7 @@ soft_verify_pin(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen)
uchar_t *tmp_pin = NULL;
boolean_t pin_initialized = B_FALSE;
CK_RV rv = CKR_OK;
+ size_t len = 0;
/*
* Check to see if keystore is initialized.
@@ -189,13 +194,18 @@ soft_verify_pin(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen)
}
cleanup:
- if (salt)
- free(salt);
- if (tmp_pin)
- free(tmp_pin);
- if (ks_cryptpin)
- free(ks_cryptpin);
-
+ if (salt) {
+ len = strlen(salt) + 1;
+ freezero(salt, len);
+ }
+ if (tmp_pin) {
+ len = strlen((char *)tmp_pin) + 1;
+ freezero(tmp_pin, len);
+ }
+ if (ks_cryptpin) {
+ len = strlen(ks_cryptpin) + 1;
+ freezero(ks_cryptpin, len);
+ }
return (rv);
}
@@ -213,6 +223,7 @@ soft_setpin(CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen,
boolean_t pin_initialized = B_FALSE;
uchar_t *tmp_old_pin = NULL, *tmp_new_pin = NULL;
CK_RV rv = CKR_OK;
+ size_t len = 0;
/*
* Check to see if keystore is initialized.
@@ -290,14 +301,22 @@ soft_setpin(CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen,
}
cleanup:
- if (salt)
- free(salt);
- if (ks_cryptpin)
- free(ks_cryptpin);
- if (tmp_old_pin)
- free(tmp_old_pin);
- if (tmp_new_pin)
- free(tmp_new_pin);
+ if (salt) {
+ len = strlen(salt) + 1;
+ freezero(salt, len);
+ }
+ if (ks_cryptpin) {
+ len = strlen(ks_cryptpin) + 1;
+ freezero(ks_cryptpin, len);
+ }
+ if (tmp_old_pin) {
+ len = strlen((char *)tmp_old_pin) + 1;
+ freezero(tmp_old_pin, len);
+ }
+ if (tmp_new_pin) {
+ len = strlen((char *)tmp_new_pin) + 1;
+ freezero(tmp_new_pin, len);
+ }
return (rv);
}
@@ -475,9 +494,7 @@ soft_keystore_unpack_obj(soft_object_t *obj, ks_obj_t *ks_obj)
}
rv = soft_add_extra_attr(&template, obj);
- if (template.pValue) {
- free(template.pValue);
- }
+ freezero(template.pValue, template.ulValueLen);
if (rv != CKR_OK) {
return (rv);
@@ -543,7 +560,7 @@ soft_unpack_obj_attribute(uchar_t *buf, biginteger_t *key_dest,
rv = get_bigint_attr_from_template(key_dest, &template);
}
- free(template.pValue);
+ freezero(template.pValue, template.ulValueLen);
if (rv != CKR_OK) {
return (rv);
}
@@ -1857,25 +1874,15 @@ soft_put_object_to_keystore(soft_object_t *objp)
return (rv);
(void) pthread_mutex_lock(&soft_slot.slot_mutex);
- if (objp->object_type == TOKEN_PUBLIC) {
- if ((soft_keystore_put_new_obj(buf, len, B_TRUE,
- B_FALSE, &objp->ks_handle)) == -1) {
- (void) pthread_mutex_unlock(&soft_slot.slot_mutex);
- free(buf);
- return (CKR_FUNCTION_FAILED);
- }
- } else {
- if ((soft_keystore_put_new_obj(buf, len, B_FALSE,
- B_FALSE, &objp->ks_handle)) == -1) {
- (void) pthread_mutex_unlock(&soft_slot.slot_mutex);
- free(buf);
- return (CKR_FUNCTION_FAILED);
- }
+ if (soft_keystore_put_new_obj(buf, len,
+ !!(objp->object_type == TOKEN_PUBLIC), B_FALSE,
+ &objp->ks_handle) == -1) {
+ rv = CKR_FUNCTION_FAILED;
}
(void) pthread_mutex_unlock(&soft_slot.slot_mutex);
- free(buf);
- return (CKR_OK);
+ freezero(buf, len);
+ return (rv);
}
/*
@@ -1897,11 +1904,11 @@ soft_modify_object_to_keystore(soft_object_t *objp)
/* B_TRUE: caller has held a writelock on the keystore */
if (soft_keystore_modify_obj(&objp->ks_handle, buf, len,
B_TRUE) < 0) {
- return (CKR_FUNCTION_FAILED);
+ rv = CKR_FUNCTION_FAILED;
}
- free(buf);
- return (CKR_OK);
+ freezero(buf, len);
+ return (rv);
}
@@ -1942,8 +1949,7 @@ soft_get_token_objects_from_keystore(ks_search_type_t type)
/* Free the ks_obj list */
ks_obj_next = ks_obj->next;
- if (ks_obj->buf)
- free(ks_obj->buf);
+ freezero(ks_obj->buf, ks_obj->size);
free(ks_obj);
ks_obj = ks_obj_next;
}
@@ -1953,7 +1959,7 @@ soft_get_token_objects_from_keystore(ks_search_type_t type)
cleanup:
while (ks_obj) {
ks_obj_next = ks_obj->next;
- free(ks_obj->buf);
+ freezero(ks_obj->buf, ks_obj->size);
free(ks_obj);
ks_obj = ks_obj_next;
}
@@ -2304,9 +2310,8 @@ soft_keystore_crypt(soft_object_t *key_p, uchar_t *ivec, boolean_t encrypt,
soft_aes_ctx->ivec);
if (soft_aes_ctx->aes_cbc == NULL) {
- bzero(soft_aes_ctx->key_sched,
+ freezero(soft_aes_ctx->key_sched,
soft_aes_ctx->keysched_len);
- free(soft_aes_ctx->key_sched);
if (encrypt) {
free(token_session.encrypt.context);
token_session.encrypt.context = NULL;
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystoreUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystoreUtil.c
index 0ebfa871e9..9023003b0d 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystoreUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystoreUtil.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
*/
/*
@@ -470,8 +471,7 @@ create_keystore()
(void) lock_file(fd, B_FALSE, B_FALSE);
(void) close(fd);
- if (hashed_pin_salt)
- free(hashed_pin_salt);
+ freezero(hashed_pin_salt, hashed_pin_salt_len);
return (0);
cleanup:
@@ -892,7 +892,7 @@ get_hashed_pin(int fd, char **hashed_pin)
if ((readn_nointr(fd, *hashed_pin, hashed_pin_size))
!= (ssize_t)hashed_pin_size) {
- free(*hashed_pin);
+ freezero(*hashed_pin, hashed_pin_size + 1);
*hashed_pin = NULL;
return (CKR_FUNCTION_FAILED);
}
@@ -1320,76 +1320,75 @@ reencrypt_obj(soft_object_t *new_enc_key, soft_object_t *new_hmac_key,
decrypted_len = 0;
if (soft_keystore_crypt(enc_key, old_iv, B_FALSE, buf, nread,
NULL, &decrypted_len) != CKR_OK) {
- free(buf);
+ freezero(buf, nread);
goto cleanup;
}
decrypted_buf = malloc(decrypted_len);
if (decrypted_buf == NULL) {
- free(buf);
+ freezero(buf, nread);
goto cleanup;
}
if (soft_keystore_crypt(enc_key, old_iv, B_FALSE, buf, nread,
decrypted_buf, &decrypted_len) != CKR_OK) {
- free(buf);
- free(decrypted_buf);
- goto cleanup;
+ freezero(buf, nread);
+ freezero(decrypted_buf, decrypted_len);
}
- free(buf);
+ freezero(buf, nread);
/* re-encrypt with new key */
encrypted_len = 0;
if (soft_keystore_crypt(new_enc_key, iv, B_TRUE, decrypted_buf,
decrypted_len, NULL, &encrypted_len) != CKR_OK) {
- free(decrypted_buf);
+ freezero(decrypted_buf, decrypted_len);
goto cleanup;
}
buf = malloc(encrypted_len);
if (buf == NULL) {
- free(decrypted_buf);
+ freezero(decrypted_buf, decrypted_len);
goto cleanup;
}
if (soft_keystore_crypt(new_enc_key, iv, B_TRUE, decrypted_buf,
decrypted_len, buf, &encrypted_len) != CKR_OK) {
- free(buf);
- free(decrypted_buf);
+ freezero(buf, encrypted_len);
+ freezero(buf, decrypted_len);
goto cleanup;
}
- free(decrypted_buf);
+ freezero(decrypted_buf, decrypted_len);
/* calculate hmac on re-encrypted data using new hmac key */
hmac_len = OBJ_HMAC_SIZE;
if (soft_keystore_hmac(new_hmac_key, B_TRUE, buf,
encrypted_len, hmac, &hmac_len) != CKR_OK) {
- free(buf);
+ freezero(buf, encrypted_len);
goto cleanup;
}
/* just for sanity check */
if (hmac_len != OBJ_HMAC_SIZE) {
- free(buf);
+ freezero(buf, encrypted_len);
goto cleanup;
}
/* write new hmac */
if (writen_nointr(new_fd, (char *)hmac, OBJ_HMAC_SIZE)
!= OBJ_HMAC_SIZE) {
- free(buf);
+ freezero(buf, encrypted_len);
goto cleanup;
}
/* write re-encrypted buffer to temp file */
if (writen_nointr(new_fd, (void *)buf, encrypted_len)
!= encrypted_len) {
- free(buf);
+ freezero(buf, encrypted_len);
goto cleanup;
}
- free(buf);
+ freezero(buf, encrypted_len);
ret_val = 0;
cleanup:
@@ -1547,11 +1546,12 @@ soft_keystore_setpin(uchar_t *oldpin, uchar_t *newpin, boolean_t lock_held)
}
if (writen_nointr(tmp_ks_fd, (void *)new_crypt_salt,
KS_KEY_SALT_SIZE) != KS_KEY_SALT_SIZE) {
- free(new_crypt_salt);
+ freezero(new_crypt_salt,
+ KS_KEY_SALT_SIZE);
(void) soft_cleanup_object(new_crypt_key);
goto cleanup;
}
- free(new_crypt_salt);
+ freezero(new_crypt_salt, KS_KEY_SALT_SIZE);
if (soft_gen_hmac_key(newpin, &new_hmac_key, &new_hmac_salt)
!= CKR_OK) {
@@ -1560,10 +1560,11 @@ soft_keystore_setpin(uchar_t *oldpin, uchar_t *newpin, boolean_t lock_held)
}
if (writen_nointr(tmp_ks_fd, (void *)new_hmac_salt,
KS_HMAC_SALT_SIZE) != KS_HMAC_SALT_SIZE) {
- free(new_hmac_salt);
+ freezero(new_hmac_salt,
+ KS_HMAC_SALT_SIZE);
goto cleanup3;
}
- free(new_hmac_salt);
+ freezero(new_hmac_salt, KS_HMAC_SALT_SIZE);
} else {
if (soft_gen_crypt_key(newpin, &new_crypt_key,
(CK_BYTE **)&crypt_salt) != CKR_OK) {
@@ -1612,13 +1613,15 @@ soft_keystore_setpin(uchar_t *oldpin, uchar_t *newpin, boolean_t lock_held)
if ((readn_nointr(fd, hashed_pin_salt, hashed_pin_salt_length)) !=
(ssize_t)hashed_pin_salt_length) {
- free(hashed_pin_salt);
+ freezero(hashed_pin_salt,
+ hashed_pin_salt_length + 1);
goto cleanup3;
}
if ((writen_nointr(tmp_ks_fd, hashed_pin_salt, hashed_pin_salt_length))
!= (ssize_t)hashed_pin_salt_length) {
- free(hashed_pin_salt);
+ freezero(hashed_pin_salt,
+ hashed_pin_salt_length + 1);
goto cleanup3;
}
@@ -1627,11 +1630,12 @@ soft_keystore_setpin(uchar_t *oldpin, uchar_t *newpin, boolean_t lock_held)
/* old hashed pin length and value can be ignored, generate new one */
if (soft_gen_hashed_pin(newpin, &new_hashed_pin,
&hashed_pin_salt) < 0) {
- free(hashed_pin_salt);
+ freezero(hashed_pin_salt,
+ hashed_pin_salt_length + 1);
goto cleanup3;
}
- free(hashed_pin_salt);
+ freezero(hashed_pin_salt, hashed_pin_salt_length + 1);
if (new_hashed_pin == NULL) {
goto cleanup3;
@@ -1763,12 +1767,8 @@ cleanup:
ret_val = 1;
}
}
- if (crypt_salt != NULL) {
- free(crypt_salt);
- }
- if (hmac_salt != NULL) {
- free(hmac_salt);
- }
+ freezero(crypt_salt, KS_KEY_SALT_SIZE);
+ freezero(hmac_salt, KS_HMAC_SALT_SIZE);
(void) close(fd);
(void) close(tmp_ks_fd);
if (ret_val != 0) {
@@ -1855,17 +1855,13 @@ cleanup:
/* unlock the file */
(void) lock_file(fd, B_TRUE, B_FALSE);
(void) close(fd);
- if (crypt_salt != NULL) {
- free(crypt_salt);
- }
- if (hmac_salt != NULL) {
- free(hmac_salt);
- }
+ freezero(crypt_salt, KS_KEY_SALT_SIZE);
+ freezero(hmac_salt, KS_HMAC_SALT_SIZE);
return (ret_val);
}
/*
- * FUNCTION: soft_keystore_get_objs
+ * FUNCTION: soft_keystore_get_objs
*
* ARGUMENTS:
*
@@ -1980,7 +1976,7 @@ cleanup:
tmp = *result_obj_list;
while (tmp) {
*result_obj_list = tmp->next;
- free(tmp->buf);
+ freezero(tmp->buf, tmp->size);
free(tmp);
tmp = *result_obj_list;
}
@@ -2087,7 +2083,7 @@ soft_keystore_get_single_obj(ks_obj_handle_t *ks_handle,
hmac_size = OBJ_HMAC_SIZE;
if (soft_keystore_hmac(hmac_key, B_FALSE, buf,
nread, obj_hmac, &hmac_size) != CKR_OK) {
- free(buf);
+ freezero(buf, nread);
rv = CKR_FUNCTION_FAILED;
goto cleanup;
}
@@ -2095,22 +2091,22 @@ soft_keystore_get_single_obj(ks_obj_handle_t *ks_handle,
/* decrypt object */
if (soft_keystore_crypt(enc_key, iv, B_FALSE, buf, nread,
NULL, &out_len) != CKR_OK) {
- free(buf);
+ freezero(buf, nread);
rv = CKR_FUNCTION_FAILED;
goto cleanup;
}
decrypted_buf = malloc(sizeof (uchar_t) * out_len);
if (decrypted_buf == NULL) {
- free(buf);
+ freezero(buf, nread);
rv = CKR_HOST_MEMORY;
goto cleanup;
}
if (soft_keystore_crypt(enc_key, iv, B_FALSE, buf, nread,
decrypted_buf, &out_len) != CKR_OK) {
- free(decrypted_buf);
- free(buf);
+ freezero(buf, nread);
+ freezero(decrypted_buf, out_len);
rv = CKR_FUNCTION_FAILED;
goto cleanup;
}
@@ -2126,14 +2122,14 @@ soft_keystore_get_single_obj(ks_obj_handle_t *ks_handle,
*/
obj->buf = malloc(sizeof (uchar_t) * (out_len - MAXPATHLEN));
if (obj->buf == NULL) {
- free(decrypted_buf);
- free(buf);
+ freezero(buf, nread);
+ freezero(decrypted_buf, out_len);
rv = CKR_HOST_MEMORY;
goto cleanup;
}
(void) memcpy(obj->buf, decrypted_buf + MAXPATHLEN, obj->size);
- free(decrypted_buf);
- free(buf);
+ freezero(buf, nread);
+ freezero(decrypted_buf, out_len);
*return_obj = obj;
}
@@ -2155,7 +2151,7 @@ cleanup:
/*
- * FUNCTION: soft_keystore_put_new_obj
+ * FUNCTION: soft_keystore_put_new_obj
*
* ARGUMENTS:
* buf: buffer containing un-encrypted data
@@ -2336,53 +2332,53 @@ soft_keystore_put_new_obj(uchar_t *buf, size_t len, boolean_t public,
if (soft_keystore_crypt(enc_key, iv,
B_TRUE, prepared_buf, prepared_len,
NULL, &out_len) != CKR_OK) {
- free(prepared_buf);
+ freezero(prepared_buf, prepared_len);
goto cleanup2;
}
encrypted_buf = malloc(out_len * sizeof (char));
if (encrypted_buf == NULL) {
- free(prepared_buf);
+ freezero(prepared_buf, prepared_len);
goto cleanup2;
}
if (soft_keystore_crypt(enc_key, iv,
B_TRUE, prepared_buf, prepared_len,
encrypted_buf, &out_len) != CKR_OK) {
- free(encrypted_buf);
- free(prepared_buf);
+ freezero(encrypted_buf, out_len);
+ freezero(prepared_buf, prepared_len);
goto cleanup2;
}
- free(prepared_buf);
+ freezero(prepared_buf, prepared_len);
/* calculate HMAC of encrypted object */
hmac_size = OBJ_HMAC_SIZE;
if (soft_keystore_hmac(hmac_key, B_TRUE, encrypted_buf,
out_len, obj_hmac, &hmac_size) != CKR_OK) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
if (hmac_size != OBJ_HMAC_SIZE) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
/* write hmac */
if (writen_nointr(obj_fd, (void *)obj_hmac,
sizeof (obj_hmac)) != sizeof (obj_hmac)) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
/* write encrypted object */
if (writen_nointr(obj_fd, (void *)encrypted_buf, out_len)
!= out_len) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
}
@@ -2421,6 +2417,8 @@ soft_keystore_put_new_obj(uchar_t *buf, size_t len, boolean_t public,
}
}
(void) close(fd);
+ explicit_bzero(obj_hmac, sizeof (obj_hmac));
+ explicit_bzero(iv, sizeof (iv));
return (0);
cleanup2:
@@ -2438,6 +2436,8 @@ cleanup:
}
(void) close(fd);
+ explicit_bzero(obj_hmac, sizeof (obj_hmac));
+ explicit_bzero(iv, sizeof (iv));
return (-1);
}
@@ -2591,44 +2591,44 @@ soft_keystore_modify_obj(ks_obj_handle_t *ks_handle, uchar_t *buf,
encrypted_buf = malloc(out_len * sizeof (char));
if (encrypted_buf == NULL) {
- free(prepared_buf);
+ freezero(prepared_buf, prepared_len);
goto cleanup2;
}
if (soft_keystore_crypt(enc_key, iv, B_TRUE, prepared_buf,
prepared_len, encrypted_buf, &out_len) != CKR_OK) {
- free(encrypted_buf);
- free(prepared_buf);
+ freezero(prepared_buf, prepared_len);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
- free(prepared_buf);
+ freezero(prepared_buf, prepared_len);
/* calculate hmac on encrypted buf */
hmac_size = OBJ_HMAC_SIZE;
if (soft_keystore_hmac(hmac_key, B_TRUE, encrypted_buf,
out_len, obj_hmac, &hmac_size) != CKR_OK) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
if (hmac_size != OBJ_HMAC_SIZE) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
if (writen_nointr(tmp_fd, (char *)obj_hmac, OBJ_HMAC_SIZE)
!= OBJ_HMAC_SIZE) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
if (writen_nointr(tmp_fd, (void *)encrypted_buf, out_len)
!= out_len) {
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
goto cleanup2;
}
- free(encrypted_buf);
+ freezero(encrypted_buf, out_len);
}
(void) close(tmp_fd);
@@ -2665,6 +2665,8 @@ soft_keystore_modify_obj(ks_obj_handle_t *ks_handle, uchar_t *buf,
(void) close(fd);
+ explicit_bzero(iv, sizeof (iv));
+ explicit_bzero(obj_hmac, sizeof (obj_hmac));
return (0); /* All operations completed successfully */
cleanup2:
@@ -2679,6 +2681,8 @@ cleanup:
(void) lock_file(ks_fd, B_FALSE, B_FALSE);
(void) close(ks_fd);
(void) remove(tmp_ks_name);
+ explicit_bzero(iv, sizeof (iv));
+ explicit_bzero(obj_hmac, sizeof (obj_hmac));
return (-1);
}
@@ -2803,7 +2807,7 @@ soft_keystore_get_pin_salt(char **salt)
if ((readn_nointr(fd, *salt, hashed_pin_salt_size))
!= (ssize_t)hashed_pin_salt_size) {
- free(*salt);
+ freezero(*salt, hashed_pin_salt_size + 1);
goto cleanup;
}
(*salt)[hashed_pin_salt_size] = '\0';
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softMAC.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softMAC.c
index b5930bf89e..273d2b7603 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softMAC.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softMAC.c
@@ -22,10 +22,9 @@
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2018, Joyent, Inc.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <pthread.h>
#include <sys/md5.h>
#include <sys/sha1.h>
@@ -562,12 +561,10 @@ clean_exit:
(void) pthread_mutex_lock(&session_p->session_mutex);
if (sign_op) {
- bzero(session_p->sign.context, sizeof (soft_hmac_ctx_t));
- free(session_p->sign.context);
+ freezero(session_p->sign.context, sizeof (soft_hmac_ctx_t));
session_p->sign.context = NULL;
} else {
- bzero(session_p->verify.context, sizeof (soft_hmac_ctx_t));
- free(session_p->verify.context);
+ freezero(session_p->verify.context, sizeof (soft_hmac_ctx_t));
session_p->verify.context = NULL;
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSSL.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSSL.c
index fb28932fd0..8ba97d55ea 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSSL.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSSL.c
@@ -21,6 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2018, Joyent, Inc.
*/
#include <fcntl.h>
@@ -925,8 +926,7 @@ soft_ssl_key_and_mac_derive(soft_session_t *sp, CK_MECHANISM_PTR mech,
if (new_tmpl_allocated)
free(new_tmpl);
- if (export_keys != NULL)
- free(export_keys);
+ freezero(export_keys, 2 * MD5_HASH_SIZE);
return (rv);
@@ -955,8 +955,7 @@ out_err:
if (new_tmpl_allocated)
free(new_tmpl);
- if (export_keys != NULL)
- free(export_keys);
+ freezero(export_keys, 2 * MD5_HASH_SIZE);
return (rv);
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSignUtil.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSignUtil.c
index f8824df2dd..ccf746dc40 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSignUtil.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSignUtil.c
@@ -22,6 +22,7 @@
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2018, Joyent, Inc.
*/
#include <stdlib.h>
@@ -562,8 +563,10 @@ soft_sign_verify_cleanup(soft_session_t *session_p, boolean_t sign,
case CKM_SHA384_HMAC:
case CKM_SHA512_HMAC_GENERAL:
case CKM_SHA512_HMAC:
- if (active_op->context != NULL)
- bzero(active_op->context, sizeof (soft_hmac_ctx_t));
+ if (active_op->context != NULL) {
+ explicit_bzero(active_op->context,
+ sizeof (soft_hmac_ctx_t));
+ }
break;
case CKM_DES_MAC_GENERAL:
case CKM_DES_MAC:
@@ -572,8 +575,10 @@ soft_sign_verify_cleanup(soft_session_t *session_p, boolean_t sign,
session_p->encrypt.context = NULL;
session_p->encrypt.flags = 0;
}
- if (active_op->context != NULL)
- bzero(active_op->context, sizeof (soft_des_ctx_t));
+ if (active_op->context != NULL) {
+ explicit_bzero(active_op->context,
+ sizeof (soft_des_ctx_t));
+ }
break;
case CKM_AES_CMAC_GENERAL:
@@ -583,8 +588,10 @@ soft_sign_verify_cleanup(soft_session_t *session_p, boolean_t sign,
session_p->encrypt.context = NULL;
session_p->encrypt.flags = 0;
}
- if (active_op->context != NULL)
- bzero(active_op->context, sizeof (soft_aes_ctx_t));
+ if (active_op->context != NULL) {
+ explicit_bzero(active_op->context,
+ sizeof (soft_aes_ctx_t));
+ }
break;
}
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSlotToken.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSlotToken.c
index 602b72486e..c8c3753f63 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSlotToken.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softSlotToken.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
*/
#include <strings.h>
@@ -337,8 +338,11 @@ C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
pInfo->flags |= CKF_USER_PIN_TO_BE_CHANGED;
}
- if (ks_cryptpin)
- free(ks_cryptpin);
+ if (ks_cryptpin != NULL) {
+ size_t cplen = strlen(ks_cryptpin) + 1;
+
+ freezero(ks_cryptpin, cplen);
+ }
/* Provide information about a token in the provided buffer */
(void) strncpy((char *)pInfo->label, SOFT_TOKEN_LABEL, 32);