Проверьте подпись на iOS и OSx без внешних библиотек (-9809 ошибка OSStatus) - PullRequest
0 голосов
/ 14 мая 2018

Я создаю открытый ключ, используя SecKeyCreateWithData. Ключ создается из Pem после удаления заголовков.

Я попытался проверить подпись, используя

  1. SecKeyRawVerify возвращает ошибку -9809 (iOS)
  2. SecKeyVerifySignature возвращает -67808 «Ошибка проверки подписи RSA, нет совпадения» (iOS)
  3. SecTransformExecute возвращает false. (OSX)

Мы используем SHA256 и кодировку Unicode для подписи сообщения (C # RSACryptoProvider).

Код для создания открытого ключа:

NSDictionary* attributes =
    @{ (id)kSecAttrKeyType:               (id)kSecAttrKeyTypeRSA,
       (id)kSecAttrKeySizeInBits:         @2048,
       (id)kSecPublicKeyAttrs:
           @{ (id)kSecAttrIsPermanent:    @YES,
              (id)kSecAttrApplicationTag: tag1
            },
       (id)kSecAttrCanEncrypt:@YES,
       (id)kSecAttrCanVerify:@YES,
       (id)kSecAttrKeyClass: (id)kSecAttrKeyClassPublic
     };

    CFErrorRef error = NULL;
    SecKeyRef keyRef = SecKeyCreateWithData((__bridge CFDataRef)publicKeyData,
                                      (__bridge CFDictionaryRef)attributes,
                                      &error);

Проверочный код iOS:

size_t signedHashBytesSize = SecKeyGetBlockSize(keyRef);
const void* signedHashBytes = [signature bytes];
NSData *plainData = [dataToSign dataUsingEncoding:NSUTF16StringEncoding];
size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
uint8_t* hashBytes = malloc(hashBytesSize);
if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
    return nil;
}

OSStatus status1 = SecKeyRawVerify(keyRef,
                                  kSecPaddingPKCS1,
                                  hashBytes,
                                  hashBytesSize,
                                  signedHashBytes,
                                  signedHashBytesSize);

Проверочный код OSx:

    verifier = SecVerifyTransformCreate(keyRef, (__bridge CFDataRef)self.digest, &errorCF);
    if (errorCF) { CFShow(errorCF);}
    SecTransformSetAttribute(verifier,
                             kSecTransformInputAttributeName,
                             (__bridge CFTypeRef)plainData,
                             &errorCF);
    if (errorCF) { CFShow(errorCF); exit(-1); }
    SecTransformSetAttribute(verifier,
                             kSecDigestTypeAttribute,
                             kSecDigestSHA2,
                             &errorCF);
    if (errorCF) { CFShow(errorCF); exit(-1); }
    SecTransformSetAttribute(verifier,
                             kSecDigestLengthAttribute,
                             (__bridge CFNumberRef)@256,
                             &errorCF);
    if (errorCF) { CFShow(errorCF); exit(-1); }
    CFBooleanRef result1 = NULL;
    result1 = SecTransformExecute(verifier, &errorCF);
    BOOL success = (result1 != NULL);

Я застрял, любая помощь будет оценена.

...