X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/b04fe171f0375ecd5d8a24747ca1dff85720a0ca..6b200bc335dc93c5516ccb52f14bd896d8c7fad7:/OSX/sec/SOSCircle/SecureObjectSync/SOSRingRecovery.c?ds=inline diff --git a/OSX/sec/SOSCircle/SecureObjectSync/SOSRingRecovery.c b/OSX/sec/SOSCircle/SecureObjectSync/SOSRingRecovery.c new file mode 100644 index 00000000..4faf03d6 --- /dev/null +++ b/OSX/sec/SOSCircle/SecureObjectSync/SOSRingRecovery.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2016 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +// +// SOSRingRecovery.c +// sec +// + +#include "SOSRingRecovery.h" +#include "SOSRingBackup.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include + +#include "SOSRingUtils.h" +#include "SOSRingTypes.h" +#include "SOSRingBasic.h" + +// MARK: Recovery Ring Ops + +static SOSRingRef SOSRingCreate_Recovery(CFStringRef name, CFStringRef myPeerID, CFErrorRef *error) { + return SOSRingCreate_ForType(name, kSOSRingRecovery, myPeerID, error); +} + + + +ringFuncStruct recovery = { + "Recovery", + 1, + SOSRingCreate_Recovery, + SOSRingResetToEmpty_Basic, + SOSRingResetToOffering_Basic, + SOSRingDeviceIsInRing_Basic, + SOSRingApply_Basic, + SOSRingWithdraw_Basic, + SOSRingGenerationSign_Basic, + SOSRingConcordanceSign_Basic, + SOSRingPeerKeyConcordanceTrust, + NULL, + NULL, + SOSRingSetPayload_Basic, + SOSRingGetPayload_Basic, +}; + + +static bool isRecoveryRing(SOSRingRef ring, CFErrorRef *error) { + SOSRingType type = SOSRingGetType(ring); + require_quiet(kSOSRingRecovery == type, errOut); + return true; +errOut: + SOSCreateError(kSOSErrorUnexpectedType, CFSTR("Not recovery ring type"), NULL, error); + return false; +} + +bool SOSRingSetRecoveryKeyBag(SOSRingRef ring, SOSFullPeerInfoRef fpi, SOSRecoveryKeyBagRef rkbg, CFErrorRef *error) { + SOSRingAssertStable(ring); + CFDataRef rkbg_as_data = NULL; + bool result = false; + require_quiet(isRecoveryRing(ring, error), errOut); + + rkbg_as_data = SOSRecoveryKeyBagCopyEncoded(rkbg, error); + result = rkbg_as_data && + SOSRingSetPayload(ring, NULL, rkbg_as_data, fpi, error); +errOut: + CFReleaseNull(rkbg_as_data); + return result; +} + +SOSRecoveryKeyBagRef SOSRingCopyRecoveryKeyBag(SOSRingRef ring, CFErrorRef *error) { + SOSRingAssertStable(ring); + + CFDataRef rkbg_as_data = NULL; + SOSRecoveryKeyBagRef result = NULL; + require_quiet(isRecoveryRing(ring, error), errOut); + + rkbg_as_data = SOSRingGetPayload(ring, error); + require_quiet(rkbg_as_data, errOut); + + result = SOSRecoveryKeyBagCreateFromData(kCFAllocatorDefault, rkbg_as_data, error); + +errOut: + return result; +} + +