2013-03-21 3 views
5

Как проверить цифровую подпись с открытым ключом в iOS без использования какого-либо стороннего кода (например,) открыть SSL?Проверка цифровой подписи с открытым ключом в iOS

Мне нужно проверить цифровую подпись в приложении iOS с открытым ключом. Может ли кто-нибудь помочь мне в достижении этого без использования стороннего программного обеспечения.

Я пытаюсь под кодом, но проблема в том, что у меня нет сертификата в моем приложении, поэтому не могу создать SecTrustRef.

КОД:

NSString *certPath    = [[NSBundle mainBundle] pathForResource:@"yyy" 
                  ofType:@"xxx"]; 
    SecCertificateRef myCertificate = nil; 
    NSData *certificateData   = [[NSData alloc] initWithContentsOfFile :certPath]; 
    myCertificate     = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificateData); 

    SecPolicyRef myPolicy   = SecPolicyCreateBasicX509(); 
    SecTrustRef trustRef; 
    SecTrustCreateWithCertificates(myCertificate, myPolicy, &trustRef); 
    SecKeyRef keyRef  = SecTrustCopyPublicKey (trustRef); 


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

У меня есть следующие:

  • Public Key (NSString *)
  • Подпись (NSString *)
  • данных (NSString *)

Пожалуйста, помогите мне, какой у меня вариант в iOS SDK, если я не хочу использовать ant-сторонний open source.

+0

Если мой ответ помог вам, пожалуйста, примите, что вопрос будет отмечен как решенный и поможет другим пользователям. спасибо – mindbomb

+0

У вас когда-нибудь было какое-то решение или вы создали .pem? – DivineDesert

ответ

0

Если данные ключа упакованы как данные PKCS12, используйте SecPKCS12Import для импорта и использования открытого ключа.

+0

Формат .pem; его просто NSString, который я получил из заголовка ответа сервера –

+0

Взгляните на http://stackoverflow.com/questions/14637328/import-pem-encoded-x-509-certificate-into-ios-keychain – quellish

1

Вы можете упаковать свой открытый ключ в сертификате X509, чтобы использовать IOS встроенные функции легко, используя OpenSSL:

openssl req -x509 -out public_key.pem -outform pem -new -newkey rsa:2048 -keyout private_key.pem 

формат ПОМ в кодировке base64, вы можете переключить -outform в DER, чтобы получить бинарный файл. вы можете импортировать формат PEM путем добавления константного NSString к вашей программе и добавить категорию NSData с помощью этой функции:

- (id) initWithBase64EncodedString:(NSString *) string { 
    NSMutableData *mutableData = nil; 

    if(string) { 
     unsigned long ixtext = 0; 
     unsigned long lentext = 0; 
     unsigned char ch = 0; 
     unsigned char inbuf[4], outbuf[3]; // buffer sizes fixed by AOL LLC 
     short i = 0, ixinbuf = 0; 
     BOOL flignore = NO; 
     BOOL flendtext = NO; 
     NSData *base64Data = nil; 
     const unsigned char *base64Bytes = nil; 

     // Convert the string to ASCII data. 
     base64Data = [string dataUsingEncoding:NSASCIIStringEncoding]; 
     base64Bytes = [base64Data bytes]; 
     mutableData = [NSMutableData dataWithCapacity:[base64Data length]]; 
     lentext = [base64Data length]; 

     while(YES) { 
      if(ixtext >= lentext) break; 
      ch = base64Bytes[ixtext++]; 
      flignore = NO; 

      if((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; 
      else if((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; 
      else if((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; 
      else if(ch == '+') ch = 62; 
      else if(ch == '=') flendtext = YES; 
      else if(ch == '/') ch = 63; 
      else flignore = YES; 

      if(! flignore) { 
       short ctcharsinbuf = 3; 
       BOOL flbreak = NO; 

       if(flendtext) { 
        if(! ixinbuf) break; 
        if((ixinbuf == 1) || (ixinbuf == 2)) ctcharsinbuf = 1; 
        else ctcharsinbuf = 2; 
        ixinbuf = 3; 
        flbreak = YES; 
       } 

       inbuf [ixinbuf++] = ch; 

       if(ixinbuf == 4) { 
        ixinbuf = 0; 
        outbuf [0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4); 
        outbuf [1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2); 
        outbuf [2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F); 

        for(i = 0; i < ctcharsinbuf; i++) 
         [mutableData appendBytes:&outbuf[i] length:1]; 
       } 

       if(flbreak) break; 
      } 
     } 
    } 

    self = [self initWithData:mutableData]; 
    return self; 
} 

конечно вы вытащить этот файл в certificateData , если вы хотите использовать существующий открытый ключ просто вытащить его и записать его в формате X509 CERT с использованием OpenSSL

$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout 

удачи

Смежные вопросы