xref: /haiku/src/tests/system/libroot/posix/CryptTest.cpp (revision 6b8403b44b428c2aabd30116c956413cdebfad02)
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 
CryptTest()35 CryptTest::CryptTest()
36 {
37 }
38 
39 
~CryptTest()40 CryptTest::~CryptTest()
41 {
42 }
43 
44 
45 void
setUp()46 CryptTest::setUp()
47 {
48 }
49 
50 
51 void
tearDown()52 CryptTest::tearDown()
53 {
54 }
55 
56 
57 void
TestLegacy()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
TestLegacyBSD()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
TestCustomSalt()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
TestSaltGeneration()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
TestBadSalt()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
TestCryptR()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
AddTests(BTestSuite & parent)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