iOS проверяет цифровую подпись

В моем приложении у меня есть открытый ключ (представленный в виде строки), обычное сообщение и цифровая подпись, представленные в виде строки в кодировке base64, хешированные с помощью SHA256 и зашифрованные с помощью RSA). Теперь мне нужно проверить цифровую подпись. Я пытался сделать следующее:

СоздайтеSecKeyRef отNSString (взято изВот)создать дайджест SHA256 из исходного сообщенияпроверить подпись используяSecKeyRawVerify функция

(Я пытаюсь избежать использования функции OpenSSL)

Кроме того, моя цифровая подпись была создана с использованием Java 'S SHA256 с использованием метода RSA. я читалВот что SHA256WithRSA добавляет идентификатор алгоритма к фактическому хешу. Теперь я не уверен, нужно ли мне добавить его к хешу.

Во всяком случае, в обоих случаях я получаю ошибку -50, которая в соответствии с Apple 'документация означаетОдин или несколько параметров, переданных в функцию, были недействительными.

Вот мой код:

-(BOOL) verifySignature:(NSString*) rawData andKey:(NSString*) key andSignature:(NSString*)signature {

    NSData* originalData = [rawData dataUsingEncoding:NSUTF8StringEncoding];
    NSData *signatureData = [NSData dataFromBase64String:signature];

    SecKeyRef publicKey = [self generatePublicKey:key];

    uint8_t sha2HashDigest[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256([originalData bytes], [originalData length], sha2HashDigest);

    //DO I NEED THIS?
    NSString *algIdentifier = @"1.3.14.3.2.26";
    NSData *algData = [algIdentifier dataUsingEncoding:NSUTF8StringEncoding];
    NSData* d_hash = [NSData dataWithBytes:sha2HashDigest length:CC_SHA256_DIGEST_LENGTH];

    NSMutableData *concatenatedData = [NSMutableData data];
    [concatenatedData appendData:algData];
    [concatenatedData appendData:d_hash];

    OSStatus verficationResult =  SecKeyRawVerify (publicKey,
                     kSecPaddingPKCS1SHA256,
                     (const uint8_t *)[d_hash bytes],
                     (size_t)[d_hash length],
                     (const uint8_t *)[signatureData bytes],
                     (size_t)[signatureData length]
                     );


    CFRelease(publicKey);

    if (verficationResult == errSecSuccess){
        NSLog(@"Verified");
        return YES;
    }
    return NO;

}

- (SecKeyRef)generatePublicKey:(NSString *)key
{

    // This will be base64 encoded, decode it.
    NSData *d_key = [NSData dataFromBase64String:key];
    d_key = [self stripPublicKeyHeader:d_key];
    if (d_key == nil) return(nil);

    NSData *d_tag = [NSData dataWithBytes:[@"pubKey" UTF8String] length:[@"pubKey" length]];

    NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
    [publicKey setObject:(id) kSecClassKey forKey:(id)kSecClass];
    [publicKey setObject:(id) kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [publicKey setObject:d_tag forKey:(id)kSecAttrApplicationTag];
    SecItemDelete((CFDictionaryRef)publicKey);

    CFTypeRef persistKey = nil;

    // Add persistent version of the key to system keychain
    [publicKey setObject:d_key forKey:(id)kSecValueData];
    [publicKey setObject:(id) kSecAttrKeyClassPublic forKey:(id)
     kSecAttrKeyClass];
    [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)
     kSecReturnPersistentRef];

    OSStatus secStatus = SecItemAdd((CFDictionaryRef)publicKey, &persistKey);
    if (persistKey != nil) CFRelease(persistKey);

    if ((secStatus != noErr) && (secStatus != errSecDuplicateItem)) {
        [publicKey release];
        return(nil);
    }

    // Now fetch the SecKeyRef version of the key
    SecKeyRef keyRef = nil;

    [publicKey removeObjectForKey:(id)kSecValueData];
    [publicKey removeObjectForKey:(id)kSecReturnPersistentRef];
    [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef
     ];

    [publicKey setObject:(id) kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    secStatus = SecItemCopyMatching((CFDictionaryRef)publicKey,
                                    (CFTypeRef *)&keyRef);

    [publicKey release];
    return keyRef;

}

Ответы на вопрос(1)

Ваш ответ на вопрос