1 /* 2 * Copyright 2017, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Andrew Aldridge, i80and@foxquill.com 7 */ 8 9 10 #include <crypt.h> 11 #include <errno.h> 12 #include <string.h> 13 #include <unistd.h> 14 15 #include "CryptTest.h" 16 17 #include <cppunit/TestCaller.h> 18 #include <cppunit/TestSuite.h> 19 20 21 #define PASSWORD "password" 22 #define HASH_SALT "$s$12$101f2cf1a3b35aa671b8e006c6fb037e429d5b4ecb8dab16919097789e2d3a5f$ignorethis" 23 #define HASH_RESULT "$s$12$101f2cf1a3b35aa671b8e006c6fb037e429d5b4ecb8dab16919097789e2d3a5f$4c5c886740871c447639e2dd5eeba004f22c0860ce88c811032ca6de6c95b23e" 24 25 // This salt is only 31 bytes, while we need 32 bytes 26 #define HASH_BAD_SALT "$s$12$101f2cf1a3b35aa671b8e006c6fb037e429d5b4ecb8dab16919097789e2d3a$ignorethis" 27 28 #define LEGACY_SALT "1d" 29 #define LEGACY_RESULT "1dVzQK99LSks6" 30 31 #define BSD_SALT "_7C/.Bf/4" 32 #define BSD_RESULT "_7C/.Bf/4gZk10RYRs4Y" 33 34 35 CryptTest::CryptTest() 36 { 37 } 38 39 40 CryptTest::~CryptTest() 41 { 42 } 43 44 45 void 46 CryptTest::setUp() 47 { 48 } 49 50 51 void 52 CryptTest::tearDown() 53 { 54 } 55 56 57 void 58 CryptTest::TestLegacy() 59 { 60 char* buf = crypt(PASSWORD, LEGACY_SALT); 61 CPPUNIT_ASSERT(buf != NULL); 62 CPPUNIT_ASSERT(strcmp(buf, LEGACY_RESULT) == 0); 63 } 64 65 66 void 67 CryptTest::TestLegacyBSD() 68 { 69 char* buf = crypt(PASSWORD, BSD_SALT); 70 CPPUNIT_ASSERT(buf != NULL); 71 CPPUNIT_ASSERT(strcmp(buf, BSD_RESULT) == 0); 72 } 73 74 75 void 76 CryptTest::TestCustomSalt() 77 { 78 char* buf = crypt(PASSWORD, HASH_SALT); 79 CPPUNIT_ASSERT(buf != NULL); 80 CPPUNIT_ASSERT(strcmp(buf, HASH_RESULT) == 0); 81 } 82 83 84 void 85 CryptTest::TestSaltGeneration() 86 { 87 char tmp[200]; 88 89 char* buf = crypt(PASSWORD, NULL); 90 CPPUNIT_ASSERT(buf != NULL); 91 strlcpy(tmp, buf, sizeof(tmp)); 92 buf = crypt(PASSWORD, tmp); 93 CPPUNIT_ASSERT(strcmp(buf, tmp) == 0); 94 } 95 96 97 void 98 CryptTest::TestBadSalt() 99 { 100 errno = 0; 101 CPPUNIT_ASSERT(crypt(PASSWORD, HASH_BAD_SALT) == NULL); 102 CPPUNIT_ASSERT(errno == EINVAL); 103 } 104 105 106 void 107 CryptTest::TestCryptR() 108 { 109 char tmp[200]; 110 111 struct crypt_data data; 112 data.initialized = 0; 113 114 char* buf = crypt_r(PASSWORD, NULL, &data); 115 CPPUNIT_ASSERT(buf != NULL); 116 strlcpy(tmp, buf, sizeof(tmp)); 117 buf = crypt(PASSWORD, tmp); 118 CPPUNIT_ASSERT(strcmp(buf, tmp) == 0); 119 } 120 121 122 void 123 CryptTest::AddTests(BTestSuite& parent) 124 { 125 CppUnit::TestSuite& suite = *new CppUnit::TestSuite("CryptTest"); 126 suite.addTest(new CppUnit::TestCaller<CryptTest>( 127 "CryptTest::TestLegacy", 128 &CryptTest::TestLegacy)); 129 suite.addTest(new CppUnit::TestCaller<CryptTest>( 130 "CryptTest::TestLegacyBSD", 131 &CryptTest::TestLegacyBSD)); 132 suite.addTest(new CppUnit::TestCaller<CryptTest>( 133 "CryptTest::TestCustomSalt", 134 &CryptTest::TestCustomSalt)); 135 suite.addTest(new CppUnit::TestCaller<CryptTest>( 136 "CryptTest::TestSaltGeneration", 137 &CryptTest::TestSaltGeneration)); 138 suite.addTest(new CppUnit::TestCaller<CryptTest>( 139 "CryptTest::TestBadSalt", 140 &CryptTest::TestBadSalt)); 141 suite.addTest(new CppUnit::TestCaller<CryptTest>( 142 "CryptTest::TestCryptR", 143 &CryptTest::TestCryptR)); 144 parent.addTest("CryptTest", &suite); 145 } 146