[PR]

水無瀬の部屋 > Programming > sample > tools > misc > sha512.cpp
最終更新日: 2007/03/04

   1: //*********************************************************
   2: // プロジェクト: TOOLS::SHA512 - Secure Hash Algorithm
   3: //   ファイル名: sha512.cpp
   4: //*********************************************************
   5: #include <misc/sha512.h>     //
   6: #include <header/tooldbg.h>  // ASSERT(), 
   7: #include <header/toolbase.h> // 
   8: #include <header/snprintf.h> // snprintf(), vsnprintf(), 
   9: #include <limits.h>          // CHAR_BIT, 
  10: 
  11: 
  12: //---------------------------------------------------------
  13: // テスト関数 の 宣言
  14: //---------------------------------------------------------
  15: DECLARE_TESTPROC( test_sha512 );
  16: 
  17: 
  18: //---------------------------------------------------------
  19: // 定数型マクロ の 定義
  20: //---------------------------------------------------------
  21: #define DBG_ALLOCNAME  "SHA512_CreateAlgorithm"
  22: 
  23: //
  24: #define SHA512_HASH    8
  25: #define SHA512_BLOCK  16
  26: #define SHA512_WORK   80
  27: #define SHA512_BUFFER_SIZE  (SHA512_BLOCK * 8)
  28: 
  29: 
  30: //---------------------------------------------------------
  31: // 構造体 の 宣言
  32: //---------------------------------------------------------
  33: typedef struct SHA512_CTX_tag
  34: {
  35: 	//
  36: 	DWORD64 length;     // 総書込バイト数
  37: 	DWORD64 state[ 8 ]; // 
  38: 
  39: 	// 
  40: 	DWORD   index;        // バッファの最終書込バイト位置
  41: 	DWORD64 buffer[ 16 ]; // 
  42: } SHA512_CTX;
  43: 
  44: 
  45: //---------------------------------------------------------
  46: // ファイルスコープ関数 の 宣言
  47: //---------------------------------------------------------
  48: static inline DWORD ReverseEndian(DWORD x) {return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);}
  49: static inline DWORD64 ReverseEndian64(DWORD64 x){return ((DWORD64)ReverseEndian((DWORD)(x & 0x00000000ffffffff)) << 32) | ReverseEndian((DWORD)(x >> 32));}
  50: static void SHA512_Transform( DWORD64 *state, const DWORD64 *buffer );
  51: static bool SHA512_IsValidContext( const SHA512_CTX *context );
  52: 
  53: 
  54: //*********************************************************
  55: // SHA512_CreateAlgorithm
  56: //*********************************************************
  57: SHA512_CTX *
  58: SHA512_CreateAlgorithm
  59: 	(
  60: 		void
  61: 	)
  62: {
  63: 	CALLONCE_TESTPROC( test_sha512 ); // [テスト]
  64: 
  65: 	SHA512_CTX *context = (SHA512_CTX *)malloc( sizeof( *context ) );
  66: 	if ( !context )
  67: 		return null;
  68: 
  69: 	SHA512_InitData( context );
  70: 	ASSERT( SHA512_IsValidContext( context ) );
  71: 	
  72: 	DBG_LOCK_ALLOCED_MEMORY( context, DBG_ALLOCNAME ); // [DBG]
  73: 	return context;
  74: }//SHA512_CreateAlgorithm
  75: 
  76: //*********************************************************
  77: // SHA512_DestroyAlgorithm
  78: //*********************************************************
  79: bool
  80: SHA512_DestroyAlgorithm
  81: 	(
  82: 		SHA512_CTX *context
  83: 	)
  84: {
  85: 	// パラメタの仮定
  86: 	ASSERT( SHA512_IsValidContext( context ) );
  87: 
  88: 	DBG_UNLOCK_ALLOCED_MEMORY( context, DBG_ALLOCNAME ); // [DBG]
  89: 	free( context );
  90: 
  91: 	return true;
  92: }//SHA512_DestroyAlgorithm
  93: 
  94: //*********************************************************
  95: // SHA512_InitData
  96: //*********************************************************
  97: bool
  98: SHA512_InitData
  99: 	(
 100: 		SHA512_CTX *context
 101: 	)
 102: {
 103: 	// パラメタの仮定
 104: 	ASSERT( IsValidPtr( context, sizeof( *context ) ) );
 105: 
 106: 	context->index  = 0;
 107: 	context->length = 0;
 108: 
 109: 	const DWORD64 state[] =
 110: 		{
 111: 			0x6a09e667f3bcc908,
 112: 			0xbb67ae8584caa73b,
 113: 			0x3c6ef372fe94f82b,
 114: 			0xa54ff53a5f1d36f1,
 115: 			0x510e527fade682d1,
 116: 			0x9b05688c2b3e6c1f,
 117: 			0x1f83d9abfb41bd6b,
 118: 			0x5be0cd19137e2179,
 119: 		};
 120: 	memzero( context->buffer, sizeof( context->buffer ) );
 121: 	memcpy( context->state, state, sizeof( context->state ) );
 122: 
 123: 	ASSERT( SHA512_IsValidContext( context ) );
 124: 	return true;
 125: }//SHA512_InitData
 126: 
 127: //*********************************************************
 128: // SHA512_AddData
 129: //*********************************************************
 130: bool
 131: SHA512_AddData
 132: 	(
 133: 		      SHA512_CTX *context,
 134: 		const void       *data,
 135: 		      int         length
 136: 	)
 137: {
 138: 	// パラメタの仮定
 139: 	ASSERT( SHA512_IsValidContext( context ) );
 140: 	ASSERT( 0 < length );
 141: 	ASSERT( IsValidReadPtr( data, length ) );
 142: 
 143: 	const BYTE *p = (BYTE *)data;
 144: 	while( 0 < length )
 145: 	{
 146: 		const DWORD use = min( ((DWORD)length), (sizeof( context->buffer ) - context->index) );
 147: 		memcpy( ((BYTE *)context->buffer) + context->index, p, use );
 148: 		p               += use;
 149: 		context->index  += use;
 150: 		context->length += use;
 151: 		length          -= use;
 152: 
 153: 		if ( sizeof( context->buffer ) <= context->index )
 154: 		{
 155: 			SHA512_Transform( context->state, context->buffer );
 156: 			context->index = 0;
 157: 		}
 158: 	}
 159: 	return true;
 160: }//SHA512_AddData
 161: 
 162: //*********************************************************
 163: // SHA512_GetHash
 164: //*********************************************************
 165: bool
 166: SHA512_GetHash
 167: 	(
 168: 		const SHA512_CTX *context,
 169: 		      void       *digest,
 170: 		      int         bufsize 
 171: 	)
 172: {
 173: 	// パラメタの仮定
 174: 	ASSERT( SHA512_IsValidContext( context ) );
 175: 	ASSERT( 0 < bufsize );
 176: 	ASSERT( IsValidPtr( digest, bufsize ) );
 177: 	DESTROY_BUFFER( digest, bufsize );
 178: 
 179: 	SHA512_CTX tmp_context;
 180: 	memcpy( &tmp_context, context, sizeof( *context ) );
 181: 	context = null;
 182: 
 183: 	DWORD64 qwNumBits[ 2 ]; 
 184: 	qwNumBits[ 0 ] = ReverseEndian64( (tmp_context.length >> 61) );
 185: 	qwNumBits[ 1 ] = ReverseEndian64( (tmp_context.length <<  3) );
 186: 
 187: 	BYTE cOne  = 0x80;
 188: 	SHA512_AddData( &tmp_context, &cOne, 1 );
 189: 	while( tmp_context.index != sizeof( tmp_context.buffer ) - 16 ) 
 190: 	{
 191: 		BYTE cZero = 0x00;
 192: 		SHA512_AddData( &tmp_context, &cZero, 1 );
 193: 	}
 194: 
 195: 	SHA512_AddData( &tmp_context, qwNumBits, 16 );
 196: 
 197: 	memmove( digest, tmp_context.state, min( bufsize, sizeof( tmp_context.state ) ) );
 198: 	return true;
 199: }//SHA512_GetHash
 200: 
 201: //*********************************************************
 202: // SHA512_GetHashText
 203: //*********************************************************
 204: bool
 205: SHA512_GetHashText
 206: 	(
 207: 		const SHA512_CTX *context,
 208: 		      char       *buffer,
 209: 			  int         bufsize
 210: 	)
 211: {
 212: 	// パラメタの仮定
 213: 	ASSERT( SHA512_IsValidContext( context ) );
 214: 	ASSERT( 0 < bufsize );
 215: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
 216: 	DESTROY_TEXT_BUFFER( buffer, bufsize );
 217: 
 218: 	//
 219: 	BYTE sha512[ SHA512_HASHSIZE ];
 220: 	VERIFY( SHA512_GetHash( context, sha512, sizeof( sha512 ) ) );
 221: 
 222: 	//
 223: 	char text[ 1+SHA512_HASHTEXTSIZE ];
 224: 	{
 225: 		char *p = text;
 226: 		{for( int i = 0; i < numof( sha512 ); i += sizeof( DWORD64 ) )
 227: 		{
 228: 			{for( int j = 0; j < sizeof( DWORD64 ); ++j )
 229: 			{
 230: 				snprintf( p, numof(text) - (p - text), "%02x", sha512[ i + (sizeof( DWORD64 ) - j - 1) ] );
 231: 				p = strtail( p );
 232: 			}}
 233: 		}}
 234: 	}
 235: 
 236: 	//
 237: 	memcpy( buffer, text, min( bufsize, sizeof( text ) ) );
 238: 	buffer[ min( bufsize, numof( text ) ) - 1 ] = '\0';
 239: 
 240: 	return true;
 241: }//SHA512_GetHashText
 242: 
 243: 
 244: //******************************************************************************************************************
 245: //
 246: //******************************************************************************************************************
 247: //
 248: 
 249: const DWORD64 c_qwK[ SHA512_WORK ] =
 250: {
 251: 	0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
 252: 	0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
 253: 	0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
 254: 	0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
 255: 	0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
 256: 	0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
 257: 	0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
 258: 	0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
 259: 	0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
 260: 	0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
 261: 	0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,
 262: 	0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
 263: 	0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
 264: 	0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
 265: 	0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
 266: 	0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
 267: 	0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
 268: 	0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
 269: 	0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
 270: 	0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817,
 271: };
 272: 
 273: static inline DWORD64 ROTATE_LEFT( DWORD64 x, DWORD n ) { return (x >> n) | (x << (64 - n)); }
 274: static inline DWORD64 Ch(DWORD64 x, DWORD64 y, DWORD64 z) {return (x & (y ^ z)) ^ z;}
 275: static inline DWORD64 Maj(DWORD64 x, DWORD64 y, DWORD64 z) {return (x & (y | z)) | (y & z);}
 276: static inline DWORD64 S0(DWORD64 x) {return ROTATE_LEFT(x, 28) ^ ROTATE_LEFT(x, 34) ^ ROTATE_LEFT(x, 39);}
 277: static inline DWORD64 S1(DWORD64 x) {return ROTATE_LEFT(x, 14) ^ ROTATE_LEFT(x, 18) ^ ROTATE_LEFT(x, 41);}
 278: static inline DWORD64 s0(DWORD64 x) {return ROTATE_LEFT(x,  1) ^ ROTATE_LEFT(x,  8) ^ (x >> 7);}
 279: static inline DWORD64 s1(DWORD64 x) {return ROTATE_LEFT(x, 19) ^ ROTATE_LEFT(x, 61) ^ (x >> 6);}
 280: 
 281: 
 282: //*********************************************************
 283: // SHA512_IsValidContext
 284: //*********************************************************
 285: static
 286: bool
 287: SHA512_IsValidContext
 288: 	(
 289: 		const SHA512_CTX *context
 290: 	)
 291: {
 292: 	VALID_TEST( context );
 293: 	VALID_TEST( IsValidReadPtr( context, sizeof( *context ) ) );
 294: 	VALID_TEST( (0 <= context->index) && (context->index < sizeof( context->buffer ) ) );
 295: 
 296: 	return true;
 297: }//SHA512_IsValidContext
 298: 
 299: //*********************************************************
 300: // SHA512_Transform
 301: //*********************************************************
 302: static
 303: void
 304: SHA512_Transform
 305: 	(
 306: 		      DWORD64 *state,
 307: 		const DWORD64 *buffer
 308: 	)
 309: {
 310: 	DWORD64 work[ SHA512_WORK ];
 311: 	{for( int i = 0; i < SHA512_BLOCK; ++i )
 312: 	{
 313: 		work[ i ] = ReverseEndian64( buffer[ i ] );
 314: 	}}
 315: 	{for( int i = SHA512_BLOCK; i < SHA512_WORK; ++i )
 316: 	{
 317: 		work[ i ] = s1( work[ i - 2 ] ) + work[ i - 7 ] + s0( work[ i - 15 ] ) + work[ i - 16 ];
 318: 	}}
 319: 
 320: 	DWORD64 Hash[ SHA512_WORK + SHA512_HASH ];
 321: 	DWORD64 *pHash = &Hash[ SHA512_WORK ];
 322: 	memcpy( pHash, state, SHA512_HASH * sizeof( DWORD64 ) );
 323: 
 324: 	{for( int i = 0; i < SHA512_WORK; ++i )
 325: 	{
 326: 		pHash--;
 327: 		DWORD64 qwT1 = pHash[8] + S1( pHash[5] ) + Ch( pHash[5], pHash[6], pHash[7] ) + c_qwK[ i ] + work[ i ];
 328: 		DWORD64 qwT2 = S0( pHash[1] ) + Maj( pHash[1], pHash[2], pHash[3] );
 329: 		pHash[ 4 ] += qwT1;
 330: 		pHash[ 0 ]  = qwT1 + qwT2;
 331: 	}}
 332: 
 333: 	{for( int i = 0; i < SHA512_HASH; ++i )
 334: 	{
 335: 		state[ i ] += Hash[ i ];
 336: 	}}
 337: }//SHA512_Transform
 338: 
 339: 
 340: //******************************************************************************************************************
 341: // TEST
 342: //******************************************************************************************************************
 343: 
 344: 
 345: #ifdef _DEBUG // デバッグ時のみ
 346: 
 347: 
 348: //*********************************************************
 349: // test_sha512
 350: //*********************************************************
 351: DEFINE_TESTPROC( test_sha512 )
 352: {
 353: 	//---------------------------------------------------------
 354: 	// 定数 の テスト
 355: 	//---------------------------------------------------------
 356: 
 357: 	//---------------------------------------------------------
 358: 	// ファイルスコープ関数 の テスト
 359: 	//---------------------------------------------------------
 360: 
 361: 	//---------------------------------------------------------
 362: 	// 公開関数 の テスト
 363: 	//---------------------------------------------------------
 364: 
 365: 	static const BYTE testcase[] = 
 366: 		{
 367: 			0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 
 368: 			0xbc, 0x76, 0xb4, 0xaf, 0x6b, 0xa5, 0xd4, 0x7e, 0xfc, 0xbf, 0xdc, 0x24, 0x77, 0x84, 0x82, 0xa5, 0xc9, 0x7a, 0x45, 0x18, 0x02, 0xbe, 0x2c, 0x0e, 0xcc, 0x52, 0x35, 0x22, 0xdd, 0x6f, 0x85, 0x79, 0x51, 0x3d, 0xdf, 0xf1, 0xe6, 0x4f, 0x5c, 0xfa, 0x7d, 0x60, 0x09, 0x0a, 0x14, 0xd0, 0x78, 0x9d, 0xa9, 0x31, 0x4a, 0x1b, 0x43, 0x2d, 0x55, 0x21, 0xf3, 0xea, 0xf0, 0x66, 0xf1, 0x74, 0x4c, 0x95, 
 369: 			0x5e, 0x8c, 0x5b, 0xe6, 0xab, 0xda, 0x8c, 0x06, 0x3c, 0xb6, 0x18, 0x69, 0x22, 0xbc, 0x4d, 0xaa, 0x7c, 0x9c, 0xae, 0xea, 0x14, 0x86, 0xe0, 0xd5, 0xb1, 0xe0, 0x0a, 0x26, 0x16, 0xc8, 0xf9, 0xea, 0x13, 0x4a, 0xec, 0x6a, 0xb1, 0x6d, 0x70, 0xf8, 0x1d, 0x05, 0x21, 0x08, 0x11, 0xfb, 0x20, 0x5d, 0x5c, 0x79, 0xde, 0x34, 0x47, 0xc9, 0xc0, 0xec, 0xe1, 0x7f, 0xf4, 0x77, 0x9f, 0x27, 0x5d, 0x9e, 
 370: 			0xb5, 0x16, 0x2b, 0x40, 0xbe, 0x5c, 0xb1, 0xec, 0xc6, 0xbc, 0x6a, 0x1f, 0x2d, 0x5d, 0x2e, 0x73, 0xf9, 0x70, 0xc5, 0x01, 0xeb, 0xdb, 0x68, 0xf0, 0xa4, 0xc9, 0xd6, 0xa0, 0xbd, 0x4d, 0x08, 0x81, 0x11, 0x5d, 0x32, 0x49, 0xce, 0xc9, 0x6c, 0x1b, 0x18, 0xb3, 0xb4, 0xa7, 0xe3, 0xf2, 0x90, 0x94, 0x32, 0x5d, 0x6e, 0xbb, 0xf7, 0x21, 0x49, 0xcb, 0x60, 0x92, 0x9a, 0xec, 0xf4, 0x7d, 0x1f, 0xc8, 
 371: 			0x33, 0xb7, 0x09, 0xb1, 0xa2, 0x28, 0x98, 0xa2, 0xe1, 0x25, 0x7b, 0x67, 0x0e, 0xce, 0x68, 0x83, 0x41, 0x68, 0x33, 0x49, 0x24, 0x13, 0xea, 0x2a, 0x08, 0x67, 0xbc, 0x9f, 0x7b, 0x83, 0x07, 0x92, 0x5b, 0xd5, 0x95, 0x97, 0x7f, 0x3c, 0xee, 0x09, 0xad, 0x81, 0xa7, 0x70, 0x79, 0xd4, 0x11, 0x06, 0xcb, 0xee, 0x93, 0x49, 0xf2, 0xd4, 0x12, 0x89, 0x59, 0x16, 0xc0, 0x28, 0x80, 0x28, 0xf5, 0x5f, 
 372: 			0xf0, 0xb9, 0xd2, 0x92, 0x35, 0x45, 0x23, 0x28, 0xf4, 0xff, 0xee, 0x5b, 0x4f, 0x3b, 0x0d, 0x62, 0xd5, 0x29, 0xe6, 0xc3, 0x0c, 0x3a, 0xb1, 0xfe, 0xfc, 0xc9, 0xe3, 0xae, 0x8d, 0xac, 0x16, 0x22, 0xe7, 0x9a, 0x0c, 0xb3, 0xdc, 0xcc, 0x2b, 0xcf, 0xb7, 0x1e, 0x71, 0xeb, 0x38, 0x08, 0x0b, 0x27, 0xec, 0xd6, 0x5a, 0xbe, 0xf8, 0x0d, 0x62, 0xf9, 0xd9, 0x51, 0xac, 0x5a, 0xde, 0x66, 0xc4, 0x95, 
 373: 			0x2a, 0xb9, 0xd7, 0x06, 0x74, 0x67, 0x7e, 0x50, 0x32, 0x93, 0x07, 0xdb, 0x4f, 0xcd, 0x19, 0xe6, 0x14, 0x1c, 0xf5, 0x6b, 0xd8, 0x68, 0x8f, 0x68, 0x81, 0x19, 0x99, 0x25, 0x2d, 0x9b, 0xdc, 0xc4, 0x88, 0xd9, 0x43, 0xd3, 0x44, 0x04, 0xe9, 0x37, 0x3d, 0x8e, 0xf1, 0xf5, 0xff, 0xf8, 0xca, 0x53, 0x51, 0xb3, 0xcc, 0xb9, 0x5d, 0x99, 0x95, 0x4f, 0x98, 0xe7, 0xfb, 0x7b, 0x1c, 0xf1, 0xe0, 0x7f, 
 374: 			0xd4, 0xb4, 0x6d, 0x7a, 0x38, 0xce, 0xea, 0x5d, 0xdf, 0xe3, 0xb1, 0x1c, 0xae, 0xe2, 0xef, 0xf4, 0x05, 0xb5, 0x8e, 0x72, 0xc8, 0xa3, 0x22, 0x95, 0xca, 0xf4, 0x3e, 0xcb, 0xe6, 0x92, 0x99, 0xa0, 0xad, 0xa2, 0x17, 0xeb, 0xa8, 0x30, 0x0b, 0xc3, 0xec, 0x31, 0xd0, 0x95, 0xdf, 0x3e, 0xae, 0x04, 0x75, 0xff, 0x7f, 0x73, 0xa8, 0xc4, 0x9e, 0x02, 0xec, 0xf4, 0xff, 0xe5, 0xb0, 0x48, 0x0b, 0x24, 
 375: 			0x03, 0x21, 0x9a, 0x1b, 0x17, 0xf6, 0x53, 0xe6, 0x04, 0x52, 0xa4, 0x15, 0xe7, 0x02, 0xcc, 0x7d, 0x9b, 0x9c, 0x4b, 0x61, 0x50, 0xc5, 0x25, 0x61, 0x7f, 0x2a, 0x63, 0xe1, 0xaa, 0xbf, 0x05, 0xb8, 0x24, 0x98, 0x3f, 0x43, 0xbd, 0xc4, 0xdd, 0x60, 0xaf, 0xf1, 0x64, 0xe9, 0x3e, 0x17, 0x63, 0xb4, 0x67, 0x8f, 0xda, 0x69, 0x1d, 0xa7, 0x5f, 0x49, 0xb3, 0x39, 0xe1, 0x7c, 0xb1, 0x06, 0x1c, 0xa0, 
 376: 			0xfa, 0x7d, 0x42, 0xa4, 0xa0, 0x63, 0x18, 0x0c, 0xaf, 0x45, 0x67, 0x73, 0x48, 0xd5, 0xf8, 0xef, 0x02, 0x99, 0xf1, 0xf3, 0x4f, 0x14, 0x6a, 0x48, 0x74, 0xd2, 0x6e, 0x97, 0xca, 0x68, 0xba, 0x17, 0xae, 0x51, 0x8c, 0x24, 0x68, 0x85, 0x16, 0x35, 0xf4, 0xee, 0x87, 0x76, 0xfc, 0xd3, 0xf7, 0xea, 0xac, 0x95, 0x13, 0x6b, 0xc5, 0xd4, 0x7e, 0x3f, 0xba, 0x28, 0x55, 0xfd, 0x93, 0xc4, 0x76, 0xab, 
 377: 			0x06, 0x12, 0xbc, 0x03, 0xb0, 0x5a, 0x41, 0xab, 0x9a, 0x50, 0x8d, 0x69, 0x3a, 0x4c, 0x1c, 0x8a, 0x9e, 0x73, 0x3d, 0x20, 0x6d, 0x58, 0xc2, 0x2c, 0x77, 0xc1, 0x4c, 0xbd, 0x15, 0xfb, 0x4b, 0x7e, 0x54, 0xb9, 0x7c, 0xf4, 0x85, 0xaa, 0xcd, 0xed, 0x77, 0xfe, 0xf5, 0xa3, 0xbc, 0x27, 0xd2, 0xe9, 0x3a, 0x06, 0xce, 0x55, 0xfd, 0x28, 0x88, 0x8b, 0x11, 0x5c, 0x2d, 0x10, 0x18, 0x95, 0x61, 0x39, 
 378: 			0x52, 0x22, 0x4c, 0x4e, 0x87, 0x00, 0x64, 0xe3, 0xfc, 0x8c, 0x76, 0x15, 0x2c, 0xe3, 0xb2, 0xf4, 0x15, 0xed, 0x85, 0xff, 0x7b, 0x05, 0x89, 0x55, 0x92, 0x41, 0xc3, 0xc9, 0x3b, 0xae, 0x3e, 0x3c, 0x15, 0x4b, 0x3b, 0x38, 0xad, 0x21, 0x1c, 0x47, 0x44, 0x0e, 0xe1, 0xea, 0xa4, 0x3f, 0xff, 0x05, 0x18, 0xba, 0xb2, 0x14, 0x5f, 0xd2, 0xee, 0x24, 0xad, 0xac, 0xb3, 0x2c, 0xa4, 0x68, 0x70, 0xfa, 
 379: 			0xa2, 0x1e, 0x19, 0x0d, 0xec, 0xf2, 0x72, 0x53, 0x94, 0x39, 0x58, 0xf5, 0x85, 0x85, 0x61, 0x5e, 0x7c, 0xf3, 0xe9, 0x86, 0x32, 0x6b, 0x10, 0x10, 0x35, 0x73, 0xa6, 0x74, 0xd8, 0x4d, 0x25, 0xc5, 0x81, 0xbd, 0x2a, 0x81, 0x21, 0x0d, 0x13, 0x42, 0x6d, 0xdd, 0x4f, 0x8b, 0x6b, 0xa4, 0x0b, 0xea, 0xef, 0x23, 0x30, 0x8e, 0xd8, 0xa7, 0x54, 0x72, 0xfe, 0x40, 0x4c, 0x87, 0x38, 0xde, 0x40, 0x24, 
 380: 			0x92, 0xba, 0xda, 0x87, 0x42, 0x9f, 0x8f, 0x52, 0x92, 0xc5, 0xef, 0xdf, 0xf4, 0xcc, 0xb5, 0x04, 0x0d, 0x64, 0xa8, 0x97, 0xd2, 0x18, 0x41, 0x39, 0x4c, 0xf5, 0xcd, 0x7e, 0xc7, 0x8c, 0x24, 0xa3, 0x47, 0x0b, 0xbd, 0x53, 0xae, 0xb5, 0x11, 0x47, 0x98, 0xe7, 0xe9, 0xab, 0x29, 0xdd, 0x2e, 0xd5, 0x24, 0x04, 0xce, 0x11, 0x1d, 0xbd, 0xcb, 0x20, 0x5e, 0xe1, 0x41, 0xf3, 0x7d, 0x64, 0xf1, 0xf4, 
 381: 			0x59, 0x82, 0xdb, 0xd4, 0xef, 0x9e, 0x3d, 0xbd, 0x40, 0x42, 0xb4, 0x39, 0x00, 0x8d, 0x10, 0xde, 0x6c, 0x16, 0x1b, 0xad, 0xeb, 0xd8, 0xc4, 0x53, 0x7e, 0xf6, 0x38, 0xa3, 0x7b, 0x1e, 0x2f, 0xd9, 0xee, 0xa8, 0xaf, 0x79, 0xbb, 0x67, 0x4c, 0xa7, 0xd5, 0x03, 0xc4, 0xcc, 0x10, 0xfd, 0x5d, 0x74, 0x30, 0x0b, 0x8d, 0x27, 0x28, 0x79, 0x33, 0x30, 0x25, 0x76, 0x49, 0xf6, 0x0d, 0xb1, 0x89, 0x31, 
 382: 			0x7c, 0x2c, 0xd4, 0xe9, 0x7b, 0x36, 0x5d, 0x06, 0x2d, 0x7e, 0x0f, 0x1b, 0x23, 0x07, 0x2a, 0x2d, 0x06, 0x41, 0x39, 0x70, 0x6b, 0xb5, 0xb2, 0x12, 0x55, 0x1a, 0x58, 0x5b, 0xed, 0xe2, 0xca, 0x89, 0xbc, 0x50, 0x85, 0xad, 0x0f, 0xbe, 0x74, 0x9c, 0x93, 0x96, 0x6b, 0x25, 0x23, 0xe9, 0x7d, 0x94, 0xd3, 0xac, 0xa0, 0x1c, 0x44, 0xf0, 0x90, 0x6d, 0x46, 0xdd, 0x0f, 0xd9, 0x61, 0xaa, 0x90, 0x5a, 
 383: 			0xfb, 0xf5, 0x0f, 0xb7, 0x99, 0x57, 0x47, 0xb8, 0x7d, 0xa5, 0x75, 0x31, 0x1c, 0xbe, 0x30, 0x25, 0x84, 0x05, 0xd9, 0x9a, 0xaa, 0x7f, 0x92, 0x43, 0xcb, 0x59, 0xa5, 0xb1, 0x57, 0x5f, 0xc4, 0x17, 0xe1, 0x40, 0x78, 0x2d, 0x0d, 0x36, 0xd3, 0xdc, 0xab, 0x59, 0x41, 0x8d, 0x61, 0xff, 0x1f, 0xd4, 0x0b, 0x67, 0x87, 0xf7, 0x42, 0xe1, 0x16, 0x38, 0x1e, 0x2f, 0x5a, 0x63, 0x0c, 0xb0, 0x7b, 0x4c, 
 384: 			0x90, 0xe2, 0x92, 0xe6, 0xec, 0x66, 0x9b, 0x00, 0xe8, 0xb5, 0x1e, 0x1c, 0xa1, 0xa9, 0xda, 0xd5, 0x2c, 0xcc, 0xad, 0x04, 0x08, 0x75, 0xbf, 0xbd, 0x2c, 0x2c, 0x3e, 0xac, 0xe6, 0xcb, 0x89, 0xba, 0xdc, 0x62, 0x5b, 0x45, 0xdd, 0xae, 0xc3, 0x8b, 0x3f, 0x9f, 0x4c, 0xd8, 0x33, 0xbd, 0x8a, 0x80, 0xc2, 0x43, 0x83, 0xea, 0x9d, 0xd9, 0x43, 0x61, 0x36, 0x23, 0x56, 0x85, 0x07, 0x67, 0xd8, 0x96, 
 385: 			0xf8, 0x94, 0x87, 0xaf, 0xe4, 0xa0, 0xa9, 0xa3, 0x63, 0x91, 0xa2, 0x03, 0xef, 0x3c, 0x39, 0xa3, 0x0f, 0x2a, 0xe5, 0x5e, 0xc5, 0x2b, 0xb1, 0x50, 0xaa, 0x13, 0x80, 0x6d, 0xf2, 0x4e, 0x94, 0xb1, 0xe5, 0x6f, 0xc7, 0x04, 0x6a, 0xaa, 0x6e, 0x50, 0xca, 0xee, 0x80, 0x1f, 0x0d, 0x70, 0xf9, 0x44, 0xa8, 0x70, 0x40, 0x09, 0x7f, 0x5b, 0x07, 0x3b, 0x01, 0xe2, 0xef, 0x6a, 0x33, 0xf6, 0x55, 0x26, 
 386: 			0x57, 0xa5, 0x3f, 0x8f, 0xf9, 0xeb, 0x3d, 0x95, 0x1b, 0xcd, 0x17, 0x1e, 0xf6, 0x6e, 0xd9, 0xd4, 0x07, 0x7c, 0xac, 0x80, 0x7f, 0x47, 0x58, 0xd9, 0xf0, 0xee, 0xe4, 0x0e, 0x7d, 0x1b, 0x37, 0x87, 0xe5, 0x59, 0xf5, 0x05, 0x6a, 0xdd, 0xdd, 0xd0, 0xff, 0x78, 0xe3, 0xa4, 0x2c, 0x39, 0x02, 0x6d, 0x9e, 0x3f, 0x80, 0x53, 0x43, 0x3d, 0xef, 0xa1, 0x94, 0x04, 0xc2, 0x10, 0x19, 0xc2, 0xc2, 0xdd, 
 387: 			0xfd, 0x96, 0x61, 0x4f, 0xbe, 0xf4, 0x76, 0xba, 0xbf, 0x4a, 0x06, 0x6b, 0x9d, 0xb8, 0xfb, 0xc8, 0xab, 0x3b, 0xcf, 0x8d, 0x7c, 0x93, 0xa5, 0x7c, 0x21, 0xdd, 0x19, 0xf6, 0x7f, 0x2b, 0xc6, 0x5a, 0x80, 0x6c, 0xd0, 0x6b, 0x03, 0x1a, 0xef, 0x4e, 0xb1, 0xf3, 0x45, 0x7b, 0xd6, 0xc9, 0x05, 0x40, 0xd9, 0x17, 0x0c, 0xf2, 0xbb, 0x7c, 0x66, 0xe3, 0xf5, 0x91, 0x69, 0xd0, 0x4e, 0xd2, 0x09, 0xb8, 
 388: 			0x36, 0xf2, 0x6b, 0x4b, 0xcb, 0x0c, 0x24, 0xb6, 0x1e, 0x5d, 0xbb, 0x1f, 0x34, 0x21, 0x1f, 0x9b, 0x14, 0xfd, 0x61, 0x7d, 0xa1, 0x25, 0xd9, 0xa7, 0xac, 0x1f, 0x4c, 0x95, 0xec, 0xcd, 0x71, 0x7d, 0xf1, 0xb3, 0x9e, 0x5d, 0xdb, 0x23, 0x47, 0x42, 0x64, 0x5e, 0x4f, 0xb1, 0x9a, 0x39, 0xe7, 0x94, 0xbb, 0xbd, 0x90, 0x0c, 0x28, 0x53, 0x5e, 0xcc, 0x13, 0xb8, 0x98, 0x31, 0xb3, 0x0c, 0x9a, 0xd3, 
 389: 			0xe6, 0xb2, 0xf8, 0x9c, 0x7b, 0xe1, 0x82, 0xe2, 0x95, 0xdb, 0xe5, 0xeb, 0x41, 0x51, 0xf7, 0x9b, 0xcc, 0xae, 0xeb, 0x6e, 0x47, 0x51, 0x49, 0x3a, 0xfb, 0x54, 0x6e, 0xe7, 0x75, 0x7b, 0xae, 0x33, 0x67, 0x70, 0x62, 0xf9, 0xc8, 0xe4, 0x78, 0x36, 0x54, 0x24, 0x5e, 0x2e, 0x35, 0x33, 0x4e, 0xff, 0x89, 0xc8, 0xd3, 0xda, 0xea, 0x70, 0xf9, 0x17, 0x8b, 0x96, 0x73, 0x70, 0x2a, 0xca, 0xa3, 0x06, 
 390: 			0x63, 0xc5, 0xe4, 0xee, 0x9f, 0x39, 0x80, 0x16, 0x77, 0xcc, 0x4a, 0xd7, 0x50, 0x98, 0xca, 0x9f, 0xf1, 0xbe, 0x7a, 0xae, 0x3a, 0x88, 0xc8, 0xa7, 0x13, 0x8b, 0xce, 0x21, 0xbc, 0xcb, 0x8e, 0x7d, 0x24, 0xc9, 0x4f, 0x94, 0x85, 0x74, 0xb0, 0x67, 0x84, 0x7b, 0xeb, 0x6b, 0xa5, 0x99, 0xc5, 0x89, 0x3f, 0x7b, 0x83, 0x00, 0x4b, 0x12, 0xc8, 0x20, 0xfe, 0x12, 0x43, 0xad, 0x34, 0x93, 0xb3, 0xbe, 
 391: 			0x62, 0x81, 0x88, 0x6f, 0x53, 0xd5, 0xeb, 0x91, 0x0f, 0x3b, 0xac, 0xbc, 0x76, 0xd3, 0xd4, 0x15, 0x26, 0x00, 0x64, 0xe9, 0xc4, 0x20, 0x43, 0x85, 0xde, 0x03, 0x59, 0x04, 0x2e, 0xc1, 0x40, 0x1f, 0xcb, 0x48, 0x4a, 0xd3, 0x14, 0xbf, 0x6b, 0x70, 0x35, 0x89, 0x8c, 0xdc, 0xef, 0x57, 0x5f, 0xc4, 0x1b, 0x2c, 0x98, 0xcb, 0x8a, 0xf9, 0x60, 0x7a, 0xaa, 0x23, 0xdd, 0x5b, 0xa6, 0x6c, 0x13, 0xd3, 
 392: 			0x63, 0x39, 0xfa, 0x9e, 0x19, 0xa0, 0x8b, 0x32, 0x0b, 0x46, 0xcf, 0xbd, 0x18, 0xfb, 0x5a, 0x21, 0x78, 0xaa, 0xb4, 0xad, 0xb7, 0x65, 0xde, 0x3e, 0x1a, 0x52, 0xac, 0xfe, 0xac, 0x08, 0x77, 0x80, 0x75, 0xfb, 0x0f, 0xe3, 0xf0, 0x89, 0xa9, 0xa1, 0xee, 0x8a, 0x58, 0xf9, 0x96, 0x51, 0xd3, 0xc2, 0x85, 0x24, 0xd0, 0xd2, 0xbf, 0x43, 0x9e, 0x64, 0xbb, 0x6c, 0xd0, 0x8b, 0x0c, 0x39, 0x38, 0x2f, 
 393: 			0xf7, 0x37, 0xa3, 0xf0, 0xd0, 0x93, 0x23, 0xa9, 0x04, 0x13, 0x54, 0x20, 0xd4, 0xb6, 0x21, 0x99, 0x54, 0xf9, 0xfb, 0xa2, 0x73, 0x74, 0x95, 0x7e, 0xc3, 0x43, 0xc9, 0x6b, 0xd5, 0xd5, 0x34, 0xfb, 0x76, 0xf4, 0xcb, 0x0a, 0x71, 0x3f, 0xa4, 0x7b, 0x8b, 0xf3, 0xd6, 0xaa, 0x2a, 0x30, 0x14, 0xb3, 0x3e, 0xb0, 0x5e, 0x3d, 0x6e, 0xc6, 0x43, 0x2c, 0x3c, 0x27, 0x5d, 0x96, 0x7c, 0x19, 0x83, 0x9c, 
 394: 			0x77, 0xaf, 0xad, 0xc9, 0x9b, 0x34, 0x11, 0xaa, 0x9c, 0x28, 0x43, 0xeb, 0x21, 0x7a, 0x23, 0xb0, 0x24, 0xf9, 0x3e, 0x1b, 0x2b, 0xd0, 0x68, 0x54, 0xe3, 0x16, 0x5f, 0xbe, 0xc2, 0x77, 0xf4, 0x23, 0x12, 0x4c, 0x85, 0x4a, 0x85, 0x98, 0xe2, 0x8e, 0x89, 0x50, 0x94, 0x14, 0x3d, 0x2f, 0xff, 0x28, 0x34, 0x71, 0x82, 0xbc, 0xbb, 0xff, 0xc2, 0xcc, 0x0c, 0x18, 0x61, 0x62, 0xdc, 0xec, 0x39, 0xe0, 
 395: 			0x7f, 0x03, 0x98, 0x1f, 0x11, 0xb5, 0xa0, 0x78, 0xe2, 0xc6, 0xe9, 0xfe, 0x43, 0xb8, 0x0d, 0x2b, 0xec, 0x5c, 0xcf, 0x51, 0xb4, 0xb5, 0xd9, 0x90, 0xb2, 0x66, 0xd4, 0x2e, 0x25, 0xc8, 0xaf, 0xbc, 0x14, 0xf3, 0x0f, 0x8e, 0x04, 0x04, 0x13, 0x74, 0xbb, 0x5d, 0x88, 0x5b, 0x5b, 0x2e, 0xf2, 0x6b, 0xe3, 0x1e, 0x71, 0x2a, 0xd2, 0xe0, 0xc0, 0x06, 0x7e, 0x43, 0x48, 0x5b, 0x27, 0x00, 0x2d, 0xd4, 
 396: 			0x87, 0x75, 0x00, 0x31, 0x1c, 0x06, 0x1c, 0x9a, 0xdb, 0xe2, 0xad, 0xb2, 0x71, 0x00, 0x6c, 0xe1, 0x33, 0x58, 0xdf, 0x03, 0x34, 0x14, 0xdf, 0x7c, 0x79, 0xe4, 0x28, 0xa3, 0x13, 0x2d, 0xeb, 0x7b, 0x7c, 0x5c, 0xc2, 0xbf, 0xb4, 0x04, 0xc9, 0xa9, 0x23, 0xcc, 0x6c, 0xc8, 0x9a, 0xb0, 0x8a, 0x9e, 0x05, 0x59, 0x63, 0xbd, 0x8f, 0x10, 0x46, 0x61, 0xcb, 0x0d, 0x4d, 0x11, 0x53, 0x9e, 0xb7, 0x29, 
 397: 			0x3a, 0x3a, 0x1e, 0xf3, 0xd1, 0xa7, 0x65, 0xcd, 0x2c, 0x86, 0x39, 0xb2, 0x51, 0xc8, 0x2c, 0x6a, 0x08, 0x9d, 0x86, 0x54, 0x9e, 0x8a, 0xe7, 0x5b, 0x24, 0x66, 0x50, 0xa1, 0x76, 0x2f, 0x33, 0x7e, 0xac, 0x64, 0x92, 0xe6, 0x3b, 0x11, 0xa3, 0x5d, 0x57, 0x8a, 0x4c, 0x4b, 0xf3, 0x70, 0x08, 0xdc, 0xf0, 0x20, 0xec, 0x00, 0xd4, 0xa6, 0xb6, 0x01, 0xff, 0x36, 0xdf, 0x3b, 0x93, 0xcd, 0xba, 0xd4, 
 398: 			0x07, 0xe3, 0xbf, 0x9b, 0xa5, 0x4a, 0x43, 0xb4, 0xb3, 0xf7, 0x9f, 0xb3, 0xc5, 0xcc, 0xac, 0x2e, 0xae, 0xf1, 0x8b, 0xd0, 0x91, 0x13, 0xf1, 0x43, 0xfd, 0xbe, 0xed, 0x25, 0x9e, 0xdd, 0x6a, 0x9a, 0xc3, 0x2f, 0xce, 0x07, 0x46, 0xde, 0x5e, 0xe6, 0x33, 0x34, 0x16, 0x60, 0x49, 0xba, 0xaa, 0x43, 0x66, 0x71, 0xc0, 0xb2, 0x0f, 0xbf, 0x4f, 0xfc, 0x95, 0x27, 0xc8, 0x39, 0x18, 0x03, 0xa0, 0x7b, 
 399: 		};
 400: 
 401: 	// SHA512
 402: 	SHA512_CTX *context = SHA512_CreateAlgorithm();
 403: 
 404: 	// 一気にハッシュ
 405: 	{for( int i = 1; (i * SHA512_HASHSIZE) < numof( testcase ); ++i )
 406: 	{
 407: 		SHA512_InitData( context );
 408: 		SHA512_AddData( context, testcase, i * SHA512_HASHSIZE );
 409: 
 410: 		BYTE sha[ SHA512_HASHSIZE ];
 411: 		{for( int j = 1; j < numof( sha ); ++j )
 412: 		{
 413: 			SHA512_GetHash( context, sha, j );
 414: 			VERIFY( 0 == memcmp( sha, testcase + (i * SHA512_HASHSIZE), j ) );
 415: 		}}
 416: 	}}
 417: 
 418: 	// 徐々にハッシュ
 419: 	SHA512_InitData( context );
 420: 	{for( int i = 1; (i * SHA512_HASHSIZE) < numof( testcase ); ++i )
 421: 	{
 422: 		{for( int j = 0; j < SHA512_HASHSIZE; ++j )
 423: 		{
 424: 			SHA512_AddData( context, &testcase[ j + ((i-1) * SHA512_HASHSIZE) ], 1 );
 425: 		}}
 426: 
 427: 		BYTE sha[ SHA512_HASHSIZE ];
 428: 		SHA512_GetHash( context, sha, numof( sha ) );
 429: 		VERIFY( 0 == memcmp( sha, testcase + (i * SHA512_HASHSIZE), numof( sha ) ) );
 430: 	}}
 431: 
 432: 	VERIFY( SHA512_DestroyAlgorithm( context ) );
 433: 
 434: }//test_sha512
 435: 
 436: 
 437: #endif // #ifdef _DEBUG
 438: 
 439: 
 440: //** end **
 441: 

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > tools > misc > sha512.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/misc/sha512_cpp.shtml
>> Amazon.co.jp 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