der_data.c
1 /* 2 * Copyright (c) 2012-2014 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25 #include <stdio.h> 26 27 #include "utilities/SecCFRelease.h" 28 #include "utilities/der_plist.h" 29 #include "utilities/der_plist_internal.h" 30 31 #include <corecrypto/ccder.h> 32 #include <CoreFoundation/CoreFoundation.h> 33 34 35 const uint8_t* der_decode_data(CFAllocatorRef allocator, 36 CFDataRef* data, CFErrorRef *error, 37 const uint8_t* der, const uint8_t *der_end) 38 { 39 if (NULL == der) { 40 SecCFDERCreateError(kSecDERErrorNullInput, CFSTR("null input"), NULL, error); 41 return NULL; 42 } 43 44 size_t payload_size = 0; 45 const uint8_t *payload = ccder_decode_tl(CCDER_OCTET_STRING, &payload_size, der, der_end); 46 47 if (NULL == payload || (ssize_t) (der_end - payload) < (ssize_t) payload_size) { 48 SecCFDERCreateError(kSecDERErrorUnknownEncoding, CFSTR("Unknown data encoding"), NULL, error); 49 return NULL; 50 } 51 52 *data = CFDataCreate(allocator, payload, payload_size); 53 54 if (NULL == *data) { 55 SecCFDERCreateError(kSecDERErrorAllocationFailure, CFSTR("Failed to create data"), NULL, error); 56 return NULL; 57 } 58 59 return payload + payload_size; 60 } 61 62 63 size_t der_sizeof_data(CFDataRef data, CFErrorRef *error) 64 { 65 return ccder_sizeof_raw_octet_string(CFDataGetLength(data)); 66 } 67 68 69 uint8_t* der_encode_data(CFDataRef data, CFErrorRef *error, 70 const uint8_t *der, uint8_t *der_end) 71 { 72 const CFIndex data_length = CFDataGetLength(data); 73 74 return SecCCDEREncodeHandleResult(ccder_encode_tl(CCDER_OCTET_STRING, data_length, der, 75 ccder_encode_body(data_length, CFDataGetBytePtr(data), der, der_end)), 76 error); 77 78 }