Skip to content

Instantly share code, notes, and snippets.

@victorchee
Created October 20, 2017 02:54
Show Gist options
  • Save victorchee/74c38babde519bf11050409375b403db to your computer and use it in GitHub Desktop.
Save victorchee/74c38babde519bf11050409375b403db to your computer and use it in GitHub Desktop.
DSA signature in iOS with OpenSSL.
#import <openssl/dsa.h>
#import <openssl/pem.h>
- (NSString *)DASSignatureStringWithPublicKey:(NSString *)publicKey privateKey:(NSString *)privateKey {
const char *message = [self UTF8String];
BIO *publicBIO = BIO_new_mem_buf((void *)[publicKey UTF8String], -1);
DSA *publicDSA = PEM_read_bio_DSA_PUBKEY(publicBIO, NULL, NULL, NULL);
BIO_free_all(publicBIO);
BIO *privateBIO = BIO_new_mem_buf((void *)[privateKey UTF8String], -1);
if (privateBIO == NULL) {
return nil;
}
DSA *dsa = PEM_read_bio_DSAPrivateKey(privateBIO, &publicDSA, NULL, NULL);
BIO_free_all(privateBIO);
if (dsa == NULL) {
return nil;
}
// Sign
unsigned int sign_length;
unsigned char *signature = (unsigned char *)calloc(DSA_size(dsa), sizeof(unsigned char));
int result = DSA_sign(0, (const unsigned char*)message, (int)strlen(message), signature, &sign_length, dsa);
if (result != 1) {
return nil;
}
// Verify
// int verifyResult = DSA_verify(1, (const unsigned char*)message, (int)strlen(message), signature, sign_length, dsa);
// if(verifyResult > 0) {
// NSLog(@"Verification OK\n");
// } else {
// NSLog(@"Verification Failure. Error = %i\n",result);
// }
DSA_free(dsa);
return [[[NSData alloc] initWithBytes:signature length:sign_length] base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
NSString *privateKey = @"-----BEGIN DSA PRIVATE KEY-----\nMIIBTAIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdS\nPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVCl\npJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith\n1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7L\nvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3\nzwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImo\ng9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoEFwIVAIegLUtmm2oQKQJTOiLugHTSjl/q\n-----END DSA PRIVATE KEY-----";
NSString *publicKey = @"-----BEGIN PUBLIC KEY-----\nMIIBtjCCASsGByqGSM44BAEwggEeAoGBAMLHqwFTJ7QOyYAQbvSYOsdaKkZ7m+tl\n/3LRmLIZ3dW85rlKi9AWNOTy37bDvV68PaqXn1X0LJ6YKJvbUbZ7iQFXnBPMdfIC\nYBeqmRTTi6UsRgGzRKCoawA7Fqbe45TWpvAn6QQOZ/t5atLRqXNG/meCQRdp+SiX\nb4PXUQiO0851AhUAlib9Op5u7oLIIH+3hvne4V9oObUCgYAcK7pXhlNUZ2bktnDO\nCn3LBQ5ZcO152sUS6gQ3UM77cOqAslV+6DRZQ0K1otpQNfZahFXG6ExDQ3p88bu3\nRBg99ik0Q6nZSylbCWptKKrOoWZDWQxXVaJ7V8obByxz9L7gnY4Uy0nFv3H6f16v\n5LciBigt5JmG7SIpehJSzbaFCAOBhAACgYBt9wbE10IYrJm3rzqcv1uemXZw7o5U\n2tQUWW+Ix2afTcWTS//L6Xe5PeTU7pDKzr2qhsx4gLePwvEyFz/dREITs0Ynu5dT\nxB65B6ozuE2/zeF+mJx9/M6SlvJxoikvHw9Y6n+vNFTymbFcAJUSfiUceEdfuQDN\ns5n0a+bYWOqtcg==\n-----END PUBLIC KEY-----";
NSString *orginalString = @"abc";
NSString *signature = [orginalString DASSignatureStringWithPublicKey:publicKey privateKey:privateKey];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment