- (NSString *)hashWithDigest:(AUMessageDigest)digest data:(NSData **)data
{
u_byte *(*CC_XXX)(const void *, CC_LONG, u_byte *);
CC_LONG CC_XXX_DIGEST_LEN;
u_byte *md = NULL;
NSInteger i = 0;
NSString *result;
NSMutableString *buffer;
switch (digest) {
case AUDigestSHA1:
CC_XXX = CC_SHA1;
CC_XXX_DIGEST_LEN = CC_SHA1_DIGEST_LENGTH;
break;
case AUDigestSHA256:
CC_XXX = CC_SHA256;
CC_XXX_DIGEST_LEN = CC_SHA256_DIGEST_LENGTH;
break;
case AUDigestSHA512:
CC_XXX = CC_SHA512;
CC_XXX_DIGEST_LEN = CC_SHA512_DIGEST_LENGTH;
break;
case AUDigestMD5:
CC_XXX = CC_MD5;
CC_XXX_DIGEST_LEN = CC_MD5_DIGEST_LENGTH;
break;
default:
return nil;
}
result = nil;
if((md = malloc(CC_XXX_DIGEST_LEN * sizeof(u_byte) + 1))) {
memset(md, 0, CC_XXX_DIGEST_LEN + 1);
CC_XXX([self bytes], [self length], md);
buffer = [NSMutableString string];
for (i = 0; i< CC_XXX_DIGEST_LEN; i++) {
[buffer appendFormat:@"%02x", (CC_LONG)(md[i])];
}
if (data != nil) {
*data = [[NSData alloc] initWithBytesNoCopy:md length:CC_XXX_DIGEST_LEN freeWhenDone:YES];
} else {
free(md);
}
result = [NSString stringWithString:buffer];
}
return result;
}