宝贝娜 發表於 2023-4-13 21:28:00

获取iOS开发者证书的公钥和私钥

<p>获取公钥</p>
<p>openssl x509 -in public.cer -inform DER -noout -pubkey</p>
<p>获取私钥</p>
<p>openssl pkcs12 -in privite.p12 -out private_key.pem -nodes -nocerts</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Shared.m
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">SignAndVerify
</span><span style="color: rgba(0, 128, 0, 1)">//</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Created by Ricci Adams on 2014-07-20.
</span><span style="color: rgba(0, 128, 0, 1)">//</span>
<span style="color: rgba(0, 128, 0, 1)">//
</span>
<span style="color: rgba(0, 0, 255, 1)">#import</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SignAndVerifyShared.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">#import</span> &lt;CommonCrypto/CommonCrypto.h&gt;
<span style="color: rgba(0, 0, 255, 1)">#import</span> &lt;Security/Security.h&gt;

<span style="color: rgba(0, 0, 255, 1)">@interface</span><span style="color: rgba(0, 0, 0, 1)"> Signer : NSObject

</span>- (<span style="color: rgba(0, 0, 255, 1)">id</span>)initWithContentsOfFile:(NSString *)path password:(NSString *)password tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag;

</span>- (NSData *)signSHA1Hash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash;
</span>- (NSData *)signSHA256Hash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash;

</span><span style="color: rgba(0, 0, 255, 1)">@end</span>


<span style="color: rgba(0, 0, 255, 1)">@interface</span><span style="color: rgba(0, 0, 0, 1)"> Verifier : NSObject

</span>- (<span style="color: rgba(0, 0, 255, 1)">id</span>)initWithContentsOfFile:(NSString *)path tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag;

</span>- (BOOL)verifySHA1Hash:(NSData *)hash   withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature;
</span>- (BOOL)verifySHA256Hash:(NSData *)hash withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature;

</span><span style="color: rgba(0, 0, 255, 1)">@end</span><span style="color: rgba(0, 0, 0, 1)">

NSData </span>*GetSHA1Hash(NSData *<span style="color: rgba(0, 0, 0, 1)">inData)
{
    unsigned </span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> digest;

    CC_SHA1_CTX ctx;

    CC_SHA1_Init(</span>&amp;<span style="color: rgba(0, 0, 0, 1)">ctx);
    CC_SHA1_Update(</span>&amp;<span style="color: rgba(0, 0, 0, 1)">ctx, , (CC_LONG));
    CC_SHA1_Final(digest, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">ctx);
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> [ initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
}


NSData </span>*GetSHA256Hash(NSData *<span style="color: rgba(0, 0, 0, 1)">inData)
{
    unsigned </span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> digest;

    CC_SHA256_CTX ctx;

    CC_SHA256_Init(</span>&amp;<span style="color: rgba(0, 0, 0, 1)">ctx);
    CC_SHA256_Update(</span>&amp;<span style="color: rgba(0, 0, 0, 1)">ctx, , (CC_LONG));
    CC_SHA256_Final(digest, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">ctx);
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> [ initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
}


NSString </span>*GetHexStringWithData(NSData *<span style="color: rgba(0, 0, 0, 1)">data)
{
    NSUInteger inLength</span>=<span style="color: rgba(0, 0, 0, 1)"> ;
    unichar </span>*outCharacters = malloc(<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(unichar) * (inLength * <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">));

    UInt8 </span>*inBytes = (UInt8 *<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> lookup[] = { <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">4</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">5</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">6</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">7</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">8</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">e</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> };

    NSUInteger i, o </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; inLength; i++<span style="color: rgba(0, 0, 0, 1)">) {
      UInt8 inByte </span>=<span style="color: rgba(0, 0, 0, 1)"> inBytes;
      outCharacters = lookup[(inByte &amp; <span style="color: rgba(128, 0, 128, 1)">0xF0</span>) &gt;&gt; <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">];
      outCharacters = lookup[(inByte &amp; <span style="color: rgba(128, 0, 128, 1)">0x0F</span><span style="color: rgba(0, 0, 0, 1)">)];
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> [ initWithCharactersNoCopy:outCharacters length:o freeWhenDone:YES];
}


NSData </span>*GetDataWithHexString(NSString *<span style="color: rgba(0, 0, 0, 1)">inputString)
{
    NSUInteger inLength </span>=<span style="color: rgba(0, 0, 0, 1)"> ;
   
    unichar </span>*inCharacters = alloca(<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(unichar) *<span style="color: rgba(0, 0, 0, 1)"> inLength);
    ;

    UInt8 </span>*outBytes = malloc(<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(UInt8) * ((inLength / <span style="color: rgba(128, 0, 128, 1)">2</span>) + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));

    NSInteger i, o </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    UInt8 outByte </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; inLength; i++<span style="color: rgba(0, 0, 0, 1)">) {
      UInt8 c </span>=<span style="color: rgba(0, 0, 0, 1)"> inCharacters;
      SInt8 value </span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>      (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>) value =      (c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F</span><span style="color: rgba(128, 0, 0, 1)">'</span>) value = <span style="color: rgba(128, 0, 128, 1)">10</span> + (c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span>) value = <span style="color: rgba(128, 0, 128, 1)">10</span> + (c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);            
      
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (value &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (i % <span style="color: rgba(128, 0, 128, 1)">2</span> == <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
                outBytes = (outByte &lt;&lt; <span style="color: rgba(128, 0, 128, 1)">4</span>) |<span style="color: rgba(0, 0, 0, 1)"> value;
                outByte </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                outByte </span>=<span style="color: rgba(0, 0, 0, 1)"> value;
            }

      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (o != <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
      }      
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ;
}


NSString </span>*DoTest(NSString *privateKeyPath, NSString *privateKeyPassword, NSString *publicKeyPath, NSString *textPath, NSString *<span style="color: rgba(0, 0, 0, 1)">resultsPath)
{
    NSError</span>*<span style="color: rgba(0, 0, 0, 1)">error;
    NSString </span>*contents = ;
   
    NSCharacterSet </span>*ws =<span style="color: rgba(0, 0, 0, 1)"> ;

    NSMutableArray </span>*sha1Hashes       =<span style="color: rgba(0, 0, 0, 1)"> ;
    NSMutableArray </span>*sha256Hashes   =<span style="color: rgba(0, 0, 0, 1)"> ;

    NSMutableArray </span>*sha1Signatures   =<span style="color: rgba(0, 0, 0, 1)"> ;
    NSMutableArray </span>*sha256Signatures =<span style="color: rgba(0, 0, 0, 1)"> ;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> For each line in input.txt, calculate the SHA1 and SHA256 of that line</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> (NSString *line <span style="color: rgba(0, 0, 255, 1)">in</span> ) {
      NSData </span>*lineAsData =<span style="color: rgba(0, 0, 0, 1)"> [ dataUsingEncoding:NSUTF8StringEncoding];
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!) <span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;

      ;
      ;
    }


    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Now sign each hash</span>
    Signer *signer = [ initWithContentsOfFile:privateKeyPath password:privateKeyPassword tag:<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">com.iccir.SignAndVerify.private-key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">];

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (NSData *hash <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> sha1Hashes) {
      ];
    }

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (NSData *hash <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> sha256Hashes) {
      ];
    }

   
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If we have an existing results.txt, verify the hashes/signatures against it</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> ([ fileExistsAtPath:resultsPath]) {
      NSString </span>*existingResults = ;

      NSInteger i </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (NSString *line <span style="color: rgba(0, 0, 255, 1)">in</span> ) {
            NSArray </span>*components = ;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> ( != <span style="color: rgba(128, 0, 128, 1)">4</span>) <span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;

            NSData </span>*existingSHA1Hash      = GetDataWithHexString(components[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
            NSData </span>*existingSHA1Signature   = GetDataWithHexString(components[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]);
            NSData </span>*existingSHA256Hash      = GetDataWithHexString(components[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]);
            NSData </span>*existingSHA256Signature = GetDataWithHexString(components[<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">]);

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">]) {
                NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">SHA-1 Hash mismatch on line %ld</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)i);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">]) {
                NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">SHA-256 Hash mismatch on line %ld</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)i);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">]) {
                NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">SHA-1 Signature mismatch on line %ld</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)i);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">]) {
                NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">SHA-256 Signature mismatch on line %ld</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)i);
            }

            i</span>++<span style="color: rgba(0, 0, 0, 1)">;
      }
    }


    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Verify the signatures with the Verifier and public key</span>
<span style="color: rgba(0, 0, 0, 1)">    {
      Verifier </span>*verifier = [ initWithContentsOfFile:publicKeyPath tag:<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">com.iccir.SignAndVerify.public-key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">];

      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (NSInteger i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; ; i++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)"> withSignature:sha1Signatures]) {
                NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">OS X Verifier failed to verify line %ld</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)i);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)"> withSignature:sha256Signatures]) {
                NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">OS X Verifier failed to verify line %ld</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)i);
            }
      }
    }

    NSMutableString </span>*results = ;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (NSInteger i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; ; i++<span style="color: rgba(0, 0, 0, 1)">) {
      [results appendFormat:</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">%@\t%@\t%@\t%@\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
            GetHexStringWithData(sha1Hashes),
            GetHexStringWithData(sha1Signatures),
            GetHexStringWithData(sha256Hashes),
            GetHexStringWithData(sha256Signatures)];
    }
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> results;
}



</span><span style="color: rgba(0, 0, 255, 1)">#if</span> TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR

<span style="color: rgba(0, 0, 255, 1)">#pragma</span> mark - iOS Implementations

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> From </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/</span>
<span style="color: rgba(0, 0, 255, 1)">static</span> NSData *sGetDataByStrippingHeader(NSData *<span style="color: rgba(0, 0, 0, 1)">data)
{
    NSUInteger length </span>=<span style="color: rgba(0, 0, 0, 1)"> ;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!length) <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil;

    </span><span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">void</span> *bytes =<span style="color: rgba(0, 0, 0, 1)"> ;
    NSUInteger index </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;

    UInt8 (</span>^getByte)(NSUInteger) = ^<span style="color: rgba(0, 0, 0, 1)">(NSUInteger i) {
      UInt8 result </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (i &lt;<span style="color: rgba(0, 0, 0, 1)"> length) {
            result </span>= ((UInt8 *<span style="color: rgba(0, 0, 0, 1)">)bytes);
      }
      
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result;
    };
   
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (getByte(index++) != <span style="color: rgba(128, 0, 128, 1)">0x30</span><span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (getByte(index) &gt; <span style="color: rgba(128, 0, 128, 1)">0x80</span><span style="color: rgba(0, 0, 0, 1)">) {
      index </span>+= getByte(index) - <span style="color: rgba(128, 0, 128, 1)">0x80</span> + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      index</span>++<span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> PKCS #1 rsaEncryption szOID_RSA_RSA</span>
    <span style="color: rgba(0, 0, 255, 1)">static</span> unsigned <span style="color: rgba(0, 0, 255, 1)">char</span> seqiod[] = { <span style="color: rgba(128, 0, 128, 1)">0x30</span>, <span style="color: rgba(128, 0, 128, 1)">0x0d</span>, <span style="color: rgba(128, 0, 128, 1)">0x06</span>, <span style="color: rgba(128, 0, 128, 1)">0x09</span>, <span style="color: rgba(128, 0, 128, 1)">0x2a</span>, <span style="color: rgba(128, 0, 128, 1)">0x86</span>, <span style="color: rgba(128, 0, 128, 1)">0x48</span>, <span style="color: rgba(128, 0, 128, 1)">0x86</span>, <span style="color: rgba(128, 0, 128, 1)">0xf7</span>, <span style="color: rgba(128, 0, 128, 1)">0x0d</span>, <span style="color: rgba(128, 0, 128, 1)">0x01</span>, <span style="color: rgba(128, 0, 128, 1)">0x01</span>, <span style="color: rgba(128, 0, 128, 1)">0x01</span>, <span style="color: rgba(128, 0, 128, 1)">0x05</span>, <span style="color: rgba(128, 0, 128, 1)">0x00</span><span style="color: rgba(0, 0, 0, 1)"> };
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((index + <span style="color: rgba(128, 0, 128, 1)">15</span>) &gt;=<span style="color: rgba(0, 0, 0, 1)"> length) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (memcmp(&amp;bytes, seqiod, <span style="color: rgba(128, 0, 128, 1)">15</span>)) <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil;

    index </span>+= <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (getByte(index++) != <span style="color: rgba(128, 0, 128, 1)">0x03</span>) <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (getByte(index) &gt; <span style="color: rgba(128, 0, 128, 1)">0x80</span><span style="color: rgba(0, 0, 0, 1)">) {
      index </span>+= getByte(index) - <span style="color: rgba(128, 0, 128, 1)">0x80</span> + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      index</span>++<span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (getByte(index++) != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span>) <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Now make a new NSData from this buffer</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span> (index &lt; length) ? length:(length -<span style="color: rgba(0, 0, 0, 1)"> index)] : nil;
}


</span><span style="color: rgba(0, 0, 255, 1)">static</span> NSData *sExtractKey(NSString *<span style="color: rgba(0, 0, 0, 1)">inString)
{
    NSArray      </span>*inLines   = ;
    NSMutableArray </span>*outLines=<span style="color: rgba(0, 0, 0, 1)"> ;
    BOOL            insideKey </span>=<span style="color: rgba(0, 0, 0, 1)"> NO;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (NSString *line <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> inLines) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (.location !=<span style="color: rgba(0, 0, 0, 1)"> NSNotFound) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> () {
                insideKey </span>=<span style="color: rgba(0, 0, 0, 1)"> YES;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> () {
                insideKey </span>=<span style="color: rgba(0, 0, 0, 1)"> NO;
            }

      } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (insideKey) {
            ;
      }
    }

    NSString </span>*outString = ;
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> [ initWithBase64EncodedString:outString options:NSDataBase64DecodingIgnoreUnknownCharacters];
}


</span><span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> Signer {
    SecKeyRef _privateKey;
}

</span>- (<span style="color: rgba(0, 0, 255, 1)">id</span>)initWithContentsOfFile:(NSString *)path password:(NSString *)password tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((self =<span style="color: rgba(0, 0, 0, 1)"> )) {
      _privateKey </span>=<span style="color: rgba(0, 0, 0, 1)"> ;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">_privateKey) {
            self </span>=<span style="color: rgba(0, 0, 0, 1)"> nil;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
      }
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
}


</span>- (SecKeyRef) _importPrivateKeyAtPath:(NSString *)keyPath password:(NSString *)password tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag CF_RETURNS_RETAINED
{
    NSString </span>*privateKeyPath =<span style="color: rgba(0, 0, 0, 1)"> keyPath;
    NSData </span>*p12Data =<span style="color: rgba(0, 0, 0, 1)"> ;
    NSMutableDictionary </span>*serverOption =<span style="color: rgba(0, 0, 0, 1)"> ;
    SecKeyRef privateKeyRef </span>=<span style="color: rgba(0, 0, 0, 1)">NULL;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">change to the actual password you usedd here</span>
    ;
    CFArrayRef items </span>= CFArrayCreate(NULL, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, NULL);
    OSStatus securityError </span>= SecPKCS12Import((CFDataRef)p12Data, (CFDictionaryRef)serverOption, &amp;<span style="color: rgba(0, 0, 0, 1)">items);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (securityError == noErr &amp;&amp; CFArrayGetCount(items) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
      CFDictionaryRef identityDict </span>=CFArrayGetValueAtIndex(items, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
      SecIdentityRef identityApp</span>=<span style="color: rgba(0, 0, 0, 1)">(SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
      securityError </span>= SecIdentityCopyPrivateKey(identityApp, &amp;<span style="color: rgba(0, 0, 0, 1)">privateKeyRef);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (securityError !=<span style="color: rgba(0, 0, 0, 1)"> noErr) {
            privateKeyRef</span>=<span style="color: rgba(0, 0, 0, 1)">NULL;
      }
    }
    CFRelease(items);
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> privateKeyRef;
}


</span>- (NSData *) _signHash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash withPadding:(SecPadding)padding
{
    size_t   signatureLength </span>=<span style="color: rgba(0, 0, 0, 1)"> SecKeyGetBlockSize(_privateKey);
    uint8_t </span>*signatureBytes=<span style="color: rgba(0, 0, 0, 1)"> malloc(signatureLength);

    OSStatus err </span>= SecKeyRawSign(_privateKey, padding, , , signatureBytes, &amp;<span style="color: rgba(0, 0, 0, 1)">signatureLength);
    NSData </span>*result =<span style="color: rgba(0, 0, 0, 1)"> nil;
   
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (err ==<span style="color: rgba(0, 0, 0, 1)"> errSecSuccess) {
      result </span>=<span style="color: rgba(0, 0, 0, 1)"> ;
    }
   
    free(signatureBytes);
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result;

}

</span>- (NSData *) signSHA1Hash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash
{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ;
}


</span>- (NSData *) signSHA256Hash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash
{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ;
}


</span><span style="color: rgba(0, 0, 255, 1)">@end</span>


<span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> Verifier {
    SecKeyRef _publicKey;
}


</span>- (<span style="color: rgba(0, 0, 255, 1)">id</span>) initWithContentsOfFile:(NSString *)path tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((self =<span style="color: rgba(0, 0, 0, 1)"> )) {
      _publicKey </span>=<span style="color: rgba(0, 0, 0, 1)"> ;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">_publicKey) {
            self </span>=<span style="color: rgba(0, 0, 0, 1)"> nil;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
      }
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
}


</span>- (SecKeyRef) _importPublicKeyAtPath:(NSString *)keyPath tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag CF_RETURNS_RETAINED
{
    NSError</span>*error   =<span style="color: rgba(0, 0, 0, 1)"> nil;
    NSString </span>*contents= ;
   
    NSData   </span>*keyData   =<span style="color: rgba(0, 0, 0, 1)"> sGetDataByStrippingHeader(sExtractKey(contents));

    NSData   </span>*tagAsData =<span style="color: rgba(0, 0, 0, 1)"> ;
    OSStatuserr       </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;

    NSMutableDictionary </span>*publicKey =<span style="color: rgba(0, 0, 0, 1)"> [ init];
    ;
    ;
    ;
    SecItemDelete((__bridge CFDictionaryRef)publicKey);

    ;
    ;

    err </span>=<span style="color: rgba(0, 0, 0, 1)"> SecItemAdd((__bridge CFDictionaryRef)publicKey, NULL);

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((err != noErr) &amp;&amp; (err !=<span style="color: rgba(0, 0, 0, 1)"> errSecDuplicateItem)) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Now fetch the SecKeyRef version of the key</span>
    SecKeyRef keyRef =<span style="color: rgba(0, 0, 0, 1)"> nil;

    ;
    ;

    SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef </span>*)&amp;<span style="color: rgba(0, 0, 0, 1)">keyRef);

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> keyRef;
}


</span>- (BOOL) verifySHA1Hash:(NSData *)hash withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature
{
    OSStatus err </span>=<span style="color: rgba(0, 0, 0, 1)"> SecKeyRawVerify(_publicKey, kSecPaddingPKCS1SHA1, , , , );
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> err ==<span style="color: rgba(0, 0, 0, 1)"> errSecSuccess;
}


</span>- (BOOL) verifySHA256Hash:(NSData *)hash withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature
{
    OSStatus err </span>=<span style="color: rgba(0, 0, 0, 1)"> SecKeyRawVerify(_publicKey, kSecPaddingPKCS1SHA256, , , , );
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> err ==<span style="color: rgba(0, 0, 0, 1)"> errSecSuccess;
}

</span><span style="color: rgba(0, 0, 255, 1)">@end</span>


<span style="color: rgba(0, 0, 255, 1)">#else</span>

<span style="color: rgba(0, 0, 255, 1)">#pragma</span> mark - OS X Implementations

<span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> Signer {
    SecKeyRef _privateKey;
}

</span>- (<span style="color: rgba(0, 0, 255, 1)">id</span>) initWithContentsOfFile:(NSString *)path tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((self =<span style="color: rgba(0, 0, 0, 1)"> )) {
      _privateKey </span>=<span style="color: rgba(0, 0, 0, 1)"> ;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">_privateKey) {
            self </span>=<span style="color: rgba(0, 0, 0, 1)"> nil;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
      }
    }
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
}


