]>
git.saurik.com Git - apple/security.git/blob - Security/sec/SOSCircle/SecureObjectSync/SOSAccountDer.c
2 * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
25 #include "SOSAccountPriv.h"
28 // DER Encoding utilities
32 // Encodes data or a zero length data
34 size_t der_sizeof_data_or_null(CFDataRef data
, CFErrorRef
* error
)
37 return der_sizeof_data(data
, error
);
39 return der_sizeof_null(kCFNull
, error
);
43 uint8_t* der_encode_data_or_null(CFDataRef data
, CFErrorRef
* error
, const uint8_t* der
, uint8_t* der_end
)
46 return der_encode_data(data
, error
, der
, der_end
);
48 return der_encode_null(kCFNull
, error
, der
, der_end
);
53 const uint8_t* der_decode_data_or_null(CFAllocatorRef allocator
, CFDataRef
* data
,
55 const uint8_t* der
, const uint8_t* der_end
)
57 CFTypeRef value
= NULL
;
58 der
= der_decode_plist(allocator
, 0, &value
, error
, der
, der_end
);
59 if (value
&& CFGetTypeID(value
) != CFDataGetTypeID()) {
70 // Mark: public_bytes encode/decode
73 size_t der_sizeof_public_bytes(SecKeyRef publicKey
, CFErrorRef
* error
)
75 CFDataRef publicData
= NULL
;
78 SecKeyCopyPublicBytes(publicKey
, &publicData
);
80 size_t size
= der_sizeof_data_or_null(publicData
, error
);
82 CFReleaseNull(publicData
);
87 uint8_t* der_encode_public_bytes(SecKeyRef publicKey
, CFErrorRef
* error
, const uint8_t* der
, uint8_t* der_end
)
89 CFDataRef publicData
= NULL
;
92 SecKeyCopyPublicBytes(publicKey
, &publicData
);
94 uint8_t *result
= der_encode_data_or_null(publicData
, error
, der
, der_end
);
96 CFReleaseNull(publicData
);
101 const uint8_t* der_decode_public_bytes(CFAllocatorRef allocator
, CFIndex algorithmID
, SecKeyRef
* publicKey
, CFErrorRef
* error
, const uint8_t* der
, const uint8_t* der_end
)
103 CFDataRef dataFound
= NULL
;
104 der
= der_decode_data_or_null(allocator
, &dataFound
, error
, der
, der_end
);
106 if (der
&& dataFound
&& publicKey
) {
107 *publicKey
= SecKeyCreateFromPublicData(allocator
, algorithmID
, dataFound
);
109 CFReleaseNull(dataFound
);
118 // bool encoding/decoding
122 const uint8_t* ccder_decode_bool(bool* boolean
, const uint8_t* der
, const uint8_t *der_end
)
127 size_t payload_size
= 0;
128 const uint8_t *payload
= ccder_decode_tl(CCDER_BOOLEAN
, &payload_size
, der
, der_end
);
130 if (NULL
== payload
|| (der_end
- payload
) < 1 || payload_size
!= 1) {
135 *boolean
= (*payload
!= 0);
137 return payload
+ payload_size
;
141 size_t ccder_sizeof_bool(bool value __unused
, CFErrorRef
*error
)
143 return ccder_sizeof(CCDER_BOOLEAN
, 1);
147 uint8_t* ccder_encode_bool(bool value
, const uint8_t *der
, uint8_t *der_end
)
149 uint8_t value_byte
= value
;
151 return ccder_encode_tl(CCDER_BOOLEAN
, 1, der
,
152 ccder_encode_body(1, &value_byte
, der
, der_end
));