获取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> <CommonCrypto/CommonCrypto.h>
<span style="color: rgba(0, 0, 255, 1)">#import</span> <Security/Security.h>
<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>&<span style="color: rgba(0, 0, 0, 1)">ctx);
CC_SHA1_Update(</span>&<span style="color: rgba(0, 0, 0, 1)">ctx, , (CC_LONG));
CC_SHA1_Final(digest, </span>&<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>&<span style="color: rgba(0, 0, 0, 1)">ctx);
CC_SHA256_Update(</span>&<span style="color: rgba(0, 0, 0, 1)">ctx, , (CC_LONG));
CC_SHA256_Final(digest, </span>&<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 < 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 & <span style="color: rgba(128, 0, 128, 1)">0xF0</span>) >> <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">];
outCharacters = lookup[(inByte & <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 < 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 >= <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> && c <= <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 >= <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> && c <= <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 >= <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> && c <= <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 >= <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 << <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 < ; 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 < ; 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 <<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) > <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>) >=<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(&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) > <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 < 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, &<span style="color: rgba(0, 0, 0, 1)">items);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (securityError == noErr && CFArrayGetCount(items) > <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, &<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, &<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) && (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>*)&<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>&format, &type, <span style="color: rgba(128, 0, 128, 1)">0</span>, NULL, NULL, &<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, &<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>&<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>&<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>&<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>&<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>&<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, &<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>&format, &type, <span style="color: rgba(128, 0, 128, 1)">0</span>, NULL, NULL, &<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, &<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>&<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>&<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>&<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>&<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>&<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, &<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> </p><br><br>
来源:https://www.cnblogs.com/yuxiaoyiyou/p/17316509.html
頁:
[1]