</span>- (SecKeyRef) _importPrivateKeyAtPath:(NSString *)path tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag CF_RETURNS_RETAINED
{
    NSData </span>*data =<span style="color: rgba(0, 0, 0, 1)"> ;

    SecExternalFormat   format </span>=<span style="color: rgba(0, 0, 0, 1)"> kSecFormatOpenSSL;
    SecExternalItemType type   </span>=<span style="color: rgba(0, 0, 0, 1)"> kSecItemTypePrivateKey;
   
    CFArrayRef cfItems </span>=<span style="color: rgba(0, 0, 0, 1)"> NULL;
    SecItemImport((__bridge CFDataRef)data, NULL, </span>&amp;format, &amp;type, <span style="color: rgba(128, 0, 128, 1)">0</span>, NULL, NULL, &amp;<span style="color: rgba(0, 0, 0, 1)">cfItems);

    NSArray </span>*result = cfItems ?<span style="color: rgba(0, 0, 0, 1)"> CFBridgingRelease(cfItems) : NULL;
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> (SecKeyRef) (result ?<span style="color: rgba(0, 0, 0, 1)"> CFBridgingRetain() : nil);
}


</span>- (NSData *) _signHash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash digestType:(CFStringRef)digestType digestLength:(NSUInteger)digestLength
{
    CFErrorRef error;
    SecTransformRef signer </span>= SecSignTransformCreate(_privateKey, &amp;<span style="color: rgba(0, 0, 0, 1)">error);
    CFTypeRef cfResult </span>=<span style="color: rgba(0, 0, 0, 1)"> NULL;
   
    SecTransformSetAttribute(signer, kSecPaddingKey, kSecPaddingPKCS1Key, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(signer, kSecInputIsAttributeName, kSecInputIsDigest, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(signer, kSecTransformInputAttributeName, (__bridge CFDataRef)hash, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(signer, kSecDigestTypeAttribute, digestType, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;
   
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (digestLength) {
      SecTransformSetAttribute(signer, kSecDigestLengthAttribute, (__bridge CFNumberRef)@(digestLength), </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;
    }

    cfResult </span>= SecTransformExecute(signer, &amp;<span style="color: rgba(0, 0, 0, 1)">error);

bail:
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
      NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">Error: %@</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, error);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (signer) {
      CFRelease(signer);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> CFBridgingRelease(cfResult);
}


</span>- (NSData *) signSHA1Hash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash
{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> ;
}


</span>- (NSData *) signSHA256Hash:(NSData *<span style="color: rgba(0, 0, 0, 1)">)hash
{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> ;
}


</span><span style="color: rgba(0, 0, 255, 1)">@end</span>


<span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> Verifier {
    SecKeyRef _publicKey;
}


</span>- (<span style="color: rgba(0, 0, 255, 1)">id</span>) initWithContentsOfFile:(NSString *)path tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((self =<span style="color: rgba(0, 0, 0, 1)"> )) {
      _publicKey </span>=<span style="color: rgba(0, 0, 0, 1)"> ;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">_publicKey) {
            self </span>=<span style="color: rgba(0, 0, 0, 1)"> nil;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
      }
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> self;
}


</span>- (SecKeyRef) _importPublicKeyAtPath:(NSString *)keyPath tag:(NSString *<span style="color: rgba(0, 0, 0, 1)">)tag CF_RETURNS_RETAINED
{
    NSData </span>*data =<span style="color: rgba(0, 0, 0, 1)"> ;

    SecExternalFormat   format </span>=<span style="color: rgba(0, 0, 0, 1)"> kSecFormatOpenSSL;
    SecExternalItemType type   </span>=<span style="color: rgba(0, 0, 0, 1)"> kSecItemTypePublicKey;
   
    CFArrayRef cfItems </span>=<span style="color: rgba(0, 0, 0, 1)"> NULL;
    SecItemImport((__bridge CFDataRef)data, NULL, </span>&amp;format, &amp;type, <span style="color: rgba(128, 0, 128, 1)">0</span>, NULL, NULL, &amp;<span style="color: rgba(0, 0, 0, 1)">cfItems);

    NSArray </span>*result = cfItems ?<span style="color: rgba(0, 0, 0, 1)"> CFBridgingRelease(cfItems) : NULL;
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> (SecKeyRef) (result ?<span style="color: rgba(0, 0, 0, 1)"> CFBridgingRetain() : nil);
}


</span>- (BOOL) _verifyHash:(NSData *)hash withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature digestType:(CFStringRef)digestType digestLength:(NSUInteger)digestLength
{
    CFErrorRef error;
    </span><span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)"> result;

    SecTransformRef verifier </span>= SecVerifyTransformCreate(_publicKey, (__bridge CFDataRef)signature, &amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(verifier, kSecPaddingKey, kSecPaddingPKCS1Key, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(verifier, kSecInputIsAttributeName, kSecInputIsDigest, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(verifier, kSecTransformInputAttributeName, (__bridge CFDataRef)hash, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;

    SecTransformSetAttribute(verifier, kSecDigestTypeAttribute, digestType, </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;
   
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (digestLength) {
      SecTransformSetAttribute(verifier, kSecDigestLengthAttribute,   (__bridge CFNumberRef)@(digestLength), </span>&amp;<span style="color: rgba(0, 0, 0, 1)">error);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (error) <span style="color: rgba(0, 0, 255, 1)">goto</span><span style="color: rgba(0, 0, 0, 1)"> bail;
    }

    result </span>= CFBridgingRelease(SecTransformExecute(verifier, &amp;<span style="color: rgba(0, 0, 0, 1)">error));
   
bail:
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
      NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">Error: %@</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, error);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (verifier) {
      CFRelease(verifier);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> () {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ;
    }
   
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NO;
}


</span>- (BOOL) verifySHA1Hash:(NSData *)hash withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature
{

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> ;
}


</span>- (BOOL) verifySHA256Hash:(NSData *)hash withSignature:(NSData *<span style="color: rgba(0, 0, 0, 1)">)signature
{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> ;
}


</span><span style="color: rgba(0, 0, 255, 1)">@end</span>

<span style="color: rgba(0, 0, 255, 1)">#endif</span>

<span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> SignAndVerify

</span>+ (BOOL)signWebClipMobileConfig:(NSString *)path privateKeyPassword:(NSString *<span style="color: rgba(0, 0, 0, 1)">)password {
    NSString </span>*privateKeyPath = <span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">/Users/blockdance/Documents/private.p12</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
    NSString </span>*publicKeyPath= <span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">/Users/blockdance/Documents/public_key.pem</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
    NSString </span>*resultsPath    = [ stringByAppendingFormat:<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">%@_sign.%@</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, path.pathComponents.lastObject, path.pathExtension];
    DoTest(privateKeyPath, password, publicKeyPath, path, resultsPath);
    ;
    [ writeToFile:path atomically:YES];
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> YES;
}

</span><span style="color: rgba(0, 0, 255, 1)">@end</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yuxiaoyiyou/p/17316509.html
頁: [1]
查看完整版本: 获取iOS开发者证书的公钥和私钥