Optimize HMAC implementation

This commit is contained in:
Florian Zeitz 2011-09-09 03:42:33 +02:00
parent a85826c6ce
commit f5559cb3e5

View file

@ -376,60 +376,53 @@
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFDataArray *k = [OFDataArray dataArrayWithItemSize: 1]; OFDataArray *k = [OFDataArray dataArrayWithItemSize: 1];
size_t i, kSize, blockSize = [hashType blockSize]; size_t i, kSize, blockSize = [hashType blockSize];
uint8_t *kCArray, *kI = NULL, *kO = NULL; uint8_t *kI = NULL, *kO = NULL;
OFHash *hash; OFHash *hashI, *hashO;
if ([key itemSize] * [key count] > blockSize) { if ([key itemSize] * [key count] > blockSize) {
hash = [[[hashType alloc] init] autorelease]; hashI = [[[hashType alloc] init] autorelease];
[hash updateWithBuffer: [key cArray] [hashI updateWithBuffer: [key cArray]
length: [key itemSize] * [key count]]; length: [key itemSize] * [key count]];
[k addNItems: [hashType digestSize] [k addNItems: [hashType digestSize]
fromCArray: [hash digest]]; fromCArray: [hashI digest]];
} else } else
[k addNItems: [key itemSize] * [key count] [k addNItems: [key itemSize] * [key count]
fromCArray: [key cArray]]; fromCArray: [key cArray]];
@try { @try {
kI = [self allocMemoryWithSize: blockSize * sizeof(uint8_t)]; kI = [self allocMemoryWithSize: blockSize];
memset(kI, HMAC_IPAD, blockSize * sizeof(uint8_t)); kO = [self allocMemoryWithSize: blockSize];
kO = [self allocMemoryWithSize: blockSize * sizeof(uint8_t)];
memset(kO, HMAC_OPAD, blockSize * sizeof(uint8_t));
kCArray = [k cArray];
kSize = [k count]; kSize = [k count];
for (i = 0; i < kSize; i++) { memcpy(kI, [k cArray], kSize);
kI[i] ^= kCArray[i]; memset(kI + kSize, 0, blockSize - kSize);
kO[i] ^= kCArray[i]; memcpy(kO, kI, blockSize);
for (i = 0; i < blockSize; i++) {
kI[i] ^= HMAC_IPAD;
kO[i] ^= HMAC_OPAD;
} }
k = [OFDataArray dataArrayWithItemSize: 1]; hashI = [[[hashType alloc] init] autorelease];
[k addNItems: blockSize [hashI updateWithBuffer: (char*)kI
fromCArray: kI]; length: blockSize];
[k addNItems: [data itemSize] * [data count] [hashI updateWithBuffer: [data cArray]
fromCArray: [data cArray]]; length: [data itemSize] * [data count]];
hash = [[[hashType alloc] init] autorelease]; hashO = [[hashType alloc] init];
[hash updateWithBuffer: [k cArray] [hashO updateWithBuffer: (char*)kO
length: [k count]]; length: blockSize];
k = [OFDataArray dataArrayWithItemSize: 1]; [hashO updateWithBuffer: (char*)[hashI digest]
[k addNItems: blockSize length: [hashType digestSize]];
fromCArray: kO];
[k addNItems: [hashType digestSize]
fromCArray: [hash digest]];
} @finally { } @finally {
[self freeMemory: kI]; [self freeMemory: kI];
[self freeMemory: kO]; [self freeMemory: kO];
} }
hash = [[[hashType alloc] init] autorelease];
[hash updateWithBuffer: [k cArray]
length: [k count]];
[hash retain];
[pool release]; [pool release];
[hashO autorelease];
return [hash digest]; return [hashO digest];
} }
- (OFDataArray*)XMPP_hiWithData: (OFDataArray *)str - (OFDataArray*)XMPP_hiWithData: (OFDataArray *)str