9121 uint_t i;
9122 int error;
9123 uint_t attr;
9124 uint_t oattr;
9125 crypto_attr_type_t type;
9126 size_t old_len, new_len;
9127 offset_t offset;
9128
9129 if (nattr > DPROV_MAX_ATTR)
9130 return (CRYPTO_HOST_MEMORY);
9131
9132 if (!force) {
9133 /* verify that object can be created */
9134 if ((error = dprov_template_can_create(session, template,
9135 nattr, check_for_secret)) != CRYPTO_SUCCESS)
9136 return (error);
9137 }
9138
9139 /* allocate new object */
9140 object = kmem_zalloc(sizeof (dprov_object_t), KM_SLEEP);
9141 if (object == NULL)
9142 return (CRYPTO_HOST_MEMORY);
9143
9144 /* is it a token object? */
9145 /* check CKA_TOKEN attribute value */
9146 error = dprov_get_template_attr_boolean(template, nattr,
9147 DPROV_CKA_TOKEN, &is_token);
9148 if (error == CRYPTO_SUCCESS && is_token) {
9149 /* token object, add it to the per-instance object table */
9150 for (i = 0; i < DPROV_MAX_OBJECTS; i++)
9151 if (softc->ds_objects[i] == NULL)
9152 break;
9153 if (i == DPROV_MAX_OBJECTS)
9154 /* no free slot */
9155 return (CRYPTO_HOST_MEMORY);
9156 softc->ds_objects[i] = object;
9157 object->do_token_idx = i;
9158 DPROV_OBJECT_REFHOLD(object);
9159 }
9160
9161 /* add object to session object table */
9162 for (i = 0; i < DPROV_MAX_OBJECTS; i++)
|
9121 uint_t i;
9122 int error;
9123 uint_t attr;
9124 uint_t oattr;
9125 crypto_attr_type_t type;
9126 size_t old_len, new_len;
9127 offset_t offset;
9128
9129 if (nattr > DPROV_MAX_ATTR)
9130 return (CRYPTO_HOST_MEMORY);
9131
9132 if (!force) {
9133 /* verify that object can be created */
9134 if ((error = dprov_template_can_create(session, template,
9135 nattr, check_for_secret)) != CRYPTO_SUCCESS)
9136 return (error);
9137 }
9138
9139 /* allocate new object */
9140 object = kmem_zalloc(sizeof (dprov_object_t), KM_SLEEP);
9141
9142 /* is it a token object? */
9143 /* check CKA_TOKEN attribute value */
9144 error = dprov_get_template_attr_boolean(template, nattr,
9145 DPROV_CKA_TOKEN, &is_token);
9146 if (error == CRYPTO_SUCCESS && is_token) {
9147 /* token object, add it to the per-instance object table */
9148 for (i = 0; i < DPROV_MAX_OBJECTS; i++)
9149 if (softc->ds_objects[i] == NULL)
9150 break;
9151 if (i == DPROV_MAX_OBJECTS)
9152 /* no free slot */
9153 return (CRYPTO_HOST_MEMORY);
9154 softc->ds_objects[i] = object;
9155 object->do_token_idx = i;
9156 DPROV_OBJECT_REFHOLD(object);
9157 }
9158
9159 /* add object to session object table */
9160 for (i = 0; i < DPROV_MAX_OBJECTS; i++)
|