From 02055ca93ac69d43f1278e50692cfbeec6f56d94 Mon Sep 17 00:00:00 2001 From: perfectlylogical Date: Wed, 26 Aug 2015 11:54:00 -0400 Subject: [PATCH 1/2] Added rjoudrey code changes https://github.com/rjoudrey/Keychain-Dumper/commit/4c558843e00516513c8cee7b47fe0605a883e180 --- main.m | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/main.m b/main.m index a991dc4..a4307e0 100644 --- a/main.m +++ b/main.m @@ -30,6 +30,8 @@ #import #import +#import +#import "NSTask.h" #import "sqlite3.h" void printToStdOut(NSString *format, ...) { @@ -41,6 +43,46 @@ void printToStdOut(NSString *format, ...) { [formattedString release]; } +NSString *runProcess(NSString *executablePath, NSArray *args) { + NSPipe *pipe = [NSPipe pipe]; + NSFileHandle *file = pipe.fileHandleForReading; + + NSTask *task = [[NSTask alloc] init]; + task.launchPath = executablePath; + task.arguments = args; + task.standardOutput = pipe; + task.standardError = [NSPipe pipe]; + [task launch]; + + NSData *data = [file readDataToEndOfFile]; + [file closeFile]; + + return [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; +} + +NSString *saveDataTemporarily(NSData *data) { + NSString *tmpPath = @"/tmp/data"; + [data writeToFile:tmpPath atomically:YES]; + return tmpPath; +} + +NSString *runOpenSSLWithArgs(NSArray *args) { + return runProcess(@"/usr/bin/openssl", args); +} + +NSString *runOpenSSLForConversion(NSString *prog, NSData *data) { + NSArray *args = @[prog, @"-inform", @"der", @"-in", saveDataTemporarily(data), @"-outform", @"pem"]; + return runOpenSSLWithArgs(args); +} + +void printKeyPEM(NSData *data) { + printToStdOut(@"%@\n", runOpenSSLForConversion(@"rsa", data)); +} + +void printCertPEM(NSData *data) { + printToStdOut(@"%@\n", runOpenSSLForConversion(@"x509", data)); +} + void printUsage() { printToStdOut(@"Usage: keychain_dumper [-e]|[-h]|[-agnick]\n"); printToStdOut(@": Dump Password Keychain Items (Generic Password, Internet Passwords)\n"); @@ -225,8 +267,8 @@ void printCertificate(NSDictionary *certificateItem) { printToStdOut(@"Label: %@\n", [certificateItem objectForKey:(id)kSecAttrLabel]); printToStdOut(@"Serial Number: %@\n", [certificateItem objectForKey:(id)kSecAttrSerialNumber]); printToStdOut(@"Subject Key ID: %@\n", [certificateItem objectForKey:(id)kSecAttrSubjectKeyID]); - printToStdOut(@"Subject Key Hash: %@\n\n", [certificateItem objectForKey:(id)kSecAttrPublicKeyHash]); - + printToStdOut(@"Subject Key Hash: %@\n", [certificateItem objectForKey:(id)kSecAttrPublicKeyHash]); + printCertPEM(certificateItem[@"certdata"]); } void printKey(NSDictionary *keyItem) { @@ -258,8 +300,8 @@ void printKey(NSDictionary *keyItem) { printToStdOut(@"For Signatures: %@\n", CFBooleanGetValue((CFBooleanRef)[keyItem objectForKey:(id)kSecAttrCanSign]) == true ? @"True" : @"False"); printToStdOut(@"For Signature Verification: %@\n", CFBooleanGetValue((CFBooleanRef)[keyItem objectForKey:(id)kSecAttrCanVerify]) == true ? @"True" : @"False"); printToStdOut(@"For Key Wrapping: %@\n", CFBooleanGetValue((CFBooleanRef)[keyItem objectForKey:(id)kSecAttrCanWrap]) == true ? @"True" : @"False"); - printToStdOut(@"For Key Unwrapping: %@\n\n", CFBooleanGetValue((CFBooleanRef)[keyItem objectForKey:(id)kSecAttrCanUnwrap]) == true ? @"True" : @"False"); - + printToStdOut(@"For Key Unwrapping: %@\n", CFBooleanGetValue((CFBooleanRef)[keyItem objectForKey:(id)kSecAttrCanUnwrap]) == true ? @"True" : @"False"); + printKeyPEM(keyItem[@"v_Data"]); } void printIdentity(NSDictionary *identityItem) { From b62bb7ada6a9a0e019a5470b237fe6d3f6000246 Mon Sep 17 00:00:00 2001 From: perfectlylogical Date: Wed, 26 Aug 2015 11:57:07 -0400 Subject: [PATCH 2/2] Updated Make file to work with cert dumping additions --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5d0380f..c6ab238 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ GCC_BIN=`xcrun --sdk iphoneos --find gcc` SDK=`xcrun --sdk iphoneos --show-sdk-path` +OSXSDK=`xcrun --sdk macosx --show-sdk-path` #support iPhone 3GS and above, delete armv6 to avoid SDK error ARCH_FLAGS=-arch armv7 -arch armv7s -arch arm64 @@ -21,10 +22,11 @@ default: main.o list @$(GCC_ARM) $(LDFLAGS) main.o -o keychain_dumper main.o: main.m + ln -s $(OSXSDK)/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSTask.h . $(GCC_ARM) -c main.m clean: - rm -f keychain_dumper *.o + rm -f keychain_dumper *.o NSTask.h list: security find-identity -pcodesigning