opietest.c revision 92906
1/* opietest.c: Quick, though definitely not complete, regression test for 2 libopie. This is intended to catch two things: 3 4 (1) when changes break something 5 (2) if some system wierdness (libc, compiler, or CPU/hardware) is 6 not getting along at all with OPIE. 7 8 It's safe to say that, if tests fail, OPIE isn't going to work right 9on your system. The converse is not such a safe statement. 10 11%%% copyright-cmetz-96 12This software is Copyright 1996-2001 by Craig Metz, All Rights Reserved. 13The Inner Net License Version 3 applies to this software. 14You should have received a copy of the license with this software. If 15you didn't get a copy, you may request one from <license@inner.net>. 16 17 History: 18 19 Modified by cmetz for OPIE 2.4. Use struct opie_key for key blocks. 20 Modified by cmetz for OPIE 2.31. Added a couple of new checks, 21 removed a few commented-out checks for functions that 22 no longer exist, added test-skip capability. 23 Modified by cmetz for OPIE 2.3. Use new calling conventions for 24 opiebtoa8()/atob8(). opiegenerator() outputs hex now. 25 Modified by cmetz for OPIE 2.22. Test opielock()/opieunlock() 26 refcount support. 27 Created by cmetz for OPIE 2.2. 28*/ 29#include "opie_cfg.h" 30#include <stdio.h> 31#include "opie.h" 32 33char buffer[1024]; 34 35int testatob8() 36{ 37 static char testin[] = "0123456789abcdef"; 38 static unsigned char testout[sizeof(struct opie_otpkey)] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 39 struct opie_otpkey key; 40 41 if (!opieatob8(&key, testin)) 42 return -1; 43 44 if (memcmp(&key, testout, sizeof(testout))) 45 return -1; 46 47 return 0; 48} 49 50int testbtoa8() 51{ 52 static unsigned char testin[sizeof(struct opie_otpkey)] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 53 static char testout[] = "0123456789abcdef"; 54 struct opie_otpkey testin_aligned; 55 56 memcpy(&testin_aligned, testin, sizeof(struct opie_otpkey)); 57 58 if (!opiebtoa8(buffer, &testin_aligned)) 59 return -1; 60 61 if (memcmp(buffer, testout, sizeof(testout))) 62 return -1; 63 64 return 0; 65} 66 67int testbtoe() 68{ 69 static unsigned char testin[sizeof(struct opie_otpkey)] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 70 static char testout[] = "AIM HEW BLUM FED MITE WARM"; 71 struct opie_otpkey testin_aligned; 72 73 memcpy(&testin_aligned, testin, sizeof(struct opie_otpkey)); 74 75 if (!opiebtoe(buffer, &testin_aligned)) 76 return -1; 77 78 if (memcmp(buffer, testout, sizeof(testout))) 79 return -1; 80 81 return 0; 82} 83 84int testetob() 85{ 86 static char testin[] = "AIM HEW BLUM FED MITE WARM"; 87 static unsigned char testout[sizeof(struct opie_otpkey)] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 88 struct opie_otpkey key; 89 90 if (opieetob(&key, testin) != 1) 91 return -1; 92 93 if (memcmp(&key, testout, sizeof(testout))) 94 return -1; 95 96 return 0; 97} 98 99int testgenerator() 100{ 101 static char testin1[] = "otp-md5 123 ke1234"; 102 static char testin2[] = "this is a test"; 103 /* static char testout[] = "END KERN BALM NICK EROS WAVY"; */ 104 static char testout[] = "11D4 C147 E227 C1F1"; 105 106 if (opiegenerator(testin1, testin2, buffer)) 107 return -1; 108 109 if (memcmp(buffer, testout, sizeof(testout))) 110 return -1; 111 112 return 0; 113} 114 115int testgetsequence() 116{ 117 struct opie testin; 118 testin.opie_n = 42; 119 120 if (opiegetsequence(&testin) != 42) 121 return -1; 122 123 return 0; 124} 125 126int testhashmd4() 127{ 128 static unsigned char testin[sizeof(struct opie_otpkey)] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 129 static unsigned char testout[sizeof(struct opie_otpkey)] = { 0x9f, 0x40, 0xfb, 0x84, 0xb, 0xf8, 0x7f, 0x4b }; 130 struct opie_otpkey testin_aligned; 131 132 memcpy(&testin_aligned, testin, sizeof(struct opie_otpkey)); 133 134 opiehash(&testin_aligned, 4); 135 136 if (memcmp(&testin_aligned, testout, sizeof(struct opie_otpkey))) 137 return -1; 138 139 return 0; 140} 141 142int testhashmd5() 143{ 144 static unsigned char testin[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 145 static unsigned char testout[] = { 0x78, 0xdd, 0x1a, 0x37, 0xf8, 0x91, 0x54, 0xe1 }; 146 struct opie_otpkey testin_aligned; 147 148 memcpy(&testin_aligned, testin, sizeof(struct opie_otpkey)); 149 150 opiehash(&testin_aligned, 5); 151 152 if (memcmp(&testin_aligned, testout, sizeof(struct opie_otpkey))) 153 return -1; 154 155 return 0; 156} 157 158int testinsecure() 159{ 160 opieinsecure(); 161 162 return 0; 163} 164 165int testkeycrunch() 166{ 167 static char testin1[] = "ke1234"; 168 static char testin2[] = "this is a test"; 169 static unsigned char testout[sizeof(struct opie_otpkey)] = { 0x2e, 0xd3, 0x5d, 0x74, 0x3e, 0xa9, 0xe9, 0xe8 }; 170 struct opie_otpkey opie_otpkey; 171 172 if (opiekeycrunch(5, &opie_otpkey, testin1, testin2)) 173 return -1; 174 175 if (memcmp(&opie_otpkey, testout, sizeof(struct opie_otpkey))) 176 return -1; 177 178 return 0; 179} 180 181int testlock() 182{ 183 int i; 184 185 if (getuid()) 186 return -2; 187 188 for (i = 0; i < 3; i++) 189 if (opielock("__opietest")) 190 return -1; 191 192 return 0; 193} 194 195int testpasscheck() 196{ 197 static char testin1[] = "abadone"; 198 static char testin2[] = "A more reasonable choice."; 199 200 if (!opiepasscheck(testin1)) 201 return -1; 202 203 if (opiepasscheck(testin2)) 204 return -1; 205 206 return 0; 207} 208 209int testrandomchallenge() 210{ 211 char buffer[OPIE_CHALLENGE_MAX+1]; 212 213 opierandomchallenge(buffer); 214 215 if (strncmp(buffer, "otp-", 4)) 216 return -1; 217 218 return 0; 219} 220 221int testunlock() 222{ 223 int i; 224 225 if (getuid()) 226 return -2; 227 228 for (i = 0; i < 3; i++) 229 if (opieunlock()) 230 return -1; 231 232 if (opieunlock() != -1) 233 return -1; 234 235 return 0; 236} 237 238struct opietest { 239 int (*f)(); 240 char *n; 241}; 242 243static struct opietest opietests[] = { 244 { testatob8, "atob8" }, 245 { testbtoa8, "btoa8" }, 246 { testbtoe, "btoe" }, 247 { testetob, "etob" }, 248/* { testchallenge, "challenge" }, */ 249 { testgenerator, "generator" }, 250 { testgetsequence, "getsequence" }, 251 { testhashmd4, "hash(MD4)" }, 252 { testhashmd5, "hash(MD5)" }, 253 { testinsecure, "insecure" }, 254 { testkeycrunch, "keycrunch" }, 255 { testlock, "lock" }, 256 { testrandomchallenge, "randomchallenge" }, 257/* { testreadpass, "readpass" }, */ 258 { testunlock, "unlock" }, 259/* { testverify, "verify" }, */ 260 { NULL, NULL } 261}; 262 263int main FUNCTION((argc, argv), int argc AND char *argv[]) 264{ 265 struct opietest *opietest; 266 int tests_passed = 0; 267 int tests_failed = 0; 268 int tests_skipped = 0; 269 int ntests = 0, testn = 0; 270 271 if (getuid() != geteuid()) { 272 fprintf(stderr, "opietest: do not make this program setuid!\n"); 273 exit(1); 274 }; 275 276 for (opietest = opietests; opietest->n; opietest++) 277 ntests++; 278 279 printf("opietest: executing %d tests\n", ntests); 280 281 for (opietest = opietests, testn = 1; opietest->n; opietest++) { 282 printf("(%2d/%2d) testing opie%s... ", testn++, ntests, opietest->n); 283 switch(opietest->f()) { 284 case -2: 285 printf("skipped\n"); 286 tests_skipped++; 287 opietest->f = NULL; 288 break; 289 case -1: 290 printf("FAILED!\n"); 291 tests_failed++; 292 break; 293 case 0: 294 printf("passed\n"); 295 tests_passed++; 296 opietest->f = NULL; 297 break; 298 } 299 } 300 301 printf("opietest: completed %d tests. %d tests passed, %d tests skipped, %d tests failed.\n", ntests, tests_passed, tests_skipped, tests_failed); 302 if (tests_failed) { 303 printf("opietest: please correct the following failures before attempting to use OPIE:\n"); 304 for (opietest = opietests; opietest->n; opietest++) 305 if (opietest->f) 306 printf(" opie%s\n", opietest->n); 307 exit(1); 308 } 309 exit(0); 310} 311