5 // Created by Richard Murphy on 3/3/15.
9 #include "SOSRingDER.h"
10 #include <AssertMacros.h>
12 #include <Security/SecureObjectSync/SOSInternal.h>
13 #include <Security/SecureObjectSync/SOSPeer.h>
14 #include <Security/SecureObjectSync/SOSPeerInfoInternal.h>
15 #include <Security/SecureObjectSync/SOSPeerInfoCollections.h>
16 #include <Security/SecureObjectSync/SOSCircle.h>
17 #include <Security/SecFramework.h>
19 #include <Security/SecKey.h>
20 #include <Security/SecKeyPriv.h>
21 #include <CoreFoundation/CoreFoundation.h>
23 #include <utilities/SecCFWrappers.h>
25 //#include "ckdUtilities.h"
27 #include <corecrypto/ccder.h>
28 #include <corecrypto/ccdigest.h>
29 #include <corecrypto/ccsha2.h>
32 #include <utilities/der_plist.h>
33 #include <utilities/der_plist_internal.h>
34 #include <corecrypto/ccder.h>
35 #include <utilities/der_date.h>
40 #include "SOSRingUtils.h"
42 size_t SOSRingGetDEREncodedSize(SOSRingRef ring
, CFErrorRef
*error
) {
43 SOSRingAssertStable(ring
);
44 size_t total_payload
= 0;
46 require_quiet(accumulate_size(&total_payload
, der_sizeof_dictionary((CFDictionaryRef
) ring
->unSignedInformation
, error
)), fail
);
47 require_quiet(accumulate_size(&total_payload
, der_sizeof_dictionary((CFDictionaryRef
) ring
->signedInformation
, error
)), fail
);
48 require_quiet(accumulate_size(&total_payload
, der_sizeof_dictionary((CFDictionaryRef
) ring
->signatures
, error
)), fail
);
49 require_quiet(accumulate_size(&total_payload
, der_sizeof_dictionary((CFDictionaryRef
) ring
->data
, error
)), fail
);
51 return ccder_sizeof(CCDER_CONSTRUCTED_SEQUENCE
, total_payload
);
53 SecCFDERCreateError(kSecDERErrorUnknownEncoding
, CFSTR("don't know how to encode"), NULL
, error
);
57 uint8_t* SOSRingEncodeToDER(SOSRingRef ring
, CFErrorRef
* error
, const uint8_t* der
, uint8_t* der_end
) {
58 return ccder_encode_constructed_tl(CCDER_CONSTRUCTED_SEQUENCE
, der_end
, der
,
59 der_encode_dictionary(ring
->unSignedInformation
, error
, der
,
60 der_encode_dictionary(ring
->signedInformation
, error
, der
,
61 der_encode_dictionary(ring
->signatures
, error
, der
,
62 der_encode_dictionary(ring
->data
, error
, der
, der_end
)))));
65 CFDataRef
SOSRingCopyEncodedData(SOSRingRef ring
, CFErrorRef
*error
) {
66 return CFDataCreateWithDER(kCFAllocatorDefault
, SOSRingGetDEREncodedSize(ring
, error
), ^uint8_t*(size_t size
, uint8_t *buffer
) {
67 return SOSRingEncodeToDER(ring
, error
, buffer
, (uint8_t *) buffer
+ size
);
71 SOSRingRef
SOSRingCreateFromDER(CFErrorRef
* error
, const uint8_t** der_p
, const uint8_t *der_end
) {
72 SOSRingRef ring
= SOSRingAllocate();
73 SOSRingRef retval
= NULL
;
74 const uint8_t *sequence_end
;
75 CFDictionaryRef unSignedInformation
= NULL
;
76 CFDictionaryRef signedInformation
= NULL
;
77 CFDictionaryRef signatures
= NULL
;
78 CFDictionaryRef data
= NULL
;
80 require_action_quiet(ring
, errOut
, secnotice("ring", "Unable to allocate ring"));
81 *der_p
= ccder_decode_constructed_tl(CCDER_CONSTRUCTED_SEQUENCE
, &sequence_end
, *der_p
, der_end
);
82 *der_p
= der_decode_dictionary(ALLOCATOR
, kCFPropertyListImmutable
, &unSignedInformation
, error
, *der_p
, sequence_end
);
83 *der_p
= der_decode_dictionary(ALLOCATOR
, kCFPropertyListImmutable
, &signedInformation
, error
, *der_p
, sequence_end
);
84 *der_p
= der_decode_dictionary(ALLOCATOR
, kCFPropertyListImmutable
, &signatures
, error
, *der_p
, sequence_end
);
85 *der_p
= der_decode_dictionary(ALLOCATOR
, kCFPropertyListImmutable
, &data
, error
, *der_p
, sequence_end
);
87 require_action_quiet(*der_p
, errOut
, secnotice("ring", "Unable to decode DER"));
88 require_action_quiet(*der_p
== der_end
, errOut
, secnotice("ring", "Unable to decode DER"));
90 ring
->unSignedInformation
= CFDictionaryCreateMutableCopy(ALLOCATOR
, 0, unSignedInformation
);
91 ring
->signedInformation
= CFDictionaryCreateMutableCopy(ALLOCATOR
, 0, signedInformation
);
92 ring
->signatures
= CFDictionaryCreateMutableCopy(ALLOCATOR
, 0, signatures
);
93 ring
->data
= CFDictionaryCreateMutableCopy(ALLOCATOR
, 0, data
);
98 CFReleaseNull(unSignedInformation
);
99 CFReleaseNull(signedInformation
);
100 CFReleaseNull(signatures
);
107 SOSRingRef
SOSRingCreateFromData(CFErrorRef
* error
, CFDataRef ring_data
) {
108 const uint8_t *der
= CFDataGetBytePtr(ring_data
);
109 CFIndex len
= CFDataGetLength(ring_data
);
110 return SOSRingCreateFromDER(error
, &der
, der
+len
);