OS X Keychain: извлечение приватных ключей - возможно? - PullRequest
0 голосов
/ 16 января 2011

Я пытаюсь извлечь необработанные байты закрытого ключа, хранящегося в SecKeyRef в OS X. Как мне поступить?

Я прочитал это ~7-летняя ветка в дискуссионных списках Apple CDSA, но не нашла ничего более свежего.У меня нет той же проблемы, что и у исходного постера в этой ветке, но это может быть из-за того, что я поступил неправильно.Вот что я сейчас пытаюсь (безрезультатно):

SecKeyRef keyRef = ...;
CSSM_KEY *cssmKey = NULL;
CSSM_WRAP_KEY wrappedKey = {0};

CSSM_CSP_HANDLE cspHandle = 0;
CSSM_CC_HANDLE ccHandle = 0;

CSSM_ACCESS_CREDENTIALS *creds = NULL;
SecKeyGetCredentials(keyRef, CSSM_ACL_AUTHORIZATION_EXPORT_WRAPPED, kSecCredentialTypeDefault, &creds);

// Tried the following, too.
//CSSM_ACCESS_CREDENTIALS *creds = malloc(sizeof(CSSM_ACCESS_CREDENTIALS));
//memset(creds, 0, sizeof(CSSM_ACCESS_CREDENTIALS));

SecKeyGetCSSMKey(keyRef, &cssmKey);
SecKeyGetCSPHandle(keyRef, &cspHandle);

CSSM_CSP_CreateSymmetricContext(cspHandle, 
    CSSM_ALGID_NONE,
    // Have also tried CSSM_ALGMODE_WRAP 
    CSSM_ALGMODE_NONE, 
    creds, 
    NULL, 
    NULL, 
    CSSM_PADDING_NONE, 
    0, 
    &ccHandle);

CSSM_WrapKey(ccHandle, 
    creds, 
    key, 
    NULL, 
    &wrappedKey);

Код ошибки, возвращаемый CSSM_WrapKey, равен CSSMERR_CSP_INVALID_KEYATTR_MASK.Есть идеи?

1 Ответ

1 голос
/ 18 января 2011

Я нашел причину, по которой у меня возникли проблемы: ключ, который я пытался извлечь, включил атрибут CSSM_KEYATTR_SENSITIVE, и я пытался выполнить «нулевую упаковку», то есть получить доступ к необработанным необработанным байтам.

Строки 285-287 из libsecurity_apple_csp / lib / wrapKey.cpp имеют следующий вид:

if(isNullWrap && (keyAttr & CSSM_KEYATTR_SENSITIVE)) {
    CssmError::throwMe(CSSMERR_CSP_INVALID_KEYATTR_MASK);
}

Если необходимо извлечь секретный закрытый ключ, он должен be wrapped - по умолчанию для закрытых ключей по умолчанию для Apple CSP используется опция оборачивания CSSM_KEYBLOB_WRAPPED_FORMAT_PKCS8.

...