Преобразование кода Objective-C в обычный C - PullRequest
2 голосов
/ 20 января 2012

Я использую следующий код для проверки подписи приложения. Это в 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?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вы пробовали использовать CFDictionaryRef signingInfo = NULL; без лишних *? Базовая ссылка ref уже является указателем. CFDictionaryRef является бесплатным для моста NSDictionary *. [signingInfo release]; затем можно перевести на CFRelease(signingInfo). Вам также следует заменить NSLog чем-то другим.

3 голосов
/ 20 января 2012

CFDictionaryRef уже является указателем.Поэтому вы должны использовать CFDictionaryRef вместо CFDictionaryRef*.

...