Blame usr/lib/common/dp_obj.c

Packit 8681c6
/*
Packit 8681c6
 * COPYRIGHT (c) International Business Machines Corp. 2001-2017
Packit 8681c6
 *
Packit 8681c6
 * This program is provided under the terms of the Common Public License,
Packit 8681c6
 * version 1.0 (CPL-1.0). Any use, reproduction or distribution for this
Packit 8681c6
 * software constitutes recipient's acceptance of CPL-1.0 terms which can be
Packit 8681c6
 * found in the file LICENSE file or at
Packit 8681c6
 * https://opensource.org/licenses/cpl1.0.php
Packit 8681c6
 */
Packit 8681c6
Packit 8681c6
// File:  dp_obj.c
Packit 8681c6
//
Packit 8681c6
// Domain Parameter Object functions
Packit 8681c6
Packit 8681c6
#include <pthread.h>
Packit 8681c6
#include <stdlib.h>
Packit 8681c6
Packit 8681c6
#include <string.h>             // for memcmp() et al
Packit 8681c6
Packit 8681c6
#include "pkcs11types.h"
Packit 8681c6
#include "defs.h"
Packit 8681c6
#include "host_defs.h"
Packit 8681c6
#include "h_extern.h"
Packit 8681c6
#include "trace.h"
Packit 8681c6
Packit 8681c6
#include "tok_spec_struct.h"
Packit 8681c6
Packit 8681c6
Packit 8681c6
// dp_object_check_required_attributes()
Packit 8681c6
//
Packit 8681c6
// Check required common attributes for domain parameter objects
Packit 8681c6
//
Packit 8681c6
CK_RV dp_object_check_required_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_ATTRIBUTE *attr = NULL;
Packit 8681c6
    CK_BBOOL found;
Packit 8681c6
Packit 8681c6
    found = template_attribute_find(tmpl, CKA_KEY_TYPE, &attr);
Packit 8681c6
    if (!found) {
Packit 8681c6
        if (mode == MODE_CREATE) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return template_check_required_base_attributes(tmpl, mode);
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV dp_dsa_check_required_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_ATTRIBUTE *attr = NULL;
Packit 8681c6
    CK_BBOOL found;
Packit 8681c6
Packit 8681c6
    if (mode == MODE_CREATE) {
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_PRIME, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_SUBPRIME, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_BASE, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    } else if (mode == MODE_KEYGEN) {
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_PRIME_BITS, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return dp_object_check_required_attributes(tmpl, mode);
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV dp_dh_check_required_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_ATTRIBUTE *attr = NULL;
Packit 8681c6
    CK_BBOOL found;
Packit 8681c6
Packit 8681c6
    if (mode == MODE_CREATE) {
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_PRIME, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_BASE, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    } else if (mode == MODE_KEYGEN) {
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_PRIME_BITS, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return dp_object_check_required_attributes(tmpl, mode);
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV dp_x9dh_check_required_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_ATTRIBUTE *attr = NULL;
Packit 8681c6
    CK_BBOOL found;
Packit 8681c6
Packit 8681c6
    if (mode == MODE_CREATE) {
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_PRIME, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_SUBPRIME, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_BASE, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    } else if (mode == MODE_KEYGEN) {
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_PRIME_BITS, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
        found = template_attribute_find(tmpl, CKA_SUBPRIME_BITS, &attr);
Packit 8681c6
        if (!found) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_TEMPLATE_INCOMPLETE));
Packit 8681c6
            return CKR_TEMPLATE_INCOMPLETE;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return dp_object_check_required_attributes(tmpl, mode);
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
// dp_object_set_default_attributes()
Packit 8681c6
//
Packit 8681c6
CK_RV dp_object_set_default_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_ATTRIBUTE *local_attr = NULL;
Packit 8681c6
Packit 8681c6
    UNUSED(mode);
Packit 8681c6
Packit 8681c6
    local_attr =
Packit 8681c6
        (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_BBOOL));
Packit 8681c6
Packit 8681c6
    if (!local_attr) {
Packit 8681c6
        TRACE_ERROR("%s\n", ock_err(ERR_HOST_MEMORY));
Packit 8681c6
        return CKR_HOST_MEMORY;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    local_attr->type = CKA_LOCAL;
Packit 8681c6
    local_attr->ulValueLen = sizeof(CK_BBOOL);
Packit 8681c6
    local_attr->pValue = (CK_BYTE *) local_attr + sizeof(CK_ATTRIBUTE);
Packit 8681c6
    *(CK_BBOOL *) local_attr->pValue = FALSE;
Packit 8681c6
Packit 8681c6
    template_update_attribute(tmpl, local_attr);
Packit 8681c6
Packit 8681c6
    return CKR_OK;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
// dp_object_validate_attribute()
Packit 8681c6
//
Packit 8681c6
CK_RV dp_object_validate_attribute(TEMPLATE *tmpl, CK_ATTRIBUTE *attr,
Packit 8681c6
                                   CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    switch (attr->type) {
Packit 8681c6
    case CKA_KEY_TYPE:
Packit 8681c6
        if (mode == MODE_CREATE)
Packit 8681c6
            return CKR_OK;
Packit 8681c6
Packit 8681c6
        TRACE_ERROR("%s\n", ock_err(ERR_ATTRIBUTE_READ_ONLY));
Packit 8681c6
        return CKR_ATTRIBUTE_READ_ONLY;
Packit 8681c6
    case CKA_LOCAL:
Packit 8681c6
        if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
Packit Service 8aa27d
            TRACE_ERROR("%s: %lx\n", ock_err(ERR_ATTRIBUTE_TYPE_INVALID),
Packit Service 8aa27d
                        attr->type);
Packit 8681c6
            return CKR_ATTRIBUTE_TYPE_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    default:
Packit 8681c6
        return template_validate_base_attribute(tmpl, attr, mode);
Packit 8681c6
    }
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV dp_dsa_validate_attribute(TEMPLATE *tmpl, CK_ATTRIBUTE *attr,
Packit 8681c6
                                CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    switch (attr->type) {
Packit 8681c6
    case CKA_PRIME:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_PRIME_BITS:
Packit 8681c6
        if (mode == MODE_CREATE) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_BASE:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_SUBPRIME:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    default:
Packit 8681c6
        return dp_object_validate_attribute(tmpl, attr, mode);
Packit 8681c6
    }
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV dp_dh_validate_attribute(TEMPLATE *tmpl, CK_ATTRIBUTE *attr,
Packit 8681c6
                               CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    switch (attr->type) {
Packit 8681c6
    case CKA_PRIME:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_PRIME_BITS:
Packit 8681c6
        if (mode == MODE_CREATE) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_BASE:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    default:
Packit 8681c6
        return dp_object_validate_attribute(tmpl, attr, mode);
Packit 8681c6
    }
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV dp_x9dh_validate_attribute(TEMPLATE *tmpl, CK_ATTRIBUTE *attr,
Packit 8681c6
                                 CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    switch (attr->type) {
Packit 8681c6
    case CKA_PRIME:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_PRIME_BITS:
Packit 8681c6
        if (mode == MODE_CREATE) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_BASE:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_SUBPRIME:
Packit 8681c6
        if (mode == MODE_KEYGEN) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    case CKA_SUBPRIME_BITS:
Packit 8681c6
        if (mode == MODE_CREATE) {
Packit 8681c6
            TRACE_ERROR("%s\n", ock_err(ERR_DOMAIN_PARAMS_INVALID));
Packit 8681c6
            return CKR_DOMAIN_PARAMS_INVALID;
Packit 8681c6
        }
Packit 8681c6
        return CKR_OK;
Packit 8681c6
    default:
Packit 8681c6
        return dp_object_validate_attribute(tmpl, attr, mode);
Packit 8681c6
    }
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
CK_RV dp_dsa_set_default_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_RV rc;
Packit 8681c6
    CK_ATTRIBUTE *prime_attr;
Packit 8681c6
    CK_ATTRIBUTE *subprime_attr;
Packit 8681c6
    CK_ATTRIBUTE *base_attr;
Packit 8681c6
    CK_ATTRIBUTE *primebits_attr;
Packit 8681c6
    CK_ATTRIBUTE *type_attr;
Packit 8681c6
Packit 8681c6
    rc = dp_object_set_default_attributes(tmpl, mode);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        return rc;
Packit 8681c6
Packit 8681c6
    prime_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    subprime_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    base_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    primebits_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    type_attr =
Packit 8681c6
        (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_KEY_TYPE));
Packit 8681c6
Packit 8681c6
    if (!prime_attr || !subprime_attr || !base_attr || !primebits_attr
Packit 8681c6
        || !type_attr) {
Packit 8681c6
        if (prime_attr)
Packit 8681c6
            free(prime_attr);
Packit 8681c6
        if (subprime_attr)
Packit 8681c6
            free(subprime_attr);
Packit 8681c6
        if (base_attr)
Packit 8681c6
            free(base_attr);
Packit 8681c6
        if (primebits_attr)
Packit 8681c6
            free(primebits_attr);
Packit 8681c6
        if (type_attr)
Packit 8681c6
            free(type_attr);
Packit 8681c6
        TRACE_ERROR("%s\n", ock_err(ERR_HOST_MEMORY));
Packit 8681c6
        return CKR_HOST_MEMORY;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    prime_attr->type = CKA_PRIME;
Packit 8681c6
    prime_attr->ulValueLen = 0;
Packit 8681c6
    prime_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    subprime_attr->type = CKA_SUBPRIME;
Packit 8681c6
    subprime_attr->ulValueLen = 0;
Packit 8681c6
    subprime_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    base_attr->type = CKA_BASE;
Packit 8681c6
    base_attr->ulValueLen = 0;
Packit 8681c6
    base_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    primebits_attr->type = CKA_PRIME_BITS;
Packit 8681c6
    primebits_attr->ulValueLen = 0;
Packit 8681c6
    primebits_attr->pValue = NULL;
Packit 8681c6
#if 0
Packit 8681c6
    primebits_attr->ulValueLen = sizeof(CK_ULONG);
Packit 8681c6
    primebits_attr->pValue = (CK_ULONG *) primebits_attr + sizeof(CK_ATTRIBUTE);
Packit 8681c6
    *(CK_ULONG *) primebits_attr->pValue = 0;
Packit 8681c6
#endif
Packit 8681c6
    type_attr->type = CKA_KEY_TYPE;
Packit 8681c6
    type_attr->ulValueLen = sizeof(CK_KEY_TYPE);
Packit 8681c6
    type_attr->pValue = (CK_BYTE *) type_attr + sizeof(CK_ATTRIBUTE);
Packit 8681c6
    *(CK_KEY_TYPE *) type_attr->pValue = CKK_DSA;
Packit 8681c6
Packit 8681c6
    template_update_attribute(tmpl, prime_attr);
Packit 8681c6
    template_update_attribute(tmpl, subprime_attr);
Packit 8681c6
    template_update_attribute(tmpl, base_attr);
Packit 8681c6
    template_update_attribute(tmpl, primebits_attr);
Packit 8681c6
    template_update_attribute(tmpl, type_attr);
Packit 8681c6
Packit 8681c6
    return CKR_OK;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV dp_dh_set_default_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_RV rc;
Packit 8681c6
    CK_ATTRIBUTE *prime_attr;
Packit 8681c6
    CK_ATTRIBUTE *base_attr;
Packit 8681c6
    CK_ATTRIBUTE *primebits_attr;
Packit 8681c6
    CK_ATTRIBUTE *type_attr;
Packit 8681c6
Packit 8681c6
    rc = dp_object_set_default_attributes(tmpl, mode);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        return rc;
Packit 8681c6
Packit 8681c6
    prime_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    base_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    primebits_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    type_attr =
Packit 8681c6
        (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_KEY_TYPE));
Packit 8681c6
Packit 8681c6
    if (!prime_attr || !base_attr || !primebits_attr || !type_attr) {
Packit 8681c6
        if (prime_attr)
Packit 8681c6
            free(prime_attr);
Packit 8681c6
        if (base_attr)
Packit 8681c6
            free(base_attr);
Packit 8681c6
        if (primebits_attr)
Packit 8681c6
            free(primebits_attr);
Packit 8681c6
        if (type_attr)
Packit 8681c6
            free(type_attr);
Packit 8681c6
        TRACE_ERROR("%s\n", ock_err(ERR_HOST_MEMORY));
Packit 8681c6
        return CKR_HOST_MEMORY;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    prime_attr->type = CKA_PRIME;
Packit 8681c6
    prime_attr->ulValueLen = 0;
Packit 8681c6
    prime_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    base_attr->type = CKA_BASE;
Packit 8681c6
    base_attr->ulValueLen = 0;
Packit 8681c6
    base_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    primebits_attr->type = CKA_PRIME_BITS;
Packit 8681c6
    primebits_attr->ulValueLen = 0;
Packit 8681c6
    primebits_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    type_attr->type = CKA_KEY_TYPE;
Packit 8681c6
    type_attr->ulValueLen = sizeof(CK_KEY_TYPE);
Packit 8681c6
    type_attr->pValue = (CK_BYTE *) type_attr + sizeof(CK_ATTRIBUTE);
Packit 8681c6
    *(CK_KEY_TYPE *) type_attr->pValue = CKK_DH;
Packit 8681c6
Packit 8681c6
    template_update_attribute(tmpl, prime_attr);
Packit 8681c6
    template_update_attribute(tmpl, base_attr);
Packit 8681c6
    template_update_attribute(tmpl, primebits_attr);
Packit 8681c6
    template_update_attribute(tmpl, type_attr);
Packit 8681c6
Packit 8681c6
    return CKR_OK;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV dp_x9dh_set_default_attributes(TEMPLATE *tmpl, CK_ULONG mode)
Packit 8681c6
{
Packit 8681c6
    CK_RV rc;
Packit 8681c6
    CK_ATTRIBUTE *prime_attr;
Packit 8681c6
    CK_ATTRIBUTE *subprime_attr;
Packit 8681c6
    CK_ATTRIBUTE *base_attr;
Packit 8681c6
    CK_ATTRIBUTE *primebits_attr;
Packit 8681c6
    CK_ATTRIBUTE *subprimebits_attr;
Packit 8681c6
    CK_ATTRIBUTE *type_attr;
Packit 8681c6
Packit 8681c6
    rc = dp_object_set_default_attributes(tmpl, mode);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        return rc;
Packit 8681c6
Packit 8681c6
    prime_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    subprime_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    base_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    primebits_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    subprimebits_attr = (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE));
Packit 8681c6
    type_attr =
Packit 8681c6
        (CK_ATTRIBUTE *) malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_KEY_TYPE));
Packit 8681c6
Packit 8681c6
    if (!prime_attr || !subprime_attr || !base_attr ||
Packit 8681c6
        !primebits_attr || !subprimebits_attr || !type_attr) {
Packit 8681c6
        if (prime_attr)
Packit 8681c6
            free(prime_attr);
Packit 8681c6
        if (subprime_attr)
Packit 8681c6
            free(subprime_attr);
Packit 8681c6
        if (base_attr)
Packit 8681c6
            free(base_attr);
Packit 8681c6
        if (primebits_attr)
Packit 8681c6
            free(primebits_attr);
Packit 8681c6
        if (subprimebits_attr)
Packit 8681c6
            free(subprimebits_attr);
Packit 8681c6
        if (type_attr)
Packit 8681c6
            free(type_attr);
Packit 8681c6
        TRACE_ERROR("%s\n", ock_err(ERR_HOST_MEMORY));
Packit 8681c6
        return CKR_HOST_MEMORY;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    prime_attr->type = CKA_PRIME;
Packit 8681c6
    prime_attr->ulValueLen = 0;
Packit 8681c6
    prime_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    subprime_attr->type = CKA_SUBPRIME;
Packit 8681c6
    subprime_attr->ulValueLen = 0;
Packit 8681c6
    subprime_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    base_attr->type = CKA_BASE;
Packit 8681c6
    base_attr->ulValueLen = 0;
Packit 8681c6
    base_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    primebits_attr->type = CKA_PRIME_BITS;
Packit 8681c6
    primebits_attr->ulValueLen = 0;
Packit 8681c6
    primebits_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    subprimebits_attr->type = CKA_SUBPRIME_BITS;
Packit 8681c6
    subprimebits_attr->ulValueLen = 0;
Packit 8681c6
    subprimebits_attr->pValue = NULL;
Packit 8681c6
Packit 8681c6
    type_attr->type = CKA_KEY_TYPE;
Packit 8681c6
    type_attr->ulValueLen = sizeof(CK_KEY_TYPE);
Packit 8681c6
    type_attr->pValue = (CK_BYTE *) type_attr + sizeof(CK_ATTRIBUTE);
Packit 8681c6
    *(CK_KEY_TYPE *) type_attr->pValue = CKK_DSA;
Packit 8681c6
Packit 8681c6
    template_update_attribute(tmpl, prime_attr);
Packit 8681c6
    template_update_attribute(tmpl, subprime_attr);
Packit 8681c6
    template_update_attribute(tmpl, base_attr);
Packit 8681c6
    template_update_attribute(tmpl, primebits_attr);
Packit 8681c6
    template_update_attribute(tmpl, subprimebits_attr);
Packit 8681c6
    template_update_attribute(tmpl, type_attr);
Packit 8681c6
Packit 8681c6
    return CKR_OK;
Packit 8681c6
}