OpenCores
URL https://opencores.org/ocsvn/sha_core/sha_core/trunk

Subversion Repositories sha_core

[/] [sha_core/] [tags/] [arelease/] [src/] [mrshs512.c] - Blame information for rev 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 marsgod
/*
2
 * Implementation of the Secure Hashing Algorithm (SHA-384 and SHA-512)
3
 *
4
 * Generates a a 384 or 512 bit message digest. It should be impossible to come
5
 * come up with two messages that hash to the same value ("collision free").
6
 *
7
 * For use with byte-oriented messages only. Could/Should be speeded
8
 * up by unwinding loops in shs_transform(), and assembly patches.
9
 *
10
 * NOTE: This requires a 64-bit integer type to be defined
11
 */
12
 
13
#include <stdio.h>
14
#include "miracl.h"
15
 
16
#ifdef mr_unsign64
17
 
18
#define H0 0x6a09e667f3bcc908
19
#define H1 0xbb67ae8584caa73b
20
#define H2 0x3c6ef372fe94f82b
21
#define H3 0xa54ff53a5f1d36f1
22
#define H4 0x510e527fade682d1
23
#define H5 0x9b05688c2b3e6c1f
24
#define H6 0x1f83d9abfb41bd6b
25
#define H7 0x5be0cd19137e2179
26
 
27
#define H8 0xcbbb9d5dc1059ed8
28
#define H9 0x629a292a367cd507
29
#define HA 0x9159015a3070dd17
30
#define HB 0x152fecd8f70e5939
31
#define HC 0x67332667ffc00b31
32
#define HD 0x8eb44a8768581511
33
#define HE 0xdb0c2e0d64f98fa7
34
#define HF 0x47b5481dbefa4fa4
35
 
36
static mr_unsign64 K[80]={
37
0x428a2f98d728ae22,0x7137449123ef65cd,0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc,
38
0x3956c25bf348b538,0x59f111f1b605d019,0x923f82a4af194f9b,0xab1c5ed5da6d8118,
39
0xd807aa98a3030242,0x12835b0145706fbe,0x243185be4ee4b28c,0x550c7dc3d5ffb4e2,
40
0x72be5d74f27b896f,0x80deb1fe3b1696b1,0x9bdc06a725c71235,0xc19bf174cf692694,
41
0xe49b69c19ef14ad2,0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65,
42
0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5,
43
0x983e5152ee66dfab,0xa831c66d2db43210,0xb00327c898fb213f,0xbf597fc7beef0ee4,
44
0xc6e00bf33da88fc2,0xd5a79147930aa725,0x06ca6351e003826f,0x142929670a0e6e70,
45
0x27b70a8546d22ffc,0x2e1b21385c26c926,0x4d2c6dfc5ac42aed,0x53380d139d95b3df,
46
0x650a73548baf63de,0x766a0abb3c77b2a8,0x81c2c92e47edaee6,0x92722c851482353b,
47
0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30,
48
0xd192e819d6ef5218,0xd69906245565a910,0xf40e35855771202a,0x106aa07032bbd1b8,
49
0x19a4c116b8d2d0c8,0x1e376c085141ab53,0x2748774cdf8eeb99,0x34b0bcb5e19b48a8,
50
0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb,0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3,
51
0x748f82ee5defb2fc,0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec,
52
0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b,
53
0xca273eceea26619c,0xd186b8c721c0c207,0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178,
54
0x06f067aa72176fba,0x0a637dc5a2c898a6,0x113f9804bef90dae,0x1b710b35131c471b,
55
0x28db77f523047d84,0x32caab7b40c72493,0x3c9ebe0a15c9bebc,0x431d67c49c100d4c,
56
0x4cc5d4becb3e42b6,0x597f299cfc657e2a,0x5fcb6fab3ad6faec,0x6c44198c4a475817};
57
 
58
#define PAD  0x80
59
#define ZERO 0
60
 
61
/* functions */
62
 
63
#define S(n,x) (((x)>>n) | ((x)<<(64-n)))
64
#define R(n,x) ((x)>>n)
65
 
66
#define Ch(x,y,z)  ((x&y)^(~(x)&z))
67
#define Maj(x,y,z) ((x&y)^(x&z)^(y&z))
68
#define Sig0(x)    (S(28,x)^S(34,x)^S(39,x))
69
#define Sig1(x)    (S(14,x)^S(18,x)^S(41,x))
70
#define theta0(x)  (S(1,x)^S(8,x)^R(7,x))
71
#define theta1(x)  (S(19,x)^S(61,x)^R(6,x))
72
 
73
static void shs_transform(sha512 *sh)
74
{ /* basic transformation step */
75
    mr_unsign64 a,b,c,d,e,f,g,h,t1,t2;
76
    int j;
77
    for (j=16;j<80;j++)
78
        sh->w[j]=theta1(sh->w[j-2])+sh->w[j-7]+theta0(sh->w[j-15])+sh->w[j-16];
79
 
80
    a=sh->h[0]; b=sh->h[1]; c=sh->h[2]; d=sh->h[3];
81
    e=sh->h[4]; f=sh->h[5]; g=sh->h[6]; h=sh->h[7];
82
 
83
    for (j=0;j<80;j++)
84
    { /* 80 times - mush it up */
85
        t1=h+Sig1(e)+Ch(e,f,g)+K[j]+sh->w[j];
86
        t2=Sig0(a)+Maj(a,b,c);
87
        h=g; g=f; f=e;
88
        e=d+t1;
89
        d=c;
90
        c=b;
91
        b=a;
92
        a=t1+t2;
93
    }
94
    sh->h[0]+=a; sh->h[1]+=b; sh->h[2]+=c; sh->h[3]+=d;
95
    sh->h[4]+=e; sh->h[5]+=f; sh->h[6]+=g; sh->h[7]+=h;
96
}
97
 
