47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The Initial Developer of the Original Code is International
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Business Machines Corporation. Portions created by IBM
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Corporation are Copyright (C) 2005 International Business
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Machines Corporation. All Rights Reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This program is free software; you can redistribute it and/or modify
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * it under the terms of the Common Public License as published by
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * IBM Corporation; either version 1 of the License, or (at your option)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * any later version.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This program is distributed in the hope that it will be useful,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * but WITHOUT ANY WARRANTY; without even the implied warranty of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Common Public License for more details.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You should have received a copy of the Common Public License
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * along with this program; if not, a copy can be viewed at
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * http://www.opensource.org/licenses/cpl1.0.php.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Use is subject to license terms.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = ber_decode_PrivateKeyInfo(keydata, keylen, &alg,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! sess || ! mech || ! publ_key_handle || ! priv_key_handle) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < publ_count; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll keyclass = *(CK_OBJECT_CLASS *)publ_tmpl[i].pValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll subclass = *(CK_ULONG *)publ_tmpl[i].pValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < priv_count; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll keyclass = *(CK_OBJECT_CLASS *)priv_tmpl[i].pValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG temp = *(CK_ULONG *)priv_tmpl[i].pValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (subclass != 0 && subclass != CKK_RSA) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * we can now set CKA_ALWAYS_SENSITIVE and CKA_NEVER_EXTRACTABLE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to their appropriate values. this only applies to CKO_SECRET_KEY
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and CKO_PRIVATE_KEY objects
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll flag = template_attribute_find(priv_key_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = build_attribute(CKA_ALWAYS_SENSITIVE, &flag,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) template_update_attribute(priv_key_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll flag = template_attribute_find(priv_key_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = build_attribute(CKA_NEVER_EXTRACTABLE, &true,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) template_update_attribute(priv_key_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = object_mgr_create_final(sess, publ_key_obj, publ_key_handle);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = object_mgr_create_final(sess, priv_key_obj, priv_key_handle);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) object_mgr_destroy_object(sess, *publ_key_handle);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = object_mgr_find_in_map1(sess->hContext, h_wrapping_key, &key1_obj);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = object_mgr_find_in_map1(sess->hContext, h_key, &key2_obj);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = template_attribute_find(key2_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = template_attribute_find(key2_obj->template, CKA_CLASS, &attr);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = template_attribute_find(key2_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = rsa_priv_wrap_get_data(key2_obj->template, length_only,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = generic_secret_wrap_get_data(key2_obj->template,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ctx = (ENCR_DECR_CONTEXT *)malloc(sizeof (ENCR_DECR_CONTEXT));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) memset(ctx, 0x0, sizeof (ENCR_DECR_CONTEXT));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = encr_mgr_init(sess, ctx, OP_WRAP, mech, h_wrapping_key);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ctx, data, data_len, wrapped_key, wrapped_key_len);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! sess || ! wrapped_key || ! h_unwrapped_key) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = object_mgr_find_in_map1(sess->hContext, h_unwrapping_key,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < attrib_count; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll keyclass = *(CK_OBJECT_CLASS *)attributes[i].pValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll keytype = *(CK_KEY_TYPE *)attributes[i].pValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (found_class == FALSE || (found_type == FALSE && keyclass !=
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ctx = (ENCR_DECR_CONTEXT *)malloc(sizeof (ENCR_DECR_CONTEXT));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) memset(ctx, 0x0, sizeof (ENCR_DECR_CONTEXT));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = decr_mgr_init(sess, ctx, OP_UNWRAP, mech, h_unwrapping_key);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * if we use X.509, the data will be padded from the front with zeros.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * PKCS #11 specifies that for this mechanism, CK_VALUE is to be read
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * from the end of the data.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Note: the PKCS #11 reference implementation gets this wrong.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = key_mgr_get_private_key_type(data, data_len, &keytype);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = secret_key_unwrap(key_obj->template, keytype, data,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rc = priv_key_unwrap(key_obj->template, keytype,