15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
-
-
+
+
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
-
-
+
-
|
#include "config.h"
#include <string.h>
#import "TestsAppDelegate.h"
static OFString *module = @"OFHMAC";
static OFString *const module = @"OFHMAC";
static const uint8_t key[] =
"yM9h8K6IWnJRvxC/0F8XRWG7RnACDBz8wqK2tbXrYVLoKC3vPLeJikyJSM47tVHc"
"DlXHww9zULAC2sJUlm2Kg1z4oz2aXY3Y1PQSB4VkC/m0DQ7hCI6cAg4TWnKdzWTy"
"cvYGX+Y6HWeDY79/PGSd8fNItme6I8w4HDBqU7BP2sum3jbePJqoiSnhcyJZQTeZ"
"jw0ZXoyrfHgOYD2M+NsTDaGpLblFtQ7n5CczjKtafG40PkEwx1dcrd46U9i3GyTK";
static const size_t key_length = sizeof(key);
static const uint8_t digest_md5[] =
static const size_t keyLength = sizeof(key);
static const uint8_t MD5Digest[] =
"\xCC\x1F\xEF\x09\x29\xA3\x25\x1A\x06\xA9\x83\x99\xF9\xBC\x8F\x42";
static const uint8_t digest_sha1[] =
static const uint8_t SHA1Digest[] =
"\x94\xB9\x0A\x6F\xFB\xA7\x13\x6A\x75\x55"
"\xD5\x7F\x5D\xB7\xF4\xCA\xEB\x4A\xDE\xBF";
static const uint8_t digest_rmd160[] =
static const uint8_t RIPEMD160Digest[] =
"\x2C\xE1\xED\x41\xC6\xF3\x51\xA8\x04\xD2"
"\xC3\x9B\x08\x33\x3B\xD5\xC9\x00\x39\x50";
static const uint8_t digest_sha256[] =
static const uint8_t SHA256Digest[] =
"\xFB\x8C\xDA\x88\xB3\x81\x32\x16\xD7\xD8\x62\xD4\xA6\x26\x9D\x77"
"\x01\x99\x62\x65\x29\x02\x41\xE6\xEF\xA1\x02\x31\xA8\x9D\x77\x5D";
static const uint8_t digest_sha384[] =
static const uint8_t SHA384Digest[] =
"\x2F\x4A\x47\xAE\x13\x8E\x96\x52\xF1\x8F\x05\xFD\x65\xCD\x9A\x97"
"\x93\x2F\xC9\x02\xD6\xC6\xAB\x2E\x15\x76\xC0\xA7\xA0\x05\xF4\xEF"
"\x14\x52\x33\x4B\x9C\x5F\xD8\x07\x4E\x98\xAE\x97\x46\x29\x24\xB4";
static const uint8_t digest_sha512[] =
static const uint8_t SHA512Digest[] =
"\xF5\x8C\x3F\x9C\xA2\x2F\x0A\xF3\x26\xD8\xC0\x7E\x20\x63\x88\x61"
"\xC9\xE1\x1F\xD7\xC7\xE5\x59\x33\xD5\x2F\xAF\x56\x1C\x94\xC8\xA4"
"\x61\xB3\xF9\x1A\xE3\x09\x43\xA6\x5B\x85\xB1\x50\x5B\xCB\x1A\x2E"
"\xB7\xE8\x87\xC1\x73\x19\x63\xF6\xA2\x91\x8D\x7E\x2E\xCC\xEC\x99";
@implementation TestsAppDelegate (OFHMACTests)
- (void)HMACTests
{
void *pool = objc_autoreleasePoolPush();
OFFile *f = [OFFile fileWithPath: @"testfile.bin"
OFFile *file = [OFFile fileWithPath: @"testfile.bin" mode: @"r"];
mode: @"r"];
OFHMAC *HMAC_MD5, *HMAC_SHA1, *HMAC_RMD160;
OFHMAC *HMAC_SHA256, *HMAC_SHA384, *HMAC_SHA512;
OFHMAC *HMACMD5, *HMACSHA1, *HMACRMD160;
OFHMAC *HMACSHA256, *HMACSHA384, *HMACSHA512;
TEST(@"+[HMACWithHashClass:] with MD5",
(HMAC_MD5 = [OFHMAC HMACWithHashClass: [OFMD5Hash class]
allowsSwappableMemory: true]))
(HMACMD5 = [OFHMAC HMACWithHashClass: [OFMD5Hash class]
allowsSwappableMemory: true]))
TEST(@"+[HMACWithHashClass:] with SHA-1",
(HMAC_SHA1 = [OFHMAC HMACWithHashClass: [OFSHA1Hash class]
allowsSwappableMemory: true]))
(HMACSHA1 = [OFHMAC HMACWithHashClass: [OFSHA1Hash class]
allowsSwappableMemory: true]))
TEST(@"+[HMACWithHashClass:] with RIPEMD-160",
(HMAC_RMD160 = [OFHMAC HMACWithHashClass: [OFRIPEMD160Hash class]
allowsSwappableMemory: true]))
(HMACRMD160 = [OFHMAC HMACWithHashClass: [OFRIPEMD160Hash class]
allowsSwappableMemory: true]))
TEST(@"+[HMACWithHashClass:] with SHA-256",
(HMAC_SHA256 = [OFHMAC HMACWithHashClass: [OFSHA256Hash class]
allowsSwappableMemory: true]))
(HMACSHA256 = [OFHMAC HMACWithHashClass: [OFSHA256Hash class]
allowsSwappableMemory: true]))
TEST(@"+[HMACWithHashClass:] with SHA-384",
(HMAC_SHA384 = [OFHMAC HMACWithHashClass: [OFSHA384Hash class]
allowsSwappableMemory: true]))
(HMACSHA384 = [OFHMAC HMACWithHashClass: [OFSHA384Hash class]
allowsSwappableMemory: true]))
TEST(@"+[HMACWithHashClass:] with SHA-512",
(HMAC_SHA512 = [OFHMAC HMACWithHashClass: [OFSHA512Hash class]
allowsSwappableMemory: true]))
(HMACSHA512 = [OFHMAC HMACWithHashClass: [OFSHA512Hash class]
allowsSwappableMemory: true]))
EXPECT_EXCEPTION(@"Detection of missing key",
OFInvalidArgumentException, [HMAC_MD5 updateWithBuffer: ""
length: 0])
OFInvalidArgumentException,
[HMACMD5 updateWithBuffer: "" length: 0])
TEST(@"-[setKey:length:] with MD5",
R([HMAC_MD5 setKey: key
R([HMACMD5 setKey: key length: keyLength]))
length: key_length]))
TEST(@"-[setKey:length:] with SHA-1",
R([HMAC_SHA1 setKey: key
R([HMACSHA1 setKey: key length: keyLength]))
length: key_length]))
TEST(@"-[setKey:length:] with RIPEMD-160",
R([HMAC_RMD160 setKey: key
R([HMACRMD160 setKey: key length: keyLength]))
length: key_length]))
TEST(@"-[setKey:length:] with SHA-256",
R([HMAC_SHA256 setKey: key
R([HMACSHA256 setKey: key length: keyLength]))
length: key_length]))
TEST(@"-[setKey:length:] with SHA-384",
R([HMAC_SHA384 setKey: key
R([HMACSHA384 setKey: key length: keyLength]))
length: key_length]))
TEST(@"-[setKey:length:] with SHA-512",
R([HMAC_SHA512 setKey: key
R([HMACSHA512 setKey: key length: keyLength]))
length: key_length]))
while (!f.atEndOfStream) {
char buf[64];
size_t len = [f readIntoBuffer: buf
while (!file.atEndOfStream) {
char buffer[64];
size_t length = [file readIntoBuffer: buffer length: 64];
length: 64];
[HMAC_MD5 updateWithBuffer: buf
[HMACMD5 updateWithBuffer: buffer length: length];
length: len];
[HMAC_SHA1 updateWithBuffer: buf
[HMACSHA1 updateWithBuffer: buffer length: length];
length: len];
[HMAC_RMD160 updateWithBuffer: buf
[HMACRMD160 updateWithBuffer: buffer length: length];
length: len];
[HMAC_SHA256 updateWithBuffer: buf
[HMACSHA256 updateWithBuffer: buffer length: length];
length: len];
[HMAC_SHA384 updateWithBuffer: buf
[HMACSHA384 updateWithBuffer: buffer length: length];
length: len];
[HMAC_SHA512 updateWithBuffer: buf
[HMACSHA512 updateWithBuffer: buffer length: length];
length: len];
}
[f close];
[file close];
TEST(@"-[digest] with MD5",
memcmp(HMAC_MD5.digest, digest_md5, HMAC_MD5.digestSize) == 0)
memcmp(HMACMD5.digest, MD5Digest, HMACMD5.digestSize) == 0)
TEST(@"-[digest] with SHA-1",
memcmp(HMAC_SHA1.digest, digest_sha1, HMAC_SHA1.digestSize) == 0)
memcmp(HMACSHA1.digest, SHA1Digest, HMACSHA1.digestSize) == 0)
TEST(@"-[digest] with RIPEMD-160",
memcmp(HMAC_RMD160.digest, digest_rmd160,
HMAC_RMD160.digestSize) == 0)
memcmp(HMACRMD160.digest, RIPEMD160Digest,
HMACRMD160.digestSize) == 0)
TEST(@"-[digest] with SHA-256",
memcmp(HMAC_SHA256.digest, digest_sha256,
memcmp(HMACSHA256.digest, SHA256Digest, HMACSHA256.digestSize) == 0)
HMAC_SHA256.digestSize) == 0)
TEST(@"-[digest] with SHA-384",
memcmp(HMAC_SHA384.digest, digest_sha384,
memcmp(HMACSHA384.digest, SHA384Digest, HMACSHA384.digestSize) == 0)
HMAC_SHA384.digestSize) == 0)
TEST(@"-[digest] with SHA-512",
memcmp(HMAC_SHA512.digest, digest_sha512,
memcmp(HMACSHA512.digest, SHA512Digest, HMACSHA512.digestSize) == 0)
HMAC_SHA512.digestSize) == 0)
objc_autoreleasePoolPop(pool);
}
@end
|