source: chevmsgr/trunk/KISA_SHA256.c@ 7

Last change on this file since 7 was 7, checked in by cheese, 9 years ago

암복호 알고리즘 추가

File size: 7.6 KB
Line 
1#include "KISA_SHA256.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6const UINT SHA256_K[64] =
7{
8 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
9 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
10 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
11 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
12 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
13 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
14 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
15 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
16 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
17 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
18 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
19};
20
21#if defined(_MSC_VER)
22 #define ROTL_ULONG(x, n) _lrotl((x), (n))
23 #define ROTR_ULONG(x, n) _lrotr((x), (n))
24#else
25 #define ROTL_ULONG(x, n) ((ULONG)((x) << (n)) | (ULONG)((x) >> (32 - (n))))
26 #define ROTR_ULONG(x, n) ((ULONG)((x) >> (n)) | (ULONG)((x) << (32 - (n))))
27#endif
28
29#define ENDIAN_REVERSE_ULONG(dwS) ( (ROTL_ULONG((dwS), 8) & 0x00ff00ff) \
30 | (ROTL_ULONG((dwS), 24) & 0xff00ff00) )
31
32#if defined(BIG_ENDIAN)
33 #define BIG_B2D(B, D) D = *(ULONG_PTR)(B)
34 #define BIG_D2B(D, B) *(ULONG_PTR)(B) = (ULONG)(D)
35 #define LITTLE_B2D(B, D) D = ENDIAN_REVERSE_ULONG(*(ULONG_PTR)(B))
36 #define LITTLE_D2B(D, B) *(ULONG_PTR)(B) = ENDIAN_REVERSE_ULONG(D)
37#elif defined(LITTLE_ENDIAN)
38 #define BIG_B2D(B, D) D = ENDIAN_REVERSE_ULONG(*(ULONG_PTR)(B))
39 #define BIG_D2B(D, B) *(ULONG_PTR)(B) = ENDIAN_REVERSE_ULONG(D)
40 #define LITTLE_B2D(B, D) D = *(ULONG_PTR)(B)
41 #define LITTLE_D2B(D, B) *(ULONG_PTR)(B) = (ULONG)(D)
42#else
43 #error ERROR : Invalid DataChangeType
44#endif
45
46#define RR(x, n) ROTR_ULONG(x, n)
47#define SS(x, n) (x >> n)
48
49#define Ch(x, y, z) ((x & y) ^ ((~x) & z))
50#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
51#define Sigma0(x) (RR(x, 2) ^ RR(x, 13) ^ RR(x, 22))
52#define Sigma1(x) (RR(x, 6) ^ RR(x, 11) ^ RR(x, 25))
53
54#define RHO0(x) (RR(x, 7) ^ RR(x, 18) ^ SS(x, 3))
55#define RHO1(x) (RR(x, 17) ^ RR(x, 19) ^ SS(x, 10))
56
57
58//*********************************************************************************************************************************
59// o SHA256_Transform() : 512 ºñÆ® ´ÜÀ§ ºí·ÏÀÇ ¸Þ½ÃÁö¸¦ ÀÔ·Â ¹Þ¾Æ ¿¬¼âº¯¼ö¸¦ °»½ÅÇÏ´Â ¾ÐÃà ÇÔ¼ö·Î½á
60// 4 ¶ó¿îµå(64 ´Ü°è)·Î ±¸¼ºµÇ¸ç 8°³ÀÇ ¿¬¼âº¯¼ö(a, b, c, d, e, f, g, h)¸¦ »ç¿ë
61// o ÀÔ·Â : Message - ÀÔ·Â ¸Þ½ÃÁöÀÇ Æ÷ÀÎÅÍ º¯¼ö
62// ChainVar - ¿¬¼âº¯¼öÀÇ Æ÷ÀÎÅÍ º¯¼ö
63// o Ãâ·Â :
64//*********************************************************************************************************************************
65void SHA256_Transform(ULONG_PTR Message, ULONG_PTR ChainVar)
66{
67 ULONG a, b, c, d, e, f, g, h, T1, X[64];
68 ULONG j;
69
70#define FF(a, b, c, d, e, f, g, h, j) { \
71 T1 = h + Sigma1(e) + Ch(e, f, g) + SHA256_K[j] + X[j]; \
72 d += T1; \
73 h = T1 + Sigma0(a) + Maj(a, b, c); \
74}
75
76#if defined(BIG_ENDIAN)
77 #define GetData(x) x
78#else
79 #define GetData(x) ENDIAN_REVERSE_ULONG(x)
80#endif
81
82 for (j = 0; j < 16; j++)
83 X[j] = GetData(Message[j]);
84
85 for (j = 16; j < 64; j++)
86 X[j] = RHO1(X[j - 2]) + X[j - 7] + RHO0(X[j - 15]) + X[j - 16];
87
88 a = ChainVar[0];
89 b = ChainVar[1];
90 c = ChainVar[2];
91 d = ChainVar[3];
92 e = ChainVar[4];
93 f = ChainVar[5];
94 g = ChainVar[6];
95 h = ChainVar[7];
96
97 for (j = 0; j < 64; j += 8)
98 {
99 FF(a, b, c, d, e, f, g, h, j + 0);
100 FF(h, a, b, c, d, e, f, g, j + 1);
101 FF(g, h, a, b, c, d, e, f, j + 2);
102 FF(f, g, h, a, b, c, d, e, j + 3);
103 FF(e, f, g, h, a, b, c, d, j + 4);
104 FF(d, e, f, g, h, a, b, c, j + 5);
105 FF(c, d, e, f, g, h, a, b, j + 6);
106 FF(b, c, d, e, f, g, h, a, j + 7);
107 }
108
109 ChainVar[0] += a;
110 ChainVar[1] += b;
111 ChainVar[2] += c;
112 ChainVar[3] += d;
113 ChainVar[4] += e;
114 ChainVar[5] += f;
115 ChainVar[6] += g;
116 ChainVar[7] += h;
117}
118
119//*********************************************************************************************************************************
120// o SHA256_Init() : ¿¬¼âº¯¼ö¿Í ±æÀ̺¯¼ö¸¦ ÃʱâÈ­ÇÏ´Â ÇÔ¼ö
121// o ÀÔ·Â : Info - SHA-256 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ º¯¼ö
122// o Ãâ·Â :
123//*********************************************************************************************************************************
124void SHA256_Init( OUT SHA256_INFO *Info )
125{
126 Info->uChainVar[0] = 0x6a09e667;
127 Info->uChainVar[1] = 0xbb67ae85;
128 Info->uChainVar[2] = 0x3c6ef372;
129 Info->uChainVar[3] = 0xa54ff53a;
130 Info->uChainVar[4] = 0x510e527f;
131 Info->uChainVar[5] = 0x9b05688c;
132 Info->uChainVar[6] = 0x1f83d9ab;
133 Info->uChainVar[7] = 0x5be0cd19;
134
135 Info->uHighLength = Info->uLowLength = 0;
136}
137
138//*********************************************************************************************************************************
139// o SHA256_Process() : ÀÓÀÇÀÇ ±æÀ̸¦ °¡Áö´Â ÀÔ·Â ¸Þ½ÃÁö¸¦ 512 ºñÆ® ºí·Ï ´ÜÀ§·Î ³ª´©¾î ¾ÐÃàÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÇÔ¼ö
140// o ÀÔ·Â : Info - SHA-256 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ º¯¼ö
141// pszMessage - ÀÔ·Â ¸Þ½ÃÁöÀÇ Æ÷ÀÎÅÍ º¯¼ö
142// uDataLen - ÀÔ·Â ¸Þ½ÃÁöÀÇ ¹ÙÀÌÆ® ±æÀÌ
143// o Ãâ·Â :
144//*********************************************************************************************************************************
145void SHA256_Process( OUT SHA256_INFO *Info, IN const BYTE *pszMessage, IN UINT uDataLen )
146{
147 if ((Info->uLowLength += (uDataLen << 3)) < 0)
148 Info->uHighLength++;
149
150 Info->uHighLength += (uDataLen >> 29);
151
152 while (uDataLen >= SHA256_DIGEST_BLOCKLEN)
153 {
154 memcpy((UCHAR_PTR)Info->szBuffer, pszMessage, (SINT)SHA256_DIGEST_BLOCKLEN);
155 SHA256_Transform((ULONG_PTR)Info->szBuffer, Info->uChainVar);
156 pszMessage += SHA256_DIGEST_BLOCKLEN;
157 uDataLen -= SHA256_DIGEST_BLOCKLEN;
158 }
159
160 memcpy((UCHAR_PTR)Info->szBuffer, pszMessage, uDataLen);
161}
162
163//*********************************************************************************************************************************
164// o SHA256_Close() : ¸Þ½ÃÁö µ¡ºÙÀ̱â¿Í ±æÀÌ µ¡ºÙÀ̱⸦ ¼öÇàÇÑ ÈÄ ¸¶Áö¸· ¸Þ½ÃÁö ºí·ÏÀ» °¡Áö°í ¾ÐÃàÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÇÔ¼ö
165// o ÀÔ·Â : Info - SHA-256 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ º¯¼ö
166// pszDigest - SHA-256 Çؽ¬°ªÀ» ÀúÀåÇÒ Æ÷ÀÎÅÍ º¯¼ö
167// o Ãâ·Â :
168//*********************************************************************************************************************************
169void SHA256_Close( OUT SHA256_INFO *Info, IN BYTE *pszDigest )
170{
171 ULONG i, Index;
172
173 Index = (Info->uLowLength >> 3) % SHA256_DIGEST_BLOCKLEN;
174 Info->szBuffer[Index++] = 0x80;
175
176 if (Index > SHA256_DIGEST_BLOCKLEN - 8)
177 {
178 memset((UCHAR_PTR)Info->szBuffer + Index, 0, (SINT)(SHA256_DIGEST_BLOCKLEN - Index));
179 SHA256_Transform((ULONG_PTR)Info->szBuffer, Info->uChainVar);
180 memset((UCHAR_PTR)Info->szBuffer, 0, (SINT)SHA256_DIGEST_BLOCKLEN - 8);
181 }
182 else
183 memset((UCHAR_PTR)Info->szBuffer + Index, 0, (SINT)(SHA256_DIGEST_BLOCKLEN - Index - 8));
184
185#if defined(LITTLE_ENDIAN)
186 Info->uLowLength = ENDIAN_REVERSE_ULONG(Info->uLowLength);
187 Info->uHighLength = ENDIAN_REVERSE_ULONG(Info->uHighLength);
188#endif
189
190 ((ULONG_PTR)Info->szBuffer)[SHA256_DIGEST_BLOCKLEN / 4 - 2] = Info->uHighLength;
191 ((ULONG_PTR)Info->szBuffer)[SHA256_DIGEST_BLOCKLEN / 4 - 1] = Info->uLowLength;
192
193 SHA256_Transform((ULONG_PTR)Info->szBuffer, Info->uChainVar);
194
195 for (i = 0; i < SHA256_DIGEST_VALUELEN; i += 4)
196 BIG_D2B((Info->uChainVar)[i / 4], &(pszDigest[i]));
197}
198
199void SHA256_Encrpyt( IN const BYTE *pszMessage, IN UINT uPlainTextLen, OUT BYTE *pszDigest )
200{
201 SHA256_INFO info;
202
203 SHA256_Init( &info );
204
205 SHA256_Process( &info, pszMessage, uPlainTextLen );
206
207 SHA256_Close( &info, pszDigest );
208}
Note: See TracBrowser for help on using the repository browser.