Я использую следующий код для проверки подписи приложения. Это в Objective-C, и это основано на коде, найденном на Профессиональной Прикладной Безопасности Какао.
OSStatus secError = noErr;
// retrieve this process's code object
SecCodeRef myCode;
secError = SecCodeCopySelf(kSecCSDefaultFlags, &myCode);
if (noErr != secError)
{
NSLog(@"unable to retrieve code object, security error %d", secError);
return -1;
}
// validate the process's identity, using the internal requirements
secError = SecCodeCheckValidity(myCode, kSecCSDefaultFlags, NULL);
switch (secError)
{
case noErr:
NSLog(@"this process has a valid signature");
break;
case errSecCSUnsigned:
NSLog(@"this process executable is unsigned");
break;
case errSecCSSignatureFailed:
case errSecCSGuestInvalid:
NSLog(@"this process has an invalid signature");
break;
default:
NSLog(@"error %d validating signature", secError);
break;
}
// get the static code object, representing the executable on disk
SecStaticCodeRef fileCode;
secError = SecCodeCopyStaticCode(myCode, kSecCSDefaultFlags, &fileCode);
if (noErr != secError)
{
NSLog(@"unable to get static code object, security error %d", secError);
CFRelease(myCode);
return -1;
}
//some basic information about the code signature
NSDictionary *signingInfo = nil;
secError = SecCodeCopySigningInformation(fileCode, kSecCSDefaultFlags, &signingInfo);
if (noErr != secError)
{
if(secError == errSecCSSignatureFailed)
NSLog(@"invalid signature");
else
NSLog(@"cannot get signing information, security error %d", secError);
}
else
{
NSLog(@"signing info: %@", signingInfo);
[signingInfo release];
}
CFRelease(myCode);
CFRelease(fileCode);
Мне нужно преобразовать это в обычный C, чтобы я мог также использовать его в приложениях, которые пишу на C. Одна из проблем - NSDictionary *signingInfo = nil;
, которую я пытался решить с помощью CFDictionaryRef *signingInfo = NULL;
, но это не похоже на работу.
Есть ли шанс, что кто-нибудь сможет перевести этот код на C?
Спасибо!