2012-05-25 11 views
5

Uygulamamdaki veri dosyalarını imzalamak için dijital sertifikaları kullanıyorum. Aşağıdaki kod parçası, SecKeyRawVerify numaralı çağrıya -9809 ile geri döndüğünde başarısız olur. Bu bir iPhone üzerinde çalışıyor. Bu hata kodunun tam olarak ne anlama geldiğini bile belirleyemiyorumSecKeyRawVerify ve OSError -9809

Önceki Güvenlik Çerçevesi, public anahtarın elde edildiği SecTrustRef'in yüklenmesi ve oluşturulmasını gerektiriyor - hata yok. Sadece küçük bir sorun, SecTrustEvaluate numaralı aramanın kSecTrustResultUnspecified döndürmesidir, ancak bunun benim kullandığım ilkenin SecPolicyCreateBasicX509 çağrısı tarafından döndürülen boilerplate olması nedeniyle olduğunu farz etmeliyim.

Herhangi bir yardım veya içgörü çok takdir edilecektir.

sayesinde

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] 
         ); 

cevap

1

Neler olduğunu keşfettim. SecKeyRawVerify çağrısı verilerinizin özetini, verilerin kendisi değil, girdi olarak alır. Aşağıdaki kod çalışır - ve tesadüfen, temel veri değiştiği için imza doğrulanmadıysa, durum geri dönüşü -9809 olur.

Teşekkür

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

'dan yüklenen sertifikaları kullanarak dinamik olarak oluşturulur. SecKeyRawVerify', verilerinizin karmasını beklemez. İmza oluşturmak için her ne yaparsanız yapın, bu, verilerinizin karmasına dayalı bir imza yarattı. – Greg

3

bu hata errSSLCrypto olarak /System/Library/Frameworks/Security.framework/Headers/SecureTransport.h içinde (diğer ilgili olanlar) ile birlikte tanımlanmıştır. Buradaki yorum, özellikle "açıklayıcı kriptografik hata" olarak adlandırılmaktadır; bu, özellikle açıklayıcı bir açıklama değildir.

Tek düşünce: kSecTrustResultUnspecified, güven düzeyinin varsayılan sistem ilkesine eşit olduğu anlamına gelir. Zincirdeki tüm sertifikalar güvenilir mi?

+0

ben% 100 emin değilim. Zincir için kök sertifika kendiliğinden imzalanır ve imzalama sertifikası o kök tarafından imzalanır, bu yüzden zincirin kendisi iyi bir sistem seviyesinde olmasına rağmen kökünde güven yoktur. Sertifikalar anahtarlığa yüklenmez - trustRef, pkcs12 blob – drew

İlgili konular