llblowfish_tut.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llblowfish_tut.cpp
  3.  * @author James Cook, james@lindenlab.com
  4.  * @date 2007-02-04
  5.  *
  6.  * Data files generated with:
  7.  * openssl enc -bf-cbc -in blowfish.digits.txt -out blowfish.1.bin -K 00000000000000000000000000000000 -iv 0000000000000000 -p
  8.  * openssl enc -bf-cbc -in blowfish.digits.txt -out blowfish.2.bin -K 526a1e07a19dbaed84c4ff08a488d15e -iv 0000000000000000 -p
  9.  *
  10.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  11.  * 
  12.  * Copyright (c) 2007-2010, Linden Research, Inc.
  13.  * 
  14.  * Second Life Viewer Source Code
  15.  * The source code in this file ("Source Code") is provided by Linden Lab
  16.  * to you under the terms of the GNU General Public License, version 2.0
  17.  * ("GPL"), unless you have obtained a separate licensing agreement
  18.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  19.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  20.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  21.  * 
  22.  * There are special exceptions to the terms and conditions of the GPL as
  23.  * it is applied to this Source Code. View the full text of the exception
  24.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  25.  * online at
  26.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  27.  * 
  28.  * By copying, modifying or distributing this software, you acknowledge
  29.  * that you have read and understood your obligations described above,
  30.  * and agree to abide by those obligations.
  31.  * 
  32.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  33.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  34.  * COMPLETENESS OR PERFORMANCE.
  35.  * $/LicenseInfo$
  36.  */
  37. #include "linden_common.h"
  38. #include "lltut.h"
  39. #include "llblowfishcipher.h"
  40. #include "lluuid.h"
  41. namespace tut
  42. {
  43. class LLData
  44. {
  45. public:
  46. unsigned char* mInput;
  47. int mInputSize;
  48. LLData()
  49. {
  50. // n to make it easier to create text files
  51. // for testing with command line openssl
  52. mInput = (unsigned char*)"01234567890123456789012345678901234n";
  53. mInputSize = 36;
  54. }
  55. bool matchFile(const std::string& filename,
  56.    const std::string& data)
  57. {
  58. LLFILE* fp = LLFile::fopen(filename, "rb");
  59. if (!fp) 
  60. {
  61. // sometimes test is run inside the indra directory
  62. std::string path = "test/";
  63. path += filename;
  64. fp = LLFile::fopen(path, "rb");
  65. }
  66. if (!fp)
  67. {
  68. llwarns << "unabled to open " << filename << llendl;
  69. return false;
  70. }
  71. std::string good;
  72. good.resize(256);
  73. size_t got = fread(&good[0], 1, 256, fp);
  74. lldebugs << "matchFile read " << got << llendl;
  75. fclose(fp);
  76. good.resize(got);
  77. return (good == data);
  78. }
  79. };
  80. typedef test_group<LLData> blowfish_test;
  81. typedef blowfish_test::object blowfish_object;
  82. // Create test with name that can be selected on
  83. // command line of test app.
  84. tut::blowfish_test blowfish("blowfish");
  85. template<> template<>
  86. void blowfish_object::test<1>()
  87. {
  88. LLUUID blank;
  89. LLBlowfishCipher cipher(&blank.mData[0], UUID_BYTES);
  90. U32 dst_len = cipher.requiredEncryptionSpace(36);
  91. ensure("encryption space 36",
  92. (dst_len == 40) );
  93. // Blowfish adds an additional 8-byte block if your
  94. // input is an exact multiple of 8
  95. dst_len = cipher.requiredEncryptionSpace(8);
  96. ensure("encryption space 8",
  97. (dst_len == 16)  );
  98. }
  99. template<> template<>
  100. void blowfish_object::test<2>()
  101. {
  102. LLUUID blank;
  103. LLBlowfishCipher cipher(&blank.mData[0], UUID_BYTES);
  104. std::string result;
  105. result.resize(256);
  106. U32 count = cipher.encrypt(mInput, mInputSize,
  107. (U8*) &result[0], 256);
  108. ensure("encrypt output count",
  109. (count == 40) );
  110. result.resize(count);
  111. ensure("encrypt null key", matchFile("blowfish.1.bin", result));
  112. }
  113. template<> template<>
  114. void blowfish_object::test<3>()
  115. {
  116.         // same as base64 test id
  117. LLUUID id("526a1e07-a19d-baed-84c4-ff08a488d15e");
  118. LLBlowfishCipher cipher(&id.mData[0], UUID_BYTES);
  119. std::string result;
  120. result.resize(256);
  121. U32 count = cipher.encrypt(mInput, mInputSize,
  122. (U8*) &result[0], 256);
  123. ensure("encrypt output count",
  124. (count == 40) );
  125. result.resize(count);
  126. ensure("encrypt real key", matchFile("blowfish.2.bin", result));
  127. }
  128. }