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