मैं सभी निजी कुंजी की सूची और उनके बारे में कुछ जानकारी मिल, एप्पल के सुरक्षा तंत्र का एपीआई का उपयोग कर के लिए इस कोड का उपयोग कर रहा:SecKeychainItemCopyContents निजी कुंजी पर segfaulting है
int main(int argc, const char * argv[]) {
const void *keys[] = { kSecClass, kSecReturnRef, kSecMatchLimit, kSecAttrKeyClass};
const void *values[] = { kSecClassKey, kCFBooleanTrue, kSecMatchLimitAll, kSecAttrKeyClassPrivate};
CFDictionaryRef searchDict = CFDictionaryCreate(
NULL,
keys, values, sizeof(keys)/sizeof(keys[0]),
NULL, NULL
);
checkAlloc(searchDict);
CFArrayRef items;
check(SecItemCopyMatching(searchDict, (CFTypeRef *)&items));
for(int i=0; i<CFArrayGetCount(items); i++) {
SecKeychainItemRef item = (SecKeychainItemRef) CFArrayGetValueAtIndex(items, i);
CFShow((CFTypeRef)item);
SecItemClass cls;
SecKeychainAttributeList attrs;
UInt32 dataLen;
void* data;
check(SecKeychainItemCopyContent(item, &cls, &attrs, &dataLen, &data));
printf("Key: %d\n", (int)dataLen);
check(SecKeychainItemFreeContent(&attrs, data));
}
CFRelease(items);
CFRelease(searchDict);
return 0;
}
SecKeychainItemCopyContent
segfaults करने के लिए कॉल, यहां तक कि में से कोई भी, हालांकि जिन पॉइंटर्स में मैं गुजर रहा हूं वे अमान्य हैं।
CFShow
प्रिंट <SecKey 0x7fb4d9d01420 [0x7fff74790ed0]>
के समान लाइनों, इसलिए item
एक SecKeyRef
होना चाहिए, लेकिन documentation for it कहना है कि यह करता है, तो कुंजी एक-चेन में एक SecKeyRef
एक SecKeychainItemRef
के रूप में उपयोग करने के लिए ठीक है। हालांकि, मुझे यह पता लगाने के लिए कोई फ़ंक्शन नहीं दिख रहा है कि कुंजी कुंजीपटल में है या नहीं, इसलिए मैं मान्य नहीं कर सकता कि लौटाई गई चाबियाँ इस तरह उपयोग की जा सकती हैं।
मैं यहाँ क्या गलत कर रहा हूं?
दूसरा उदाहरण गलत है क्योंकि आप प्रारंभ होने से पहले 'डेटालेन' प्रिंट करने का प्रयास करते हैं। मैं नहीं देखता कि इसमें प्रवेश करने से पहले शून्य-एंटर्स 'एटर्स' कैसे एक फर्क पड़ेगा, क्योंकि 'सेककेकेन इटैमकॉपीकंटेंट' केवल इसे लिखना चाहिए और 'attr' पॉइंटर को कम करने का कोई कारण नहीं है। –