98
void shs512_init(sha512 *sh)
99
{ /* re-initialise */
100
    int i;
101
    for (i=0;i<80;i++) sh->w[i]=0;
102
    sh->length[0]=sh->length[1]=0;
103
    sh->h[0]=H0;
104
    sh->h[1]=H1;
105
    sh->h[2]=H2;
106
    sh->h[3]=H3;
107
    sh->h[4]=H4;
108
    sh->h[5]=H5;
109
    sh->h[6]=H6;
110
    sh->h[7]=H7;
111
}
112
 
113
void shs384_init(sha384 *sh)
114
{ /* re-initialise */
115
    int i;
116
    for (i=0;i<80;i++) sh->w[i]=0;
117
    sh->length[0]=sh->length[1]=0;
118
    sh->h[0]=H8;
119
    sh->h[1]=H9;
120
    sh->h[2]=HA;
121
    sh->h[3]=HB;
122
    sh->h[4]=HC;
123
    sh->h[5]=HD;
124
    sh->h[6]=HE;
125
    sh->h[7]=HF;
126
}
127
 
128
 
129
void shs512_process(sha512 *sh,int byte)
130
{ /* process the next message byte */
131
    int cnt;
132
 
133
    cnt=(int)((sh->length[0]/64)%16);
134
 
135
    sh->w[cnt]<<=8;
136
    sh->w[cnt]|=(mr_unsign64)(byte&0xFF);
137
 
138
    sh->length[0]+=8;
139
    if (sh->length[0]==0L) { sh->length[1]++; sh->length[0]=0L; }
140
    if ((sh->length[0]%1024)==0) shs_transform(sh);
141
}
142
 
143
 
144
void shs384_process(sha384 *sh,int byte)
145
{ /* process the next message byte */
146
    int cnt;
147
 
148
    cnt=(int)((sh->length[0]/64)%16);
149
 
150
    sh->w[cnt]<<=8;
151
    sh->w[cnt]|=(mr_unsign64)(byte&0xFF);
152
 
153
    sh->length[0]+=8;
154
    if (sh->length[0]==0L) { sh->length[1]++; sh->length[0]=0L; }
155
    if ((sh->length[0]%1024)==0) shs_transform(sh);
156
}
157
 
158
 
159
void shs512_hash(sha512 *sh,char hash[64])
160
{ /* pad message and finish - supply digest */
161
    int i;
162
    mr_unsign64 len0,len1;
163
    len0=sh->length[0];
164
    len1=sh->length[1];
165
    shs512_process(sh,PAD);
166
    while ((sh->length[0]%1024)!=896) shs512_process(sh,ZERO);
167
    sh->w[14]=len1;
168
    sh->w[15]=len0;
169
    shs_transform(sh);
170
    for (i=0;i<64;i++)
171
    { /* convert to bytes */
172
        hash[i]=(char)((sh->h[i/8]>>(8*(7-i%8))) & 0xffL);
173
    }
174
    shs512_init(sh);
175
}
176
 
177
void shs384_hash(sha384 *sh,char hash[48])
178
{ /* pad message and finish - supply digest */
179
    int i;
180
    mr_unsign64 len0,len1;
181
    len0=sh->length[0];
182
    len1=sh->length[1];
183
    shs512_process(sh,PAD);
184
    while ((sh->length[0]%1024)!=896) shs384_process(sh,ZERO);
185
    sh->w[14]=len1;
186
    sh->w[15]=len0;
187
    shs_transform(sh);
188
    for (i=0;i<48;i++)
189
    { /* convert to bytes */
190
        hash[i]=(char)((sh->h[i/8]>>(8*(7-i%8))) & 0xffL);
191
    }
192
    shs384_init(sh);
193
}
194
 
195
 
196
#endif
197
 
198
/* test program: should produce digests
199
 
200
512 bit
201
 
202
8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018
203
501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909
204
 
205
 
206
384 bit
207
 
208
09330c33f71147e8 3d192fc782cd1b47 53111b173b3b05d2 2fa08086e3b0f712
209
fcc7c71a557e2db9 66c3e9fa91746039
210
 
211
 
212
#include <stdio.h>
213
#include "miracl.h"
214
 
215
char test[]="abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
216
 
217
int main()
218
{
219
    char hash[64];
220
    int i;
221
    sha512 sh;
222
    shs512_init(&sh);
223
    for (i=0;test[i]!=0;i++) shs512_process(&sh,test[i]);
224
    shs512_hash(&sh,hash);
225
    for (i=0;i<64;i++) printf("%02x",(unsigned char)hash[i]);
226
    printf("\n");
227
 
228
    shs384_init(&sh);
229
    for (i=0;test[i]!=0;i++) shs384_process(&sh,test[i]);
230
    shs384_hash(&sh,hash);
231
    for (i=0;i<48;i++) printf("%02x",(unsigned char)hash[i]);
232
    printf("\n");
233
 
234
    return 0;
235
}
236
 
237
*/
238
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.