2012-05-25 26 views
5

Tôi đang sử dụng chứng chỉ kỹ thuật số để ký các tệp dữ liệu trong Ứng dụng của mình. Đoạn mã dưới đây không thành công khi cuộc gọi đến SecKeyRawVerify trả về với -9809. Điều này đang chạy trên iPhone. Tôi thậm chí không thể xác định chính xác mã lỗi này có nghĩa là gìSecKeyRawVerify và OSError -9809

Khung bảo mật trước đây gọi để tải và tạo SecTrustRef mà khóa công khai được nhận là có vẻ không có lỗi. Vấn đề nhỏ duy nhất là cuộc gọi đến SecTrustEvaluate trả về một kSecTrustResultUnspecified, nhưng tôi cho rằng đó là vì chính sách tôi đang sử dụng là bản hợp đồng được trả về bởi cuộc gọi SecPolicyCreateBasicX509.

Mọi hỗ trợ hoặc thông tin chi tiết sẽ được đánh giá rất nhiều.

Cảm ơn

SecKeyRef keyRef = SecTrustCopyPublicKey (trustRef); 

fileURL = [[NSBundle mainBundle] URLForResource:@"data" withExtension:@"txt"]; 
NSData *data = [NSData dataWithContentsOfURL:fileURL]; 

fileURL = [[NSBundle mainBundle] URLForResource:@"data" withExtension:@"sgn"]; 
NSData *signature = [NSData dataWithContentsOfURL:fileURL]; 

NSLog(@"Hash block size = %zu",SecKeyGetBlockSize(keyRef)); 

status = SecKeyRawVerify (keyRef, 
          kSecPaddingPKCS1SHA1, 
          (const uint8_t *)[data bytes], 
          (size_t)[data length], 
          (const uint8_t *)[signature bytes], 
          (size_t)[signature length] 
         ); 

Trả lời

1

Tôi đã khám phá những gì đang diễn ra. Cuộc gọi SecKeyRawVerify lấy thông báo của dữ liệu của bạn làm dữ liệu đầu vào chứ không phải chính dữ liệu. Mã bên dưới hoạt động - và tình cờ, nếu chữ ký không được xác minh vì dữ liệu cơ bản đã thay đổi, thì trạng thái trả về là -9809.

Cảm ơn

CC_SHA1((const void *)[data bytes], [data length], (unsigned char *)hash); 

status = SecKeyRawVerify (keyRef, 
          kSecPaddingPKCS1SHA1, 
          hash, 
          20, 
          (const uint8_t *)[signature bytes], 
          SecKeyGetBlockSize(keyRef) 
         ); 
+1

Nó không phải là 'SecKeyRawVerify' hy vọng băm dữ liệu của bạn. Đó là bất cứ điều gì bạn sử dụng để tạo chữ ký ở nơi đầu tiên tạo ra một chữ ký dựa trên băm dữ liệu của bạn. – Greg

3

lỗi đó được xác định (cùng với những người thân khác có liên quan) trong /System/Library/Frameworks/Security.framework/Headers/SecureTransport.h như errSSLCrypto. Nhận xét ở đó gọi nó là "lỗi mật mã cơ bản", không phải là một mô tả đặc biệt mô tả.

Một ý nghĩ: kSecTrustResultUnspecified có nghĩa là mức độ tin cậy tương đương với chính sách hệ thống mặc định. Tất cả các chứng chỉ trong chuỗi có đáng tin cậy không?

+0

Tôi không chắc chắn 100%. Chứng chỉ gốc cho chuỗi là tự ký và chứng chỉ ký kết được ký bởi gốc đó, vì vậy chính chuỗi đó là tốt, mặc dù ở mức hệ thống không có sự tin cậy trong thư mục gốc. Các certs không được nạp vào keychain - trustRef được tạo tự động bằng cách sử dụng các certs nạp từ một blok pkcs12 – drew

Các vấn đề liên quan