summaryrefslogtreecommitdiff
path: root/indra/test/llblowfish_tut.cpp
blob: 8f0912d98de6901e4a52440efcd0a06a5c801090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
/** 
 * @file llblowfish_tut.cpp
 * @author James Cook, james@lindenlab.com
 * @date 2007-02-04
 *
 * Data files generated with:
 * openssl enc -bf-cbc -in blowfish.digits.txt -out blowfish.1.bin -K 00000000000000000000000000000000 -iv 0000000000000000 -p
 * openssl enc -bf-cbc -in blowfish.digits.txt -out blowfish.2.bin -K 526a1e07a19dbaed84c4ff08a488d15e -iv 0000000000000000 -p
 *
 * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
 * $License$
 */

#include "linden_common.h"
#include "lltut.h"

#include "llblowfishcipher.h"

#include <string>
#include <stdio.h>
#include "lluuid.h"

namespace tut
{
	class LLData
	{
	public:
		unsigned char* mInput;
		int mInputSize;

		LLData()
		{
			// \n to make it easier to create text files
			// for testing with command line openssl
			mInput = (unsigned char*)"01234567890123456789012345678901234\n";
			mInputSize = 36;
		}

		bool matchFile(const char* filename,
				const std::string& data)
		{
			FILE* fp = fopen(filename, "rb");
			if (!fp) 
			{
				// sometimes test is run inside the indra directory
				std::string path = "test/";
				path += filename;
				fp = fopen(path.c_str(), "rb");
			}
			if (!fp)
			{
				llwarns << "unabled to open " << filename << llendl;
				return false;
			}

			std::string good;
			good.resize(256);
			size_t got = fread(&good[0], 1, 256, fp);
			lldebugs << "matchFile read " << got << llendl;
			fclose(fp);
			good.resize(got);
		
			return (good == data);
		}
	};
	typedef test_group<LLData> blowfish_test;
	typedef blowfish_test::object blowfish_object;
	// Create test with name that can be selected on
	// command line of test app.
	tut::blowfish_test blowfish("blowfish");

	template<> template<>
	void blowfish_object::test<1>()
	{
		LLUUID blank;
		LLBlowfishCipher cipher(&blank.mData[0], UUID_BYTES);

		U32 dst_len = cipher.requiredEncryptionSpace(36);
		ensure("encryption space 36",
				(dst_len == 40) );

		// Blowfish adds an additional 8-byte block if your
		// input is an exact multiple of 8
		dst_len = cipher.requiredEncryptionSpace(8);
		ensure("encryption space 8",
				(dst_len == 16)  );
	}

	template<> template<>
	void blowfish_object::test<2>()
	{
		LLUUID blank;
		LLBlowfishCipher cipher(&blank.mData[0], UUID_BYTES);

		std::string result;
		result.resize(256);
		U32 count = cipher.encrypt(mInput, mInputSize,
				(U8*) &result[0], 256);

		ensure("encrypt output count",
				(count == 40) );
		result.resize(count);

		ensure("encrypt null key", matchFile("blowfish.1.bin", result));
	}

	template<> template<>
	void blowfish_object::test<3>()
	{
		// same as base64 test id
		LLUUID id("526a1e07-a19d-baed-84c4-ff08a488d15e");
		LLBlowfishCipher cipher(&id.mData[0], UUID_BYTES);

		std::string result;
		result.resize(256);
		U32 count = cipher.encrypt(mInput, mInputSize,
				(U8*) &result[0], 256);

		ensure("encrypt output count",
				(count == 40) );
		result.resize(count);

		ensure("encrypt real key", matchFile("blowfish.2.bin", result));
	}
}