2011-11-01 3 views
1

저는 Lion과 Xcode 4.1을 사용하고 있습니다.SecKeyRawSign osx with EC Cert

SecKeyRawSign은 여전히 ​​호출 할 수 OSX에 대한 문서화 성공적으로 RSA 인증서를 서명 그러나 EC 인증으로 실패하지 않습니다.

SecKeyRawSign 방법 EC-CERT 384 -50, 즉 잘못된 파라미터를 반환한다.

은 OSX와 EC CERT는 사용할 수 SecKeyRawSign 수 있습니까? 그렇다면 패딩 매개 변수는 무엇입니까?

미리 감사드립니다.

답변

4

SecKeyRawSign 맥 OS 10.6과 10.7에서 개인 기능, 그래서 당신은 그것을 사용하지 말아야합니다. ECC 인증서 문제는 아직 공개되지 않은 이유 중 하나 일 수 있습니다.

10.7의 데이터 서명을위한 공식적인 고급 API는 Security TransformsSecSignTransformCreate입니다. 적절한 다이제스트 알고리즘을 자동으로 사용해야합니다. 그렇지 않은 경우 kSecDigestTypeAttributekSecDigestLengthAttribute을 원하는대로 설정하십시오. AFAIK 패딩 알고리즘은 구성 할 수 없습니다.

10.6 이하에서는 CDSA를 사용해야합니다. 먼저 CSSM_CSP_CreateSignatureContext으로 컨텍스트를 만듭니다. 서명 알고리즘은 CSSM_ALGID_SHA512WithECDSA (또는 이와 유사)입니다. SecKeyGetCSPHandle, SecKeyGetCSSMKeySecKeyGetCredentials에서 다른 인수를 얻을 수 있습니다. 서명 컨텍스트가 있으면 CSSM_SignData으로 데이터에 서명합니다. 다이제스트 알고리즘은 CSSM_ALGID_NONE이어야합니다.

패딩

은 최고의 토마스 Pornin의 answer to another question에 의해 설명된다. 응답

+0

감사 : 나는 다음 코드를 썼다. –

2

@Fnord는

감사합니다. 응답

CFDataRef 
CreateSignature (SecKeyRef privateKeyRef, CFDataRef plaintext, CFErrorRef &error) 
{ 
    SecTransformRef signingTransform = SecSignTransformCreate(privateKeyRef, error); 
    if (signingTransform == NULL) 
     return NULL; 

    Boolean success = SecTransformSetAttribute(signingTransform, 
               kSecTransformInputAttributeName, 
               plaintext, 
               error); 
    if (!success) { 
     CFRelease(signingTransform); 
     return NULL; 
    } 

    CFDataRef signature = SecTransformExecute(signingTransform, error); 
    CFRetain(signature); 
    CFRelease(signingTransform); 
    return signature; 
} 
+0

작동하도록 코드를 편집했습니다. 몇 점 : (1) InputIs 속성에서 다르게 말하지 않는 한, 서명 변환의 입력은 서명 할 일반 텍스트이며 다이제스트는 아닙니다. 변환은 적절한 다이제스트 알고리즘을 자동으로 선택하거나 DigestType/DigestLength 속성에 하나를 제공 할 수 있습니다. (2) 생성 한 변환을 실제로 실행하는 것을 잊지 마십시오. (3) ** 항상 ** 생성하거나 복사 한 객체에 대해'CFRelease'를 호출하십시오. (4) 모든 반환 값을 확인하십시오. 오류는 항상 발생합니다. –

+0

하나의 큰주의 사항 : 앱에 개인 키가있는 데이터에 서명하는 자격 증명이없는 경우 (예 : 사용자가 키 체인 확인 대화 상자에서 액세스를 거부하는 경우) 'SecTransformExecute'는 오류를보고하지 않지만 자동으로 가짜 데이터. (정크로 가득 차있는 32768 바이트의 내부 버퍼를 반환하는 것처럼 보입니다.) –