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 35const uint8_t* der_decode_data_mutable(CFAllocatorRef allocator, CFOptionFlags mutability, 36 CFMutableDataRef* data, CFErrorRef *error, 37 const uint8_t* der, const uint8_t *der_end) 38{ 39 if (NULL == der) 40 return NULL; 41 42 size_t payload_size = 0; 43 const uint8_t *payload = ccder_decode_tl(CCDER_OCTET_STRING, &payload_size, der, der_end); 44 45 if (NULL == payload || (der_end - payload) < payload_size) { 46 SecCFDERCreateError(kSecDERErrorUnknownEncoding, CFSTR("Unknown data encoding"), NULL, error); 47 return NULL; 48 } 49 50 *data = CFDataCreateMutable(allocator, 0); 51 52 if (NULL == *data) { 53 SecCFDERCreateError(kSecDERErrorAllocationFailure, CFSTR("Failed to create data"), NULL, error); 54 return NULL; 55 } 56 57 CFDataAppendBytes(*data, payload, payload_size); 58 59 return payload + payload_size; 60} 61 62 63const uint8_t* der_decode_data(CFAllocatorRef allocator, CFOptionFlags mutability, 64 CFDataRef* data, CFErrorRef *error, 65 const uint8_t* der, const uint8_t *der_end) 66{ 67 if (NULL == der) 68 return NULL; 69 70 size_t payload_size = 0; 71 const uint8_t *payload = ccder_decode_tl(CCDER_OCTET_STRING, &payload_size, der, der_end); 72 73 if (NULL == payload || (der_end - payload) < payload_size) { 74 SecCFDERCreateError(kSecDERErrorUnknownEncoding, CFSTR("Unknown data encoding"), NULL, error); 75 return NULL; 76 } 77 78 *data = CFDataCreate(allocator, payload, payload_size); 79 80 if (NULL == *data) { 81 SecCFDERCreateError(kSecDERErrorAllocationFailure, CFSTR("Failed to create data"), NULL, error); 82 return NULL; 83 } 84 85 return payload + payload_size; 86} 87 88 89size_t der_sizeof_data(CFDataRef data, CFErrorRef *error) 90{ 91 return ccder_sizeof_raw_octet_string(CFDataGetLength(data)); 92} 93 94 95uint8_t* der_encode_data(CFDataRef data, CFErrorRef *error, 96 const uint8_t *der, uint8_t *der_end) 97{ 98 const CFIndex data_length = CFDataGetLength(data); 99 100 return ccder_encode_tl(CCDER_OCTET_STRING, data_length, der, 101 ccder_encode_body(data_length, CFDataGetBytePtr(data), der, der_end)); 102 103} 104