1/* 2 * Copyright (c) 2010 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Portions Copyright (c) 2010 Apple Inc. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <config.h> 37 38#include <errno.h> 39 40#include <stdio.h> 41#include <stdlib.h> 42 43#include <krb5-types.h> 44#include <rfc2459_asn1.h> 45#include <hcrypto/bn.h> 46 47#ifdef HAVE_CDSA 48#define NEED_CDSA 1 49#endif 50 51#include "common.h" 52 53#ifdef HAVE_CDSA 54 55static CSSM_CSP_HANDLE cspHandle; 56 57static CSSM_VERSION vers = {2, 0 }; 58static const CSSM_GUID guid = { 0xFADE, 0, 0, { 1, 2, 3, 4, 5, 6, 7, 0 } }; 59 60const CSSM_DATA _hc_labelData = { 7, (void *)"noLabel" }; 61 62static void * cssmMalloc(CSSM_SIZE size, void *alloc) { return malloc(size); } 63static void cssmFree(void *ptr, void *alloc) { free(ptr); } 64static void * cssmRealloc(void *ptr, CSSM_SIZE size, void *alloc) { return realloc(ptr, size); } 65static void * cssmCalloc(uint32 num, CSSM_SIZE size, void *alloc) { return calloc(num, size); } 66 67 68static CSSM_API_MEMORY_FUNCS cssm_memory_funcs = { 69 cssmMalloc, 70 cssmFree, 71 cssmRealloc, 72 cssmCalloc, 73 NULL 74}; 75 76CSSM_CSP_HANDLE 77_hc_get_cdsa_csphandle(void) 78{ 79 CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE; 80 CSSM_RETURN ret; 81 82 if (cspHandle) 83 return cspHandle; 84 85 ret = CSSM_Init(&vers, CSSM_PRIVILEGE_SCOPE_NONE, 86 &guid, CSSM_KEY_HIERARCHY_NONE, 87 &pvcPolicy, NULL); 88 if (ret != CSSM_OK) 89 abort(); 90 91 ret = CSSM_ModuleLoad(&gGuidAppleCSP, CSSM_KEY_HIERARCHY_NONE, NULL, NULL); 92 if (ret) 93 abort(); 94 95 ret = CSSM_ModuleAttach(&gGuidAppleCSP, &vers, &cssm_memory_funcs, 96 0, CSSM_SERVICE_CSP, 0, 97 CSSM_KEY_HIERARCHY_NONE, 98 NULL, 0, NULL, &cspHandle); 99 if (ret) 100 abort(); 101 102 return cspHandle; 103} 104#endif 105 106 107int 108_hc_BN_to_integer(BIGNUM *bn, heim_integer *integer) 109{ 110 integer->length = BN_num_bytes(bn); 111 integer->data = malloc(integer->length); 112 if (integer->data == NULL) 113 return ENOMEM; 114 BN_bn2bin(bn, integer->data); 115 integer->negative = BN_is_negative(bn); 116 return 0; 117} 118 119BIGNUM * 120_hc_integer_to_BN(const heim_integer *i, BIGNUM *bn) 121{ 122 bn = BN_bin2bn(i->data, i->length, bn); 123 if (bn) 124 BN_set_negative(bn, i->negative); 125 return bn; 126} 127