X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/b04fe171f0375ecd5d8a24747ca1dff85720a0ca..6b200bc335dc93c5516ccb52f14bd896d8c7fad7:/OSX/sec/SOSCircle/Tool/syncbackup.c diff --git a/OSX/sec/SOSCircle/Tool/syncbackup.c b/OSX/sec/SOSCircle/Tool/syncbackup.c index d202ee3e..acb04d92 100644 --- a/OSX/sec/SOSCircle/Tool/syncbackup.c +++ b/OSX/sec/SOSCircle/Tool/syncbackup.c @@ -38,6 +38,7 @@ #include #include +#include #include @@ -53,6 +54,58 @@ static bool dumpBackupInfo(CFErrorRef *error) { return *error != NULL; } +static bool longListing(CFErrorRef *error) { + CFDataRef rkbgder = NULL; + CFDictionaryRef bskbders = NULL; + + CFDictionaryRef backupInfo = SOSCCCopyBackupInformation(error); + SOSRecoveryKeyBagRef rkbg = NULL; + CFNumberRef status = CFDictionaryGetValue(backupInfo, kSOSBkpInfoStatus); + int infoStatus; + CFNumberGetValue(status, kCFNumberIntType, &infoStatus); + + switch(infoStatus) { + case noError: + rkbgder = CFDictionaryGetValue(backupInfo, kSOSBkpInfoRKBG); + bskbders = CFDictionaryGetValue(backupInfo, kSOSBkpInfoBSKB); + break; + case noTxnorAcct: + break; + case noAlloc: + break; + case noTrustedPubKey: + break; + case noBSKBs: + rkbgder = CFDictionaryGetValue(backupInfo, kSOSBkpInfoRKBG); + break; + default: + break; + } + + if(rkbgder) { + rkbg = SOSRecoveryKeyBagCreateFromData(kCFAllocatorDefault, rkbgder, NULL); + printmsg(CFSTR("Recovery Keybag: %@\n"), rkbg); + } + + if(bskbders) { + CFDataRef rkPub = NULL; + if(rkbg) rkPub = SOSRecoveryKeyBagGetKeyData(rkbg, NULL); + CFDictionaryForEach(bskbders, ^(const void *key, const void *value) { + CFDataRef bskbder = asData(value, NULL); + SOSBackupSliceKeyBagRef bskb = SOSBackupSliceKeyBagCreateFromData(kCFAllocatorDefault, bskbder, NULL); + if(bskb) { + bool reckeyPresent = (rkPub && SOSBKSBPrefixedKeyIsInKeyBag(bskb, bskbRkbgPrefix, rkPub)); + printmsg(CFSTR("BackupSliceKeybag %@: Recovery Key %s; %@\n"), key, (reckeyPresent) ? "Present": "Absent ", bskb); + CFReleaseNull(bskb); + } + }); + } + CFReleaseNull(backupInfo); + CFReleaseNull(rkbg); + return *error != NULL; +} + + int syncbackup(int argc, char * const *argv) @@ -62,19 +115,23 @@ syncbackup(int argc, char * const *argv) " -i info (current status)" */ - setOutputTo(NULL, NULL); + SOSLogSetOutputTo(NULL, NULL); int ch, result = 0; CFErrorRef error = NULL; bool hadError = false; - while ((ch = getopt(argc, argv, "i")) != -1) + while ((ch = getopt(argc, argv, "il")) != -1) switch (ch) { case 'i': hadError = dumpBackupInfo(&error); break; + case 'l': + hadError = longListing(&error); + break; + case '?': default: return 2; /* Return 2 triggers usage message. */