xref: /OK3568_Linux_fs/external/security/librkcrypto/test/c_mode/hash_sha256.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include <stdio.h>
2*4882a593Smuzhiyun #include <stdlib.h>
3*4882a593Smuzhiyun #include <string.h>
4*4882a593Smuzhiyun #include <assert.h>
5*4882a593Smuzhiyun #include "aes_core.h"
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef uint32_t
8*4882a593Smuzhiyun #define uint32_t unsigned int
9*4882a593Smuzhiyun #endif
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /**
12*4882a593Smuzhiyun  * \brief          SHA-256 context structure
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun typedef struct
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun     uint32_t total[2];          /*!< number of bytes processed  */
17*4882a593Smuzhiyun     uint32_t state[8];          /*!< intermediate digest state  */
18*4882a593Smuzhiyun     unsigned char buffer[64];   /*!< data block being processed */
19*4882a593Smuzhiyun     int is224;                  /*!< 0 => SHA-256, else SHA-224 */
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun RK_SHA256_CTX;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* Implementation that should never be optimized out by the compiler */
mbedtls_zeroize(void * v,size_t n)24*4882a593Smuzhiyun static void mbedtls_zeroize( void *v, size_t n ) {
25*4882a593Smuzhiyun     volatile unsigned char *p = v; while( n-- ) *p++ = 0;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * 32-bit integer manipulation macros (big endian)
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun #ifndef GET_UINT32_BE
32*4882a593Smuzhiyun #define GET_UINT32_BE(n,b,i)                            \
33*4882a593Smuzhiyun do {                                                    \
34*4882a593Smuzhiyun     (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \
35*4882a593Smuzhiyun         | ( (uint32_t) (b)[(i) + 1] << 16 )             \
36*4882a593Smuzhiyun         | ( (uint32_t) (b)[(i) + 2] <<  8 )             \
37*4882a593Smuzhiyun         | ( (uint32_t) (b)[(i) + 3]       );            \
38*4882a593Smuzhiyun } while( 0 )
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #ifndef PUT_UINT32_BE
42*4882a593Smuzhiyun #define PUT_UINT32_BE(n,b,i)                            \
43*4882a593Smuzhiyun do {                                                    \
44*4882a593Smuzhiyun     (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
45*4882a593Smuzhiyun     (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
46*4882a593Smuzhiyun     (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
47*4882a593Smuzhiyun     (b)[(i) + 3] = (unsigned char) ( (n)       );       \
48*4882a593Smuzhiyun } while( 0 )
49*4882a593Smuzhiyun #endif
50*4882a593Smuzhiyun 
mbedtls_sha256_init(RK_SHA256_CTX * ctx)51*4882a593Smuzhiyun void mbedtls_sha256_init( RK_SHA256_CTX *ctx )
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun     memset( ctx, 0, sizeof( RK_SHA256_CTX ) );
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
mbedtls_sha256_free(RK_SHA256_CTX * ctx)56*4882a593Smuzhiyun void mbedtls_sha256_free( RK_SHA256_CTX *ctx )
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun     if( ctx == NULL )
59*4882a593Smuzhiyun         return;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun     mbedtls_zeroize( ctx, sizeof( RK_SHA256_CTX ) );
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun 
mbedtls_sha256_clone(RK_SHA256_CTX * dst,const RK_SHA256_CTX * src)64*4882a593Smuzhiyun void mbedtls_sha256_clone( RK_SHA256_CTX *dst,
65*4882a593Smuzhiyun                            const RK_SHA256_CTX *src )
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun     *dst = *src;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /*
71*4882a593Smuzhiyun  * SHA-256 context setup
72*4882a593Smuzhiyun  */
mbedtls_sha256_starts(RK_SHA256_CTX * ctx,int is224)73*4882a593Smuzhiyun void mbedtls_sha256_starts( RK_SHA256_CTX *ctx, int is224 )
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun     ctx->total[0] = 0;
76*4882a593Smuzhiyun     ctx->total[1] = 0;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun     if( is224 == 0 )
79*4882a593Smuzhiyun     {
80*4882a593Smuzhiyun         /* SHA-256 */
81*4882a593Smuzhiyun         ctx->state[0] = 0x6A09E667;
82*4882a593Smuzhiyun         ctx->state[1] = 0xBB67AE85;
83*4882a593Smuzhiyun         ctx->state[2] = 0x3C6EF372;
84*4882a593Smuzhiyun         ctx->state[3] = 0xA54FF53A;
85*4882a593Smuzhiyun         ctx->state[4] = 0x510E527F;
86*4882a593Smuzhiyun         ctx->state[5] = 0x9B05688C;
87*4882a593Smuzhiyun         ctx->state[6] = 0x1F83D9AB;
88*4882a593Smuzhiyun         ctx->state[7] = 0x5BE0CD19;
89*4882a593Smuzhiyun     }
90*4882a593Smuzhiyun     else
91*4882a593Smuzhiyun     {
92*4882a593Smuzhiyun         /* SHA-224 */
93*4882a593Smuzhiyun         ctx->state[0] = 0xC1059ED8;
94*4882a593Smuzhiyun         ctx->state[1] = 0x367CD507;
95*4882a593Smuzhiyun         ctx->state[2] = 0x3070DD17;
96*4882a593Smuzhiyun         ctx->state[3] = 0xF70E5939;
97*4882a593Smuzhiyun         ctx->state[4] = 0xFFC00B31;
98*4882a593Smuzhiyun         ctx->state[5] = 0x68581511;
99*4882a593Smuzhiyun         ctx->state[6] = 0x64F98FA7;
100*4882a593Smuzhiyun         ctx->state[7] = 0xBEFA4FA4;
101*4882a593Smuzhiyun     }
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun     ctx->is224 = is224;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun static const uint32_t K[] =
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun     0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
109*4882a593Smuzhiyun     0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
110*4882a593Smuzhiyun     0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
111*4882a593Smuzhiyun     0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
112*4882a593Smuzhiyun     0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
113*4882a593Smuzhiyun     0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
114*4882a593Smuzhiyun     0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
115*4882a593Smuzhiyun     0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
116*4882a593Smuzhiyun     0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
117*4882a593Smuzhiyun     0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
118*4882a593Smuzhiyun     0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
119*4882a593Smuzhiyun     0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
120*4882a593Smuzhiyun     0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
121*4882a593Smuzhiyun     0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
122*4882a593Smuzhiyun     0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
123*4882a593Smuzhiyun     0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #define  SHR(x,n) ((x & 0xFFFFFFFF) >> n)
127*4882a593Smuzhiyun #define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))
130*4882a593Smuzhiyun #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
133*4882a593Smuzhiyun #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define F0(x,y,z) ((x & y) | (z & (x | y)))
136*4882a593Smuzhiyun #define F1(x,y,z) (z ^ (x & (y ^ z)))
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun #define R(t)                                    \
139*4882a593Smuzhiyun (                                               \
140*4882a593Smuzhiyun     W[t] = S1(W[t -  2]) + W[t -  7] +          \
141*4882a593Smuzhiyun            S0(W[t - 15]) + W[t - 16]            \
142*4882a593Smuzhiyun )
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #define P(a,b,c,d,e,f,g,h,x,K)                  \
145*4882a593Smuzhiyun {                                               \
146*4882a593Smuzhiyun     temp1 = h + S3(e) + F1(e,f,g) + K + x;      \
147*4882a593Smuzhiyun     temp2 = S2(a) + F0(a,b,c);                  \
148*4882a593Smuzhiyun     d += temp1; h = temp1 + temp2;              \
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun 
mbedtls_sha256_process(RK_SHA256_CTX * ctx,const unsigned char data[64])151*4882a593Smuzhiyun void mbedtls_sha256_process( RK_SHA256_CTX *ctx, const unsigned char data[64] )
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun     uint32_t temp1, temp2, W[64];
154*4882a593Smuzhiyun     uint32_t A[8];
155*4882a593Smuzhiyun     unsigned int i;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun     for( i = 0; i < 8; i++ )
158*4882a593Smuzhiyun         A[i] = ctx->state[i];
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #if defined(MBEDTLS_SHA256_SMALLER)
161*4882a593Smuzhiyun     for( i = 0; i < 64; i++ )
162*4882a593Smuzhiyun     {
163*4882a593Smuzhiyun         if( i < 16 )
164*4882a593Smuzhiyun             GET_UINT32_BE( W[i], data, 4 * i );
165*4882a593Smuzhiyun         else
166*4882a593Smuzhiyun             R( i );
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun         P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun         temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
171*4882a593Smuzhiyun         A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
172*4882a593Smuzhiyun     }
173*4882a593Smuzhiyun #else /* MBEDTLS_SHA256_SMALLER */
174*4882a593Smuzhiyun     for( i = 0; i < 16; i++ )
175*4882a593Smuzhiyun         GET_UINT32_BE( W[i], data, 4 * i );
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun     for( i = 0; i < 16; i += 8 )
178*4882a593Smuzhiyun     {
179*4882a593Smuzhiyun         P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
180*4882a593Smuzhiyun         P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
181*4882a593Smuzhiyun         P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
182*4882a593Smuzhiyun         P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
183*4882a593Smuzhiyun         P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
184*4882a593Smuzhiyun         P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
185*4882a593Smuzhiyun         P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
186*4882a593Smuzhiyun         P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
187*4882a593Smuzhiyun     }
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun     for( i = 16; i < 64; i += 8 )
190*4882a593Smuzhiyun     {
191*4882a593Smuzhiyun         P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
192*4882a593Smuzhiyun         P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
193*4882a593Smuzhiyun         P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
194*4882a593Smuzhiyun         P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
195*4882a593Smuzhiyun         P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
196*4882a593Smuzhiyun         P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
197*4882a593Smuzhiyun         P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
198*4882a593Smuzhiyun         P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
199*4882a593Smuzhiyun     }
200*4882a593Smuzhiyun #endif /* MBEDTLS_SHA256_SMALLER */
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun     for( i = 0; i < 8; i++ )
203*4882a593Smuzhiyun         ctx->state[i] += A[i];
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun /*
207*4882a593Smuzhiyun  * SHA-256 process buffer
208*4882a593Smuzhiyun  */
mbedtls_sha256_update(RK_SHA256_CTX * ctx,const unsigned char * input,size_t ilen)209*4882a593Smuzhiyun void mbedtls_sha256_update( RK_SHA256_CTX *ctx, const unsigned char *input,
210*4882a593Smuzhiyun                     size_t ilen )
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun     size_t fill;
213*4882a593Smuzhiyun     uint32_t left;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun     if( ilen == 0 )
216*4882a593Smuzhiyun         return;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun     left = ctx->total[0] & 0x3F;
219*4882a593Smuzhiyun     fill = 64 - left;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun     ctx->total[0] += (uint32_t) ilen;
222*4882a593Smuzhiyun     ctx->total[0] &= 0xFFFFFFFF;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun     if( ctx->total[0] < (uint32_t) ilen )
225*4882a593Smuzhiyun         ctx->total[1]++;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun     if( left && ilen >= fill )
228*4882a593Smuzhiyun     {
229*4882a593Smuzhiyun         memcpy( (void *) (ctx->buffer + left), input, fill );
230*4882a593Smuzhiyun         mbedtls_sha256_process( ctx, ctx->buffer );
231*4882a593Smuzhiyun         input += fill;
232*4882a593Smuzhiyun         ilen  -= fill;
233*4882a593Smuzhiyun         left = 0;
234*4882a593Smuzhiyun     }
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun     while( ilen >= 64 )
237*4882a593Smuzhiyun     {
238*4882a593Smuzhiyun         mbedtls_sha256_process( ctx, input );
239*4882a593Smuzhiyun         input += 64;
240*4882a593Smuzhiyun         ilen  -= 64;
241*4882a593Smuzhiyun     }
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun     if( ilen > 0 )
244*4882a593Smuzhiyun         memcpy( (void *) (ctx->buffer + left), input, ilen );
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun static const unsigned char sha256_padding[64] =
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
250*4882a593Smuzhiyun     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
251*4882a593Smuzhiyun     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252*4882a593Smuzhiyun     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun /*
256*4882a593Smuzhiyun  * SHA-256 final digest
257*4882a593Smuzhiyun  */
mbedtls_sha256_finish(RK_SHA256_CTX * ctx,unsigned char output[32])258*4882a593Smuzhiyun void mbedtls_sha256_finish( RK_SHA256_CTX *ctx, unsigned char output[32] )
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun     uint32_t last, padn;
261*4882a593Smuzhiyun     uint32_t high, low;
262*4882a593Smuzhiyun     unsigned char msglen[8];
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun     high = ( ctx->total[0] >> 29 )
265*4882a593Smuzhiyun          | ( ctx->total[1] <<  3 );
266*4882a593Smuzhiyun     low  = ( ctx->total[0] <<  3 );
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun     PUT_UINT32_BE( high, msglen, 0 );
269*4882a593Smuzhiyun     PUT_UINT32_BE( low,  msglen, 4 );
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun     last = ctx->total[0] & 0x3F;
272*4882a593Smuzhiyun     padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun     mbedtls_sha256_update( ctx, sha256_padding, padn );
275*4882a593Smuzhiyun     mbedtls_sha256_update( ctx, msglen, 8 );
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[0], output,  0 );
278*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[1], output,  4 );
279*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[2], output,  8 );
280*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[3], output, 12 );
281*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[4], output, 16 );
282*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[5], output, 20 );
283*4882a593Smuzhiyun     PUT_UINT32_BE( ctx->state[6], output, 24 );
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun     if( ctx->is224 == 0 )
286*4882a593Smuzhiyun         PUT_UINT32_BE( ctx->state[7], output, 28 );
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /*
290*4882a593Smuzhiyun  * output = SHA-256( input buffer )
291*4882a593Smuzhiyun  */
rk_hash_sha256(const unsigned char * in,unsigned int in_len,unsigned char * out,unsigned int * out_len)292*4882a593Smuzhiyun int rk_hash_sha256(const unsigned char *in, unsigned int in_len,
293*4882a593Smuzhiyun 							unsigned char *out, unsigned int *out_len)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun     RK_SHA256_CTX ctx;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	if (in == NULL && in_len != 0)
298*4882a593Smuzhiyun 		return -1;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	if(out == NULL || out_len == NULL)
301*4882a593Smuzhiyun 		return -1;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun     mbedtls_sha256_init( &ctx );
304*4882a593Smuzhiyun     mbedtls_sha256_starts( &ctx, 0 );
305*4882a593Smuzhiyun     mbedtls_sha256_update( &ctx, in, in_len );
306*4882a593Smuzhiyun     mbedtls_sha256_finish( &ctx, out );
307*4882a593Smuzhiyun     mbedtls_sha256_free( &ctx );
308*4882a593Smuzhiyun 	*out_len = 32;
309*4882a593Smuzhiyun 	return 0;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun 
rk_hash_sha224(const unsigned char * in,unsigned int in_len,unsigned char * out,unsigned int * out_len)312*4882a593Smuzhiyun int rk_hash_sha224(const unsigned char *in, unsigned int in_len,
313*4882a593Smuzhiyun 							unsigned char *out, unsigned int *out_len)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun     RK_SHA256_CTX ctx;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	if (in == NULL && in_len != 0)
318*4882a593Smuzhiyun 		return -1;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	if(out == NULL || out_len == NULL)
321*4882a593Smuzhiyun 		return -1;
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun     mbedtls_sha256_init( &ctx );
324*4882a593Smuzhiyun     mbedtls_sha256_starts( &ctx, 1);
325*4882a593Smuzhiyun     mbedtls_sha256_update( &ctx, in, in_len );
326*4882a593Smuzhiyun     mbedtls_sha256_finish( &ctx, out );
327*4882a593Smuzhiyun     mbedtls_sha256_free( &ctx );
328*4882a593Smuzhiyun 	*out_len = 28;
329*4882a593Smuzhiyun 	return 0;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 
333