Ошибка сегментации в ОС Ma c при вызове API SecItemCopyMatching - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать Python, чтобы получить сертификаты в моей цепочке для ключей на Ма c, чтобы я мог в конечном итоге поместить его в объект x509. К сожалению, код, который я написал, вызывает ошибку сегментации при вызове API SecItemCopyMatching. Я попробовал несколько вещей, но никуда не денусь, потому что просто говорю «ошибка сегментации», вместо того, чтобы фактически сказать мне, что не так. Мне было интересно, если у кого-то может быть идея о том, что не так в моем коде, пожалуйста?

import ctypes
import struct
from ctypes import c_void_p, c_uint16, c_uint32, c_int32, c_char_p, POINTER, byref, Structure

__metaclass__ = type

sec_keychain_ref = sec_keychain_item_ref = c_void_p
cf_mutable_dictionary_ref = c_void_p

OS_status = c_int32

fw = '/System/Library/Frameworks/{name}.framework/Versions/A/{name}'.format
_sec = ctypes.CDLL(fw(name='Security'))
_coref = ctypes.CDLL(fw(name='CoreFoundation'))

SecItemCopyMatching = _sec.SecItemCopyMatching
SecItemCopyMatching.argtypes = (c_void_p, c_void_p)
SecItemCopyMatching.restype = OS_status

CFDictionaryCreateMutable = _coref.CFDictionaryCreateMutable
CFDictionaryCreateMutable.argtypes = (c_void_p, c_int32, c_void_p, c_void_p)
CFDictionaryCreateMutable.restype = cf_mutable_dictionary_ref

CFDictionarySetValue = _coref.CFDictionarySetValue
CFDictionarySetValue.argtypes = (cf_mutable_dictionary_ref, c_void_p, c_void_p)

kCFTypeDictionaryKeyCallBacks = _coref.kCFTypeDictionaryKeyCallBacks
kCFTypeDictionaryValueCallBacks = _coref.kCFTypeDictionaryValueCallBacks
kCFTypeArrayCallBacks = _coref.kCFTypeArrayCallBacks

kSecReturnRef = ctypes.c_void_p.in_dll(_sec, "kSecReturnRef")
kCFBooleanTrue = ctypes.c_void_p.in_dll(_sec, "kCFBooleanTrue")
kSecMatchItemList = ctypes.c_void_p.in_dll(_sec, "kSecMatchItemList")
kSecMatchSearchList = ctypes.c_void_p.in_dll(_sec, "kSecMatchSearchList")
kSecClass = ctypes.c_void_p.in_dll(_sec, "kSecClass")
kSecClassCertificate = ctypes.c_void_p.in_dll(_sec, "kSecClassCertificate")
kSecMatchLimit = ctypes.c_void_p.in_dll(_sec, "kSecMatchLimit")
kSecMatchLimitAll = ctypes.c_void_p.in_dll(_sec, "kSecMatchLimitAll")

CFArrayCreate = _coref.CFArrayCreate
CFArrayCreate.argtypes = (c_void_p, c_void_p, c_int32, c_void_p)
CFArrayCreate.restype = c_void_p

SecKeychainCopyDefault = _sec.SecKeychainCopyDefault
SecKeychainCopyDefault.argtypes = (c_void_p,)
SecKeychainCopyDefault.restype = OS_status

class OpaqueType(Structure):
    pass

OpaqueTypeRef = POINTER(OpaqueType)

query = CFDictionaryCreateMutable(None, 0, byref(kCFTypeDictionaryKeyCallBacks), byref(kCFTypeDictionaryValueCallBacks))

constKeyChain = OpaqueTypeRef()

os_status = SecKeychainCopyDefault(byref(constKeyChain))

searchList = CFArrayCreate(None, constKeyChain, 1, byref(kCFTypeArrayCallBacks))

CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue)
CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitAll)
CFDictionarySetValue(query, kSecClass, kSecClassCertificate)
CFDictionarySetValue(query, kSecMatchSearchList, searchList)

result = OpaqueTypeRef()

os_status = SecItemCopyMatching(query, byref(result))

Я уверен, что с одним из моих указателей все просто, но я пытался понять это. в течение нескольких часов, и я никуда не уйду.

...