/** * @brief 메시지 덧붙이기와 길이 덧붙이기를 수행한 후 마지막 메시지 블록을 가지고 압축함수를 호출하는 함수 * @param Info : SHA256_Init 호출하여 초기화된 구조체(내부적으로 사용된다.) * @param pszDigest : 암호문 */ public static void SHA256_Close(SHA256_INFO Info, byte[] pszDigest) { int i, Index; Index = URShift(Info.uLowLength, 3) % SHA256_DIGEST_BLOCKLEN; Info.szBuffer[Index++] = (byte) 0x80; if (Index > SHA256_DIGEST_BLOCKLEN - 8) { arrayinit_offset(Info.szBuffer, Index, (byte) 0, SHA256_DIGEST_BLOCKLEN - Index); SHA256_Transform(Info.szBuffer, Info.uChainVar); arrayinit(Info.szBuffer, (byte) 0, SHA256_DIGEST_BLOCKLEN - 8); } else { arrayinit_offset(Info.szBuffer, Index, (byte) 0, SHA256_DIGEST_BLOCKLEN - Index - 8); } if (ENDIAN == LITTLE_ENDIAN) { Info.uLowLength = ENDIAN_REVERSE_ULONG(Info.uLowLength); Info.uHighLength = ENDIAN_REVERSE_ULONG(Info.uHighLength); } int_to_byte_unit( Info.szBuffer, ((int) (SHA256_DIGEST_BLOCKLEN / 4 - 2)) * 4, Info.uHighLength, ENDIAN); int_to_byte_unit( Info.szBuffer, ((int) (SHA256_DIGEST_BLOCKLEN / 4 - 1)) * 4, Info.uLowLength, ENDIAN); SHA256_Transform(Info.szBuffer, Info.uChainVar); for (i = 0; i < SHA256_DIGEST_VALUELEN; i += 4) BIG_D2B((Info.uChainVar)[i / 4], pszDigest, i); }
/** * @brief 연쇄변수와 길이변수를 초기화하는 함수 * @param Info : SHA256_Process 호출 시 사용되는 구조체 */ public static void SHA256_Init(SHA256_INFO Info) { Info.uChainVar[0] = 0x6a09e667; Info.uChainVar[1] = 0xbb67ae85; Info.uChainVar[2] = 0x3c6ef372; Info.uChainVar[3] = 0xa54ff53a; Info.uChainVar[4] = 0x510e527f; Info.uChainVar[5] = 0x9b05688c; Info.uChainVar[6] = 0x1f83d9ab; Info.uChainVar[7] = 0x5be0cd19; Info.uHighLength = Info.uLowLength = 0; }
/** * @brief 연쇄변수와 길이변수를 초기화하는 함수 * @param Info : SHA256_Init 호출하여 초기화된 구조체(내부적으로 사용된다.) * @param pszMessage : 사용자 입력 평문 * @param inLen : 사용자 입력 평문 길이 */ public static void SHA256_Process(SHA256_INFO Info, byte[] pszMessage, int uDataLen) { int pszMessage_offset; if ((Info.uLowLength += (uDataLen << 3)) < 0) { Info.uHighLength++; } Info.uHighLength += URShift(uDataLen, 29); pszMessage_offset = 0; while (uDataLen >= SHA256_DIGEST_BLOCKLEN) { arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, SHA256_DIGEST_BLOCKLEN); SHA256_Transform(Info.szBuffer, Info.uChainVar); pszMessage_offset += SHA256_DIGEST_BLOCKLEN; uDataLen -= SHA256_DIGEST_BLOCKLEN; } arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, uDataLen); }