Optimize HMAC implementation
This commit is contained in:
parent
a85826c6ce
commit
f5559cb3e5
1 changed files with 26 additions and 33 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue