📄 tsha.cpp
字号:
// tsha.cc// testing SHA and SHA-HMAC function// copyright SafeTP Development Group, Inc., 2000 Terms of use are as specified in license.txt#include "ssha.h" // SHA#include "shmac.h" // HMAC#include "datablok.h" // DataBlock#include "integer.h" // Integer#include <stdio.h> // printf#include <ctype.h> // isprint#include <string.h> // strlen#include <iostream.h> // cout#include "blokutil.h" // dataBlock2Integer, vice-versaDataBlock hash(DataBlock const &data, HashModule &hash){ DataBlock ret(hash.DigestSize()); hash.CalculateDigest(ret.getData(), data.getDataC(), data.getDataLen()); ret.setDataLen(hash.DigestSize()); return ret;}DataBlock sha(DataBlock const &data){ SHA sha; return hash(data, sha);}DataBlock shaHmac(DataBlock const &data, DataBlock const &key){ SHA sha; HMAC hmac(sha, key.getDataC(), key.getDataLen()); return hash(data, hmac);}bool shaHmacTestVector( DataBlock const &key, DataBlock const &data, DataBlock const &expectedDigest){ printf("\n\n"); DataBlock digest = shaHmac(data, key); key.print("key"); data.print("data"); digest.print("digest"); if (!digest.dataEqual(expectedDigest)) { expectedDigest.print("!! expected digest !!"); return false; } else { return true; }}bool shaTestVector( DataBlock const &data, DataBlock const &expectedDigest){ printf("\n\n"); DataBlock digest = sha(data); data.print("data"); digest.print("digest"); if (!digest.dataEqual(expectedDigest)) { expectedDigest.print("!! expected digest !!"); return false; } else { return true; }}DataBlock integerBits(Integer const &i){ return integer2DataBlock(i);}void doit(){ DataBlock data("some stuff"); DataBlock digest = sha(data); digest.print(); bool pass = true;# define INT(s) integerBits(Integer(s, 16)) // one that is failing on my Linux loopi(2) { pass = shaHmacTestVector( INT("aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa"), DataBlock("Test Using Larger Than Block-Size Key and Larger " "Than One Block-Size Data", 73), INT("e8e99d0f45237d786d6bbaa7965c7808bbff1a91") ) && pass; }#if 1 // these 3 from crypto++ validation tests pass = shaTestVector( DataBlock("abc", 3), DataBlock("\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D", 20) ) && pass; pass = shaTestVector( DataBlock("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56), DataBlock("\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1", 20) ) && pass; //shaTestVector( // DataBlock("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), // DataBlock("\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F", // 15625) // these seven are from from RFC 2202 pass = shaHmacTestVector( INT("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), DataBlock("Hi There", 8), INT("b617318655057264e28bc0b6fb378c8ef146be00") ) && pass; pass = shaHmacTestVector( DataBlock("Jefe", 4), DataBlock("what do ya want for nothing?", 28), INT("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79") ) && pass; pass = shaHmacTestVector( INT("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), INT("dddddddddddddddddddd" "dddddddddddddddddddd" "dddddddddddddddddddd" "dddddddddddddddddddd" "dddddddddddddddddddd"), INT("125d7342b9ac11cd91a39af48aa17b4f63f175d3") ) && pass; pass = shaHmacTestVector( INT("0102030405060708090a0b0c0d0e0f10111213141516171819"), INT("cdcdcdcdcdcdcdcdcdcd" "cdcdcdcdcdcdcdcdcdcd" "cdcdcdcdcdcdcdcdcdcd" "cdcdcdcdcdcdcdcdcdcd" "cdcdcdcdcdcdcdcdcdcd"), INT("4c9007f4026250c6bc8414f9bf50c86c2d7235da") ) && pass; pass = shaHmacTestVector( INT("0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c"), DataBlock("Test With Truncation", 20), INT("4c1a03424b55e07fe7f27be1d58bb9324a9a5a04") ) && pass; // digest-96 = 0x4c1a03424b55e07fe7f27be1 pass = shaHmacTestVector( INT("aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa"), DataBlock("Test Using Larger Than Block-Size Key - Hash Key First", 54), INT("aa4ae5e15272d00e95705637ce8a3b55ed402112") ) && pass; pass = shaHmacTestVector( INT("aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaa"), DataBlock("Test Using Larger Than Block-Size Key and Larger " "Than One Block-Size Data", 73), INT("e8e99d0f45237d786d6bbaa7965c7808bbff1a91") ) && pass;#endif // 0/1 printf("\n"); if (pass) { printf("all tests succeeded\n"); } else { printf("at least one test failed\n"); }}int main(){ try { doit(); return 0; } catch (xBase &x) { cout << "exception caught: " << x << endl; return 4; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -