@@ -235,6 +235,45 @@ - (void)updateAvailable:(NSString *)_available filename:(NSString *)_filename {
235235 });
236236}
237237
238+ - (BOOL )verifyCMSSignature: (NSData *)signatureData data: (NSData *)data cert: (NSData *)cert {
239+ #define RETURN_IF_OERROR (MSG ) if (oserr) { NSLog (MSG); return false ; }
240+ CMSDecoderRef decoderRef;
241+ OSStatus oserr = CMSDecoderCreate (&decoderRef);
242+ RETURN_IF_OERROR (@" CMSDecoderCreate" )
243+ id decoder = CFBridgingRelease (decoderRef);
244+
245+ oserr = CMSDecoderUpdateMessage ((__bridge CMSDecoderRef)decoder, signatureData.bytes , signatureData.length );
246+ RETURN_IF_OERROR (@" CMSDecoderUpdateMessage" )
247+ oserr = CMSDecoderFinalizeMessage ((__bridge CMSDecoderRef)decoder);
248+ RETURN_IF_OERROR (@" CMSDecoderFinalizeMessage" )
249+ oserr = CMSDecoderSetDetachedContent ((__bridge CMSDecoderRef)decoder, (__bridge CFDataRef)data);
250+ RETURN_IF_OERROR (@" CMSDecoderSetDetachedContent" )
251+
252+ size_t numSignersOut = 0 ;
253+ oserr = CMSDecoderGetNumSigners ((__bridge CMSDecoderRef)decoder, &numSignersOut);
254+ RETURN_IF_OERROR (@" CMSDecoderGetNumSigners" )
255+ if (numSignersOut != 1 ) {
256+ NSLog (@" Invalid number of signers: %lu " , numSignersOut);
257+ return false ;
258+ }
259+
260+ SecPolicyRef policy = SecPolicyCreateBasicX509 ();
261+ CMSSignerStatus status;
262+ oserr = CMSDecoderCopySignerStatus ((__bridge CMSDecoderRef)decoder, 0 , policy, TRUE , &status, nil , nil );
263+ CFRelease (policy);
264+ RETURN_IF_OERROR (@" CMSDecoderCopySignerStatus" )
265+ bool isValid = status == kCMSSignerValid ;
266+
267+ SecCertificateRef signerCert;
268+ oserr = CMSDecoderCopySignerCert ((__bridge CMSDecoderRef)decoder, 0 , &signerCert);
269+ RETURN_IF_OERROR (@" CMSDecoderCopySignerCert" )
270+ bool isSameCert = [cert isEqualToData: CFBridgingRelease (SecCertificateCopyData (signerCert))];
271+ CFRelease (signerCert);
272+
273+ NSLog (@" Signature is (%d ) and cert is equal(%d )" , isValid, isSameCert);
274+ return isValid && isSameCert;
275+ }
276+
238277#pragma mark - Connection delegate
239278
240279- (void )URLSession: (NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didWriteData: (int64_t )bytesWritten totalBytesWritten: (int64_t )totalBytesWritten totalBytesExpectedToWrite: (int64_t )totalBytesExpectedToWrite {
@@ -309,7 +348,7 @@ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTas
309348 }
310349
311350 if ([signatureType isEqualToString: @" CMS" ]) {
312- if ([update verifyCMSSignature: signature data: data cert: certData])
351+ if ([self verifyCMSSignature: signature data: data cert: certData])
313352 [NSTask launchedTaskWithLaunchPath: @" /usr/bin/open" arguments: @[path]];
314353 else
315354 {
@@ -371,7 +410,7 @@ - (IBAction)diagnostics:(id)sender {
371410 NSDictionary *versions = @{
372411 @" DigiDoc4" : update.digidoc4 ,
373412 @" Open-EID" : update.baseversion ,
374- @" ID-Updater" : [ update versionInfo: @" ee.ria.ID-updater " ] ,
413+ @" ID-Updater" : update. updaterversion ,
375414 NSLocalizedString (@" Safari (Extensions) browser plugin" , nil ): [update versionInfo:@"ee.ria.safari-token-signing"],
376415 NSLocalizedString(@" Safari (NPAPI) browser plugin" , nil ): [update versionInfo:@"ee.ria.firefox-token-signing"],
377416 NSLocalizedString(@" Chrome/Firefox browser plugin" , nil ): [update versionInfo:@"ee.ria.chrome-token-signing"],
0 commit comments