NSCry
NSCry

Reputation: 1652

How To Generate SHA256 and CRC32 in ios

I am doing a file uploading job. I want to generate SHA256 and CRC32 hashes. Can anyone help me how shall I generate those hash? I want to get it working for iOS.

Upvotes: 8

Views: 20218

Answers (4)

Paul Harter
Paul Harter

Reputation: 51

This method will generate crc32c as used by gcloud on iOS from a filepath. If you want the standard crc32 just uncomment the other value for CRC32_POLYNOMIAL.

It reads the file given in 512KB chunks so can be used on large files.

- (NSString*) crc32c:(NSString*)filepath{

    ///  using crc code from
    //   http://classroomm.com/objective-c/index.php?action=printpage;topic=2891.0
    //   by rgronlie


    //this is the standard crc32 polynomial
    //uint32_t CRC32_POLYNOMIAL = 0xEDB88320;

    //this is the crc32c one
    uint32_t CRC32_POLYNOMIAL = 0x82F63B78L;
    uint32_t  CRC32C_SEED = 0xFFFFFFFFL;

    // create and populate a lookup table
    uint32_t* pCRCTable = malloc(sizeof(uint32_t) * 256);

    for (uint32_t i = 0; i <= 255; i++)
    {
        uint32_t crc32 = i;
        for (uint32_t j = 8; j > 0; j--)
        {
            if ((crc32 & 1) == 1)
                crc32 = (crc32 >> 1) ^ CRC32_POLYNOMIAL;
            else
                crc32 >>= 1;
        }
        pCRCTable[i] = crc32;
    }

    // get a handle to the file
    NSFileHandle *filehandle = [NSFileHandle fileHandleForReadingAtPath:filepath];

    if(filehandle == NULL){
        NSLog(@"failed to create file handle");
        return nil;
    }

    // a buffer to read into
    NSData* databuffer;

    uint32_t crc = CRC32C_SEED;

    // read the file in chunks of 512KB

    while(true){
        databuffer = [filehandle readDataOfLength: 512 * 1024];

        // if there is nothing left finish
        if([databuffer length] == 0){
            break;
        }
        // otherwise run each chunk through the lookup table
        uint8_t *pBytes = (uint8_t *)[databuffer bytes];
        uint32_t length = [databuffer length];

        while (length--)
        {
            crc = (crc>>8) ^ pCRCTable[(crc & 0xFF) ^ *pBytes++];
        }
    }

    // clean up
    [filehandle closeFile];
    free(pCRCTable);

    // this is the result
    uint32_t hash = crc ^ 0xFFFFFFFFL;

    // reverse it for endianness
    uint32_t hash_reversed = CFSwapInt32HostToBig(hash);
    // as raw bytes
    NSData* hash_data = [NSData dataWithBytes: &hash_reversed length: sizeof(hash_reversed)];
    // return base64 encoded
    return [hash_data base64EncodedStringWithOptions:0];
}

Upvotes: 1

Paul de Lange
Paul de Lange

Reputation: 10633

For both of these, you can use this gist:

https://gist.github.com/paul-delange/6808278

And an example

NSString* crc32 = (__bridge NSString*)TGDFileHashCreateWithPath((__bridge CFStringRef)filepath, TGDFileHashDefaultChunkSizeForReadingData, TGDChecksumAlgorithmCRC32);

Upvotes: 2

zaph
zaph

Reputation: 112875

SHA256 is available in CommonCrypto. CRC32 is not a hash, it a Cyclic Redundancy Check.

Example code:

#import <CommonCrypto/CommonDigest.h>

NSData *dataIn = [@"Now is the time for all good computers to come to the aid of their masters." dataUsingEncoding:NSASCIIStringEncoding];
NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

CC_SHA256(dataIn.bytes, dataIn.length,  macOut.mutableBytes);

NSLog(@"dataIn: %@", dataIn);
NSLog(@"macOut: %@", macOut);

NSLog output:
dataIn: <4e6f7720 69732074 68652074 696d6520 666f7220 616c6c20 676f6f64 20636f6d 70757465 72732074 6f20636f 6d652074 6f207468 65206169 64206f66 20746865 6972206d 61737465 72732e>

macOut: <53f89cf6 7ebfbe56 89f1f76a 3843dfd1 09d68c5b a938dcd2 9a12004e 108260cb>

Upvotes: 33

Yagnesh Mistry
Yagnesh Mistry

Reputation: 1

there are no apps which can generate Hash for ios

This should work....its for Mac

http://itunes.apple.com/us/app/digiprint/id473233587?mt=12

Upvotes: -5

Related Questions