5 // Created by Mitch Adler on 6/18/12.
6 // Copyright (c) 2012 Apple Inc. All rights reserved.
11 #include "utilities/SecCFRelease.h"
12 #include "utilities/der_plist.h"
13 #include "utilities/der_plist_internal.h"
15 #include <corecrypto/ccder.h>
16 #include <CoreFoundation/CoreFoundation.h>
19 const uint8_t* der_decode_data_mutable(CFAllocatorRef allocator
, CFOptionFlags mutability
,
20 CFMutableDataRef
* data
, CFErrorRef
*error
,
21 const uint8_t* der
, const uint8_t *der_end
)
26 size_t payload_size
= 0;
27 const uint8_t *payload
= ccder_decode_tl(CCDER_OCTET_STRING
, &payload_size
, der
, der_end
);
29 if (NULL
== payload
|| (der_end
- payload
) < payload_size
) {
30 SecCFDERCreateError(kSecDERErrorUnknownEncoding
, CFSTR("Unknown data encoding"), NULL
, error
);
34 *data
= CFDataCreateMutable(allocator
, 0);
37 SecCFDERCreateError(kSecDERErrorUnderlyingError
, CFSTR("Failed to create data"), NULL
, error
);
41 CFDataAppendBytes(*data
, payload
, payload_size
);
43 return payload
+ payload_size
;
47 const uint8_t* der_decode_data(CFAllocatorRef allocator
, CFOptionFlags mutability
,
48 CFDataRef
* data
, CFErrorRef
*error
,
49 const uint8_t* der
, const uint8_t *der_end
)
54 size_t payload_size
= 0;
55 const uint8_t *payload
= ccder_decode_tl(CCDER_OCTET_STRING
, &payload_size
, der
, der_end
);
57 if (NULL
== payload
|| (der_end
- payload
) < payload_size
) {
58 SecCFDERCreateError(kSecDERErrorUnknownEncoding
, CFSTR("Unknown data encoding"), NULL
, error
);
62 *data
= CFDataCreate(allocator
, payload
, payload_size
);
65 SecCFDERCreateError(kSecDERErrorUnderlyingError
, CFSTR("Failed to create data"), NULL
, error
);
69 return payload
+ payload_size
;
73 size_t der_sizeof_data(CFDataRef data
, CFErrorRef
*error
)
75 return ccder_sizeof_raw_octet_string(CFDataGetLength(data
));
79 uint8_t* der_encode_data(CFDataRef data
, CFErrorRef
*error
,
80 const uint8_t *der
, uint8_t *der_end
)
82 const CFIndex data_length
= CFDataGetLength(data
);
84 return ccder_encode_tl(CCDER_OCTET_STRING
, data_length
, der
,
85 ccder_encode_body(data_length
, CFDataGetBytePtr(data
), der
, der_end
));