aes_decrypt_init:
   60|    334|{
   61|    334|	u32 *rk;
   62|    334|	int res;
   63|    334|	rk = os_malloc(AES_PRIV_SIZE);
  ------------------
  |  |  505|    334|#define os_malloc(s) malloc((s))
  ------------------
   64|    334|	if (rk == NULL)
  ------------------
  |  Branch (64:6): [True: 0, False: 334]
  ------------------
   65|      0|		return NULL;
   66|    334|	res = rijndaelKeySetupDec(rk, key, len * 8);
   67|    334|	if (res < 0) {
  ------------------
  |  Branch (67:6): [True: 0, False: 334]
  ------------------
   68|      0|		os_free(rk);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   69|      0|		return NULL;
   70|      0|	}
   71|    334|	rk[AES_PRIV_NR_POS] = res;
  ------------------
  |  |  121|    334|#define AES_PRIV_NR_POS (4 * 15)
  ------------------
   72|    334|	return rk;
   73|    334|}
aes_decrypt:
  152|  20.5k|{
  153|  20.5k|	u32 *rk = ctx;
  154|  20.5k|	rijndaelDecrypt(ctx, rk[AES_PRIV_NR_POS], crypt, plain);
  ------------------
  |  |  121|  20.5k|#define AES_PRIV_NR_POS (4 * 15)
  ------------------
  155|  20.5k|	return 0;
  156|  20.5k|}
aes_decrypt_deinit:
  160|    334|{
  161|    334|	os_memset(ctx, 0, AES_PRIV_SIZE);
  ------------------
  |  |  529|    334|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  162|    334|	os_free(ctx);
  ------------------
  |  |  511|    334|#define os_free(p) free((p))
  ------------------
  163|    334|}
aes-internal-dec.c:rijndaelKeySetupDec:
   29|    334|{
   30|    334|	int Nr, i, j;
   31|    334|	u32 temp;
   32|       |
   33|       |	/* expand the cipher key: */
   34|    334|	Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
   35|    334|	if (Nr < 0)
  ------------------
  |  Branch (35:6): [True: 0, False: 334]
  ------------------
   36|      0|		return Nr;
   37|       |	/* invert the order of the round keys: */
   38|  2.63k|	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
  ------------------
  |  Branch (38:24): [True: 2.30k, False: 334]
  ------------------
   39|  2.30k|		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
   40|  2.30k|		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
   41|  2.30k|		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
   42|  2.30k|		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
   43|  2.30k|	}
   44|       |	/* apply the inverse MixColumn transform to all round keys but the
   45|       |	 * first and the last: */
   46|  4.60k|	for (i = 1; i < Nr; i++) {
  ------------------
  |  Branch (46:14): [True: 4.27k, False: 334]
  ------------------
   47|  4.27k|		rk += 4;
   48|  21.3k|		for (j = 0; j < 4; j++) {
  ------------------
  |  Branch (48:15): [True: 17.0k, False: 4.27k]
  ------------------
   49|  17.0k|			rk[j] = TD0_(TE4((rk[j] >> 24)       )) ^
  ------------------
  |  |  101|  17.0k|#define TD0_(i) Td0[(i) & 0xff]
  ------------------
   50|  17.0k|				TD1_(TE4((rk[j] >> 16) & 0xff)) ^
  ------------------
  |  |  102|  17.0k|#define TD1_(i) rotr(Td0[(i) & 0xff], 8)
  ------------------
   51|  17.0k|				TD2_(TE4((rk[j] >>  8) & 0xff)) ^
  ------------------
  |  |  103|  17.0k|#define TD2_(i) rotr(Td0[(i) & 0xff], 16)
  ------------------
   52|  17.0k|				TD3_(TE4((rk[j]      ) & 0xff));
  ------------------
  |  |  104|  17.0k|#define TD3_(i) rotr(Td0[(i) & 0xff], 24)
  ------------------
   53|  17.0k|		}
   54|  4.27k|	}
   55|       |
   56|    334|	return Nr;
   57|    334|}
aes-internal-dec.c:rijndaelDecrypt:
   77|  20.5k|{
   78|  20.5k|	u32 s0, s1, s2, s3, t0, t1, t2, t3;
   79|  20.5k|#ifndef FULL_UNROLL
   80|  20.5k|	int r;
   81|  20.5k|#endif /* ?FULL_UNROLL */
   82|       |
   83|       |	/*
   84|       |	 * map byte array block to cipher state
   85|       |	 * and add initial round key:
   86|       |	 */
   87|  20.5k|	s0 = GETU32(ct     ) ^ rk[0];
  ------------------
  |  |  113|  20.5k|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|  20.5k|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   88|  20.5k|	s1 = GETU32(ct +  4) ^ rk[1];
  ------------------
  |  |  113|  20.5k|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|  20.5k|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   89|  20.5k|	s2 = GETU32(ct +  8) ^ rk[2];
  ------------------
  |  |  113|  20.5k|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|  20.5k|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   90|  20.5k|	s3 = GETU32(ct + 12) ^ rk[3];
  ------------------
  |  |  113|  20.5k|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|  20.5k|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   91|       |
   92|  20.5k|#define ROUND(i,d,s) \
   93|  20.5k|d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
   94|  20.5k|d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
   95|  20.5k|d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
   96|  20.5k|d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
   97|       |
   98|       |#ifdef FULL_UNROLL
   99|       |
  100|       |	ROUND(1,t,s);
  101|       |	ROUND(2,s,t);
  102|       |	ROUND(3,t,s);
  103|       |	ROUND(4,s,t);
  104|       |	ROUND(5,t,s);
  105|       |	ROUND(6,s,t);
  106|       |	ROUND(7,t,s);
  107|       |	ROUND(8,s,t);
  108|       |	ROUND(9,t,s);
  109|       |	if (Nr > 10) {
  110|       |		ROUND(10,s,t);
  111|       |		ROUND(11,t,s);
  112|       |		if (Nr > 12) {
  113|       |			ROUND(12,s,t);
  114|       |			ROUND(13,t,s);
  115|       |		}
  116|       |	}
  117|       |
  118|       |	rk += Nr << 2;
  119|       |
  120|       |#else  /* !FULL_UNROLL */
  121|       |
  122|       |	/* Nr - 1 full rounds: */
  123|  20.5k|	r = Nr >> 1;
  124|   143k|	for (;;) {
  125|   143k|		ROUND(1,t,s);
  ------------------
  |  |   92|   143k|#define ROUND(i,d,s) \
  |  |   93|   143k|d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   93|   143k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   94|   143k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   95|   143k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   96|   143k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   94|   143k|d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   93|   143k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   94|   143k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   95|   143k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   96|   143k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   95|   143k|d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   93|   143k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   94|   143k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   95|   143k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   96|   143k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   96|   143k|d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   93|   143k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   94|   143k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   95|   143k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   96|   143k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  ------------------
  126|   143k|		rk += 8;
  127|   143k|		if (--r == 0)
  ------------------
  |  Branch (127:7): [True: 20.5k, False: 123k]
  ------------------
  128|  20.5k|			break;
  129|   123k|		ROUND(0,s,t);
  ------------------
  |  |   92|   123k|#define ROUND(i,d,s) \
  |  |   93|   123k|d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   93|   123k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   94|   123k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   95|   123k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   96|   123k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   94|   123k|d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   93|   123k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   94|   123k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   95|   123k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   96|   123k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   95|   123k|d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   93|   123k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   94|   123k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   95|   123k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   96|   123k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   96|   123k|d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   93|   123k|#define TD0(i) Td0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   94|   123k|#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   95|   123k|#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   96|   123k|#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  |  |  ------------------
  ------------------
  130|   123k|	}
  131|       |
  132|  20.5k|#endif /* ?FULL_UNROLL */
  133|       |
  134|  20.5k|#undef ROUND
  135|       |
  136|       |	/*
  137|       |	 * apply last round and
  138|       |	 * map cipher state to byte array block:
  139|       |	 */
  140|  20.5k|	s0 = TD41(t0) ^ TD42(t3) ^ TD43(t2) ^ TD44(t1) ^ rk[0];
  ------------------
  |  |   97|  20.5k|#define TD41(i) ((u32) Td4s[((i) >> 24) & 0xff] << 24)
  ------------------
              	s0 = TD41(t0) ^ TD42(t3) ^ TD43(t2) ^ TD44(t1) ^ rk[0];
  ------------------
  |  |   98|  20.5k|#define TD42(i) ((u32) Td4s[((i) >> 16) & 0xff] << 16)
  ------------------
              	s0 = TD41(t0) ^ TD42(t3) ^ TD43(t2) ^ TD44(t1) ^ rk[0];
  ------------------
  |  |   99|  20.5k|#define TD43(i) ((u32) Td4s[((i) >> 8) & 0xff] << 8)
  ------------------
              	s0 = TD41(t0) ^ TD42(t3) ^ TD43(t2) ^ TD44(t1) ^ rk[0];
  ------------------
  |  |  100|  20.5k|#define TD44(i) ((u32) Td4s[(i) & 0xff])
  ------------------
  141|  20.5k|	PUTU32(pt     , s0);
  ------------------
  |  |  115|  20.5k|#define PUTU32(ct, st) { \
  |  |  116|  20.5k|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|  20.5k|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
  142|  20.5k|	s1 = TD41(t1) ^ TD42(t0) ^ TD43(t3) ^ TD44(t2) ^ rk[1];
  ------------------
  |  |   97|  20.5k|#define TD41(i) ((u32) Td4s[((i) >> 24) & 0xff] << 24)
  ------------------
              	s1 = TD41(t1) ^ TD42(t0) ^ TD43(t3) ^ TD44(t2) ^ rk[1];
  ------------------
  |  |   98|  20.5k|#define TD42(i) ((u32) Td4s[((i) >> 16) & 0xff] << 16)
  ------------------
              	s1 = TD41(t1) ^ TD42(t0) ^ TD43(t3) ^ TD44(t2) ^ rk[1];
  ------------------
  |  |   99|  20.5k|#define TD43(i) ((u32) Td4s[((i) >> 8) & 0xff] << 8)
  ------------------
              	s1 = TD41(t1) ^ TD42(t0) ^ TD43(t3) ^ TD44(t2) ^ rk[1];
  ------------------
  |  |  100|  20.5k|#define TD44(i) ((u32) Td4s[(i) & 0xff])
  ------------------
  143|  20.5k|	PUTU32(pt +  4, s1);
  ------------------
  |  |  115|  20.5k|#define PUTU32(ct, st) { \
  |  |  116|  20.5k|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|  20.5k|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
  144|  20.5k|	s2 = TD41(t2) ^ TD42(t1) ^ TD43(t0) ^ TD44(t3) ^ rk[2];
  ------------------
  |  |   97|  20.5k|#define TD41(i) ((u32) Td4s[((i) >> 24) & 0xff] << 24)
  ------------------
              	s2 = TD41(t2) ^ TD42(t1) ^ TD43(t0) ^ TD44(t3) ^ rk[2];
  ------------------
  |  |   98|  20.5k|#define TD42(i) ((u32) Td4s[((i) >> 16) & 0xff] << 16)
  ------------------
              	s2 = TD41(t2) ^ TD42(t1) ^ TD43(t0) ^ TD44(t3) ^ rk[2];
  ------------------
  |  |   99|  20.5k|#define TD43(i) ((u32) Td4s[((i) >> 8) & 0xff] << 8)
  ------------------
              	s2 = TD41(t2) ^ TD42(t1) ^ TD43(t0) ^ TD44(t3) ^ rk[2];
  ------------------
  |  |  100|  20.5k|#define TD44(i) ((u32) Td4s[(i) & 0xff])
  ------------------
  145|  20.5k|	PUTU32(pt +  8, s2);
  ------------------
  |  |  115|  20.5k|#define PUTU32(ct, st) { \
  |  |  116|  20.5k|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|  20.5k|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
  146|  20.5k|	s3 = TD41(t3) ^ TD42(t2) ^ TD43(t1) ^ TD44(t0) ^ rk[3];
  ------------------
  |  |   97|  20.5k|#define TD41(i) ((u32) Td4s[((i) >> 24) & 0xff] << 24)
  ------------------
              	s3 = TD41(t3) ^ TD42(t2) ^ TD43(t1) ^ TD44(t0) ^ rk[3];
  ------------------
  |  |   98|  20.5k|#define TD42(i) ((u32) Td4s[((i) >> 16) & 0xff] << 16)
  ------------------
              	s3 = TD41(t3) ^ TD42(t2) ^ TD43(t1) ^ TD44(t0) ^ rk[3];
  ------------------
  |  |   99|  20.5k|#define TD43(i) ((u32) Td4s[((i) >> 8) & 0xff] << 8)
  ------------------
              	s3 = TD41(t3) ^ TD42(t2) ^ TD43(t1) ^ TD44(t0) ^ rk[3];
  ------------------
  |  |  100|  20.5k|#define TD44(i) ((u32) Td4s[(i) & 0xff])
  ------------------
  147|  20.5k|	PUTU32(pt + 12, s3);
  ------------------
  |  |  115|  20.5k|#define PUTU32(ct, st) { \
  |  |  116|  20.5k|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|  20.5k|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
  148|  20.5k|}

aes_encrypt_init:
   99|    334|{
  100|    334|	u32 *rk;
  101|    334|	int res;
  102|       |
  103|    334|	if (TEST_FAIL())
  ------------------
  |  |  688|    334|#define TEST_FAIL() testing_test_fail(NULL, false)
  |  |  ------------------
  |  |  |  Branch (688:21): [True: 0, False: 334]
  |  |  ------------------
  ------------------
  104|      0|		return NULL;
  105|       |
  106|    334|	rk = os_malloc(AES_PRIV_SIZE);
  ------------------
  |  |  505|    334|#define os_malloc(s) malloc((s))
  ------------------
  107|    334|	if (rk == NULL)
  ------------------
  |  Branch (107:6): [True: 0, False: 334]
  ------------------
  108|      0|		return NULL;
  109|    334|	res = rijndaelKeySetupEnc(rk, key, len * 8);
  110|    334|	if (res < 0) {
  ------------------
  |  Branch (110:6): [True: 0, False: 334]
  ------------------
  111|      0|		os_free(rk);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  112|      0|		return NULL;
  113|      0|	}
  114|    334|	rk[AES_PRIV_NR_POS] = res;
  ------------------
  |  |  121|    334|#define AES_PRIV_NR_POS (4 * 15)
  ------------------
  115|    334|	return rk;
  116|    334|}
aes_encrypt:
  120|    849|{
  121|    849|	u32 *rk = ctx;
  122|    849|	rijndaelEncrypt(ctx, rk[AES_PRIV_NR_POS], plain, crypt);
  ------------------
  |  |  121|    849|#define AES_PRIV_NR_POS (4 * 15)
  ------------------
  123|    849|	return 0;
  124|    849|}
aes_encrypt_deinit:
  128|    334|{
  129|    334|	os_memset(ctx, 0, AES_PRIV_SIZE);
  ------------------
  |  |  529|    334|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  130|    334|	os_free(ctx);
  ------------------
  |  |  511|    334|#define os_free(p) free((p))
  ------------------
  131|    334|}
aes-internal-enc.c:rijndaelEncrypt:
   24|    849|{
   25|    849|	u32 s0, s1, s2, s3, t0, t1, t2, t3;
   26|    849|#ifndef FULL_UNROLL
   27|    849|	int r;
   28|    849|#endif /* ?FULL_UNROLL */
   29|       |
   30|       |	/*
   31|       |	 * map byte array block to cipher state
   32|       |	 * and add initial round key:
   33|       |	 */
   34|    849|	s0 = GETU32(pt     ) ^ rk[0];
  ------------------
  |  |  113|    849|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    849|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   35|    849|	s1 = GETU32(pt +  4) ^ rk[1];
  ------------------
  |  |  113|    849|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    849|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   36|    849|	s2 = GETU32(pt +  8) ^ rk[2];
  ------------------
  |  |  113|    849|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    849|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   37|    849|	s3 = GETU32(pt + 12) ^ rk[3];
  ------------------
  |  |  113|    849|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    849|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
   38|       |
   39|    849|#define ROUND(i,d,s) \
   40|    849|d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
   41|    849|d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
   42|    849|d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
   43|    849|d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
   44|       |
   45|       |#ifdef FULL_UNROLL
   46|       |
   47|       |	ROUND(1,t,s);
   48|       |	ROUND(2,s,t);
   49|       |	ROUND(3,t,s);
   50|       |	ROUND(4,s,t);
   51|       |	ROUND(5,t,s);
   52|       |	ROUND(6,s,t);
   53|       |	ROUND(7,t,s);
   54|       |	ROUND(8,s,t);
   55|       |	ROUND(9,t,s);
   56|       |	if (Nr > 10) {
   57|       |		ROUND(10,s,t);
   58|       |		ROUND(11,t,s);
   59|       |		if (Nr > 12) {
   60|       |			ROUND(12,s,t);
   61|       |			ROUND(13,t,s);
   62|       |		}
   63|       |	}
   64|       |
   65|       |	rk += Nr << 2;
   66|       |
   67|       |#else  /* !FULL_UNROLL */
   68|       |
   69|       |	/* Nr - 1 full rounds: */
   70|    849|	r = Nr >> 1;
   71|  5.85k|	for (;;) {
   72|  5.85k|		ROUND(1,t,s);
  ------------------
  |  |   39|  5.85k|#define ROUND(i,d,s) \
  |  |   40|  5.85k|d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   75|  5.85k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   76|  5.85k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   77|  5.85k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   78|  5.85k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   41|  5.85k|d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   75|  5.85k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   76|  5.85k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   77|  5.85k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   78|  5.85k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   42|  5.85k|d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   75|  5.85k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   76|  5.85k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   77|  5.85k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   78|  5.85k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   43|  5.85k|d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   75|  5.85k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   76|  5.85k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   77|  5.85k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   78|  5.85k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  ------------------
   73|  5.85k|		rk += 8;
   74|  5.85k|		if (--r == 0)
  ------------------
  |  Branch (74:7): [True: 849, False: 5.00k]
  ------------------
   75|    849|			break;
   76|  5.00k|		ROUND(0,s,t);
  ------------------
  |  |   39|  5.00k|#define ROUND(i,d,s) \
  |  |   40|  5.00k|d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   75|  5.00k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   76|  5.00k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   77|  5.00k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  |  |  ------------------
  |  |  |  |   78|  5.00k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   41|  5.00k|d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   75|  5.00k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   76|  5.00k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   77|  5.00k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  |  |  ------------------
  |  |  |  |   78|  5.00k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   42|  5.00k|d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   75|  5.00k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   76|  5.00k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   77|  5.00k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  |  |  ------------------
  |  |  |  |   78|  5.00k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  |  |   43|  5.00k|d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   75|  5.00k|#define TE0(i) Te0[((i) >> 24) & 0xff]
  |  |  ------------------
  |  |               d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   76|  5.00k|#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  |  |  ------------------
  |  |               d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   77|  5.00k|#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  |  |  ------------------
  |  |               d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  |  |  ------------------
  |  |  |  |   78|  5.00k|#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  |  |  ------------------
  ------------------
   77|  5.00k|	}
   78|       |
   79|    849|#endif /* ?FULL_UNROLL */
   80|       |
   81|    849|#undef ROUND
   82|       |
   83|       |	/*
   84|       |	 * apply last round and
   85|       |	 * map cipher state to byte array block:
   86|       |	 */
   87|    849|	s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
  ------------------
  |  |   79|    849|#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
  ------------------
              	s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
  ------------------
  |  |   80|    849|#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
  ------------------
              	s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
  ------------------
  |  |   81|    849|#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
  ------------------
              	s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
  ------------------
  |  |   82|    849|#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
  ------------------
   88|    849|	PUTU32(ct     , s0);
  ------------------
  |  |  115|    849|#define PUTU32(ct, st) { \
  |  |  116|    849|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|    849|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
   89|    849|	s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
  ------------------
  |  |   79|    849|#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
  ------------------
              	s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
  ------------------
  |  |   80|    849|#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
  ------------------
              	s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
  ------------------
  |  |   81|    849|#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
  ------------------
              	s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
  ------------------
  |  |   82|    849|#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
  ------------------
   90|    849|	PUTU32(ct +  4, s1);
  ------------------
  |  |  115|    849|#define PUTU32(ct, st) { \
  |  |  116|    849|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|    849|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
   91|    849|	s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
  ------------------
  |  |   79|    849|#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
  ------------------
              	s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
  ------------------
  |  |   80|    849|#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
  ------------------
              	s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
  ------------------
  |  |   81|    849|#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
  ------------------
              	s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
  ------------------
  |  |   82|    849|#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
  ------------------
   92|    849|	PUTU32(ct +  8, s2);
  ------------------
  |  |  115|    849|#define PUTU32(ct, st) { \
  |  |  116|    849|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|    849|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
   93|    849|	s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
  ------------------
  |  |   79|    849|#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
  ------------------
              	s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
  ------------------
  |  |   80|    849|#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
  ------------------
              	s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
  ------------------
  |  |   81|    849|#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
  ------------------
              	s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
  ------------------
  |  |   82|    849|#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
  ------------------
   94|    849|	PUTU32(ct + 12, s3);
  ------------------
  |  |  115|    849|#define PUTU32(ct, st) { \
  |  |  116|    849|(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  |  |  117|    849|(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
  ------------------
   95|    849|}

rijndaelKeySetupEnc:
  780|    668|{
  781|    668|	int i;
  782|    668|	u32 temp;
  783|       |
  784|    668|	rk[0] = GETU32(cipherKey     );
  ------------------
  |  |  113|    668|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    668|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  785|    668|	rk[1] = GETU32(cipherKey +  4);
  ------------------
  |  |  113|    668|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    668|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  786|    668|	rk[2] = GETU32(cipherKey +  8);
  ------------------
  |  |  113|    668|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    668|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  787|    668|	rk[3] = GETU32(cipherKey + 12);
  ------------------
  |  |  113|    668|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    668|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  788|       |
  789|    668|	if (keyBits == 128) {
  ------------------
  |  Branch (789:6): [True: 36, False: 632]
  ------------------
  790|    396|		for (i = 0; i < 10; i++) {
  ------------------
  |  Branch (790:15): [True: 360, False: 36]
  ------------------
  791|    360|			temp  = rk[3];
  792|    360|			rk[4] = rk[0] ^ TE421(temp) ^ TE432(temp) ^
  ------------------
  |  |   83|    360|#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
  ------------------
              			rk[4] = rk[0] ^ TE421(temp) ^ TE432(temp) ^
  ------------------
  |  |   84|    360|#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
  ------------------
  793|    360|				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   85|    360|#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
  ------------------
              				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   86|    360|#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
  ------------------
              				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   68|    360|#define RCON(i) ((u32) rcons[(i)] << 24)
  ------------------
  794|    360|			rk[5] = rk[1] ^ rk[4];
  795|    360|			rk[6] = rk[2] ^ rk[5];
  796|    360|			rk[7] = rk[3] ^ rk[6];
  797|    360|			rk += 4;
  798|    360|		}
  799|     36|		return 10;
  800|     36|	}
  801|       |
  802|    632|	rk[4] = GETU32(cipherKey + 16);
  ------------------
  |  |  113|    632|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    632|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  803|    632|	rk[5] = GETU32(cipherKey + 20);
  ------------------
  |  |  113|    632|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    632|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  804|       |
  805|    632|	if (keyBits == 192) {
  ------------------
  |  Branch (805:6): [True: 0, False: 632]
  ------------------
  806|      0|		for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (806:15): [True: 0, False: 0]
  ------------------
  807|      0|			temp  = rk[5];
  808|      0|			rk[6] = rk[0] ^ TE421(temp) ^ TE432(temp) ^
  ------------------
  |  |   83|      0|#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
  ------------------
              			rk[6] = rk[0] ^ TE421(temp) ^ TE432(temp) ^
  ------------------
  |  |   84|      0|#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
  ------------------
  809|      0|				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   85|      0|#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
  ------------------
              				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   86|      0|#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
  ------------------
              				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   68|      0|#define RCON(i) ((u32) rcons[(i)] << 24)
  ------------------
  810|      0|			rk[7] = rk[1] ^ rk[6];
  811|      0|			rk[8] = rk[2] ^ rk[7];
  812|      0|			rk[9] = rk[3] ^ rk[8];
  813|      0|			if (i == 7)
  ------------------
  |  Branch (813:8): [True: 0, False: 0]
  ------------------
  814|      0|				return 12;
  815|      0|			rk[10] = rk[4] ^ rk[9];
  816|      0|			rk[11] = rk[5] ^ rk[10];
  817|      0|			rk += 6;
  818|      0|		}
  819|      0|	}
  820|       |
  821|    632|	rk[6] = GETU32(cipherKey + 24);
  ------------------
  |  |  113|    632|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    632|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  822|    632|	rk[7] = GETU32(cipherKey + 28);
  ------------------
  |  |  113|    632|#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  |  |  114|    632|((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
  ------------------
  823|       |
  824|    632|	if (keyBits == 256) {
  ------------------
  |  Branch (824:6): [True: 632, False: 0]
  ------------------
  825|  4.42k|		for (i = 0; i < 7; i++) {
  ------------------
  |  Branch (825:15): [True: 4.42k, False: 0]
  ------------------
  826|  4.42k|			temp  = rk[7];
  827|  4.42k|			rk[8] = rk[0] ^ TE421(temp) ^ TE432(temp) ^
  ------------------
  |  |   83|  4.42k|#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
  ------------------
              			rk[8] = rk[0] ^ TE421(temp) ^ TE432(temp) ^
  ------------------
  |  |   84|  4.42k|#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
  ------------------
  828|  4.42k|				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   85|  4.42k|#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
  ------------------
              				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   86|  4.42k|#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
  ------------------
              				TE443(temp) ^ TE414(temp) ^ RCON(i);
  ------------------
  |  |   68|  4.42k|#define RCON(i) ((u32) rcons[(i)] << 24)
  ------------------
  829|  4.42k|			rk[9] = rk[1] ^ rk[8];
  830|  4.42k|			rk[10] = rk[2] ^ rk[9];
  831|  4.42k|			rk[11] = rk[3] ^ rk[10];
  832|  4.42k|			if (i == 6)
  ------------------
  |  Branch (832:8): [True: 632, False: 3.79k]
  ------------------
  833|    632|				return 14;
  834|  3.79k|			temp  = rk[11];
  835|  3.79k|			rk[12] = rk[4] ^ TE411(temp) ^ TE422(temp) ^
  ------------------
  |  |   87|  3.79k|#define TE411(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
  ------------------
              			rk[12] = rk[4] ^ TE411(temp) ^ TE422(temp) ^
  ------------------
  |  |   88|  3.79k|#define TE422(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
  ------------------
  836|  3.79k|				TE433(temp) ^ TE444(temp);
  ------------------
  |  |   89|  3.79k|#define TE433(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
  ------------------
              				TE433(temp) ^ TE444(temp);
  ------------------
  |  |   90|  3.79k|#define TE444(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
  ------------------
  837|  3.79k|			rk[13] = rk[5] ^ rk[12];
  838|  3.79k|			rk[14] = rk[6] ^ rk[13];
  839|  3.79k|			rk[15] = rk[7] ^ rk[14];
  840|  3.79k|			rk += 8;
  841|  3.79k|		}
  842|    632|	}
  843|       |
  844|      0|	return -1;
  845|    632|}

aes-internal-dec.c:rotr:
   71|  3.25M|{
   72|  3.25M|	return (val >> bits) | (val << (32 - bits));
   73|  3.25M|}
aes-internal-enc.c:rotr:
   71|   130k|{
   72|   130k|	return (val >> bits) | (val << (32 - bits));
   73|   130k|}

crypto_cipher_init:
   46|    860|{
   47|    860|	struct crypto_cipher *ctx;
   48|       |
   49|    860|	ctx = os_zalloc(sizeof(*ctx));
   50|    860|	if (ctx == NULL)
  ------------------
  |  Branch (50:6): [True: 0, False: 860]
  ------------------
   51|      0|		return NULL;
   52|       |
   53|    860|	ctx->alg = alg;
   54|       |
   55|    860|	switch (alg) {
   56|    268|	case CRYPTO_CIPHER_ALG_RC4:
  ------------------
  |  Branch (56:2): [True: 268, False: 592]
  ------------------
   57|    268|		if (key_len > sizeof(ctx->u.rc4.key)) {
  ------------------
  |  Branch (57:7): [True: 0, False: 268]
  ------------------
   58|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   59|      0|			return NULL;
   60|      0|		}
   61|    268|		ctx->u.rc4.keylen = key_len;
   62|    268|		os_memcpy(ctx->u.rc4.key, key, key_len);
  ------------------
  |  |  523|    268|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   63|    268|		break;
   64|    334|	case CRYPTO_CIPHER_ALG_AES:
  ------------------
  |  Branch (64:2): [True: 334, False: 526]
  ------------------
   65|    334|		ctx->u.aes.ctx_enc = aes_encrypt_init(key, key_len);
   66|    334|		if (ctx->u.aes.ctx_enc == NULL) {
  ------------------
  |  Branch (66:7): [True: 0, False: 334]
  ------------------
   67|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   68|      0|			return NULL;
   69|      0|		}
   70|    334|		ctx->u.aes.ctx_dec = aes_decrypt_init(key, key_len);
   71|    334|		if (ctx->u.aes.ctx_dec == NULL) {
  ------------------
  |  Branch (71:7): [True: 0, False: 334]
  ------------------
   72|      0|			aes_encrypt_deinit(ctx->u.aes.ctx_enc);
   73|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   74|      0|			return NULL;
   75|      0|		}
   76|    334|		os_memcpy(ctx->u.aes.cbc, iv, AES_BLOCK_SIZE);
  ------------------
  |  |  523|    334|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   77|    334|		break;
   78|    258|	case CRYPTO_CIPHER_ALG_3DES:
  ------------------
  |  Branch (78:2): [True: 258, False: 602]
  ------------------
   79|    258|		if (key_len != 24) {
  ------------------
  |  Branch (79:7): [True: 0, False: 258]
  ------------------
   80|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   81|      0|			return NULL;
   82|      0|		}
   83|    258|		des3_key_setup(key, &ctx->u.des3.key);
   84|    258|		os_memcpy(ctx->u.des3.cbc, iv, 8);
  ------------------
  |  |  523|    258|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   85|    258|		break;
   86|      0|	case CRYPTO_CIPHER_ALG_DES:
  ------------------
  |  Branch (86:2): [True: 0, False: 860]
  ------------------
   87|      0|		if (key_len != 8) {
  ------------------
  |  Branch (87:7): [True: 0, False: 0]
  ------------------
   88|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   89|      0|			return NULL;
   90|      0|		}
   91|      0|		des_key_setup(key, ctx->u.des.ek, ctx->u.des.dk);
   92|      0|		os_memcpy(ctx->u.des.cbc, iv, 8);
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   93|      0|		break;
   94|      0|	default:
  ------------------
  |  Branch (94:2): [True: 0, False: 860]
  ------------------
   95|      0|		os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   96|      0|		return NULL;
   97|    860|	}
   98|       |
   99|    860|	return ctx;
  100|    860|}
crypto_cipher_encrypt:
  105|    486|{
  106|    486|	size_t i, j, blocks;
  107|       |
  108|    486|	switch (ctx->alg) {
  109|    150|	case CRYPTO_CIPHER_ALG_RC4:
  ------------------
  |  Branch (109:2): [True: 150, False: 336]
  ------------------
  110|    150|		if (plain != crypt)
  ------------------
  |  Branch (110:7): [True: 0, False: 150]
  ------------------
  111|      0|			os_memcpy(crypt, plain, len);
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  112|    150|		rc4_skip(ctx->u.rc4.key, ctx->u.rc4.keylen,
  113|    150|			 ctx->u.rc4.used_bytes, crypt, len);
  114|    150|		ctx->u.rc4.used_bytes += len;
  115|    150|		break;
  116|    199|	case CRYPTO_CIPHER_ALG_AES:
  ------------------
  |  Branch (116:2): [True: 199, False: 287]
  ------------------
  117|    199|		if (len % AES_BLOCK_SIZE)
  ------------------
  |  |   12|    199|#define AES_BLOCK_SIZE 16
  ------------------
  |  Branch (117:7): [True: 0, False: 199]
  ------------------
  118|      0|			return -1;
  119|    199|		blocks = len / AES_BLOCK_SIZE;
  ------------------
  |  |   12|    199|#define AES_BLOCK_SIZE 16
  ------------------
  120|  1.04k|		for (i = 0; i < blocks; i++) {
  ------------------
  |  Branch (120:15): [True: 849, False: 199]
  ------------------
  121|  14.4k|			for (j = 0; j < AES_BLOCK_SIZE; j++)
  ------------------
  |  |   12|  14.4k|#define AES_BLOCK_SIZE 16
  ------------------
  |  Branch (121:16): [True: 13.5k, False: 849]
  ------------------
  122|  13.5k|				ctx->u.aes.cbc[j] ^= plain[j];
  123|    849|			aes_encrypt(ctx->u.aes.ctx_enc, ctx->u.aes.cbc,
  124|    849|				    ctx->u.aes.cbc);
  125|    849|			os_memcpy(crypt, ctx->u.aes.cbc, AES_BLOCK_SIZE);
  ------------------
  |  |  523|    849|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  126|    849|			plain += AES_BLOCK_SIZE;
  ------------------
  |  |   12|    849|#define AES_BLOCK_SIZE 16
  ------------------
  127|    849|			crypt += AES_BLOCK_SIZE;
  ------------------
  |  |   12|    849|#define AES_BLOCK_SIZE 16
  ------------------
  128|    849|		}
  129|    199|		break;
  130|    137|	case CRYPTO_CIPHER_ALG_3DES:
  ------------------
  |  Branch (130:2): [True: 137, False: 349]
  ------------------
  131|    137|		if (len % 8)
  ------------------
  |  Branch (131:7): [True: 0, False: 137]
  ------------------
  132|      0|			return -1;
  133|    137|		blocks = len / 8;
  134|    875|		for (i = 0; i < blocks; i++) {
  ------------------
  |  Branch (134:15): [True: 738, False: 137]
  ------------------
  135|  6.64k|			for (j = 0; j < 8; j++)
  ------------------
  |  Branch (135:16): [True: 5.90k, False: 738]
  ------------------
  136|  5.90k|				ctx->u.des3.cbc[j] ^= plain[j];
  137|    738|			des3_encrypt(ctx->u.des3.cbc, &ctx->u.des3.key,
  138|    738|				     ctx->u.des3.cbc);
  139|    738|			os_memcpy(crypt, ctx->u.des3.cbc, 8);
  ------------------
  |  |  523|    738|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  140|    738|			plain += 8;
  141|    738|			crypt += 8;
  142|    738|		}
  143|    137|		break;
  144|      0|	case CRYPTO_CIPHER_ALG_DES:
  ------------------
  |  Branch (144:2): [True: 0, False: 486]
  ------------------
  145|      0|		if (len % 8)
  ------------------
  |  Branch (145:7): [True: 0, False: 0]
  ------------------
  146|      0|			return -1;
  147|      0|		blocks = len / 8;
  148|      0|		for (i = 0; i < blocks; i++) {
  ------------------
  |  Branch (148:15): [True: 0, False: 0]
  ------------------
  149|      0|			for (j = 0; j < 8; j++)
  ------------------
  |  Branch (149:16): [True: 0, False: 0]
  ------------------
  150|      0|				ctx->u.des3.cbc[j] ^= plain[j];
  151|      0|			des_block_encrypt(ctx->u.des.cbc, ctx->u.des.ek,
  152|      0|					  ctx->u.des.cbc);
  153|      0|			os_memcpy(crypt, ctx->u.des.cbc, 8);
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  154|      0|			plain += 8;
  155|      0|			crypt += 8;
  156|      0|		}
  157|      0|		break;
  158|      0|	default:
  ------------------
  |  Branch (158:2): [True: 0, False: 486]
  ------------------
  159|      0|		return -1;
  160|    486|	}
  161|       |
  162|    486|	return 0;
  163|    486|}
crypto_cipher_decrypt:
  168|  38.6k|{
  169|  38.6k|	size_t i, j, blocks;
  170|  38.6k|	u8 tmp[32];
  171|       |
  172|  38.6k|	switch (ctx->alg) {
  173|  28.7k|	case CRYPTO_CIPHER_ALG_RC4:
  ------------------
  |  Branch (173:2): [True: 28.7k, False: 9.90k]
  ------------------
  174|  28.7k|		if (plain != crypt)
  ------------------
  |  Branch (174:7): [True: 28.7k, False: 0]
  ------------------
  175|  28.7k|			os_memcpy(plain, crypt, len);
  ------------------
  |  |  523|  28.7k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  176|  28.7k|		rc4_skip(ctx->u.rc4.key, ctx->u.rc4.keylen,
  177|  28.7k|			 ctx->u.rc4.used_bytes, plain, len);
  178|  28.7k|		ctx->u.rc4.used_bytes += len;
  179|  28.7k|		break;
  180|  5.65k|	case CRYPTO_CIPHER_ALG_AES:
  ------------------
  |  Branch (180:2): [True: 5.65k, False: 32.9k]
  ------------------
  181|  5.65k|		if (len % AES_BLOCK_SIZE)
  ------------------
  |  |   12|  5.65k|#define AES_BLOCK_SIZE 16
  ------------------
  |  Branch (181:7): [True: 287, False: 5.37k]
  ------------------
  182|    287|			return -1;
  183|  5.37k|		blocks = len / AES_BLOCK_SIZE;
  ------------------
  |  |   12|  5.37k|#define AES_BLOCK_SIZE 16
  ------------------
  184|  25.8k|		for (i = 0; i < blocks; i++) {
  ------------------
  |  Branch (184:15): [True: 20.5k, False: 5.37k]
  ------------------
  185|  20.5k|			os_memcpy(tmp, crypt, AES_BLOCK_SIZE);
  ------------------
  |  |  523|  20.5k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  186|  20.5k|			aes_decrypt(ctx->u.aes.ctx_dec, crypt, plain);
  187|   348k|			for (j = 0; j < AES_BLOCK_SIZE; j++)
  ------------------
  |  |   12|   348k|#define AES_BLOCK_SIZE 16
  ------------------
  |  Branch (187:16): [True: 328k, False: 20.5k]
  ------------------
  188|   328k|				plain[j] ^= ctx->u.aes.cbc[j];
  189|  20.5k|			os_memcpy(ctx->u.aes.cbc, tmp, AES_BLOCK_SIZE);
  ------------------
  |  |  523|  20.5k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  190|  20.5k|			plain += AES_BLOCK_SIZE;
  ------------------
  |  |   12|  20.5k|#define AES_BLOCK_SIZE 16
  ------------------
  191|  20.5k|			crypt += AES_BLOCK_SIZE;
  ------------------
  |  |   12|  20.5k|#define AES_BLOCK_SIZE 16
  ------------------
  192|  20.5k|		}
  193|  5.37k|		break;
  194|  4.24k|	case CRYPTO_CIPHER_ALG_3DES:
  ------------------
  |  Branch (194:2): [True: 4.24k, False: 34.3k]
  ------------------
  195|  4.24k|		if (len % 8)
  ------------------
  |  Branch (195:7): [True: 454, False: 3.79k]
  ------------------
  196|    454|			return -1;
  197|  3.79k|		blocks = len / 8;
  198|  21.1k|		for (i = 0; i < blocks; i++) {
  ------------------
  |  Branch (198:15): [True: 17.3k, False: 3.79k]
  ------------------
  199|  17.3k|			os_memcpy(tmp, crypt, 8);
  ------------------
  |  |  523|  17.3k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  200|  17.3k|			des3_decrypt(crypt, &ctx->u.des3.key, plain);
  201|   156k|			for (j = 0; j < 8; j++)
  ------------------
  |  Branch (201:16): [True: 138k, False: 17.3k]
  ------------------
  202|   138k|				plain[j] ^= ctx->u.des3.cbc[j];
  203|  17.3k|			os_memcpy(ctx->u.des3.cbc, tmp, 8);
  ------------------
  |  |  523|  17.3k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  204|  17.3k|			plain += 8;
  205|  17.3k|			crypt += 8;
  206|  17.3k|		}
  207|  3.79k|		break;
  208|      0|	case CRYPTO_CIPHER_ALG_DES:
  ------------------
  |  Branch (208:2): [True: 0, False: 38.6k]
  ------------------
  209|      0|		if (len % 8)
  ------------------
  |  Branch (209:7): [True: 0, False: 0]
  ------------------
  210|      0|			return -1;
  211|      0|		blocks = len / 8;
  212|      0|		for (i = 0; i < blocks; i++) {
  ------------------
  |  Branch (212:15): [True: 0, False: 0]
  ------------------
  213|      0|			os_memcpy(tmp, crypt, 8);
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  214|      0|			des_block_decrypt(crypt, ctx->u.des.dk, plain);
  215|      0|			for (j = 0; j < 8; j++)
  ------------------
  |  Branch (215:16): [True: 0, False: 0]
  ------------------
  216|      0|				plain[j] ^= ctx->u.des.cbc[j];
  217|      0|			os_memcpy(ctx->u.des.cbc, tmp, 8);
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  218|      0|			plain += 8;
  219|      0|			crypt += 8;
  220|      0|		}
  221|      0|		break;
  222|      0|	default:
  ------------------
  |  Branch (222:2): [True: 0, False: 38.6k]
  ------------------
  223|      0|		return -1;
  224|  38.6k|	}
  225|       |
  226|  37.8k|	return 0;
  227|  38.6k|}
crypto_cipher_deinit:
  231|    860|{
  232|    860|	switch (ctx->alg) {
  233|    334|	case CRYPTO_CIPHER_ALG_AES:
  ------------------
  |  Branch (233:2): [True: 334, False: 526]
  ------------------
  234|    334|		aes_encrypt_deinit(ctx->u.aes.ctx_enc);
  235|    334|		aes_decrypt_deinit(ctx->u.aes.ctx_dec);
  236|    334|		break;
  237|    258|	case CRYPTO_CIPHER_ALG_3DES:
  ------------------
  |  Branch (237:2): [True: 258, False: 602]
  ------------------
  238|    258|		break;
  239|    268|	default:
  ------------------
  |  Branch (239:2): [True: 268, False: 592]
  ------------------
  240|    268|		break;
  241|    860|	}
  242|    860|	os_free(ctx);
  ------------------
  |  |  511|    860|#define os_free(p) free((p))
  ------------------
  243|    860|}

crypto_mod_exp:
   93|    105|{
   94|    105|	struct bignum *bn_base, *bn_exp, *bn_modulus, *bn_result;
   95|    105|	int ret = -1;
   96|       |
   97|    105|	bn_base = bignum_init();
   98|    105|	bn_exp = bignum_init();
   99|    105|	bn_modulus = bignum_init();
  100|    105|	bn_result = bignum_init();
  101|       |
  102|    105|	if (bn_base == NULL || bn_exp == NULL || bn_modulus == NULL ||
  ------------------
  |  Branch (102:6): [True: 0, False: 105]
  |  Branch (102:25): [True: 0, False: 105]
  |  Branch (102:43): [True: 0, False: 105]
  ------------------
  103|    105|	    bn_result == NULL)
  ------------------
  |  Branch (103:6): [True: 0, False: 105]
  ------------------
  104|      0|		goto error;
  105|       |
  106|    105|	if (bignum_set_unsigned_bin(bn_base, base, base_len) < 0 ||
  ------------------
  |  Branch (106:6): [True: 0, False: 105]
  ------------------
  107|    105|	    bignum_set_unsigned_bin(bn_exp, power, power_len) < 0 ||
  ------------------
  |  Branch (107:6): [True: 0, False: 105]
  ------------------
  108|    105|	    bignum_set_unsigned_bin(bn_modulus, modulus, modulus_len) < 0)
  ------------------
  |  Branch (108:6): [True: 0, False: 105]
  ------------------
  109|      0|		goto error;
  110|       |
  111|    105|	if (bignum_exptmod(bn_base, bn_exp, bn_modulus, bn_result) < 0)
  ------------------
  |  Branch (111:6): [True: 3, False: 102]
  ------------------
  112|      3|		goto error;
  113|       |
  114|    102|	ret = bignum_get_unsigned_bin(bn_result, result, result_len);
  115|       |
  116|    105|error:
  117|    105|	bignum_deinit(bn_base);
  118|    105|	bignum_deinit(bn_exp);
  119|    105|	bignum_deinit(bn_modulus);
  120|    105|	bignum_deinit(bn_result);
  121|    105|	return ret;
  122|    102|}

crypto_public_key_import:
   23|    931|{
   24|    931|	return (struct crypto_public_key *)
   25|    931|		crypto_rsa_import_public_key(key, len);
   26|    931|}
crypto_public_key_from_cert:
   66|  2.21k|{
   67|       |	/* No X.509 support in crypto_internal.c */
   68|       |	return NULL;
   69|  2.21k|}
crypto_public_key_encrypt_pkcs1_v15:
   75|    419|{
   76|    419|	return pkcs1_encrypt(2, (struct crypto_rsa_key *) key,
   77|    419|			     0, in, inlen, out, outlen);
   78|    419|}
crypto_public_key_free:
  100|  5.31k|{
  101|  5.31k|	crypto_rsa_free((struct crypto_rsa_key *) key);
  102|  5.31k|}
crypto_public_key_decrypt_pkcs1:
  114|    356|{
  115|    356|	return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key,
  116|    356|					crypt, crypt_len, plain, plain_len);
  117|    356|}

crypto_hash_init:
   41|  62.7k|{
   42|  62.7k|	struct crypto_hash *ctx;
   43|  62.7k|	u8 k_pad[64];
   44|  62.7k|	u8 tk[32];
   45|  62.7k|	size_t i;
   46|       |
   47|  62.7k|	ctx = os_zalloc(sizeof(*ctx));
   48|  62.7k|	if (ctx == NULL)
  ------------------
  |  Branch (48:6): [True: 0, False: 62.7k]
  ------------------
   49|      0|		return NULL;
   50|       |
   51|  62.7k|	ctx->alg = alg;
   52|       |
   53|  62.7k|	switch (alg) {
   54|  9.44k|	case CRYPTO_HASH_ALG_MD5:
  ------------------
  |  Branch (54:2): [True: 9.44k, False: 53.3k]
  ------------------
   55|  9.44k|		MD5Init(&ctx->u.md5);
   56|  9.44k|		break;
   57|  9.44k|	case CRYPTO_HASH_ALG_SHA1:
  ------------------
  |  Branch (57:2): [True: 9.44k, False: 53.3k]
  ------------------
   58|  9.44k|		SHA1Init(&ctx->u.sha1);
   59|  9.44k|		break;
   60|      0|#ifdef CONFIG_SHA256
   61|  9.45k|	case CRYPTO_HASH_ALG_SHA256:
  ------------------
  |  Branch (61:2): [True: 9.45k, False: 53.3k]
  ------------------
   62|  9.45k|		sha256_init(&ctx->u.sha256);
   63|  9.45k|		break;
   64|      0|#endif /* CONFIG_SHA256 */
   65|      0|#ifdef CONFIG_INTERNAL_SHA384
   66|    144|	case CRYPTO_HASH_ALG_SHA384:
  ------------------
  |  Branch (66:2): [True: 144, False: 62.6k]
  ------------------
   67|    144|		sha384_init(&ctx->u.sha384);
   68|    144|		break;
   69|      0|#endif /* CONFIG_INTERNAL_SHA384 */
   70|       |#ifdef CONFIG_INTERNAL_SHA512
   71|       |	case CRYPTO_HASH_ALG_SHA512:
   72|       |		sha512_init(&ctx->u.sha512);
   73|       |		break;
   74|       |#endif /* CONFIG_INTERNAL_SHA512 */
   75|  26.6k|	case CRYPTO_HASH_ALG_HMAC_MD5:
  ------------------
  |  Branch (75:2): [True: 26.6k, False: 36.1k]
  ------------------
   76|  26.6k|		if (key_len > sizeof(k_pad)) {
  ------------------
  |  Branch (76:7): [True: 0, False: 26.6k]
  ------------------
   77|      0|			MD5Init(&ctx->u.md5);
   78|      0|			MD5Update(&ctx->u.md5, key, key_len);
   79|      0|			MD5Final(tk, &ctx->u.md5);
   80|      0|			key = tk;
   81|      0|			key_len = 16;
   82|      0|		}
   83|  26.6k|		os_memcpy(ctx->key, key, key_len);
  ------------------
  |  |  523|  26.6k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   84|  26.6k|		ctx->key_len = key_len;
   85|       |
   86|  26.6k|		os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  26.6k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   87|  26.6k|		if (key_len < sizeof(k_pad))
  ------------------
  |  Branch (87:7): [True: 26.6k, False: 0]
  ------------------
   88|  26.6k|			os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len);
  ------------------
  |  |  529|  26.6k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   89|  1.73M|		for (i = 0; i < sizeof(k_pad); i++)
  ------------------
  |  Branch (89:15): [True: 1.70M, False: 26.6k]
  ------------------
   90|  1.70M|			k_pad[i] ^= 0x36;
   91|  26.6k|		MD5Init(&ctx->u.md5);
   92|  26.6k|		MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad));
   93|  26.6k|		break;
   94|  3.80k|	case CRYPTO_HASH_ALG_HMAC_SHA1:
  ------------------
  |  Branch (94:2): [True: 3.80k, False: 58.9k]
  ------------------
   95|  3.80k|		if (key_len > sizeof(k_pad)) {
  ------------------
  |  Branch (95:7): [True: 0, False: 3.80k]
  ------------------
   96|      0|			SHA1Init(&ctx->u.sha1);
   97|      0|			SHA1Update(&ctx->u.sha1, key, key_len);
   98|      0|			SHA1Final(tk, &ctx->u.sha1);
   99|      0|			key = tk;
  100|      0|			key_len = 20;
  101|      0|		}
  102|  3.80k|		os_memcpy(ctx->key, key, key_len);
  ------------------
  |  |  523|  3.80k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  103|  3.80k|		ctx->key_len = key_len;
  104|       |
  105|  3.80k|		os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  3.80k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  106|  3.80k|		if (key_len < sizeof(k_pad))
  ------------------
  |  Branch (106:7): [True: 3.80k, False: 0]
  ------------------
  107|  3.80k|			os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len);
  ------------------
  |  |  529|  3.80k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  108|   247k|		for (i = 0; i < sizeof(k_pad); i++)
  ------------------
  |  Branch (108:15): [True: 243k, False: 3.80k]
  ------------------
  109|   243k|			k_pad[i] ^= 0x36;
  110|  3.80k|		SHA1Init(&ctx->u.sha1);
  111|  3.80k|		SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad));
  112|  3.80k|		break;
  113|      0|#ifdef CONFIG_SHA256
  114|  3.81k|	case CRYPTO_HASH_ALG_HMAC_SHA256:
  ------------------
  |  Branch (114:2): [True: 3.81k, False: 58.9k]
  ------------------
  115|  3.81k|		if (key_len > sizeof(k_pad)) {
  ------------------
  |  Branch (115:7): [True: 0, False: 3.81k]
  ------------------
  116|      0|			sha256_init(&ctx->u.sha256);
  117|      0|			sha256_process(&ctx->u.sha256, key, key_len);
  118|      0|			sha256_done(&ctx->u.sha256, tk);
  119|      0|			key = tk;
  120|      0|			key_len = 32;
  121|      0|		}
  122|  3.81k|		os_memcpy(ctx->key, key, key_len);
  ------------------
  |  |  523|  3.81k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  123|  3.81k|		ctx->key_len = key_len;
  124|       |
  125|  3.81k|		os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  3.81k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  126|  3.81k|		if (key_len < sizeof(k_pad))
  ------------------
  |  Branch (126:7): [True: 3.81k, False: 0]
  ------------------
  127|  3.81k|			os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len);
  ------------------
  |  |  529|  3.81k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  128|   247k|		for (i = 0; i < sizeof(k_pad); i++)
  ------------------
  |  Branch (128:15): [True: 244k, False: 3.81k]
  ------------------
  129|   244k|			k_pad[i] ^= 0x36;
  130|  3.81k|		sha256_init(&ctx->u.sha256);
  131|  3.81k|		sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad));
  132|  3.81k|		break;
  133|      0|#endif /* CONFIG_SHA256 */
  134|      1|	default:
  ------------------
  |  Branch (134:2): [True: 1, False: 62.7k]
  ------------------
  135|      1|		os_free(ctx);
  ------------------
  |  |  511|      1|#define os_free(p) free((p))
  ------------------
  136|      1|		return NULL;
  137|  62.7k|	}
  138|       |
  139|  62.7k|	return ctx;
  140|  62.7k|}
crypto_hash_update:
  144|   211k|{
  145|   211k|	if (ctx == NULL)
  ------------------
  |  Branch (145:6): [True: 0, False: 211k]
  ------------------
  146|      0|		return;
  147|       |
  148|   211k|	switch (ctx->alg) {
  149|  24.7k|	case CRYPTO_HASH_ALG_MD5:
  ------------------
  |  Branch (149:2): [True: 24.7k, False: 186k]
  ------------------
  150|   131k|	case CRYPTO_HASH_ALG_HMAC_MD5:
  ------------------
  |  Branch (150:2): [True: 106k, False: 105k]
  ------------------
  151|   131k|		MD5Update(&ctx->u.md5, data, len);
  152|   131k|		break;
  153|  24.7k|	case CRYPTO_HASH_ALG_SHA1:
  ------------------
  |  Branch (153:2): [True: 24.7k, False: 186k]
  ------------------
  154|  39.8k|	case CRYPTO_HASH_ALG_HMAC_SHA1:
  ------------------
  |  Branch (154:2): [True: 15.0k, False: 196k]
  ------------------
  155|  39.8k|		SHA1Update(&ctx->u.sha1, data, len);
  156|  39.8k|		break;
  157|      0|#ifdef CONFIG_SHA256
  158|  24.9k|	case CRYPTO_HASH_ALG_SHA256:
  ------------------
  |  Branch (158:2): [True: 24.9k, False: 186k]
  ------------------
  159|  39.9k|	case CRYPTO_HASH_ALG_HMAC_SHA256:
  ------------------
  |  Branch (159:2): [True: 15.0k, False: 196k]
  ------------------
  160|  39.9k|		sha256_process(&ctx->u.sha256, data, len);
  161|  39.9k|		break;
  162|      0|#endif /* CONFIG_SHA256 */
  163|      0|#ifdef CONFIG_INTERNAL_SHA384
  164|    432|	case CRYPTO_HASH_ALG_SHA384:
  ------------------
  |  Branch (164:2): [True: 432, False: 211k]
  ------------------
  165|    432|		sha384_process(&ctx->u.sha384, data, len);
  166|    432|		break;
  167|      0|#endif /* CONFIG_INTERNAL_SHA384 */
  168|       |#ifdef CONFIG_INTERNAL_SHA512
  169|       |	case CRYPTO_HASH_ALG_SHA512:
  170|       |		sha512_process(&ctx->u.sha512, data, len);
  171|       |		break;
  172|       |#endif /* CONFIG_INTERNAL_SHA512 */
  173|      0|	default:
  ------------------
  |  Branch (173:2): [True: 0, False: 211k]
  ------------------
  174|      0|		break;
  175|   211k|	}
  176|   211k|}
crypto_hash_finish:
  180|  91.4k|{
  181|  91.4k|	u8 k_pad[64];
  182|  91.4k|	size_t i;
  183|       |
  184|  91.4k|	if (ctx == NULL)
  ------------------
  |  Branch (184:6): [True: 28.7k, False: 62.7k]
  ------------------
  185|  28.7k|		return -2;
  186|       |
  187|  62.7k|	if (mac == NULL || len == NULL) {
  ------------------
  |  Branch (187:6): [True: 27.1k, False: 35.6k]
  |  Branch (187:21): [True: 0, False: 35.6k]
  ------------------
  188|  27.1k|		os_free(ctx);
  ------------------
  |  |  511|  27.1k|#define os_free(p) free((p))
  ------------------
  189|  27.1k|		return 0;
  190|  27.1k|	}
  191|       |
  192|  35.6k|	switch (ctx->alg) {
  193|    420|	case CRYPTO_HASH_ALG_MD5:
  ------------------
  |  Branch (193:2): [True: 420, False: 35.1k]
  ------------------
  194|    420|		if (*len < 16) {
  ------------------
  |  Branch (194:7): [True: 0, False: 420]
  ------------------
  195|      0|			*len = 16;
  196|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  197|      0|			return -1;
  198|      0|		}
  199|    420|		*len = 16;
  200|    420|		MD5Final(mac, &ctx->u.md5);
  201|    420|		break;
  202|    420|	case CRYPTO_HASH_ALG_SHA1:
  ------------------
  |  Branch (202:2): [True: 420, False: 35.1k]
  ------------------
  203|    420|		if (*len < 20) {
  ------------------
  |  Branch (203:7): [True: 0, False: 420]
  ------------------
  204|      0|			*len = 20;
  205|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  206|      0|			return -1;
  207|      0|		}
  208|    420|		*len = 20;
  209|    420|		SHA1Final(mac, &ctx->u.sha1);
  210|    420|		break;
  211|      0|#ifdef CONFIG_SHA256
  212|    347|	case CRYPTO_HASH_ALG_SHA256:
  ------------------
  |  Branch (212:2): [True: 347, False: 35.2k]
  ------------------
  213|    347|		if (*len < 32) {
  ------------------
  |  Branch (213:7): [True: 0, False: 347]
  ------------------
  214|      0|			*len = 32;
  215|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  216|      0|			return -1;
  217|      0|		}
  218|    347|		*len = 32;
  219|    347|		sha256_done(&ctx->u.sha256, mac);
  220|    347|		break;
  221|      0|#endif /* CONFIG_SHA256 */
  222|      0|#ifdef CONFIG_INTERNAL_SHA384
  223|    144|	case CRYPTO_HASH_ALG_SHA384:
  ------------------
  |  Branch (223:2): [True: 144, False: 35.4k]
  ------------------
  224|    144|		if (*len < 48) {
  ------------------
  |  Branch (224:7): [True: 0, False: 144]
  ------------------
  225|      0|			*len = 48;
  226|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  227|      0|			return -1;
  228|      0|		}
  229|    144|		*len = 48;
  230|    144|		sha384_done(&ctx->u.sha384, mac);
  231|    144|		break;
  232|      0|#endif /* CONFIG_INTERNAL_SHA384 */
  233|       |#ifdef CONFIG_INTERNAL_SHA512
  234|       |	case CRYPTO_HASH_ALG_SHA512:
  235|       |		if (*len < 64) {
  236|       |			*len = 64;
  237|       |			os_free(ctx);
  238|       |			return -1;
  239|       |		}
  240|       |		*len = 64;
  241|       |		sha512_done(&ctx->u.sha512, mac);
  242|       |		break;
  243|       |#endif /* CONFIG_INTERNAL_SHA512 */
  244|  26.6k|	case CRYPTO_HASH_ALG_HMAC_MD5:
  ------------------
  |  Branch (244:2): [True: 26.6k, False: 8.94k]
  ------------------
  245|  26.6k|		if (*len < 16) {
  ------------------
  |  Branch (245:7): [True: 0, False: 26.6k]
  ------------------
  246|      0|			*len = 16;
  247|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  248|      0|			return -1;
  249|      0|		}
  250|  26.6k|		*len = 16;
  251|       |
  252|  26.6k|		MD5Final(mac, &ctx->u.md5);
  253|       |
  254|  26.6k|		os_memcpy(k_pad, ctx->key, ctx->key_len);
  ------------------
  |  |  523|  26.6k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  255|  26.6k|		os_memset(k_pad + ctx->key_len, 0,
  ------------------
  |  |  529|  26.6k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  256|  26.6k|			  sizeof(k_pad) - ctx->key_len);
  257|  1.73M|		for (i = 0; i < sizeof(k_pad); i++)
  ------------------
  |  Branch (257:15): [True: 1.70M, False: 26.6k]
  ------------------
  258|  1.70M|			k_pad[i] ^= 0x5c;
  259|  26.6k|		MD5Init(&ctx->u.md5);
  260|  26.6k|		MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad));
  261|  26.6k|		MD5Update(&ctx->u.md5, mac, 16);
  262|  26.6k|		MD5Final(mac, &ctx->u.md5);
  263|  26.6k|		break;
  264|  3.80k|	case CRYPTO_HASH_ALG_HMAC_SHA1:
  ------------------
  |  Branch (264:2): [True: 3.80k, False: 31.8k]
  ------------------
  265|  3.80k|		if (*len < 20) {
  ------------------
  |  Branch (265:7): [True: 0, False: 3.80k]
  ------------------
  266|      0|			*len = 20;
  267|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  268|      0|			return -1;
  269|      0|		}
  270|  3.80k|		*len = 20;
  271|       |
  272|  3.80k|		SHA1Final(mac, &ctx->u.sha1);
  273|       |
  274|  3.80k|		os_memcpy(k_pad, ctx->key, ctx->key_len);
  ------------------
  |  |  523|  3.80k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  275|  3.80k|		os_memset(k_pad + ctx->key_len, 0,
  ------------------
  |  |  529|  3.80k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  276|  3.80k|			  sizeof(k_pad) - ctx->key_len);
  277|   247k|		for (i = 0; i < sizeof(k_pad); i++)
  ------------------
  |  Branch (277:15): [True: 243k, False: 3.80k]
  ------------------
  278|   243k|			k_pad[i] ^= 0x5c;
  279|  3.80k|		SHA1Init(&ctx->u.sha1);
  280|  3.80k|		SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad));
  281|  3.80k|		SHA1Update(&ctx->u.sha1, mac, 20);
  282|  3.80k|		SHA1Final(mac, &ctx->u.sha1);
  283|  3.80k|		break;
  284|      0|#ifdef CONFIG_SHA256
  285|  3.81k|	case CRYPTO_HASH_ALG_HMAC_SHA256:
  ------------------
  |  Branch (285:2): [True: 3.81k, False: 31.7k]
  ------------------
  286|  3.81k|		if (*len < 32) {
  ------------------
  |  Branch (286:7): [True: 0, False: 3.81k]
  ------------------
  287|      0|			*len = 32;
  288|      0|			os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  289|      0|			return -1;
  290|      0|		}
  291|  3.81k|		*len = 32;
  292|       |
  293|  3.81k|		sha256_done(&ctx->u.sha256, mac);
  294|       |
  295|  3.81k|		os_memcpy(k_pad, ctx->key, ctx->key_len);
  ------------------
  |  |  523|  3.81k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  296|  3.81k|		os_memset(k_pad + ctx->key_len, 0,
  ------------------
  |  |  529|  3.81k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  297|  3.81k|			  sizeof(k_pad) - ctx->key_len);
  298|   247k|		for (i = 0; i < sizeof(k_pad); i++)
  ------------------
  |  Branch (298:15): [True: 244k, False: 3.81k]
  ------------------
  299|   244k|			k_pad[i] ^= 0x5c;
  300|  3.81k|		sha256_init(&ctx->u.sha256);
  301|  3.81k|		sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad));
  302|  3.81k|		sha256_process(&ctx->u.sha256, mac, 32);
  303|  3.81k|		sha256_done(&ctx->u.sha256, mac);
  304|  3.81k|		break;
  305|      0|#endif /* CONFIG_SHA256 */
  306|      0|	default:
  ------------------
  |  Branch (306:2): [True: 0, False: 35.6k]
  ------------------
  307|      0|		os_free(ctx);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  308|      0|		return -1;
  309|  35.6k|	}
  310|       |
  311|  35.6k|	os_free(ctx);
  ------------------
  |  |  511|  35.6k|#define os_free(p) free((p))
  ------------------
  312|       |
  313|  35.6k|	if (TEST_FAIL())
  ------------------
  |  |  688|  35.6k|#define TEST_FAIL() testing_test_fail(NULL, false)
  |  |  ------------------
  |  |  |  Branch (688:21): [True: 0, False: 35.6k]
  |  |  ------------------
  ------------------
  314|      0|		return -1;
  315|       |
  316|  35.6k|	return 0;
  317|  35.6k|}
crypto_global_init:
  321|  6.20k|{
  322|  6.20k|	return 0;
  323|  6.20k|}
crypto_global_deinit:
  327|  6.20k|{
  328|  6.20k|}

des3_key_setup:
  458|    258|{
  459|    258|	deskey(key, 0, dkey->ek[0]);
  460|    258|	deskey(key + 8, 1, dkey->ek[1]);
  461|    258|	deskey(key + 16, 0, dkey->ek[2]);
  462|       |
  463|    258|	deskey(key, 1, dkey->dk[2]);
  464|    258|	deskey(key + 8, 0, dkey->dk[1]);
  465|    258|	deskey(key + 16, 1, dkey->dk[0]);
  466|    258|}
des3_encrypt:
  470|    738|{
  471|    738|	u32 work[2];
  472|       |
  473|    738|	work[0] = WPA_GET_BE32(plain);
  474|    738|	work[1] = WPA_GET_BE32(plain + 4);
  475|    738|	desfunc(work, key->ek[0]);
  476|    738|	desfunc(work, key->ek[1]);
  477|    738|	desfunc(work, key->ek[2]);
  478|    738|	WPA_PUT_BE32(crypt, work[0]);
  479|    738|	WPA_PUT_BE32(crypt + 4, work[1]);
  480|    738|}
des3_decrypt:
  484|  17.3k|{
  485|  17.3k|	u32 work[2];
  486|       |
  487|  17.3k|	work[0] = WPA_GET_BE32(crypt);
  488|  17.3k|	work[1] = WPA_GET_BE32(crypt + 4);
  489|  17.3k|	desfunc(work, key->dk[0]);
  490|  17.3k|	desfunc(work, key->dk[1]);
  491|  17.3k|	desfunc(work, key->dk[2]);
  492|  17.3k|	WPA_PUT_BE32(plain, work[0]);
  493|  17.3k|	WPA_PUT_BE32(plain + 4, work[1]);
  494|  17.3k|}
des-internal.c:deskey:
  274|  1.54k|{
  275|  1.54k|	u32 i, j, l, m, n, kn[32];
  276|  1.54k|	u8 pc1m[56], pcr[56];
  277|       |
  278|  88.2k|	for (j = 0; j < 56; j++) {
  ------------------
  |  Branch (278:14): [True: 86.6k, False: 1.54k]
  ------------------
  279|  86.6k|		l = (u32) pc1[j];
  280|  86.6k|		m = l & 7;
  281|  86.6k|		pc1m[j] = (u8)
  282|  86.6k|			((key[l >> 3U] & bytebit[m]) == bytebit[m] ? 1 : 0);
  ------------------
  |  Branch (282:5): [True: 43.1k, False: 43.4k]
  ------------------
  283|  86.6k|	}
  284|       |
  285|  26.3k|	for (i = 0; i < 16; i++) {
  ------------------
  |  Branch (285:14): [True: 24.7k, False: 1.54k]
  ------------------
  286|  24.7k|		if (decrypt)
  ------------------
  |  Branch (286:7): [True: 12.3k, False: 12.3k]
  ------------------
  287|  12.3k|			m = (15 - i) << 1;
  288|  12.3k|		else
  289|  12.3k|			m = i << 1;
  290|  24.7k|		n = m + 1;
  291|  24.7k|		kn[m] = kn[n] = 0L;
  292|   718k|		for (j = 0; j < 28; j++) {
  ------------------
  |  Branch (292:15): [True: 693k, False: 24.7k]
  ------------------
  293|   693k|			l = j + (u32) totrot[i];
  294|   693k|			if (l < 28)
  ------------------
  |  Branch (294:8): [True: 334k, False: 359k]
  ------------------
  295|   334k|				pcr[j] = pc1m[l];
  296|   359k|			else
  297|   359k|				pcr[j] = pc1m[l - 28];
  298|   693k|		}
  299|   718k|		for (/* j = 28 */; j < 56; j++) {
  ------------------
  |  Branch (299:22): [True: 693k, False: 24.7k]
  ------------------
  300|   693k|			l = j + (u32) totrot[i];
  301|   693k|			if (l < 56)
  ------------------
  |  Branch (301:8): [True: 334k, False: 359k]
  ------------------
  302|   334k|				pcr[j] = pc1m[l];
  303|   359k|			else
  304|   359k|				pcr[j] = pc1m[l - 28];
  305|   693k|		}
  306|   619k|		for (j = 0; j < 24; j++) {
  ------------------
  |  Branch (306:15): [True: 594k, False: 24.7k]
  ------------------
  307|   594k|			if ((int) pcr[(int) pc2[j]] != 0)
  ------------------
  |  Branch (307:8): [True: 298k, False: 295k]
  ------------------
  308|   298k|				kn[m] |= bigbyte[j];
  309|   594k|			if ((int) pcr[(int) pc2[j + 24]] != 0)
  ------------------
  |  Branch (309:8): [True: 293k, False: 300k]
  ------------------
  310|   293k|				kn[n] |= bigbyte[j];
  311|   594k|		}
  312|  24.7k|	}
  313|       |
  314|  1.54k|	cookey(kn, keyout);
  315|  1.54k|}
des-internal.c:cookey:
  250|  1.54k|{
  251|  1.54k|	u32 *cook;
  252|  1.54k|	const u32 *raw0;
  253|  1.54k|	u32 dough[32];
  254|  1.54k|	int i;
  255|       |
  256|  1.54k|	cook = dough;
  257|  26.3k|	for (i = 0; i < 16; i++, raw1++) {
  ------------------
  |  Branch (257:14): [True: 24.7k, False: 1.54k]
  ------------------
  258|  24.7k|		raw0 = raw1++;
  259|  24.7k|		*cook    = (*raw0 & 0x00fc0000L) << 6;
  260|  24.7k|		*cook   |= (*raw0 & 0x00000fc0L) << 10;
  261|  24.7k|		*cook   |= (*raw1 & 0x00fc0000L) >> 10;
  262|  24.7k|		*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
  263|  24.7k|		*cook    = (*raw0 & 0x0003f000L) << 12;
  264|  24.7k|		*cook   |= (*raw0 & 0x0000003fL) << 16;
  265|  24.7k|		*cook   |= (*raw1 & 0x0003f000L) >> 4;
  266|  24.7k|		*cook++ |= (*raw1 & 0x0000003fL);
  267|  24.7k|	}
  268|       |
  269|  1.54k|	os_memcpy(keyout, dough, sizeof(dough));
  ------------------
  |  |  523|  1.54k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  270|  1.54k|}
des-internal.c:desfunc:
  319|  54.2k|{
  320|  54.2k|	u32 work, right, leftt;
  321|  54.2k|	int cur_round;
  322|       |
  323|  54.2k|	leftt = block[0];
  324|  54.2k|	right = block[1];
  325|       |
  326|  54.2k|	work = ((leftt >> 4)  ^ right) & 0x0f0f0f0fL;
  327|  54.2k|	right ^= work;
  328|  54.2k|	leftt ^= (work << 4);
  329|       |
  330|  54.2k|	work = ((leftt >> 16) ^ right) & 0x0000ffffL;
  331|  54.2k|	right ^= work;
  332|  54.2k|	leftt ^= (work << 16);
  333|       |
  334|  54.2k|	work = ((right >> 2)  ^ leftt) & 0x33333333L;
  335|  54.2k|	leftt ^= work;
  336|  54.2k|	right ^= (work << 2);
  337|       |
  338|  54.2k|	work = ((right >> 8)  ^ leftt) & 0x00ff00ffL;
  339|  54.2k|	leftt ^= work;
  340|  54.2k|	right ^= (work << 8);
  341|       |
  342|  54.2k|	right = ROLc(right, 1);
  ------------------
  |  |   39|  54.2k|	((((unsigned long) (x) << (unsigned long) ((y) & 31)) | \
  |  |   40|  54.2k|	  (((unsigned long) (x) & 0xFFFFFFFFUL) >> \
  |  |   41|  54.2k|	   (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  ------------------
  343|  54.2k|	work = (leftt ^ right) & 0xaaaaaaaaL;
  344|       |
  345|  54.2k|	leftt ^= work;
  346|  54.2k|	right ^= work;
  347|  54.2k|	leftt = ROLc(leftt, 1);
  ------------------
  |  |   39|  54.2k|	((((unsigned long) (x) << (unsigned long) ((y) & 31)) | \
  |  |   40|  54.2k|	  (((unsigned long) (x) & 0xFFFFFFFFUL) >> \
  |  |   41|  54.2k|	   (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  ------------------
  348|       |
  349|   488k|	for (cur_round = 0; cur_round < 8; cur_round++) {
  ------------------
  |  Branch (349:22): [True: 434k, False: 54.2k]
  ------------------
  350|   434k|		work  = RORc(right, 4) ^ *keys++;
  ------------------
  |  |   43|   434k|	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
  |  |   44|   434k|	   (unsigned long) ((y) & 31)) | \
  |  |   45|   434k|	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
  |  |   46|   434k|	 0xFFFFFFFFUL)
  ------------------
  351|   434k|		leftt ^= SP7[work        & 0x3fL]
  352|   434k|			^ SP5[(work >>  8) & 0x3fL]
  353|   434k|			^ SP3[(work >> 16) & 0x3fL]
  354|   434k|			^ SP1[(work >> 24) & 0x3fL];
  355|   434k|		work  = right ^ *keys++;
  356|   434k|		leftt ^= SP8[ work        & 0x3fL]
  357|   434k|			^  SP6[(work >>  8) & 0x3fL]
  358|   434k|			^  SP4[(work >> 16) & 0x3fL]
  359|   434k|			^  SP2[(work >> 24) & 0x3fL];
  360|       |
  361|   434k|		work = RORc(leftt, 4) ^ *keys++;
  ------------------
  |  |   43|   434k|	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
  |  |   44|   434k|	   (unsigned long) ((y) & 31)) | \
  |  |   45|   434k|	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
  |  |   46|   434k|	 0xFFFFFFFFUL)
  ------------------
  362|   434k|		right ^= SP7[ work        & 0x3fL]
  363|   434k|			^  SP5[(work >>  8) & 0x3fL]
  364|   434k|			^  SP3[(work >> 16) & 0x3fL]
  365|   434k|			^  SP1[(work >> 24) & 0x3fL];
  366|   434k|		work  = leftt ^ *keys++;
  367|   434k|		right ^= SP8[ work        & 0x3fL]
  368|   434k|			^  SP6[(work >>  8) & 0x3fL]
  369|   434k|			^  SP4[(work >> 16) & 0x3fL]
  370|   434k|			^  SP2[(work >> 24) & 0x3fL];
  371|   434k|	}
  372|       |
  373|  54.2k|	right = RORc(right, 1);
  ------------------
  |  |   43|  54.2k|	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
  |  |   44|  54.2k|	   (unsigned long) ((y) & 31)) | \
  |  |   45|  54.2k|	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
  |  |   46|  54.2k|	 0xFFFFFFFFUL)
  ------------------
  374|  54.2k|	work = (leftt ^ right) & 0xaaaaaaaaL;
  375|  54.2k|	leftt ^= work;
  376|  54.2k|	right ^= work;
  377|  54.2k|	leftt = RORc(leftt, 1);
  ------------------
  |  |   43|  54.2k|	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
  |  |   44|  54.2k|	   (unsigned long) ((y) & 31)) | \
  |  |   45|  54.2k|	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
  |  |   46|  54.2k|	 0xFFFFFFFFUL)
  ------------------
  378|  54.2k|	work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
  379|  54.2k|	right ^= work;
  380|  54.2k|	leftt ^= (work << 8);
  381|       |	/* -- */
  382|  54.2k|	work = ((leftt >> 2) ^ right) & 0x33333333L;
  383|  54.2k|	right ^= work;
  384|  54.2k|	leftt ^= (work << 2);
  385|  54.2k|	work = ((right >> 16) ^ leftt) & 0x0000ffffL;
  386|  54.2k|	leftt ^= work;
  387|  54.2k|	right ^= (work << 16);
  388|  54.2k|	work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
  389|  54.2k|	leftt ^= work;
  390|  54.2k|	right ^= (work << 4);
  391|       |
  392|  54.2k|	block[0] = right;
  393|  54.2k|	block[1] = leftt;
  394|  54.2k|}

md5_vector:
   32|  14.8k|{
   33|  14.8k|	MD5_CTX ctx;
   34|  14.8k|	size_t i;
   35|       |
   36|  14.8k|	if (TEST_FAIL())
  ------------------
  |  |  688|  14.8k|#define TEST_FAIL() testing_test_fail(NULL, false)
  |  |  ------------------
  |  |  |  Branch (688:21): [True: 0, False: 14.8k]
  |  |  ------------------
  ------------------
   37|      0|		return -1;
   38|       |
   39|  14.8k|	MD5Init(&ctx);
   40|  51.9k|	for (i = 0; i < num_elem; i++)
  ------------------
  |  Branch (40:14): [True: 37.1k, False: 14.8k]
  ------------------
   41|  37.1k|		MD5Update(&ctx, addr[i], len[i]);
   42|  14.8k|	MD5Final(mac, &ctx);
   43|  14.8k|	return 0;
   44|  14.8k|}
MD5Init:
   88|  77.6k|{
   89|  77.6k|    ctx->buf[0] = 0x67452301;
   90|  77.6k|    ctx->buf[1] = 0xefcdab89;
   91|  77.6k|    ctx->buf[2] = 0x98badcfe;
   92|  77.6k|    ctx->buf[3] = 0x10325476;
   93|       |
   94|  77.6k|    ctx->bits[0] = 0;
   95|  77.6k|    ctx->bits[1] = 0;
   96|  77.6k|}
MD5Update:
  103|   248k|{
  104|   248k|    u32 t;
  105|       |
  106|       |    /* Update bitcount */
  107|       |
  108|   248k|    t = ctx->bits[0];
  109|   248k|    if ((ctx->bits[0] = t + ((u32) len << 3)) < t)
  ------------------
  |  Branch (109:9): [True: 0, False: 248k]
  ------------------
  110|      0|	ctx->bits[1]++;		/* Carry from low to high */
  111|   248k|    ctx->bits[1] += len >> 29;
  112|       |
  113|   248k|    t = (t >> 3) & 0x3f;	/* Bytes already in shsInfo->data */
  114|       |
  115|       |    /* Handle any leading odd-sized chunks */
  116|       |
  117|   248k|    if (t) {
  ------------------
  |  Branch (117:9): [True: 102k, False: 146k]
  ------------------
  118|   102k|	unsigned char *p = (unsigned char *) ctx->in + t;
  119|       |
  120|   102k|	t = 64 - t;
  121|   102k|	if (len < t) {
  ------------------
  |  Branch (121:6): [True: 88.5k, False: 13.8k]
  ------------------
  122|  88.5k|	    os_memcpy(p, buf, len);
  ------------------
  |  |  523|  88.5k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  123|  88.5k|	    return;
  124|  88.5k|	}
  125|  13.8k|	os_memcpy(p, buf, t);
  ------------------
  |  |  523|  13.8k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  126|  13.8k|	byteReverse(ctx->in, 16);
  127|  13.8k|	MD5Transform(ctx->buf, (u32 *) ctx->in);
  128|  13.8k|	buf += t;
  129|  13.8k|	len -= t;
  130|  13.8k|    }
  131|       |    /* Process data in 64-byte chunks */
  132|       |
  133|   287k|    while (len >= 64) {
  ------------------
  |  Branch (133:12): [True: 128k, False: 159k]
  ------------------
  134|   128k|	os_memcpy(ctx->in, buf, 64);
  ------------------
  |  |  523|   128k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  135|   128k|	byteReverse(ctx->in, 16);
  136|   128k|	MD5Transform(ctx->buf, (u32 *) ctx->in);
  137|   128k|	buf += 64;
  138|   128k|	len -= 64;
  139|   128k|    }
  140|       |
  141|       |    /* Handle any remaining bytes of data. */
  142|       |
  143|   159k|    os_memcpy(ctx->in, buf, len);
  ------------------
  |  |  523|   159k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  144|   159k|}
MD5Final:
  151|  68.5k|{
  152|  68.5k|    unsigned count;
  153|  68.5k|    unsigned char *p;
  154|       |
  155|       |    /* Compute number of bytes mod 64 */
  156|  68.5k|    count = (ctx->bits[0] >> 3) & 0x3F;
  157|       |
  158|       |    /* Set the first char of padding to 0x80.  This is safe since there is
  159|       |       always at least one byte free */
  160|  68.5k|    p = ctx->in + count;
  161|  68.5k|    *p++ = 0x80;
  162|       |
  163|       |    /* Bytes of padding needed to make 64 bytes */
  164|  68.5k|    count = 64 - 1 - count;
  165|       |
  166|       |    /* Pad out to 56 mod 64 */
  167|  68.5k|    if (count < 8) {
  ------------------
  |  Branch (167:9): [True: 346, False: 68.2k]
  ------------------
  168|       |	/* Two lots of padding:  Pad the first block to 64 bytes */
  169|    346|	os_memset(p, 0, count);
  ------------------
  |  |  529|    346|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  170|    346|	byteReverse(ctx->in, 16);
  171|    346|	MD5Transform(ctx->buf, (u32 *) ctx->in);
  172|       |
  173|       |	/* Now fill the next block with 56 bytes */
  174|    346|	os_memset(ctx->in, 0, 56);
  ------------------
  |  |  529|    346|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  175|  68.2k|    } else {
  176|       |	/* Pad block to 56 bytes */
  177|  68.2k|	os_memset(p, 0, count - 8);
  ------------------
  |  |  529|  68.2k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  178|  68.2k|    }
  179|  68.5k|    byteReverse(ctx->in, 14);
  180|       |
  181|       |    /* Append length in bits and transform */
  182|  68.5k|    ((u32 *) aliasing_hide_typecast(ctx->in, u32))[14] = ctx->bits[0];
  ------------------
  |  |  652|  68.5k|#define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a))
  ------------------
  183|  68.5k|    ((u32 *) aliasing_hide_typecast(ctx->in, u32))[15] = ctx->bits[1];
  ------------------
  |  |  652|  68.5k|#define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a))
  ------------------
  184|       |
  185|  68.5k|    MD5Transform(ctx->buf, (u32 *) ctx->in);
  186|  68.5k|    byteReverse((unsigned char *) ctx->buf, 4);
  187|  68.5k|    os_memcpy(digest, ctx->buf, 16);
  ------------------
  |  |  523|  68.5k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  188|  68.5k|    os_memset(ctx, 0, sizeof(*ctx));	/* In case it's sensitive */
  ------------------
  |  |  529|  68.5k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  189|  68.5k|}
md5-internal.c:MD5Transform:
  209|   210k|{
  210|   210k|    register u32 a, b, c, d;
  211|       |
  212|   210k|    a = buf[0];
  213|   210k|    b = buf[1];
  214|   210k|    c = buf[2];
  215|   210k|    d = buf[3];
  216|       |
  217|   210k|    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  217|   210k|    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  218|   210k|    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  218|   210k|    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  219|   210k|    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  219|   210k|    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|   210k|    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  220|   210k|    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  221|   210k|    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  221|   210k|    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|   210k|    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  222|   210k|    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|   210k|    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  223|   210k|    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  224|   210k|    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  224|   210k|    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|   210k|    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  225|   210k|    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|   210k|    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  226|   210k|    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|   210k|    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  227|   210k|    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  228|   210k|    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  228|   210k|    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  229|   210k|    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  229|   210k|    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  230|   210k|    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  230|   210k|    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|   210k|    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  231|   210k|    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  232|   210k|    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  232|   210k|    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|       |
  234|   210k|    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  234|   210k|    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  235|   210k|    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  235|   210k|    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  236|   210k|    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  236|   210k|    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  237|   210k|    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  237|   210k|    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  238|   210k|    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  238|   210k|    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|   210k|    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  239|   210k|    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  240|   210k|    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  240|   210k|    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  241|   210k|    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  241|   210k|    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  242|   210k|    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  242|   210k|    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|   210k|    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  243|   210k|    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  244|   210k|    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  244|   210k|    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  245|   210k|    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  245|   210k|    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|   210k|    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  246|   210k|    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|   210k|    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  247|   210k|    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|   210k|    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  248|   210k|    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  249|   210k|    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  249|   210k|    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   210k|#define F2(x, y, z) F1(z, x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  194|   210k|#define F1(x, y, z) (z ^ (x & (y ^ z)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|       |
  251|   210k|    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  251|   210k|    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|   210k|    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  252|   210k|    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|   210k|    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  253|   210k|    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  254|   210k|    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  254|   210k|    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|   210k|    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  255|   210k|    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|   210k|    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  256|   210k|    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  257|   210k|    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  257|   210k|    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|   210k|    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  258|   210k|    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|   210k|    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  259|   210k|    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|   210k|    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  260|   210k|    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|   210k|    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  261|   210k|    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|   210k|    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  262|   210k|    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|   210k|    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  263|   210k|    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  264|   210k|    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  264|   210k|    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|   210k|    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  265|   210k|    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|   210k|    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  266|   210k|    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
  |  |  |  |  ------------------
  |  |  |  |  |  |  196|   210k|#define F3(x, y, z) (x ^ y ^ z)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|       |
  268|   210k|    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  268|   210k|    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  269|   210k|    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  269|   210k|    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  270|   210k|    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  270|   210k|    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  271|   210k|    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  271|   210k|    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  272|   210k|    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  272|   210k|    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|   210k|    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  273|   210k|    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  274|   210k|    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  274|   210k|    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  275|   210k|    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  275|   210k|    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|   210k|    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  276|   210k|    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  277|   210k|    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  277|   210k|    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  278|   210k|    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  278|   210k|    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  279|   210k|    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  279|   210k|    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  280|   210k|    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  280|   210k|    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  281|   210k|    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  281|   210k|    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  282|   210k|    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  282|   210k|    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  283|   210k|    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
  ------------------
  |  |  201|   210k|	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
  |  |  ------------------
  |  |  |  |  283|   210k|    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|   210k|#define F4(x, y, z) (y ^ (x | ~z))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|       |
  285|   210k|    buf[0] += a;
  286|   210k|    buf[1] += b;
  287|   210k|    buf[2] += c;
  288|   210k|    buf[3] += d;
  289|   210k|}

hmac_md5_vector:
   28|  7.42k|{
   29|  7.42k|	u8 k_pad[64]; /* padding - key XORd with ipad/opad */
   30|  7.42k|	u8 tk[16];
   31|  7.42k|	const u8 *_addr[6];
   32|  7.42k|	size_t i, _len[6];
   33|  7.42k|	int res;
   34|       |
   35|  7.42k|	if (num_elem > 5) {
  ------------------
  |  Branch (35:6): [True: 0, False: 7.42k]
  ------------------
   36|       |		/*
   37|       |		 * Fixed limit on the number of fragments to avoid having to
   38|       |		 * allocate memory (which could fail).
   39|       |		 */
   40|      0|		return -1;
   41|      0|	}
   42|       |
   43|       |        /* if key is longer than 64 bytes reset it to key = MD5(key) */
   44|  7.42k|        if (key_len > 64) {
  ------------------
  |  Branch (44:13): [True: 0, False: 7.42k]
  ------------------
   45|      0|		if (md5_vector(1, &key, &key_len, tk))
  ------------------
  |  Branch (45:7): [True: 0, False: 0]
  ------------------
   46|      0|			return -1;
   47|      0|		key = tk;
   48|      0|		key_len = 16;
   49|      0|        }
   50|       |
   51|       |	/* the HMAC_MD5 transform looks like:
   52|       |	 *
   53|       |	 * MD5(K XOR opad, MD5(K XOR ipad, text))
   54|       |	 *
   55|       |	 * where K is an n byte key
   56|       |	 * ipad is the byte 0x36 repeated 64 times
   57|       |	 * opad is the byte 0x5c repeated 64 times
   58|       |	 * and text is the data being protected */
   59|       |
   60|       |	/* start out by storing key in ipad */
   61|  7.42k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  7.42k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   62|  7.42k|	os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  7.42k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   63|       |
   64|       |	/* XOR key with ipad values */
   65|   482k|	for (i = 0; i < 64; i++)
  ------------------
  |  Branch (65:14): [True: 475k, False: 7.42k]
  ------------------
   66|   475k|		k_pad[i] ^= 0x36;
   67|       |
   68|       |	/* perform inner MD5 */
   69|  7.42k|	_addr[0] = k_pad;
   70|  7.42k|	_len[0] = 64;
   71|  22.2k|	for (i = 0; i < num_elem; i++) {
  ------------------
  |  Branch (71:14): [True: 14.8k, False: 7.42k]
  ------------------
   72|  14.8k|		_addr[i + 1] = addr[i];
   73|  14.8k|		_len[i + 1] = len[i];
   74|  14.8k|	}
   75|  7.42k|	if (md5_vector(1 + num_elem, _addr, _len, mac))
  ------------------
  |  Branch (75:6): [True: 0, False: 7.42k]
  ------------------
   76|      0|		return -1;
   77|       |
   78|  7.42k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  7.42k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   79|  7.42k|	os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  7.42k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   80|       |	/* XOR key with opad values */
   81|   482k|	for (i = 0; i < 64; i++)
  ------------------
  |  Branch (81:14): [True: 475k, False: 7.42k]
  ------------------
   82|   475k|		k_pad[i] ^= 0x5c;
   83|       |
   84|       |	/* perform outer MD5 */
   85|  7.42k|	_addr[0] = k_pad;
   86|  7.42k|	_len[0] = 64;
   87|  7.42k|	_addr[1] = mac;
   88|  7.42k|	_len[1] = MD5_MAC_LEN;
  ------------------
  |  |   12|  7.42k|#define MD5_MAC_LEN 16
  ------------------
   89|  7.42k|	res = md5_vector(2, _addr, _len, mac);
   90|  7.42k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  7.42k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   91|  7.42k|	os_memset(tk, 0, sizeof(tk));
  ------------------
  |  |  529|  7.42k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   92|  7.42k|	return res;
   93|  7.42k|}
hmac_md5:
  107|  3.26k|{
  108|  3.26k|	return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac);
  109|  3.26k|}

rc4_skip:
   18|  28.8k|{
   19|  28.8k|	u32 i, j, k;
   20|  28.8k|	u8 S[256], *pos;
   21|  28.8k|	size_t kpos;
   22|       |
   23|       |	/* Setup RC4 state */
   24|  7.41M|	for (i = 0; i < 256; i++)
  ------------------
  |  Branch (24:14): [True: 7.39M, False: 28.8k]
  ------------------
   25|  7.39M|		S[i] = i;
   26|  28.8k|	j = 0;
   27|  28.8k|	kpos = 0;
   28|  7.41M|	for (i = 0; i < 256; i++) {
  ------------------
  |  Branch (28:14): [True: 7.39M, False: 28.8k]
  ------------------
   29|  7.39M|		j = (j + S[i] + key[kpos]) & 0xff;
   30|  7.39M|		kpos++;
   31|  7.39M|		if (kpos >= keylen)
  ------------------
  |  Branch (31:7): [True: 461k, False: 6.92M]
  ------------------
   32|   461k|			kpos = 0;
   33|  7.39M|		S_SWAP(i, j);
  ------------------
  |  |   14|  7.39M|#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0)
  |  |  ------------------
  |  |  |  Branch (14:70): [Folded, False: 7.39M]
  |  |  ------------------
  ------------------
   34|  7.39M|	}
   35|       |
   36|       |	/* Skip the start of the stream */
   37|  28.8k|	i = j = 0;
   38|  1.82G|	for (k = 0; k < skip; k++) {
  ------------------
  |  Branch (38:14): [True: 1.82G, False: 28.8k]
  ------------------
   39|  1.82G|		i = (i + 1) & 0xff;
   40|  1.82G|		j = (j + S[i]) & 0xff;
   41|  1.82G|		S_SWAP(i, j);
  ------------------
  |  |   14|  1.82G|#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0)
  |  |  ------------------
  |  |  |  Branch (14:70): [Folded, False: 1.82G]
  |  |  ------------------
  ------------------
   42|  1.82G|	}
   43|       |
   44|       |	/* Apply RC4 to data */
   45|  28.8k|	pos = data;
   46|   530k|	for (k = 0; k < data_len; k++) {
  ------------------
  |  Branch (46:14): [True: 501k, False: 28.8k]
  ------------------
   47|   501k|		i = (i + 1) & 0xff;
   48|   501k|		j = (j + S[i]) & 0xff;
   49|   501k|		S_SWAP(i, j);
  ------------------
  |  |   14|   501k|#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0)
  |  |  ------------------
  |  |  |  Branch (14:70): [Folded, False: 501k]
  |  |  ------------------
  ------------------
   50|   501k|		*pos++ ^= S[(S[i] + S[j]) & 0xff];
   51|   501k|	}
   52|       |
   53|  28.8k|	return 0;
   54|  28.8k|}

sha1_vector:
   32|  13.6k|{
   33|  13.6k|	SHA1_CTX ctx;
   34|  13.6k|	size_t i;
   35|       |
   36|  13.6k|	if (TEST_FAIL())
  ------------------
  |  |  688|  13.6k|#define TEST_FAIL() testing_test_fail(NULL, false)
  |  |  ------------------
  |  |  |  Branch (688:21): [True: 0, False: 13.6k]
  |  |  ------------------
  ------------------
   37|      0|		return -1;
   38|       |
   39|  13.6k|	SHA1Init(&ctx);
   40|  47.6k|	for (i = 0; i < num_elem; i++)
  ------------------
  |  Branch (40:14): [True: 34.0k, False: 13.6k]
  ------------------
   41|  34.0k|		SHA1Update(&ctx, addr[i], len[i]);
   42|  13.6k|	SHA1Final(mac, &ctx);
   43|  13.6k|	return 0;
   44|  13.6k|}
SHA1Transform:
  177|   117k|{
  178|   117k|	u32 a, b, c, d, e;
  179|   117k|	typedef union {
  180|   117k|		unsigned char c[64];
  181|   117k|		u32 l[16];
  182|   117k|	} CHAR64LONG16;
  183|   117k|	CHAR64LONG16* block;
  184|   117k|#ifdef SHA1HANDSOFF
  185|   117k|	CHAR64LONG16 workspace;
  186|   117k|	block = &workspace;
  187|   117k|	os_memcpy(block, buffer, 64);
  ------------------
  |  |  523|   117k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  188|       |#else
  189|       |	block = (CHAR64LONG16 *) buffer;
  190|       |#endif
  191|       |	/* Copy context->state[] to working vars */
  192|   117k|	a = state[0];
  193|   117k|	b = state[1];
  194|   117k|	c = state[2];
  195|   117k|	d = state[3];
  196|   117k|	e = state[4];
  197|       |	/* 4 rounds of 20 operations each. Loop unrolled. */
  198|   117k|	R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  199|   117k|	R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  200|   117k|	R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  201|   117k|	R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
  ------------------
  |  |  145|   117k|	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  135|   117k|#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  136|   117k|	(rol(block->l[i], 8) & 0x00FF00FF))
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  146|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  202|   117k|	R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
  ------------------
  |  |  148|   117k|	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  149|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
  ------------------
  |  |  148|   117k|	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  149|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
  ------------------
  |  |  148|   117k|	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  149|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
  ------------------
  |  |  148|   117k|	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  149|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  203|   117k|	R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  204|   117k|	R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  205|   117k|	R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  206|   117k|	R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  207|   117k|	R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
  ------------------
  |  |  151|   117k|	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  208|   117k|	R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  209|   117k|	R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  210|   117k|	R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  211|   117k|	R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  212|   117k|	R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
  ------------------
  |  |  153|   117k|	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  154|   117k|	w = rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  213|   117k|	R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  214|   117k|	R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  215|   117k|	R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  216|   117k|	R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  217|   117k|	R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
              	R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
  ------------------
  |  |  156|   117k|	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  140|   117k|#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  |  |  ------------------
  |  |  |  |  141|   117k|	block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  |  |  ------------------
  |  |               	z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  |  |  157|   117k|	w=rol(w, 30);
  |  |  ------------------
  |  |  |  |  130|   117k|#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  |  |  ------------------
  ------------------
  218|       |	/* Add the working vars back into context.state[] */
  219|   117k|	state[0] += a;
  220|   117k|	state[1] += b;
  221|   117k|	state[2] += c;
  222|   117k|	state[3] += d;
  223|   117k|	state[4] += e;
  224|       |	/* Wipe variables */
  225|   117k|	a = b = c = d = e = 0;
  226|   117k|#ifdef SHA1HANDSOFF
  227|   117k|	forced_memzero(block, 64);
  228|   117k|#endif
  229|   117k|}
SHA1Init:
  235|  30.6k|{
  236|       |	/* SHA1 initialization constants */
  237|  30.6k|	context->state[0] = 0x67452301;
  238|  30.6k|	context->state[1] = 0xEFCDAB89;
  239|  30.6k|	context->state[2] = 0x98BADCFE;
  240|  30.6k|	context->state[3] = 0x10325476;
  241|  30.6k|	context->state[4] = 0xC3D2E1F0;
  242|  30.6k|	context->count[0] = context->count[1] = 0;
  243|  30.6k|}
SHA1Update:
  249|   853k|{
  250|   853k|	u32 i, j;
  251|   853k|	const unsigned char *data = _data;
  252|       |
  253|       |#ifdef VERBOSE
  254|       |	SHAPrintContext(context, "before");
  255|       |#endif
  256|   853k|	j = (context->count[0] >> 3) & 63;
  257|   853k|	if ((context->count[0] += len << 3) < (len << 3))
  ------------------
  |  Branch (257:6): [True: 0, False: 853k]
  ------------------
  258|      0|		context->count[1]++;
  259|   853k|	context->count[1] += (len >> 29);
  260|   853k|	if ((j + len) > 63) {
  ------------------
  |  Branch (260:6): [True: 66.7k, False: 786k]
  ------------------
  261|  66.7k|		os_memcpy(&context->buffer[j], data, (i = 64-j));
  ------------------
  |  |  523|  66.7k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  262|  66.7k|		SHA1Transform(context->state, context->buffer);
  263|   117k|		for ( ; i + 63 < len; i += 64) {
  ------------------
  |  Branch (263:11): [True: 50.2k, False: 66.7k]
  ------------------
  264|  50.2k|			SHA1Transform(context->state, &data[i]);
  265|  50.2k|		}
  266|  66.7k|		j = 0;
  267|  66.7k|	}
  268|   786k|	else i = 0;
  269|   853k|	os_memcpy(&context->buffer[j], &data[i], len - i);
  ------------------
  |  |  523|   853k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  270|       |#ifdef VERBOSE
  271|       |	SHAPrintContext(context, "after ");
  272|       |#endif
  273|   853k|}
SHA1Final:
  279|  21.6k|{
  280|  21.6k|	u32 i;
  281|  21.6k|	unsigned char finalcount[8];
  282|       |
  283|   194k|	for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (283:14): [True: 173k, False: 21.6k]
  ------------------
  284|   173k|		finalcount[i] = (unsigned char)
  285|   173k|			((context->count[(i >= 4 ? 0 : 1)] >>
  ------------------
  |  Branch (285:22): [True: 86.5k, False: 86.5k]
  ------------------
  286|   173k|			  ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
  287|   173k|	}
  288|  21.6k|	SHA1Update(context, (unsigned char *) "\200", 1);
  289|   746k|	while ((context->count[0] & 504) != 448) {
  ------------------
  |  Branch (289:9): [True: 725k, False: 21.6k]
  ------------------
  290|   725k|		SHA1Update(context, (unsigned char *) "\0", 1);
  291|   725k|	}
  292|  21.6k|	SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform()
  293|       |					      */
  294|   454k|	for (i = 0; i < 20; i++) {
  ------------------
  |  Branch (294:14): [True: 432k, False: 21.6k]
  ------------------
  295|   432k|		digest[i] = (unsigned char)
  296|   432k|			((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) &
  297|   432k|			 255);
  298|   432k|	}
  299|       |	/* Wipe variables */
  300|  21.6k|	os_memset(context->buffer, 0, 64);
  ------------------
  |  |  529|  21.6k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  301|  21.6k|	os_memset(context->state, 0, 20);
  ------------------
  |  |  529|  21.6k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  302|  21.6k|	os_memset(context->count, 0, 8);
  ------------------
  |  |  529|  21.6k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  303|  21.6k|	forced_memzero(finalcount, sizeof(finalcount));
  304|  21.6k|}

tls_prf_sha1_md5:
   32|    891|{
   33|    891|	size_t L_S1, L_S2, i;
   34|    891|	const u8 *S1, *S2;
   35|    891|	u8 A_MD5[MD5_MAC_LEN], A_SHA1[SHA1_MAC_LEN];
   36|    891|	u8 P_MD5[MD5_MAC_LEN], P_SHA1[SHA1_MAC_LEN];
   37|    891|	int MD5_pos, SHA1_pos;
   38|    891|	const u8 *MD5_addr[3];
   39|    891|	size_t MD5_len[3];
   40|    891|	const unsigned char *SHA1_addr[3];
   41|    891|	size_t SHA1_len[3];
   42|       |
   43|    891|	MD5_addr[0] = A_MD5;
   44|    891|	MD5_len[0] = MD5_MAC_LEN;
  ------------------
  |  |   12|    891|#define MD5_MAC_LEN 16
  ------------------
   45|    891|	MD5_addr[1] = (unsigned char *) label;
   46|    891|	MD5_len[1] = os_strlen(label);
  ------------------
  |  |  536|    891|#define os_strlen(s) strlen(s)
  ------------------
   47|    891|	MD5_addr[2] = seed;
   48|    891|	MD5_len[2] = seed_len;
   49|       |
   50|    891|	SHA1_addr[0] = A_SHA1;
   51|    891|	SHA1_len[0] = SHA1_MAC_LEN;
  ------------------
  |  |   12|    891|#define SHA1_MAC_LEN 20
  ------------------
   52|    891|	SHA1_addr[1] = (unsigned char *) label;
   53|    891|	SHA1_len[1] = os_strlen(label);
  ------------------
  |  |  536|    891|#define os_strlen(s) strlen(s)
  ------------------
   54|    891|	SHA1_addr[2] = seed;
   55|    891|	SHA1_len[2] = seed_len;
   56|       |
   57|       |	/* RFC 2246, Chapter 5
   58|       |	 * A(0) = seed, A(i) = HMAC(secret, A(i-1))
   59|       |	 * P_hash = HMAC(secret, A(1) + seed) + HMAC(secret, A(2) + seed) + ..
   60|       |	 * PRF = P_MD5(S1, label + seed) XOR P_SHA-1(S2, label + seed)
   61|       |	 */
   62|       |
   63|    891|	L_S1 = L_S2 = (secret_len + 1) / 2;
   64|    891|	S1 = secret;
   65|    891|	S2 = secret + L_S1;
   66|    891|	if (secret_len & 1) {
  ------------------
  |  Branch (66:6): [True: 0, False: 891]
  ------------------
   67|       |		/* The last byte of S1 will be shared with S2 */
   68|      0|		S2--;
   69|      0|	}
   70|       |
   71|    891|	hmac_md5_vector(S1, L_S1, 2, &MD5_addr[1], &MD5_len[1], A_MD5);
   72|    891|	hmac_sha1_vector(S2, L_S2, 2, &SHA1_addr[1], &SHA1_len[1], A_SHA1);
   73|       |
   74|    891|	MD5_pos = MD5_MAC_LEN;
  ------------------
  |  |   12|    891|#define MD5_MAC_LEN 16
  ------------------
   75|    891|	SHA1_pos = SHA1_MAC_LEN;
  ------------------
  |  |   12|    891|#define SHA1_MAC_LEN 20
  ------------------
   76|  50.9k|	for (i = 0; i < outlen; i++) {
  ------------------
  |  Branch (76:14): [True: 50.0k, False: 891]
  ------------------
   77|  50.0k|		if (MD5_pos == MD5_MAC_LEN) {
  ------------------
  |  |   12|  50.0k|#define MD5_MAC_LEN 16
  ------------------
  |  Branch (77:7): [True: 3.26k, False: 46.7k]
  ------------------
   78|  3.26k|			hmac_md5_vector(S1, L_S1, 3, MD5_addr, MD5_len, P_MD5);
   79|  3.26k|			MD5_pos = 0;
   80|  3.26k|			hmac_md5(S1, L_S1, A_MD5, MD5_MAC_LEN, A_MD5);
  ------------------
  |  |   12|  3.26k|#define MD5_MAC_LEN 16
  ------------------
   81|  3.26k|		}
   82|  50.0k|		if (SHA1_pos == SHA1_MAC_LEN) {
  ------------------
  |  |   12|  50.0k|#define SHA1_MAC_LEN 20
  ------------------
  |  Branch (82:7): [True: 2.95k, False: 47.0k]
  ------------------
   83|  2.95k|			hmac_sha1_vector(S2, L_S2, 3, SHA1_addr, SHA1_len,
   84|  2.95k|					 P_SHA1);
   85|  2.95k|			SHA1_pos = 0;
   86|  2.95k|			hmac_sha1(S2, L_S2, A_SHA1, SHA1_MAC_LEN, A_SHA1);
  ------------------
  |  |   12|  2.95k|#define SHA1_MAC_LEN 20
  ------------------
   87|  2.95k|		}
   88|       |
   89|  50.0k|		out[i] = P_MD5[MD5_pos] ^ P_SHA1[SHA1_pos];
   90|       |
   91|  50.0k|		MD5_pos++;
   92|  50.0k|		SHA1_pos++;
   93|  50.0k|	}
   94|       |
   95|    891|	forced_memzero(A_MD5, MD5_MAC_LEN);
  ------------------
  |  |   12|    891|#define MD5_MAC_LEN 16
  ------------------
   96|    891|	forced_memzero(P_MD5, MD5_MAC_LEN);
  ------------------
  |  |   12|    891|#define MD5_MAC_LEN 16
  ------------------
   97|    891|	forced_memzero(A_SHA1, SHA1_MAC_LEN);
  ------------------
  |  |   12|    891|#define SHA1_MAC_LEN 20
  ------------------
   98|    891|	forced_memzero(P_SHA1, SHA1_MAC_LEN);
  ------------------
  |  |   12|    891|#define SHA1_MAC_LEN 20
  ------------------
   99|       |
  100|    891|	return 0;
  101|    891|}

hmac_sha1_vector:
   28|  6.80k|{
   29|  6.80k|	unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */
   30|  6.80k|	unsigned char tk[20];
   31|  6.80k|	const u8 *_addr[6];
   32|  6.80k|	size_t _len[6], i;
   33|  6.80k|	int ret;
   34|       |
   35|  6.80k|	if (num_elem > 5) {
  ------------------
  |  Branch (35:6): [True: 0, False: 6.80k]
  ------------------
   36|       |		/*
   37|       |		 * Fixed limit on the number of fragments to avoid having to
   38|       |		 * allocate memory (which could fail).
   39|       |		 */
   40|      0|		return -1;
   41|      0|	}
   42|       |
   43|       |        /* if key is longer than 64 bytes reset it to key = SHA1(key) */
   44|  6.80k|        if (key_len > 64) {
  ------------------
  |  Branch (44:13): [True: 0, False: 6.80k]
  ------------------
   45|      0|		if (sha1_vector(1, &key, &key_len, tk))
  ------------------
  |  Branch (45:7): [True: 0, False: 0]
  ------------------
   46|      0|			return -1;
   47|      0|		key = tk;
   48|      0|		key_len = 20;
   49|      0|        }
   50|       |
   51|       |	/* the HMAC_SHA1 transform looks like:
   52|       |	 *
   53|       |	 * SHA1(K XOR opad, SHA1(K XOR ipad, text))
   54|       |	 *
   55|       |	 * where K is an n byte key
   56|       |	 * ipad is the byte 0x36 repeated 64 times
   57|       |	 * opad is the byte 0x5c repeated 64 times
   58|       |	 * and text is the data being protected */
   59|       |
   60|       |	/* start out by storing key in ipad */
   61|  6.80k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  6.80k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   62|  6.80k|	os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  6.80k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   63|       |	/* XOR key with ipad values */
   64|   442k|	for (i = 0; i < 64; i++)
  ------------------
  |  Branch (64:14): [True: 435k, False: 6.80k]
  ------------------
   65|   435k|		k_pad[i] ^= 0x36;
   66|       |
   67|       |	/* perform inner SHA1 */
   68|  6.80k|	_addr[0] = k_pad;
   69|  6.80k|	_len[0] = 64;
   70|  20.4k|	for (i = 0; i < num_elem; i++) {
  ------------------
  |  Branch (70:14): [True: 13.6k, False: 6.80k]
  ------------------
   71|  13.6k|		_addr[i + 1] = addr[i];
   72|  13.6k|		_len[i + 1] = len[i];
   73|  13.6k|	}
   74|  6.80k|	if (sha1_vector(1 + num_elem, _addr, _len, mac))
  ------------------
  |  Branch (74:6): [True: 0, False: 6.80k]
  ------------------
   75|      0|		return -1;
   76|       |
   77|  6.80k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  6.80k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   78|  6.80k|	os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  6.80k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   79|       |	/* XOR key with opad values */
   80|   442k|	for (i = 0; i < 64; i++)
  ------------------
  |  Branch (80:14): [True: 435k, False: 6.80k]
  ------------------
   81|   435k|		k_pad[i] ^= 0x5c;
   82|       |
   83|       |	/* perform outer SHA1 */
   84|  6.80k|	_addr[0] = k_pad;
   85|  6.80k|	_len[0] = 64;
   86|  6.80k|	_addr[1] = mac;
   87|  6.80k|	_len[1] = SHA1_MAC_LEN;
  ------------------
  |  |   12|  6.80k|#define SHA1_MAC_LEN 20
  ------------------
   88|  6.80k|	ret = sha1_vector(2, _addr, _len, mac);
   89|  6.80k|	forced_memzero(k_pad, sizeof(k_pad));
   90|  6.80k|	forced_memzero(tk, sizeof(tk));
   91|  6.80k|	return ret;
   92|  6.80k|}
hmac_sha1:
  106|  2.95k|{
  107|  2.95k|	return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
  108|  2.95k|}

sha256_vector:
   27|  5.85k|{
   28|  5.85k|	struct sha256_state ctx;
   29|  5.85k|	size_t i;
   30|       |
   31|  5.85k|	if (TEST_FAIL())
  ------------------
  |  |  688|  5.85k|#define TEST_FAIL() testing_test_fail(NULL, false)
  |  |  ------------------
  |  |  |  Branch (688:21): [True: 0, False: 5.85k]
  |  |  ------------------
  ------------------
   32|      0|		return -1;
   33|       |
   34|  5.85k|	sha256_init(&ctx);
   35|  20.0k|	for (i = 0; i < num_elem; i++)
  ------------------
  |  Branch (35:14): [True: 14.2k, False: 5.85k]
  ------------------
   36|  14.2k|		if (sha256_process(&ctx, addr[i], len[i]))
  ------------------
  |  Branch (36:7): [True: 0, False: 14.2k]
  ------------------
   37|      0|			return -1;
   38|  5.85k|	if (sha256_done(&ctx, mac))
  ------------------
  |  Branch (38:6): [True: 0, False: 5.85k]
  ------------------
   39|      0|		return -1;
   40|  5.85k|	return 0;
   41|  5.85k|}
sha256_init:
  125|  22.9k|{
  126|  22.9k|	md->curlen = 0;
  127|  22.9k|	md->length = 0;
  128|  22.9k|	md->state[0] = 0x6A09E667UL;
  129|  22.9k|	md->state[1] = 0xBB67AE85UL;
  130|  22.9k|	md->state[2] = 0x3C6EF372UL;
  131|  22.9k|	md->state[3] = 0xA54FF53AUL;
  132|  22.9k|	md->state[4] = 0x510E527FUL;
  133|  22.9k|	md->state[5] = 0x9B05688CUL;
  134|  22.9k|	md->state[6] = 0x1F83D9ABUL;
  135|  22.9k|	md->state[7] = 0x5BE0CD19UL;
  136|  22.9k|}
sha256_process:
  147|  65.6k|{
  148|  65.6k|	unsigned long n;
  149|       |
  150|  65.6k|	if (md->curlen >= sizeof(md->buf))
  ------------------
  |  Branch (150:6): [True: 0, False: 65.6k]
  ------------------
  151|      0|		return -1;
  152|       |
  153|   199k|	while (inlen > 0) {
  ------------------
  |  Branch (153:9): [True: 134k, False: 65.6k]
  ------------------
  154|   134k|		if (md->curlen == 0 && inlen >= SHA256_BLOCK_SIZE) {
  ------------------
  |  |   12|   107k|#define SHA256_BLOCK_SIZE 64
  ------------------
  |  Branch (154:7): [True: 107k, False: 27.0k]
  |  Branch (154:26): [True: 72.5k, False: 34.4k]
  ------------------
  155|  72.5k|			if (sha256_compress(md, (unsigned char *) in) < 0)
  ------------------
  |  Branch (155:8): [True: 0, False: 72.5k]
  ------------------
  156|      0|				return -1;
  157|  72.5k|			md->length += SHA256_BLOCK_SIZE * 8;
  ------------------
  |  |   12|  72.5k|#define SHA256_BLOCK_SIZE 64
  ------------------
  158|  72.5k|			in += SHA256_BLOCK_SIZE;
  ------------------
  |  |   12|  72.5k|#define SHA256_BLOCK_SIZE 64
  ------------------
  159|  72.5k|			inlen -= SHA256_BLOCK_SIZE;
  ------------------
  |  |   12|  72.5k|#define SHA256_BLOCK_SIZE 64
  ------------------
  160|  72.5k|		} else {
  161|  61.4k|			n = MIN(inlen, (SHA256_BLOCK_SIZE - md->curlen));
  ------------------
  |  |  468|  61.4k|#define MIN(a, b) ((a) < (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (468:20): [True: 49.6k, False: 11.8k]
  |  |  ------------------
  ------------------
  162|  61.4k|			os_memcpy(md->buf + md->curlen, in, n);
  ------------------
  |  |  523|  61.4k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  163|  61.4k|			md->curlen += n;
  164|  61.4k|			in += n;
  165|  61.4k|			inlen -= n;
  166|  61.4k|			if (md->curlen == SHA256_BLOCK_SIZE) {
  ------------------
  |  |   12|  61.4k|#define SHA256_BLOCK_SIZE 64
  ------------------
  |  Branch (166:8): [True: 11.8k, False: 49.6k]
  ------------------
  167|  11.8k|				if (sha256_compress(md, md->buf) < 0)
  ------------------
  |  Branch (167:9): [True: 0, False: 11.8k]
  ------------------
  168|      0|					return -1;
  169|  11.8k|				md->length += 8 * SHA256_BLOCK_SIZE;
  ------------------
  |  |   12|  11.8k|#define SHA256_BLOCK_SIZE 64
  ------------------
  170|  11.8k|				md->curlen = 0;
  171|  11.8k|			}
  172|  61.4k|		}
  173|   134k|	}
  174|       |
  175|  65.6k|	return 0;
  176|  65.6k|}
sha256_done:
  186|  13.8k|{
  187|  13.8k|	int i;
  188|       |
  189|  13.8k|	if (md->curlen >= sizeof(md->buf))
  ------------------
  |  Branch (189:6): [True: 0, False: 13.8k]
  ------------------
  190|      0|		return -1;
  191|       |
  192|       |	/* increase the length of the message */
  193|  13.8k|	md->length += md->curlen * 8;
  194|       |
  195|       |	/* append the '1' bit */
  196|  13.8k|	md->buf[md->curlen++] = (unsigned char) 0x80;
  197|       |
  198|       |	/* if the length is currently above 56 bytes we append zeros
  199|       |	 * then compress.  Then we can fall back to padding zeros and length
  200|       |	 * encoding like normal.
  201|       |	 */
  202|  13.8k|	if (md->curlen > 56) {
  ------------------
  |  Branch (202:6): [True: 929, False: 12.8k]
  ------------------
  203|  3.01k|		while (md->curlen < SHA256_BLOCK_SIZE) {
  ------------------
  |  |   12|  3.01k|#define SHA256_BLOCK_SIZE 64
  ------------------
  |  Branch (203:10): [True: 2.08k, False: 929]
  ------------------
  204|  2.08k|			md->buf[md->curlen++] = (unsigned char) 0;
  205|  2.08k|		}
  206|    929|		sha256_compress(md, md->buf);
  207|    929|		md->curlen = 0;
  208|    929|	}
  209|       |
  210|       |	/* pad up to 56 bytes of zeroes */
  211|   414k|	while (md->curlen < 56) {
  ------------------
  |  Branch (211:9): [True: 400k, False: 13.8k]
  ------------------
  212|   400k|		md->buf[md->curlen++] = (unsigned char) 0;
  213|   400k|	}
  214|       |
  215|       |	/* store length */
  216|  13.8k|	WPA_PUT_BE64(md->buf + 56, md->length);
  217|  13.8k|	sha256_compress(md, md->buf);
  218|       |
  219|       |	/* copy output */
  220|   124k|	for (i = 0; i < 8; i++)
  ------------------
  |  Branch (220:14): [True: 110k, False: 13.8k]
  ------------------
  221|   110k|		WPA_PUT_BE32(out + (4 * i), md->state[i]);
  222|       |
  223|  13.8k|	return 0;
  224|  13.8k|}
sha256-internal.c:sha256_compress:
   82|  99.1k|{
   83|  99.1k|	u32 S[8], W[64], t0, t1;
   84|  99.1k|	u32 t;
   85|  99.1k|	int i;
   86|       |
   87|       |	/* copy state into S */
   88|   892k|	for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (88:14): [True: 793k, False: 99.1k]
  ------------------
   89|   793k|		S[i] = md->state[i];
   90|   793k|	}
   91|       |
   92|       |	/* copy the state into 512-bits into W[0..15] */
   93|  1.68M|	for (i = 0; i < 16; i++)
  ------------------
  |  Branch (93:14): [True: 1.58M, False: 99.1k]
  ------------------
   94|  1.58M|		W[i] = WPA_GET_BE32(buf + (4 * i));
   95|       |
   96|       |	/* fill W[16..63] */
   97|  4.85M|	for (i = 16; i < 64; i++) {
  ------------------
  |  Branch (97:15): [True: 4.76M, False: 99.1k]
  ------------------
   98|  4.76M|		W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
  ------------------
  |  |   78|  4.76M|#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
  |  |  ------------------
  |  |  |  |   73|  4.76M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|  4.76M|#define RORc(x, y) \
  |  |  |  |  |  |   69|  4.76M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |   70|  4.76M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
  |  |  ------------------
  |  |  |  |   73|  4.76M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|  4.76M|#define RORc(x, y) \
  |  |  |  |  |  |   69|  4.76M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |   70|  4.76M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
  |  |  ------------------
  |  |  |  |   74|  4.76M|#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
  |  |  ------------------
  ------------------
              		W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
  ------------------
  |  |   77|  4.76M|#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
  |  |  ------------------
  |  |  |  |   73|  4.76M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|  4.76M|#define RORc(x, y) \
  |  |  |  |  |  |   69|  4.76M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |   70|  4.76M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
  |  |  ------------------
  |  |  |  |   73|  4.76M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|  4.76M|#define RORc(x, y) \
  |  |  |  |  |  |   69|  4.76M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |   70|  4.76M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
  |  |  ------------------
  |  |  |  |   74|  4.76M|#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
  |  |  ------------------
  ------------------
   99|  4.76M|			W[i - 16];
  100|  4.76M|	}
  101|       |
  102|       |	/* Compress */
  103|  99.1k|#define RND(a,b,c,d,e,f,g,h,i)                          \
  104|  99.1k|	t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];	\
  105|  99.1k|	t1 = Sigma0(a) + Maj(a, b, c);			\
  106|  99.1k|	d += t0;					\
  107|  99.1k|	h  = t0 + t1;
  108|       |
  109|  6.44M|	for (i = 0; i < 64; ++i) {
  ------------------
  |  Branch (109:14): [True: 6.34M, False: 99.1k]
  ------------------
  110|  6.34M|		RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i);
  ------------------
  |  |  104|  6.34M|	t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];	\
  |  |  ------------------
  |  |  |  |   76|  6.34M|#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|  6.34M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|  6.34M|#define RORc(x, y) \
  |  |  |  |  |  |  |  |   69|  6.34M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |  |  |   70|  6.34M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|  6.34M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|  6.34M|#define RORc(x, y) \
  |  |  |  |  |  |  |  |   69|  6.34M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |  |  |   70|  6.34M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|  6.34M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|  6.34M|#define RORc(x, y) \
  |  |  |  |  |  |  |  |   69|  6.34M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |  |  |   70|  6.34M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];	\
  |  |  ------------------
  |  |  |  |   71|  6.34M|#define Ch(x,y,z)       (z ^ (x & (y ^ z)))
  |  |  ------------------
  |  |  105|  6.34M|	t1 = Sigma0(a) + Maj(a, b, c);			\
  |  |  ------------------
  |  |  |  |   75|  6.34M|#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|  6.34M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|  6.34M|#define RORc(x, y) \
  |  |  |  |  |  |  |  |   69|  6.34M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |  |  |   70|  6.34M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|  6.34M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|  6.34M|#define RORc(x, y) \
  |  |  |  |  |  |  |  |   69|  6.34M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |  |  |   70|  6.34M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |               #define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|  6.34M|#define S(x, n)         RORc((x), (n))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|  6.34M|#define RORc(x, y) \
  |  |  |  |  |  |  |  |   69|  6.34M|( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  |  |  |  |  |  |  |  |   70|  6.34M|   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               	t1 = Sigma0(a) + Maj(a, b, c);			\
  |  |  ------------------
  |  |  |  |   72|  6.34M|#define Maj(x,y,z)      (((x | y) & z) | (x & y))
  |  |  ------------------
  |  |  106|  6.34M|	d += t0;					\
  |  |  107|  6.34M|	h  = t0 + t1;
  ------------------
  111|  6.34M|		t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
  112|  6.34M|		S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
  113|  6.34M|	}
  114|       |
  115|       |	/* feedback */
  116|   892k|	for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (116:14): [True: 793k, False: 99.1k]
  ------------------
  117|   793k|		md->state[i] = md->state[i] + S[i];
  118|   793k|	}
  119|  99.1k|	return 0;
  120|  99.1k|}

tls_prf_sha256:
   31|    554|{
   32|    554|	size_t clen;
   33|    554|	u8 A[SHA256_MAC_LEN];
   34|    554|	u8 P[SHA256_MAC_LEN];
   35|    554|	size_t pos;
   36|    554|	const unsigned char *addr[3];
   37|    554|	size_t len[3];
   38|       |
   39|    554|	addr[0] = A;
   40|    554|	len[0] = SHA256_MAC_LEN;
  ------------------
  |  |   12|    554|#define SHA256_MAC_LEN 32
  ------------------
   41|    554|	addr[1] = (unsigned char *) label;
   42|    554|	len[1] = os_strlen(label);
  ------------------
  |  |  536|    554|#define os_strlen(s) strlen(s)
  ------------------
   43|    554|	addr[2] = seed;
   44|    554|	len[2] = seed_len;
   45|       |
   46|       |	/*
   47|       |	 * RFC 5246, Chapter 5
   48|       |	 * A(0) = seed, A(i) = HMAC(secret, A(i-1))
   49|       |	 * P_hash = HMAC(secret, A(1) + seed) + HMAC(secret, A(2) + seed) + ..
   50|       |	 * PRF(secret, label, seed) = P_SHA256(secret, label + seed)
   51|       |	 */
   52|       |
   53|    554|	if (hmac_sha256_vector(secret, secret_len, 2, &addr[1], &len[1], A) < 0)
  ------------------
  |  Branch (53:6): [True: 0, False: 554]
  ------------------
   54|      0|		return -1;
   55|       |
   56|    554|	pos = 0;
   57|  1.67k|	while (pos < outlen) {
  ------------------
  |  Branch (57:9): [True: 1.12k, False: 554]
  ------------------
   58|  1.12k|		if (hmac_sha256_vector(secret, secret_len, 3, addr, len, P) <
  ------------------
  |  Branch (58:7): [True: 0, False: 1.12k]
  ------------------
   59|  1.12k|		    0 ||
   60|  1.12k|		    hmac_sha256(secret, secret_len, A, SHA256_MAC_LEN, A) < 0)
  ------------------
  |  |   12|  1.12k|#define SHA256_MAC_LEN 32
  ------------------
  |  Branch (60:7): [True: 0, False: 1.12k]
  ------------------
   61|      0|			return -1;
   62|       |
   63|  1.12k|		clen = outlen - pos;
   64|  1.12k|		if (clen > SHA256_MAC_LEN)
  ------------------
  |  |   12|  1.12k|#define SHA256_MAC_LEN 32
  ------------------
  |  Branch (64:7): [True: 568, False: 554]
  ------------------
   65|    568|			clen = SHA256_MAC_LEN;
  ------------------
  |  |   12|    568|#define SHA256_MAC_LEN 32
  ------------------
   66|  1.12k|		os_memcpy(out + pos, P, clen);
  ------------------
  |  |  523|  1.12k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   67|  1.12k|		pos += clen;
   68|  1.12k|	}
   69|       |
   70|    554|	return 0;
   71|    554|}

hmac_sha256_vector:
   28|  2.79k|{
   29|  2.79k|	unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */
   30|  2.79k|	unsigned char tk[32];
   31|  2.79k|	const u8 *_addr[HMAC_VECTOR_MAX_ELEM + 1];
   32|  2.79k|	size_t _len[HMAC_VECTOR_MAX_ELEM + 1], i;
   33|  2.79k|	int ret;
   34|       |
   35|  2.79k|	if (num_elem > HMAC_VECTOR_MAX_ELEM) {
  ------------------
  |  |   24|  2.79k|#define HMAC_VECTOR_MAX_ELEM 11
  ------------------
  |  Branch (35:6): [True: 0, False: 2.79k]
  ------------------
   36|       |		/*
   37|       |		 * Fixed limit on the number of fragments to avoid having to
   38|       |		 * allocate memory (which could fail).
   39|       |		 */
   40|      0|		return -1;
   41|      0|	}
   42|       |
   43|       |        /* if key is longer than 64 bytes reset it to key = SHA256(key) */
   44|  2.79k|        if (key_len > 64) {
  ------------------
  |  Branch (44:13): [True: 255, False: 2.54k]
  ------------------
   45|    255|		if (sha256_vector(1, &key, &key_len, tk) < 0)
  ------------------
  |  Branch (45:7): [True: 0, False: 255]
  ------------------
   46|      0|			return -1;
   47|    255|		key = tk;
   48|    255|		key_len = 32;
   49|    255|        }
   50|       |
   51|       |	/* the HMAC_SHA256 transform looks like:
   52|       |	 *
   53|       |	 * SHA256(K XOR opad, SHA256(K XOR ipad, text))
   54|       |	 *
   55|       |	 * where K is an n byte key
   56|       |	 * ipad is the byte 0x36 repeated 64 times
   57|       |	 * opad is the byte 0x5c repeated 64 times
   58|       |	 * and text is the data being protected */
   59|       |
   60|       |	/* start out by storing key in ipad */
   61|  2.79k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  2.79k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   62|  2.79k|	os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  2.79k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   63|       |	/* XOR key with ipad values */
   64|   181k|	for (i = 0; i < 64; i++)
  ------------------
  |  Branch (64:14): [True: 179k, False: 2.79k]
  ------------------
   65|   179k|		k_pad[i] ^= 0x36;
   66|       |
   67|       |	/* perform inner SHA256 */
   68|  2.79k|	_addr[0] = k_pad;
   69|  2.79k|	_len[0] = 64;
   70|  8.39k|	for (i = 0; i < num_elem; i++) {
  ------------------
  |  Branch (70:14): [True: 5.59k, False: 2.79k]
  ------------------
   71|  5.59k|		_addr[i + 1] = addr[i];
   72|  5.59k|		_len[i + 1] = len[i];
   73|  5.59k|	}
   74|  2.79k|	ret = sha256_vector(1 + num_elem, _addr, _len, mac);
   75|  2.79k|	if (ret < 0)
  ------------------
  |  Branch (75:6): [True: 0, False: 2.79k]
  ------------------
   76|      0|		goto fail;
   77|       |
   78|  2.79k|	os_memset(k_pad, 0, sizeof(k_pad));
  ------------------
  |  |  529|  2.79k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   79|  2.79k|	os_memcpy(k_pad, key, key_len);
  ------------------
  |  |  523|  2.79k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   80|       |	/* XOR key with opad values */
   81|   181k|	for (i = 0; i < 64; i++)
  ------------------
  |  Branch (81:14): [True: 179k, False: 2.79k]
  ------------------
   82|   179k|		k_pad[i] ^= 0x5c;
   83|       |
   84|       |	/* perform outer SHA256 */
   85|  2.79k|	_addr[0] = k_pad;
   86|  2.79k|	_len[0] = 64;
   87|  2.79k|	_addr[1] = mac;
   88|  2.79k|	_len[1] = SHA256_MAC_LEN;
  ------------------
  |  |   12|  2.79k|#define SHA256_MAC_LEN 32
  ------------------
   89|       |
   90|  2.79k|	ret = sha256_vector(2, _addr, _len, mac);
   91|       |
   92|  2.79k|fail:
   93|  2.79k|	forced_memzero(k_pad, sizeof(k_pad));
   94|  2.79k|	forced_memzero(tk, sizeof(tk));
   95|       |
   96|  2.79k|	return ret;
   97|  2.79k|}
hmac_sha256:
  111|  1.12k|{
  112|  1.12k|	return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac);
  113|  1.12k|}

sha384_init:
   53|    144|{
   54|    144|	md->curlen = 0;
   55|    144|	md->length = 0;
   56|    144|	md->state[0] = CONST64(0xcbbb9d5dc1059ed8);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   57|    144|	md->state[1] = CONST64(0x629a292a367cd507);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   58|    144|	md->state[2] = CONST64(0x9159015a3070dd17);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   59|    144|	md->state[3] = CONST64(0x152fecd8f70e5939);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   60|    144|	md->state[4] = CONST64(0x67332667ffc00b31);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   61|    144|	md->state[5] = CONST64(0x8eb44a8768581511);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   62|    144|	md->state[6] = CONST64(0xdb0c2e0d64f98fa7);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   63|    144|	md->state[7] = CONST64(0x47b5481dbefa4fa4);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
   64|    144|}
sha384_process:
   68|    432|{
   69|    432|	return sha512_process(md, in, inlen);
   70|    432|}
sha384_done:
   79|    144|{
   80|    144|	unsigned char buf[64];
   81|       |
   82|    144|	if (md->curlen >= sizeof(md->buf))
  ------------------
  |  Branch (82:6): [True: 0, False: 144]
  ------------------
   83|      0|		return -1;
   84|       |
   85|    144|	if (sha512_done(md, buf) != 0)
  ------------------
  |  Branch (85:6): [True: 0, False: 144]
  ------------------
   86|      0|		return -1;
   87|       |
   88|    144|	os_memcpy(out, buf, 48);
  ------------------
  |  |  523|    144|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   89|    144|	return 0;
   90|    144|}

sha512_process:
  185|    432|{
  186|    432|	unsigned long n;
  187|       |
  188|    432|	if (md->curlen >= sizeof(md->buf))
  ------------------
  |  Branch (188:6): [True: 0, False: 432]
  ------------------
  189|      0|		return -1;
  190|       |
  191|  1.38k|	while (inlen > 0) {
  ------------------
  |  Branch (191:9): [True: 952, False: 432]
  ------------------
  192|    952|		if (md->curlen == 0 && inlen >= SHA512_BLOCK_SIZE) {
  ------------------
  |  |   12|    664|#define SHA512_BLOCK_SIZE 128
  ------------------
  |  Branch (192:7): [True: 664, False: 288]
  |  Branch (192:26): [True: 376, False: 288]
  ------------------
  193|    376|			if (sha512_compress(md, (unsigned char *) in) < 0)
  ------------------
  |  Branch (193:8): [True: 0, False: 376]
  ------------------
  194|      0|				return -1;
  195|    376|			md->length += SHA512_BLOCK_SIZE * 8;
  ------------------
  |  |   12|    376|#define SHA512_BLOCK_SIZE 128
  ------------------
  196|    376|			in += SHA512_BLOCK_SIZE;
  ------------------
  |  |   12|    376|#define SHA512_BLOCK_SIZE 128
  ------------------
  197|    376|			inlen -= SHA512_BLOCK_SIZE;
  ------------------
  |  |   12|    376|#define SHA512_BLOCK_SIZE 128
  ------------------
  198|    576|		} else {
  199|    576|			n = MIN(inlen, (SHA512_BLOCK_SIZE - md->curlen));
  ------------------
  |  |  468|    576|#define MIN(a, b) ((a) < (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (468:20): [True: 432, False: 144]
  |  |  ------------------
  ------------------
  200|    576|			os_memcpy(md->buf + md->curlen, in, n);
  ------------------
  |  |  523|    576|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  201|    576|			md->curlen += n;
  202|    576|			in += n;
  203|    576|			inlen -= n;
  204|    576|			if (md->curlen == SHA512_BLOCK_SIZE) {
  ------------------
  |  |   12|    576|#define SHA512_BLOCK_SIZE 128
  ------------------
  |  Branch (204:8): [True: 144, False: 432]
  ------------------
  205|    144|				if (sha512_compress(md, md->buf) < 0)
  ------------------
  |  Branch (205:9): [True: 0, False: 144]
  ------------------
  206|      0|					return -1;
  207|    144|				md->length += 8 * SHA512_BLOCK_SIZE;
  ------------------
  |  |   12|    144|#define SHA512_BLOCK_SIZE 128
  ------------------
  208|    144|				md->curlen = 0;
  209|    144|			}
  210|    576|		}
  211|    952|	}
  212|       |
  213|    432|	return 0;
  214|    432|}
sha512_done:
  224|    144|{
  225|    144|	int i;
  226|       |
  227|    144|	if (md->curlen >= sizeof(md->buf))
  ------------------
  |  Branch (227:6): [True: 0, False: 144]
  ------------------
  228|      0|		return -1;
  229|       |
  230|       |	/* increase the length of the message */
  231|    144|	md->length += md->curlen * CONST64(8);
  ------------------
  |  |   45|    144|#define CONST64(n) n ## ULL
  ------------------
  232|       |
  233|       |	/* append the '1' bit */
  234|    144|	md->buf[md->curlen++] = (unsigned char) 0x80;
  235|       |
  236|       |	/* if the length is currently above 112 bytes we append zeros
  237|       |	 * then compress.  Then we can fall back to padding zeros and length
  238|       |	 * encoding like normal.
  239|       |	 */
  240|    144|	if (md->curlen > 112) {
  ------------------
  |  Branch (240:6): [True: 4, False: 140]
  ------------------
  241|     28|		while (md->curlen < 128) {
  ------------------
  |  Branch (241:10): [True: 24, False: 4]
  ------------------
  242|     24|			md->buf[md->curlen++] = (unsigned char) 0;
  243|     24|		}
  244|      4|		sha512_compress(md, md->buf);
  245|      4|		md->curlen = 0;
  246|      4|	}
  247|       |
  248|       |	/* pad up to 120 bytes of zeroes
  249|       |	 * note: that from 112 to 120 is the 64 MSB of the length.  We assume
  250|       |	 * that you won't hash > 2^64 bits of data... :-)
  251|       |	 */
  252|  7.23k|	while (md->curlen < 120) {
  ------------------
  |  Branch (252:9): [True: 7.09k, False: 144]
  ------------------
  253|  7.09k|		md->buf[md->curlen++] = (unsigned char) 0;
  254|  7.09k|	}
  255|       |
  256|       |	/* store length */
  257|    144|	WPA_PUT_BE64(md->buf + 120, md->length);
  258|    144|	sha512_compress(md, md->buf);
  259|       |
  260|       |	/* copy output */
  261|  1.29k|	for (i = 0; i < 8; i++)
  ------------------
  |  Branch (261:14): [True: 1.15k, False: 144]
  ------------------
  262|  1.15k|		WPA_PUT_BE64(out + (8 * i), md->state[i]);
  263|       |
  264|    144|	return 0;
  265|    144|}
sha512-internal.c:sha512_compress:
  108|    668|{
  109|    668|	u64 S[8], t0, t1;
  110|    668|	u64 *W;
  111|    668|	int i;
  112|       |
  113|    668|	W = os_malloc(80 * sizeof(u64));
  ------------------
  |  |  505|    668|#define os_malloc(s) malloc((s))
  ------------------
  114|    668|	if (!W)
  ------------------
  |  Branch (114:6): [True: 0, False: 668]
  ------------------
  115|      0|		return -1;
  116|       |
  117|       |	/* copy state into S */
  118|  6.01k|	for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (118:14): [True: 5.34k, False: 668]
  ------------------
  119|  5.34k|		S[i] = md->state[i];
  120|  5.34k|	}
  121|       |
  122|       |	/* copy the state into 1024-bits into W[0..15] */
  123|  11.3k|	for (i = 0; i < 16; i++)
  ------------------
  |  Branch (123:14): [True: 10.6k, False: 668]
  ------------------
  124|  10.6k|		W[i] = WPA_GET_BE64(buf + (8 * i));
  125|       |
  126|       |	/* fill W[16..79] */
  127|  43.4k|	for (i = 16; i < 80; i++) {
  ------------------
  |  Branch (127:15): [True: 42.7k, False: 668]
  ------------------
  128|  42.7k|		W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
  ------------------
  |  |   99|  42.7k|#define Gamma1(x)       (S(x, 19) ^ S(x, 61) ^ R(x, 6))
  |  |  ------------------
  |  |  |  |   94|  42.7k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  42.7k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  42.7k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  42.7k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma1(x)       (S(x, 19) ^ S(x, 61) ^ R(x, 6))
  |  |  ------------------
  |  |  |  |   94|  42.7k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  42.7k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  42.7k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  42.7k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma1(x)       (S(x, 19) ^ S(x, 61) ^ R(x, 6))
  |  |  ------------------
  |  |  |  |   95|  42.7k|#define R(x, n)         (((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) n))
  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
  ------------------
  |  |   98|  42.7k|#define Gamma0(x)       (S(x, 1) ^ S(x, 8) ^ R(x, 7))
  |  |  ------------------
  |  |  |  |   94|  42.7k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  42.7k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  42.7k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  42.7k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma0(x)       (S(x, 1) ^ S(x, 8) ^ R(x, 7))
  |  |  ------------------
  |  |  |  |   94|  42.7k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  42.7k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  42.7k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  42.7k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Gamma0(x)       (S(x, 1) ^ S(x, 8) ^ R(x, 7))
  |  |  ------------------
  |  |  |  |   95|  42.7k|#define R(x, n)         (((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) n))
  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  42.7k|#define CONST64(n) n ## ULL
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  129|  42.7k|			W[i - 16];
  130|  42.7k|	}
  131|       |
  132|       |	/* Compress */
  133|  54.1k|	for (i = 0; i < 80; i++) {
  ------------------
  |  Branch (133:14): [True: 53.4k, False: 668]
  ------------------
  134|  53.4k|		t0 = S[7] + Sigma1(S[4]) + Ch(S[4], S[5], S[6]) + K[i] + W[i];
  ------------------
  |  |   97|  53.4k|#define Sigma1(x)       (S(x, 14) ^ S(x, 18) ^ S(x, 41))
  |  |  ------------------
  |  |  |  |   94|  53.4k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  53.4k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  53.4k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  53.4k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Sigma1(x)       (S(x, 14) ^ S(x, 18) ^ S(x, 41))
  |  |  ------------------
  |  |  |  |   94|  53.4k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  53.4k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  53.4k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  53.4k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Sigma1(x)       (S(x, 14) ^ S(x, 18) ^ S(x, 41))
  |  |  ------------------
  |  |  |  |   94|  53.4k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  53.4k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  53.4k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  53.4k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		t0 = S[7] + Sigma1(S[4]) + Ch(S[4], S[5], S[6]) + K[i] + W[i];
  ------------------
  |  |   92|  53.4k|#define Ch(x,y,z)       (z ^ (x & (y ^ z)))
  ------------------
  135|  53.4k|		t1 = Sigma0(S[0]) + Maj(S[0], S[1], S[2]);
  ------------------
  |  |   96|  53.4k|#define Sigma0(x)       (S(x, 28) ^ S(x, 34) ^ S(x, 39))
  |  |  ------------------
  |  |  |  |   94|  53.4k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  53.4k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  53.4k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  53.4k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Sigma0(x)       (S(x, 28) ^ S(x, 34) ^ S(x, 39))
  |  |  ------------------
  |  |  |  |   94|  53.4k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  53.4k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  53.4k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  53.4k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define Sigma0(x)       (S(x, 28) ^ S(x, 34) ^ S(x, 39))
  |  |  ------------------
  |  |  |  |   94|  53.4k|#define S(x, n)         ROR64c(x, n)
  |  |  |  |  ------------------
  |  |  |  |  |  |  102|  53.4k|    ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                   ( ((((x) & CONST64(0xFFFFFFFFFFFFFFFF)) >> ((u64) (y) & CONST64(63))) | \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  103|  53.4k|      ((x) << ((u64) (64 - ((y) & CONST64(63)))))) & \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  104|  53.4k|      CONST64(0xFFFFFFFFFFFFFFFF))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|  53.4k|#define CONST64(n) n ## ULL
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		t1 = Sigma0(S[0]) + Maj(S[0], S[1], S[2]);
  ------------------
  |  |   93|  53.4k|#define Maj(x,y,z)      (((x | y) & z) | (x & y))
  ------------------
  136|  53.4k|		S[7] = S[6];
  137|  53.4k|		S[6] = S[5];
  138|  53.4k|		S[5] = S[4];
  139|  53.4k|		S[4] = S[3] + t0;
  140|  53.4k|		S[3] = S[2];
  141|  53.4k|		S[2] = S[1];
  142|  53.4k|		S[1] = S[0];
  143|  53.4k|		S[0] = t0 + t1;
  144|  53.4k|	}
  145|       |
  146|       |	/* feedback */
  147|  6.01k|	for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (147:14): [True: 5.34k, False: 668]
  ------------------
  148|  5.34k|		md->state[i] = md->state[i] + S[i];
  149|  5.34k|	}
  150|       |
  151|    668|	os_free(W);
  ------------------
  |  |  511|    668|#define os_free(p) free((p))
  ------------------
  152|    668|	return 0;
  153|    668|}

tls_init:
   41|  3.10k|{
   42|  3.10k|	struct tls_global *global;
   43|       |
   44|  3.10k|	if (tls_ref_count == 0) {
  ------------------
  |  Branch (44:6): [True: 3.10k, False: 0]
  ------------------
   45|  3.10k|#ifdef CONFIG_TLS_INTERNAL_CLIENT
   46|  3.10k|		if (tlsv1_client_global_init())
  ------------------
  |  Branch (46:7): [True: 0, False: 3.10k]
  ------------------
   47|      0|			return NULL;
   48|  3.10k|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
   49|  3.10k|#ifdef CONFIG_TLS_INTERNAL_SERVER
   50|  3.10k|		if (tlsv1_server_global_init())
  ------------------
  |  Branch (50:7): [True: 0, False: 3.10k]
  ------------------
   51|      0|			return NULL;
   52|  3.10k|#endif /* CONFIG_TLS_INTERNAL_SERVER */
   53|  3.10k|	}
   54|  3.10k|	tls_ref_count++;
   55|       |
   56|  3.10k|	global = os_zalloc(sizeof(*global));
   57|  3.10k|	if (global == NULL)
  ------------------
  |  Branch (57:6): [True: 0, False: 3.10k]
  ------------------
   58|      0|		return NULL;
   59|  3.10k|	if (conf) {
  ------------------
  |  Branch (59:6): [True: 3.10k, False: 0]
  ------------------
   60|  3.10k|		global->event_cb = conf->event_cb;
   61|  3.10k|		global->cb_ctx = conf->cb_ctx;
   62|  3.10k|		global->cert_in_cb = conf->cert_in_cb;
   63|  3.10k|	}
   64|       |
   65|  3.10k|	return global;
   66|  3.10k|}
tls_deinit:
   69|  3.10k|{
   70|  3.10k|	struct tls_global *global = ssl_ctx;
   71|  3.10k|	tls_ref_count--;
   72|  3.10k|	if (tls_ref_count == 0) {
  ------------------
  |  Branch (72:6): [True: 3.10k, False: 0]
  ------------------
   73|  3.10k|#ifdef CONFIG_TLS_INTERNAL_CLIENT
   74|  3.10k|		tlsv1_client_global_deinit();
   75|  3.10k|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
   76|  3.10k|#ifdef CONFIG_TLS_INTERNAL_SERVER
   77|  3.10k|		tlsv1_server_global_deinit();
   78|  3.10k|#endif /* CONFIG_TLS_INTERNAL_SERVER */
   79|  3.10k|	}
   80|  3.10k|#ifdef CONFIG_TLS_INTERNAL_SERVER
   81|  3.10k|	tlsv1_cred_free(global->server_cred);
   82|  3.10k|#endif /* CONFIG_TLS_INTERNAL_SERVER */
   83|  3.10k|	os_free(global);
  ------------------
  |  |  511|  3.10k|#define os_free(p) free((p))
  ------------------
   84|  3.10k|}
tls_connection_init:
   94|  3.10k|{
   95|  3.10k|	struct tls_connection *conn;
   96|  3.10k|	struct tls_global *global = tls_ctx;
   97|       |
   98|  3.10k|	conn = os_zalloc(sizeof(*conn));
   99|  3.10k|	if (conn == NULL)
  ------------------
  |  Branch (99:6): [True: 0, False: 3.10k]
  ------------------
  100|      0|		return NULL;
  101|  3.10k|	conn->global = global;
  102|       |
  103|  3.10k|#ifdef CONFIG_TLS_INTERNAL_CLIENT
  104|  3.10k|	if (!global->server) {
  ------------------
  |  Branch (104:6): [True: 3.10k, False: 0]
  ------------------
  105|  3.10k|		conn->client = tlsv1_client_init();
  106|  3.10k|		if (conn->client == NULL) {
  ------------------
  |  Branch (106:7): [True: 0, False: 3.10k]
  ------------------
  107|      0|			os_free(conn);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  108|      0|			return NULL;
  109|      0|		}
  110|  3.10k|		tlsv1_client_set_cb(conn->client, global->event_cb,
  111|  3.10k|				    global->cb_ctx, global->cert_in_cb);
  112|  3.10k|	}
  113|  3.10k|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
  114|  3.10k|#ifdef CONFIG_TLS_INTERNAL_SERVER
  115|  3.10k|	if (global->server) {
  ------------------
  |  Branch (115:6): [True: 0, False: 3.10k]
  ------------------
  116|      0|		conn->server = tlsv1_server_init(global->server_cred);
  117|      0|		if (conn->server == NULL) {
  ------------------
  |  Branch (117:7): [True: 0, False: 0]
  ------------------
  118|      0|			os_free(conn);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  119|      0|			return NULL;
  120|      0|		}
  121|      0|	}
  122|  3.10k|#endif /* CONFIG_TLS_INTERNAL_SERVER */
  123|       |
  124|  3.10k|	return conn;
  125|  3.10k|}
tls_connection_deinit:
  151|  3.10k|{
  152|  3.10k|	if (conn == NULL)
  ------------------
  |  Branch (152:6): [True: 0, False: 3.10k]
  ------------------
  153|      0|		return;
  154|  3.10k|#ifdef CONFIG_TLS_INTERNAL_CLIENT
  155|  3.10k|	if (conn->client)
  ------------------
  |  Branch (155:6): [True: 3.10k, False: 0]
  ------------------
  156|  3.10k|		tlsv1_client_deinit(conn->client);
  157|  3.10k|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
  158|  3.10k|#ifdef CONFIG_TLS_INTERNAL_SERVER
  159|  3.10k|	if (conn->server)
  ------------------
  |  Branch (159:6): [True: 0, False: 3.10k]
  ------------------
  160|      0|		tlsv1_server_deinit(conn->server);
  161|  3.10k|#endif /* CONFIG_TLS_INTERNAL_SERVER */
  162|  3.10k|	os_free(conn);
  ------------------
  |  |  511|  3.10k|#define os_free(p) free((p))
  ------------------
  163|  3.10k|}
tls_connection_established:
  167|   129k|{
  168|   129k|#ifdef CONFIG_TLS_INTERNAL_CLIENT
  169|   129k|	if (conn->client)
  ------------------
  |  Branch (169:6): [True: 129k, False: 0]
  ------------------
  170|   129k|		return tlsv1_client_established(conn->client);
  171|      0|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
  172|      0|#ifdef CONFIG_TLS_INTERNAL_SERVER
  173|      0|	if (conn->server)
  ------------------
  |  Branch (173:6): [True: 0, False: 0]
  ------------------
  174|      0|		return tlsv1_server_established(conn->server);
  175|      0|#endif /* CONFIG_TLS_INTERNAL_SERVER */
  176|      0|	return 0;
  177|      0|}
tls_connection_handshake:
  468|  66.6k|{
  469|  66.6k|	return tls_connection_handshake2(tls_ctx, conn, in_data, appl_data,
  470|       |					 NULL);
  471|  66.6k|}
tls_connection_handshake2:
  479|  66.6k|{
  480|  66.6k|#ifdef CONFIG_TLS_INTERNAL_CLIENT
  481|  66.6k|	u8 *res, *ad;
  482|  66.6k|	size_t res_len, ad_len;
  483|  66.6k|	struct wpabuf *out;
  484|       |
  485|  66.6k|	if (conn->client == NULL)
  ------------------
  |  Branch (485:6): [True: 0, False: 66.6k]
  ------------------
  486|      0|		return NULL;
  487|       |
  488|  66.6k|	ad = NULL;
  489|  66.6k|	res = tlsv1_client_handshake(conn->client,
  490|  66.6k|				     in_data ? wpabuf_head(in_data) : NULL,
  ------------------
  |  Branch (490:10): [True: 63.5k, False: 3.10k]
  ------------------
  491|  66.6k|				     in_data ? wpabuf_len(in_data) : 0,
  ------------------
  |  Branch (491:10): [True: 63.5k, False: 3.10k]
  ------------------
  492|  66.6k|				     &res_len, &ad, &ad_len, need_more_data);
  493|  66.6k|	if (res == NULL)
  ------------------
  |  Branch (493:6): [True: 217, False: 66.3k]
  ------------------
  494|    217|		return NULL;
  495|  66.3k|	out = wpabuf_alloc_ext_data(res, res_len);
  496|  66.3k|	if (out == NULL) {
  ------------------
  |  Branch (496:6): [True: 0, False: 66.3k]
  ------------------
  497|      0|		os_free(res);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  498|      0|		os_free(ad);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  499|      0|		return NULL;
  500|      0|	}
  501|  66.3k|	if (appl_data) {
  ------------------
  |  Branch (501:6): [True: 66.3k, False: 0]
  ------------------
  502|  66.3k|		if (ad) {
  ------------------
  |  Branch (502:7): [True: 0, False: 66.3k]
  ------------------
  503|      0|			*appl_data = wpabuf_alloc_ext_data(ad, ad_len);
  504|      0|			if (*appl_data == NULL)
  ------------------
  |  Branch (504:8): [True: 0, False: 0]
  ------------------
  505|      0|				os_free(ad);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  506|      0|		} else
  507|  66.3k|			*appl_data = NULL;
  508|  66.3k|	} else
  509|      0|		os_free(ad);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  510|       |
  511|  66.3k|	return out;
  512|       |#else /* CONFIG_TLS_INTERNAL_CLIENT */
  513|       |	return NULL;
  514|       |#endif /* CONFIG_TLS_INTERNAL_CLIENT */
  515|  66.3k|}
tls_connection_encrypt:
  556|     24|{
  557|     24|#ifdef CONFIG_TLS_INTERNAL_CLIENT
  558|     24|	if (conn->client) {
  ------------------
  |  Branch (558:6): [True: 24, False: 0]
  ------------------
  559|     24|		struct wpabuf *buf;
  560|     24|		int res;
  561|     24|		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
  562|     24|		if (buf == NULL)
  ------------------
  |  Branch (562:7): [True: 0, False: 24]
  ------------------
  563|      0|			return NULL;
  564|     24|		res = tlsv1_client_encrypt(conn->client, wpabuf_head(in_data),
  565|     24|					   wpabuf_len(in_data),
  566|     24|					   wpabuf_mhead(buf),
  567|     24|					   wpabuf_size(buf));
  568|     24|		if (res < 0) {
  ------------------
  |  Branch (568:7): [True: 0, False: 24]
  ------------------
  569|      0|			wpabuf_free(buf);
  570|      0|			return NULL;
  571|      0|		}
  572|     24|		wpabuf_put(buf, res);
  573|     24|		return buf;
  574|     24|	}
  575|      0|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
  576|      0|#ifdef CONFIG_TLS_INTERNAL_SERVER
  577|      0|	if (conn->server) {
  ------------------
  |  Branch (577:6): [True: 0, False: 0]
  ------------------
  578|      0|		struct wpabuf *buf;
  579|      0|		int res;
  580|      0|		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
  581|      0|		if (buf == NULL)
  ------------------
  |  Branch (581:7): [True: 0, False: 0]
  ------------------
  582|      0|			return NULL;
  583|      0|		res = tlsv1_server_encrypt(conn->server, wpabuf_head(in_data),
  584|      0|					   wpabuf_len(in_data),
  585|      0|					   wpabuf_mhead(buf),
  586|      0|					   wpabuf_size(buf));
  587|      0|		if (res < 0) {
  ------------------
  |  Branch (587:7): [True: 0, False: 0]
  ------------------
  588|      0|			wpabuf_free(buf);
  589|      0|			return NULL;
  590|      0|		}
  591|      0|		wpabuf_put(buf, res);
  592|      0|		return buf;
  593|      0|	}
  594|      0|#endif /* CONFIG_TLS_INTERNAL_SERVER */
  595|      0|	return NULL;
  596|      0|}
tls_connection_decrypt:
  602|     23|{
  603|       |	return tls_connection_decrypt2(tls_ctx, conn, in_data, NULL);
  604|     23|}
tls_connection_decrypt2:
  611|     23|{
  612|     23|	if (need_more_data)
  ------------------
  |  Branch (612:6): [True: 0, False: 23]
  ------------------
  613|      0|		*need_more_data = 0;
  614|       |
  615|     23|#ifdef CONFIG_TLS_INTERNAL_CLIENT
  616|     23|	if (conn->client) {
  ------------------
  |  Branch (616:6): [True: 23, False: 0]
  ------------------
  617|     23|		return tlsv1_client_decrypt(conn->client, wpabuf_head(in_data),
  618|     23|					    wpabuf_len(in_data),
  619|     23|					    need_more_data);
  620|     23|	}
  621|      0|#endif /* CONFIG_TLS_INTERNAL_CLIENT */
  622|      0|#ifdef CONFIG_TLS_INTERNAL_SERVER
  623|      0|	if (conn->server) {
  ------------------
  |  Branch (623:6): [True: 0, False: 0]
  ------------------
  624|      0|		struct wpabuf *buf;
  625|      0|		int res;
  626|      0|		buf = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3);
  627|      0|		if (buf == NULL)
  ------------------
  |  Branch (627:7): [True: 0, False: 0]
  ------------------
  628|      0|			return NULL;
  629|      0|		res = tlsv1_server_decrypt(conn->server, wpabuf_head(in_data),
  630|      0|					   wpabuf_len(in_data),
  631|      0|					   wpabuf_mhead(buf),
  632|      0|					   wpabuf_size(buf));
  633|      0|		if (res < 0) {
  ------------------
  |  Branch (633:7): [True: 0, False: 0]
  ------------------
  634|      0|			wpabuf_free(buf);
  635|      0|			return NULL;
  636|      0|		}
  637|      0|		wpabuf_put(buf, res);
  638|      0|		return buf;
  639|      0|	}
  640|      0|#endif /* CONFIG_TLS_INTERNAL_SERVER */
  641|      0|	return NULL;
  642|      0|}
tls_connection_get_failed:
  726|  66.3k|{
  727|  66.3k|#ifdef CONFIG_TLS_INTERNAL_SERVER
  728|  66.3k|	if (conn->server)
  ------------------
  |  Branch (728:6): [True: 0, False: 66.3k]
  ------------------
  729|      0|		return tlsv1_server_get_failed(conn->server);
  730|  66.3k|#endif /* CONFIG_TLS_INTERNAL_SERVER */
  731|  66.3k|	return 0;
  732|  66.3k|}

asn1_get_next:
  172|   151k|{
  173|   151k|	const u8 *pos, *end;
  174|   151k|	u8 tmp;
  175|       |
  176|   151k|	os_memset(hdr, 0, sizeof(*hdr));
  ------------------
  |  |  529|   151k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  177|   151k|	pos = buf;
  178|   151k|	end = buf + len;
  179|       |
  180|   151k|	if (pos >= end) {
  ------------------
  |  Branch (180:6): [True: 69, False: 150k]
  ------------------
  181|     69|		wpa_printf(MSG_DEBUG, "ASN.1: No room for Identifier");
  182|     69|		return -1;
  183|     69|	}
  184|   150k|	hdr->identifier = *pos++;
  185|   150k|	hdr->class = hdr->identifier >> 6;
  186|   150k|	hdr->constructed = !!(hdr->identifier & (1 << 5));
  187|       |
  188|   150k|	if ((hdr->identifier & 0x1f) == 0x1f) {
  ------------------
  |  Branch (188:6): [True: 359, False: 150k]
  ------------------
  189|    359|		size_t ext_len = 0;
  190|       |
  191|    359|		hdr->tag = 0;
  192|    359|		if (pos == end || (*pos & 0x7f) == 0) {
  ------------------
  |  Branch (192:7): [True: 10, False: 349]
  |  Branch (192:21): [True: 5, False: 344]
  ------------------
  193|     15|			wpa_printf(MSG_DEBUG,
  194|     15|				   "ASN.1: Invalid extended tag (first octet has to be included with at least one nonzero bit for the tag value)");
  195|     15|			return -1;
  196|     15|		}
  197|  1.70k|		do {
  198|  1.70k|			if (pos >= end) {
  ------------------
  |  Branch (198:8): [True: 6, False: 1.69k]
  ------------------
  199|      6|				wpa_printf(MSG_DEBUG, "ASN.1: Identifier "
  200|      6|					   "underflow");
  201|      6|				return -1;
  202|      6|			}
  203|  1.69k|			ext_len++;
  204|  1.69k|			tmp = *pos++;
  205|  1.69k|			wpa_printf(MSG_MSGDUMP, "ASN.1: Extended tag data: "
  206|  1.69k|				   "0x%02x", tmp);
  207|  1.69k|			hdr->tag = (hdr->tag << 7) | (tmp & 0x7f);
  208|  1.69k|		} while (tmp & 0x80);
  ------------------
  |  Branch (208:12): [True: 1.36k, False: 338]
  ------------------
  209|    338|		wpa_printf(MSG_MSGDUMP, "ASN.1: Extended Tag: 0x%x (len=%zu)",
  210|    338|			   hdr->tag, ext_len);
  211|    338|		if ((hdr->class != ASN1_CLASS_PRIVATE && hdr->tag < 31) ||
  ------------------
  |  |   46|    676|#define ASN1_CLASS_PRIVATE		3
  ------------------
  |  Branch (211:8): [True: 231, False: 107]
  |  Branch (211:44): [True: 5, False: 226]
  ------------------
  212|    333|		    ext_len * 7 > sizeof(hdr->tag) * 8) {
  ------------------
  |  Branch (212:7): [True: 38, False: 295]
  ------------------
  213|     43|			wpa_printf(MSG_DEBUG,
  214|     43|				   "ASN.1: Invalid or unsupported (too large) extended Tag: 0x%x (len=%zu)",
  215|     43|				   hdr->tag, ext_len);
  216|     43|			return -1;
  217|     43|		}
  218|    338|	} else
  219|   150k|		hdr->tag = hdr->identifier & 0x1f;
  220|       |
  221|   150k|	if (pos >= end) {
  ------------------
  |  Branch (221:6): [True: 31, False: 150k]
  ------------------
  222|     31|		wpa_printf(MSG_DEBUG, "ASN.1: No room for Length");
  223|     31|		return -1;
  224|     31|	}
  225|   150k|	tmp = *pos++;
  226|   150k|	if (tmp & 0x80) {
  ------------------
  |  Branch (226:6): [True: 15.2k, False: 135k]
  ------------------
  227|  15.2k|		if (tmp == 0xff) {
  ------------------
  |  Branch (227:7): [True: 25, False: 15.2k]
  ------------------
  228|     25|			wpa_printf(MSG_DEBUG, "ASN.1: Reserved length "
  229|     25|				   "value 0xff used");
  230|     25|			return -1;
  231|     25|		}
  232|  15.2k|		tmp &= 0x7f; /* number of subsequent octets */
  233|  15.2k|		hdr->length = 0;
  234|  15.2k|		if (tmp == 0 || pos == end || *pos == 0) {
  ------------------
  |  Branch (234:7): [True: 4, False: 15.2k]
  |  Branch (234:19): [True: 12, False: 15.2k]
  |  Branch (234:33): [True: 9, False: 15.2k]
  ------------------
  235|     25|			wpa_printf(MSG_DEBUG,
  236|     25|				   "ASN.1: Definite long form of the length does not start with a nonzero value");
  237|     25|			return -1;
  238|     25|		}
  239|  15.2k|		if (tmp > 4) {
  ------------------
  |  Branch (239:7): [True: 54, False: 15.1k]
  ------------------
  240|     54|			wpa_printf(MSG_DEBUG, "ASN.1: Too long length field");
  241|     54|			return -1;
  242|     54|		}
  243|  35.9k|		while (tmp--) {
  ------------------
  |  Branch (243:10): [True: 20.8k, False: 15.1k]
  ------------------
  244|  20.8k|			if (pos >= end) {
  ------------------
  |  Branch (244:8): [True: 3, False: 20.8k]
  ------------------
  245|      3|				wpa_printf(MSG_DEBUG, "ASN.1: Length "
  246|      3|					   "underflow");
  247|      3|				return -1;
  248|      3|			}
  249|  20.8k|			hdr->length = (hdr->length << 8) | *pos++;
  250|  20.8k|		}
  251|  15.1k|		if (hdr->length < 128) {
  ------------------
  |  Branch (251:7): [True: 11, False: 15.1k]
  ------------------
  252|     11|			wpa_printf(MSG_DEBUG,
  253|     11|				   "ASN.1: Definite long form of the length used with too short length");
  254|     11|			return -1;
  255|     11|		}
  256|   135k|	} else {
  257|       |		/* Short form - length 0..127 in one octet */
  258|   135k|		hdr->length = tmp;
  259|   135k|	}
  260|       |
  261|   150k|	if (end < pos || hdr->length > (unsigned int) (end - pos)) {
  ------------------
  |  Branch (261:6): [True: 0, False: 150k]
  |  Branch (261:19): [True: 252, False: 150k]
  ------------------
  262|    252|		wpa_printf(MSG_DEBUG, "ASN.1: Contents underflow");
  263|    252|		return -1;
  264|    252|	}
  265|       |
  266|   150k|	hdr->payload = pos;
  267|       |
  268|   150k|	if (!asn1_valid_der(hdr)) {
  ------------------
  |  Branch (268:6): [True: 127, False: 150k]
  ------------------
  269|    127|		asn1_print_hdr(hdr, "ASN.1: Invalid DER encoding: ");
  270|    127|		return -1;
  271|    127|	}
  272|   150k|	return 0;
  273|   150k|}
asn1_print_hdr:
  277|    127|{
  278|    127|	wpa_printf(MSG_DEBUG, "%sclass %d constructed %d tag 0x%x",
  279|    127|		   title, hdr->class, hdr->constructed, hdr->tag);
  280|    127|}
asn1_unexpected:
  284|  1.12k|{
  285|  1.12k|	wpa_printf(MSG_DEBUG, "%s - found class %d constructed %d tag 0x%x",
  286|  1.12k|		   title, hdr->class, hdr->constructed, hdr->tag);
  287|  1.12k|}
asn1_parse_oid:
  291|  31.6k|{
  292|  31.6k|	const u8 *pos, *end;
  293|  31.6k|	unsigned long val;
  294|  31.6k|	u8 tmp;
  295|       |
  296|  31.6k|	os_memset(oid, 0, sizeof(*oid));
  ------------------
  |  |  529|  31.6k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  297|       |
  298|  31.6k|	pos = buf;
  299|  31.6k|	end = buf + len;
  300|       |
  301|   156k|	while (pos < end) {
  ------------------
  |  Branch (301:9): [True: 124k, False: 31.5k]
  ------------------
  302|   124k|		val = 0;
  303|       |
  304|   166k|		do {
  305|   166k|			if (pos >= end)
  ------------------
  |  Branch (305:8): [True: 38, False: 166k]
  ------------------
  306|     38|				return -1;
  307|   166k|			tmp = *pos++;
  308|   166k|			val = (val << 7) | (tmp & 0x7f);
  309|   166k|		} while (tmp & 0x80);
  ------------------
  |  Branch (309:12): [True: 41.6k, False: 124k]
  ------------------
  310|       |
  311|   124k|		if (oid->len >= ASN1_MAX_OID_LEN) {
  ------------------
  |  |   55|   124k|#define ASN1_MAX_OID_LEN 20
  ------------------
  |  Branch (311:7): [True: 21, False: 124k]
  ------------------
  312|     21|			wpa_printf(MSG_DEBUG, "ASN.1: Too long OID value");
  313|     21|			return -1;
  314|     21|		}
  315|   124k|		if (oid->len == 0) {
  ------------------
  |  Branch (315:7): [True: 31.5k, False: 92.8k]
  ------------------
  316|       |			/*
  317|       |			 * The first octet encodes the first two object
  318|       |			 * identifier components in (X*40) + Y formula.
  319|       |			 * X = 0..2.
  320|       |			 */
  321|  31.5k|			oid->oid[0] = val / 40;
  322|  31.5k|			if (oid->oid[0] > 2)
  ------------------
  |  Branch (322:8): [True: 5.55k, False: 26.0k]
  ------------------
  323|  5.55k|				oid->oid[0] = 2;
  324|  31.5k|			oid->oid[1] = val - oid->oid[0] * 40;
  325|  31.5k|			oid->len = 2;
  326|  31.5k|		} else
  327|  92.8k|			oid->oid[oid->len++] = val;
  328|   124k|	}
  329|       |
  330|  31.5k|	return 0;
  331|  31.6k|}
asn1_get_oid:
  336|  31.6k|{
  337|  31.6k|	struct asn1_hdr hdr;
  338|       |
  339|  31.6k|	if (asn1_get_next(buf, len, &hdr) < 0 || hdr.length == 0 ||
  ------------------
  |  Branch (339:6): [True: 95, False: 31.5k]
  |  Branch (339:43): [True: 25, False: 31.4k]
  ------------------
  340|  31.4k|	    !asn1_is_oid(&hdr)) {
  ------------------
  |  Branch (340:6): [True: 28, False: 31.4k]
  ------------------
  341|    148|		asn1_unexpected(&hdr, "ASN.1: Expected OID");
  342|    148|		return -1;
  343|    148|	}
  344|       |
  345|  31.4k|	*next = hdr.payload + hdr.length;
  346|       |
  347|  31.4k|	return asn1_parse_oid(hdr.payload, hdr.length, oid);
  348|  31.6k|}
asn1_oid_to_str:
  352|  5.24k|{
  353|  5.24k|	char *pos = buf;
  354|  5.24k|	size_t i;
  355|  5.24k|	int ret;
  356|       |
  357|  5.24k|	if (len == 0)
  ------------------
  |  Branch (357:6): [True: 0, False: 5.24k]
  ------------------
  358|      0|		return;
  359|       |
  360|  5.24k|	buf[0] = '\0';
  361|       |
  362|  30.8k|	for (i = 0; i < oid->len; i++) {
  ------------------
  |  Branch (362:14): [True: 25.6k, False: 5.17k]
  ------------------
  363|  25.6k|		ret = os_snprintf(pos, buf + len - pos,
  ------------------
  |  |  572|  25.6k|#define os_snprintf snprintf
  ------------------
  364|  25.6k|				  "%s%lu",
  365|  25.6k|				  i == 0 ? "" : ".", oid->oid[i]);
  ------------------
  |  Branch (365:7): [True: 5.15k, False: 20.5k]
  ------------------
  366|  25.6k|		if (os_snprintf_error(buf + len - pos, ret))
  ------------------
  |  Branch (366:7): [True: 65, False: 25.6k]
  ------------------
  367|     65|			break;
  368|  25.6k|		pos += ret;
  369|  25.6k|	}
  370|  5.24k|	buf[len - 1] = '\0';
  371|  5.24k|}
asn1_bit_string_to_long:
  392|     65|{
  393|     65|	unsigned long val = 0;
  394|     65|	const u8 *pos = buf;
  395|       |
  396|       |	/* BER requires that unused bits are zero, so we can ignore the number
  397|       |	 * of unused bits */
  398|     65|	pos++;
  399|       |
  400|     65|	if (len >= 2)
  ------------------
  |  Branch (400:6): [True: 51, False: 14]
  ------------------
  401|     51|		val |= rotate_bits(*pos++);
  402|     65|	if (len >= 3)
  ------------------
  |  Branch (402:6): [True: 51, False: 14]
  ------------------
  403|     51|		val |= ((unsigned long) rotate_bits(*pos++)) << 8;
  404|     65|	if (len >= 4)
  ------------------
  |  Branch (404:6): [True: 45, False: 20]
  ------------------
  405|     45|		val |= ((unsigned long) rotate_bits(*pos++)) << 16;
  406|     65|	if (len >= 5)
  ------------------
  |  Branch (406:6): [True: 42, False: 23]
  ------------------
  407|     42|		val |= ((unsigned long) rotate_bits(*pos++)) << 24;
  408|     65|	if (len >= 6)
  ------------------
  |  Branch (408:6): [True: 36, False: 29]
  ------------------
  409|     36|		wpa_printf(MSG_DEBUG, "X509: %s - some bits ignored "
  410|     36|			   "(BIT STRING length %lu)",
  411|     36|			   __func__, (unsigned long) len);
  412|       |
  413|     65|	return val;
  414|     65|}
asn1.c:asn1_valid_der:
  127|   150k|{
  128|   150k|	if (hdr->class != ASN1_CLASS_UNIVERSAL)
  ------------------
  |  |   43|   150k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (128:6): [True: 5.56k, False: 144k]
  ------------------
  129|  5.56k|		return 1;
  130|   144k|	if (hdr->tag == ASN1_TAG_BOOLEAN && !asn1_valid_der_boolean(hdr))
  ------------------
  |  |   13|   289k|#define ASN1_TAG_BOOLEAN	0x01
  ------------------
  |  Branch (130:6): [True: 252, False: 144k]
  |  Branch (130:38): [True: 22, False: 230]
  ------------------
  131|     22|		return 0;
  132|   144k|	if (hdr->tag == ASN1_TAG_NULL && hdr->length != 0)
  ------------------
  |  |   17|   289k|#define ASN1_TAG_NULL		0x05
  ------------------
  |  Branch (132:6): [True: 193, False: 144k]
  |  Branch (132:35): [True: 11, False: 182]
  ------------------
  133|     11|		return 0;
  134|       |
  135|       |	/* Check for allowed primitive/constructed values */
  136|   144k|	if (hdr->constructed &&
  ------------------
  |  Branch (136:6): [True: 72.4k, False: 72.4k]
  ------------------
  137|  72.4k|	    (hdr->tag == ASN1_TAG_BOOLEAN ||
  ------------------
  |  |   13|   144k|#define ASN1_TAG_BOOLEAN	0x01
  ------------------
  |  Branch (137:7): [True: 1, False: 72.4k]
  ------------------
  138|  72.4k|	     hdr->tag == ASN1_TAG_INTEGER ||
  ------------------
  |  |   14|   144k|#define ASN1_TAG_INTEGER	0x02
  ------------------
  |  Branch (138:7): [True: 2, False: 72.4k]
  ------------------
  139|  72.4k|	     hdr->tag == ASN1_TAG_NULL ||
  ------------------
  |  |   17|   144k|#define ASN1_TAG_NULL		0x05
  ------------------
  |  Branch (139:7): [True: 1, False: 72.4k]
  ------------------
  140|  72.4k|	     hdr->tag == ASN1_TAG_OID ||
  ------------------
  |  |   18|   144k|#define ASN1_TAG_OID		0x06
  ------------------
  |  Branch (140:7): [True: 6, False: 72.4k]
  ------------------
  141|  72.4k|	     hdr->tag == ANS1_TAG_RELATIVE_OID ||
  ------------------
  |  |   25|   144k|#define ANS1_TAG_RELATIVE_OID	0x0D
  ------------------
  |  Branch (141:7): [True: 1, False: 72.4k]
  ------------------
  142|  72.4k|	     hdr->tag == ASN1_TAG_REAL ||
  ------------------
  |  |   21|   144k|#define ASN1_TAG_REAL		0x09 /* not yet parsed */
  ------------------
  |  Branch (142:7): [True: 3, False: 72.4k]
  ------------------
  143|  72.4k|	     hdr->tag == ASN1_TAG_ENUMERATED ||
  ------------------
  |  |   22|   144k|#define ASN1_TAG_ENUMERATED	0x0A /* not yet parsed */
  ------------------
  |  Branch (143:7): [True: 4, False: 72.4k]
  ------------------
  144|  72.4k|	     hdr->tag == ASN1_TAG_BITSTRING ||
  ------------------
  |  |   15|   144k|#define ASN1_TAG_BITSTRING	0x03
  ------------------
  |  Branch (144:7): [True: 2, False: 72.4k]
  ------------------
  145|  72.4k|	     hdr->tag == ASN1_TAG_OCTETSTRING ||
  ------------------
  |  |   16|   144k|#define ASN1_TAG_OCTETSTRING	0x04
  ------------------
  |  Branch (145:7): [True: 8, False: 72.4k]
  ------------------
  146|  72.4k|	     hdr->tag == ASN1_TAG_NUMERICSTRING ||
  ------------------
  |  |   29|   144k|#define ASN1_TAG_NUMERICSTRING	0x12 /* not yet parsed */
  ------------------
  |  Branch (146:7): [True: 11, False: 72.4k]
  ------------------
  147|  72.4k|	     hdr->tag == ASN1_TAG_PRINTABLESTRING ||
  ------------------
  |  |   30|   144k|#define ASN1_TAG_PRINTABLESTRING	0x13
  ------------------
  |  Branch (147:7): [True: 6, False: 72.4k]
  ------------------
  148|  72.4k|	     hdr->tag == ASN1_TAG_T61STRING ||
  ------------------
  |  |   31|   144k|#define ASN1_TAG_T61STRING	0x14 /* not yet parsed */
  ------------------
  |  Branch (148:7): [True: 9, False: 72.4k]
  ------------------
  149|  72.4k|	     hdr->tag == ASN1_TAG_VIDEOTEXSTRING ||
  ------------------
  |  |   32|   144k|#define ASN1_TAG_VIDEOTEXSTRING	0x15 /* not yet parsed */
  ------------------
  |  Branch (149:7): [True: 3, False: 72.4k]
  ------------------
  150|  72.4k|	     hdr->tag == ASN1_TAG_VISIBLESTRING ||
  ------------------
  |  |   37|   144k|#define ASN1_TAG_VISIBLESTRING	0x1A
  ------------------
  |  Branch (150:7): [True: 2, False: 72.4k]
  ------------------
  151|  72.4k|	     hdr->tag == ASN1_TAG_IA5STRING ||
  ------------------
  |  |   33|   144k|#define ASN1_TAG_IA5STRING	0x16
  ------------------
  |  Branch (151:7): [True: 3, False: 72.4k]
  ------------------
  152|  72.4k|	     hdr->tag == ASN1_TAG_GRAPHICSTRING ||
  ------------------
  |  |   36|   144k|#define ASN1_TAG_GRAPHICSTRING	0x19 /* not yet parsed */
  ------------------
  |  Branch (152:7): [True: 4, False: 72.4k]
  ------------------
  153|  72.4k|	     hdr->tag == ASN1_TAG_GENERALSTRING ||
  ------------------
  |  |   38|   144k|#define ASN1_TAG_GENERALSTRING	0x1B /* not yet parsed */
  ------------------
  |  Branch (153:7): [True: 2, False: 72.4k]
  ------------------
  154|  72.4k|	     hdr->tag == ASN1_TAG_UNIVERSALSTRING ||
  ------------------
  |  |   39|   144k|#define ASN1_TAG_UNIVERSALSTRING	0x1C /* not yet parsed */
  ------------------
  |  Branch (154:7): [True: 1, False: 72.4k]
  ------------------
  155|  72.4k|	     hdr->tag == ASN1_TAG_UTF8STRING ||
  ------------------
  |  |   24|   144k|#define ASN1_TAG_UTF8STRING	0x0C /* not yet parsed */
  ------------------
  |  Branch (155:7): [True: 1, False: 72.4k]
  ------------------
  156|  72.4k|	     hdr->tag == ASN1_TAG_BMPSTRING ||
  ------------------
  |  |   41|   144k|#define ASN1_TAG_BMPSTRING	0x1E /* not yet parsed */
  ------------------
  |  Branch (156:7): [True: 2, False: 72.4k]
  ------------------
  157|  72.4k|	     hdr->tag == ASN1_TAG_CHARACTERSTRING ||
  ------------------
  |  |   40|   144k|#define ASN1_TAG_CHARACTERSTRING	0x1D /* not yet parsed */
  ------------------
  |  Branch (157:7): [True: 5, False: 72.3k]
  ------------------
  158|  72.3k|	     hdr->tag == ASN1_TAG_UTCTIME ||
  ------------------
  |  |   34|   144k|#define ASN1_TAG_UTCTIME	0x17
  ------------------
  |  Branch (158:7): [True: 4, False: 72.3k]
  ------------------
  159|  72.3k|	     hdr->tag == ASN1_TAG_GENERALIZEDTIME ||
  ------------------
  |  |   35|   144k|#define ASN1_TAG_GENERALIZEDTIME	0x18 /* not yet parsed */
  ------------------
  |  Branch (159:7): [True: 4, False: 72.3k]
  ------------------
  160|  72.3k|	     hdr->tag == ASN1_TAG_TIME))
  ------------------
  |  |   26|  72.3k|#define ASN1_TAG_TIME		0x0E
  ------------------
  |  Branch (160:7): [True: 3, False: 72.3k]
  ------------------
  161|     88|		return 0;
  162|   144k|	if (!hdr->constructed &&
  ------------------
  |  Branch (162:6): [True: 72.4k, False: 72.3k]
  ------------------
  163|  72.4k|	    (hdr->tag == ASN1_TAG_SEQUENCE ||
  ------------------
  |  |   27|   144k|#define ASN1_TAG_SEQUENCE	0x10 /* shall be constructed */
  ------------------
  |  Branch (163:7): [True: 5, False: 72.4k]
  ------------------
  164|  72.4k|	     hdr->tag == ASN1_TAG_SET))
  ------------------
  |  |   28|  72.4k|#define ASN1_TAG_SET		0x11
  ------------------
  |  Branch (164:7): [True: 1, False: 72.4k]
  ------------------
  165|      6|		return 0;
  166|       |
  167|   144k|	return 1;
  168|   144k|}
asn1.c:asn1_valid_der_boolean:
  107|    252|{
  108|       |	/* Enforce DER requirements for a single way of encoding a BOOLEAN */
  109|    252|	if (hdr->length != 1) {
  ------------------
  |  Branch (109:6): [True: 13, False: 239]
  ------------------
  110|     13|		wpa_printf(MSG_DEBUG, "ASN.1: Unexpected BOOLEAN length (%u)",
  111|     13|			   hdr->length);
  112|     13|		return 0;
  113|     13|	}
  114|       |
  115|    239|	if (hdr->payload[0] != 0 && hdr->payload[0] != 0xff) {
  ------------------
  |  Branch (115:6): [True: 210, False: 29]
  |  Branch (115:30): [True: 9, False: 201]
  ------------------
  116|      9|		wpa_printf(MSG_DEBUG,
  117|      9|			   "ASN.1: Invalid BOOLEAN value 0x%x (DER requires 0 or 0xff)",
  118|      9|			   hdr->payload[0]);
  119|      9|		return 0;
  120|      9|	}
  121|       |
  122|    230|	return 1;
  123|    239|}
asn1.c:rotate_bits:
  375|    189|{
  376|    189|	int i;
  377|    189|	u8 res;
  378|       |
  379|    189|	res = 0;
  380|  1.70k|	for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (380:14): [True: 1.51k, False: 189]
  ------------------
  381|  1.51k|		res <<= 1;
  382|  1.51k|		if (octet & 1)
  ------------------
  |  Branch (382:7): [True: 674, False: 838]
  ------------------
  383|    674|			res |= 1;
  384|  1.51k|		octet >>= 1;
  385|  1.51k|	}
  386|       |
  387|    189|	return res;
  388|    189|}

x509v3.c:asn1_is_sequence:
  113|  53.7k|{
  114|  53.7k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|   107k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (114:9): [True: 53.6k, False: 56]
  ------------------
  115|  53.6k|		hdr->tag == ASN1_TAG_SEQUENCE;
  ------------------
  |  |   27|   107k|#define ASN1_TAG_SEQUENCE	0x10 /* shall be constructed */
  ------------------
  |  Branch (115:3): [True: 53.4k, False: 215]
  ------------------
  116|  53.7k|}
x509v3.c:asn1_is_set:
  119|  17.1k|{
  120|  17.1k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  34.2k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (120:9): [True: 17.0k, False: 17]
  ------------------
  121|  17.0k|		hdr->tag == ASN1_TAG_SET;
  ------------------
  |  |   28|  34.2k|#define ASN1_TAG_SET		0x11
  ------------------
  |  Branch (121:3): [True: 17.0k, False: 51]
  ------------------
  122|  17.1k|}
x509v3.c:asn1_is_string_type:
  149|  16.9k|{
  150|  16.9k|	if (hdr->class != ASN1_CLASS_UNIVERSAL || hdr->constructed)
  ------------------
  |  |   43|  33.9k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (150:6): [True: 0, False: 16.9k]
  |  Branch (150:44): [True: 779, False: 16.1k]
  ------------------
  151|    779|		return false;
  152|  16.1k|	return hdr->tag == ASN1_TAG_UTF8STRING ||
  ------------------
  |  |   24|  32.3k|#define ASN1_TAG_UTF8STRING	0x0C /* not yet parsed */
  ------------------
  |  Branch (152:9): [True: 6.83k, False: 9.36k]
  ------------------
  153|  9.36k|		hdr->tag == ASN1_TAG_NUMERICSTRING ||
  ------------------
  |  |   29|  25.5k|#define ASN1_TAG_NUMERICSTRING	0x12 /* not yet parsed */
  ------------------
  |  Branch (153:3): [True: 225, False: 9.13k]
  ------------------
  154|  9.13k|		hdr->tag == ASN1_TAG_PRINTABLESTRING ||
  ------------------
  |  |   30|  25.3k|#define ASN1_TAG_PRINTABLESTRING	0x13
  ------------------
  |  Branch (154:3): [True: 3.51k, False: 5.62k]
  ------------------
  155|  5.62k|		hdr->tag == ASN1_TAG_T61STRING ||
  ------------------
  |  |   31|  21.8k|#define ASN1_TAG_T61STRING	0x14 /* not yet parsed */
  ------------------
  |  Branch (155:3): [True: 196, False: 5.42k]
  ------------------
  156|  5.42k|		hdr->tag == ASN1_TAG_VIDEOTEXSTRING ||
  ------------------
  |  |   32|  21.6k|#define ASN1_TAG_VIDEOTEXSTRING	0x15 /* not yet parsed */
  ------------------
  |  Branch (156:3): [True: 478, False: 4.94k]
  ------------------
  157|  4.94k|		hdr->tag == ASN1_TAG_IA5STRING ||
  ------------------
  |  |   33|  21.1k|#define ASN1_TAG_IA5STRING	0x16
  ------------------
  |  Branch (157:3): [True: 471, False: 4.47k]
  ------------------
  158|  4.47k|		hdr->tag == ASN1_TAG_GRAPHICSTRING ||
  ------------------
  |  |   36|  20.6k|#define ASN1_TAG_GRAPHICSTRING	0x19 /* not yet parsed */
  ------------------
  |  Branch (158:3): [True: 297, False: 4.17k]
  ------------------
  159|  4.17k|		hdr->tag == ASN1_TAG_VISIBLESTRING ||
  ------------------
  |  |   37|  20.3k|#define ASN1_TAG_VISIBLESTRING	0x1A
  ------------------
  |  Branch (159:3): [True: 106, False: 4.07k]
  ------------------
  160|  4.07k|		hdr->tag == ASN1_TAG_GENERALSTRING ||
  ------------------
  |  |   38|  20.2k|#define ASN1_TAG_GENERALSTRING	0x1B /* not yet parsed */
  ------------------
  |  Branch (160:3): [True: 289, False: 3.78k]
  ------------------
  161|  3.78k|		hdr->tag == ASN1_TAG_UNIVERSALSTRING ||
  ------------------
  |  |   39|  19.9k|#define ASN1_TAG_UNIVERSALSTRING	0x1C /* not yet parsed */
  ------------------
  |  Branch (161:3): [True: 516, False: 3.26k]
  ------------------
  162|  3.26k|		hdr->tag == ASN1_TAG_CHARACTERSTRING ||
  ------------------
  |  |   40|  19.4k|#define ASN1_TAG_CHARACTERSTRING	0x1D /* not yet parsed */
  ------------------
  |  Branch (162:3): [True: 73, False: 3.19k]
  ------------------
  163|  3.19k|		hdr->tag == ASN1_TAG_BMPSTRING;
  ------------------
  |  |   41|  19.3k|#define ASN1_TAG_BMPSTRING	0x1E /* not yet parsed */
  ------------------
  |  Branch (163:3): [True: 109, False: 3.08k]
  ------------------
  164|  16.9k|}
x509v3.c:asn1_is_cs_tag:
  185|  3.69k|{
  186|  3.69k|	return hdr->class == ASN1_CLASS_CONTEXT_SPECIFIC &&
  ------------------
  |  |   45|  7.38k|#define ASN1_CLASS_CONTEXT_SPECIFIC	2
  ------------------
  |  Branch (186:9): [True: 2.87k, False: 823]
  ------------------
  187|  2.87k|		hdr->tag == tag;
  ------------------
  |  Branch (187:3): [True: 2.85k, False: 12]
  ------------------
  188|  3.69k|}
x509v3.c:asn1_is_integer:
  101|  6.54k|{
  102|  6.54k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  13.0k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (102:9): [True: 6.53k, False: 17]
  ------------------
  103|  6.53k|		hdr->tag == ASN1_TAG_INTEGER;
  ------------------
  |  |   14|  13.0k|#define ASN1_TAG_INTEGER	0x02
  ------------------
  |  Branch (103:3): [True: 6.50k, False: 28]
  ------------------
  104|  6.54k|}
x509v3.c:asn1_is_utctime:
  137|  6.29k|{
  138|  6.29k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  12.5k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (138:9): [True: 6.28k, False: 5]
  ------------------
  139|  6.28k|		hdr->tag == ASN1_TAG_UTCTIME;
  ------------------
  |  |   34|  12.5k|#define ASN1_TAG_UTCTIME	0x17
  ------------------
  |  Branch (139:3): [True: 6.19k, False: 91]
  ------------------
  140|  6.29k|}
x509v3.c:asn1_is_generalizedtime:
  143|     96|{
  144|     96|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|    192|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (144:9): [True: 91, False: 5]
  ------------------
  145|     91|		hdr->tag == ASN1_TAG_GENERALIZEDTIME;
  ------------------
  |  |   35|    187|#define ASN1_TAG_GENERALIZEDTIME	0x18 /* not yet parsed */
  ------------------
  |  Branch (145:3): [True: 59, False: 32]
  ------------------
  146|     96|}
x509v3.c:asn1_is_boolean:
   95|  4.21k|{
   96|  4.21k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  8.42k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (96:9): [True: 4.20k, False: 5]
  ------------------
   97|  4.20k|		hdr->tag == ASN1_TAG_BOOLEAN;
  ------------------
  |  |   13|  8.41k|#define ASN1_TAG_BOOLEAN	0x01
  ------------------
  |  Branch (97:3): [True: 204, False: 4.00k]
  ------------------
   98|  4.21k|}
x509v3.c:asn1_is_bitstring:
  131|  5.65k|{
  132|  5.65k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  11.3k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (132:9): [True: 5.64k, False: 7]
  ------------------
  133|  5.64k|		hdr->tag == ASN1_TAG_BITSTRING;
  ------------------
  |  |   15|  11.2k|#define ASN1_TAG_BITSTRING	0x03
  ------------------
  |  Branch (133:3): [True: 5.62k, False: 21]
  ------------------
  134|  5.65k|}
x509v3.c:asn1_is_octetstring:
  125|  4.01k|{
  126|  4.01k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  8.03k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (126:9): [True: 3.98k, False: 38]
  ------------------
  127|  3.98k|		hdr->tag == ASN1_TAG_OCTETSTRING;
  ------------------
  |  |   16|  8.00k|#define ASN1_TAG_OCTETSTRING	0x04
  ------------------
  |  Branch (127:3): [True: 3.97k, False: 10]
  ------------------
  128|  4.01k|}
asn1.c:asn1_is_oid:
   89|  31.4k|{
   90|  31.4k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  62.9k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (90:9): [True: 31.4k, False: 6]
  ------------------
   91|  31.4k|		hdr->tag == ASN1_TAG_OID;
  ------------------
  |  |   18|  62.9k|#define ASN1_TAG_OID		0x06
  ------------------
  |  Branch (91:3): [True: 31.4k, False: 22]
  ------------------
   92|  31.4k|}
rsa.c:asn1_is_sequence:
  113|    928|{
  114|    928|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  1.85k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (114:9): [True: 926, False: 2]
  ------------------
  115|    926|		hdr->tag == ASN1_TAG_SEQUENCE;
  ------------------
  |  |   27|  1.85k|#define ASN1_TAG_SEQUENCE	0x10 /* shall be constructed */
  ------------------
  |  Branch (115:3): [True: 918, False: 8]
  ------------------
  116|    928|}
rsa.c:asn1_is_integer:
  101|  1.81k|{
  102|  1.81k|	return hdr->class == ASN1_CLASS_UNIVERSAL &&
  ------------------
  |  |   43|  3.62k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (102:9): [True: 1.81k, False: 3]
  ------------------
  103|  1.81k|		hdr->tag == ASN1_TAG_INTEGER;
  ------------------
  |  |   14|  3.62k|#define ASN1_TAG_INTEGER	0x02
  ------------------
  |  Branch (103:3): [True: 1.79k, False: 12]
  ------------------
  104|  1.81k|}

bignum_init:
   31|  3.04k|{
   32|  3.04k|	struct bignum *n = os_zalloc(sizeof(mp_int));
   33|  3.04k|	if (n == NULL)
  ------------------
  |  Branch (33:6): [True: 0, False: 3.04k]
  ------------------
   34|      0|		return NULL;
   35|  3.04k|	if (mp_init((mp_int *) n) != MP_OKAY) {
  ------------------
  |  |   93|  3.04k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (35:6): [True: 0, False: 3.04k]
  ------------------
   36|      0|		os_free(n);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   37|       |		n = NULL;
   38|      0|	}
   39|  3.04k|	return n;
   40|  3.04k|}
bignum_deinit:
   48|  10.1k|{
   49|  10.1k|	if (n) {
  ------------------
  |  Branch (49:6): [True: 3.04k, False: 7.12k]
  ------------------
   50|  3.04k|		mp_clear((mp_int *) n);
   51|  3.04k|		os_free(n);
  ------------------
  |  |  511|  3.04k|#define os_free(p) free((p))
  ------------------
   52|  3.04k|	}
   53|  10.1k|}
bignum_get_unsigned_bin_len:
   62|  2.48k|{
   63|  2.48k|	return mp_unsigned_bin_size((mp_int *) n);
   64|  2.48k|}
bignum_get_unsigned_bin:
   76|    784|{
   77|    784|	size_t need = mp_unsigned_bin_size((mp_int *) n);
   78|    784|	if (len && need > *len) {
  ------------------
  |  Branch (78:6): [True: 102, False: 682]
  |  Branch (78:13): [True: 0, False: 102]
  ------------------
   79|      0|		*len = need;
   80|      0|		return -1;
   81|      0|	}
   82|    784|	if (mp_to_unsigned_bin((mp_int *) n, buf) != MP_OKAY) {
  ------------------
  |  |   93|    784|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (82:6): [True: 0, False: 784]
  ------------------
   83|      0|		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);
   84|      0|		return -1;
   85|      0|	}
   86|    784|	if (len)
  ------------------
  |  Branch (86:6): [True: 102, False: 682]
  ------------------
   87|    102|		*len = need;
   88|    784|	return 0;
   89|    784|}
bignum_set_unsigned_bin:
  100|  2.88k|{
  101|  2.88k|	if (mp_read_unsigned_bin((mp_int *) n, (u8 *) buf, len) != MP_OKAY) {
  ------------------
  |  |   93|  2.88k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (101:6): [True: 0, False: 2.88k]
  ------------------
  102|      0|		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);
  103|      0|		return -1;
  104|      0|	}
  105|  2.88k|	return 0;
  106|  2.88k|}
bignum_cmp:
  116|    767|{
  117|    767|	return mp_cmp((mp_int *) a, (mp_int *) b);
  118|    767|}
bignum_exptmod:
  217|    812|{
  218|    812|	if (mp_exptmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d)
  ------------------
  |  Branch (218:6): [True: 6, False: 806]
  ------------------
  219|    812|	    != MP_OKAY) {
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
  220|      6|		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);
  221|      6|		return -1;
  222|      6|	}
  223|    806|	return 0;
  224|    812|}

bignum.c:mp_init:
  368|  1.84M|{
  369|  1.84M|  int i;
  370|       |
  371|       |  /* allocate memory required and clear it */
  372|  1.84M|  a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC);
  ------------------
  |  |   79|  1.84M|#define XMALLOC  os_malloc
  |  |  ------------------
  |  |  |  |  505|  1.84M|#define os_malloc(s) malloc((s))
  |  |  ------------------
  ------------------
  373|  1.84M|  if (a->dp == NULL) {
  ------------------
  |  Branch (373:7): [True: 0, False: 1.84M]
  ------------------
  374|      0|    return MP_MEM;
  ------------------
  |  |   94|      0|#define MP_MEM        -2  /* out of mem */
  ------------------
  375|      0|  }
  376|       |
  377|       |  /* set the digits to zero */
  378|  16.6M|  for (i = 0; i < MP_PREC; i++) {
  ------------------
  |  |  110|  16.6M|      #define MP_PREC                 8      /* default digits of precision */
  ------------------
  |  Branch (378:15): [True: 14.7M, False: 1.84M]
  ------------------
  379|  14.7M|      a->dp[i] = 0;
  380|  14.7M|  }
  381|       |
  382|       |  /* set the used to zero, allocated digits to the default precision
  383|       |   * and sign to positive */
  384|  1.84M|  a->used  = 0;
  385|  1.84M|  a->alloc = MP_PREC;
  ------------------
  |  |  110|  1.84M|      #define MP_PREC                 8      /* default digits of precision */
  ------------------
  386|  1.84M|  a->sign  = MP_ZPOS;
  ------------------
  |  |   90|  1.84M|#define MP_ZPOS       0   /* positive integer */
  ------------------
  387|       |
  388|  1.84M|  return MP_OKAY;
  ------------------
  |  |   93|  1.84M|#define MP_OKAY       0   /* ok result */
  ------------------
  389|  1.84M|}
bignum.c:mp_clear:
  394|  2.55M|{
  395|  2.55M|  int i;
  396|       |
  397|       |  /* only do anything if a hasn't been freed previously */
  398|  2.55M|  if (a->dp != NULL) {
  ------------------
  |  Branch (398:7): [True: 2.55M, False: 0]
  ------------------
  399|       |    /* first zero the digits */
  400|  14.4M|    for (i = 0; i < a->used; i++) {
  ------------------
  |  Branch (400:17): [True: 11.8M, False: 2.55M]
  ------------------
  401|  11.8M|        a->dp[i] = 0;
  402|  11.8M|    }
  403|       |
  404|       |    /* free ram */
  405|  2.55M|    XFREE(a->dp);
  ------------------
  |  |   80|  2.55M|#define XFREE    os_free
  |  |  ------------------
  |  |  |  |  511|  2.55M|#define os_free(p) free((p))
  |  |  ------------------
  ------------------
  406|       |
  407|       |    /* reset members to make debugging easier */
  408|  2.55M|    a->dp    = NULL;
  409|  2.55M|    a->alloc = a->used = 0;
  410|  2.55M|    a->sign  = MP_ZPOS;
  ------------------
  |  |   90|  2.55M|#define MP_ZPOS       0   /* positive integer */
  ------------------
  411|  2.55M|  }
  412|  2.55M|}
bignum.c:mp_unsigned_bin_size:
  755|  3.27k|{
  756|  3.27k|  int     size = mp_count_bits (a);
  757|  3.27k|  return (size / 8 + ((size & 7) != 0 ? 1 : 0));
  ------------------
  |  Branch (757:23): [True: 2.52k, False: 742]
  ------------------
  758|  3.27k|}
bignum.c:mp_count_bits:
 1542|  5.71k|{
 1543|  5.71k|  int     r;
 1544|  5.71k|  mp_digit q;
 1545|       |
 1546|       |  /* shortcut */
 1547|  5.71k|  if (a->used == 0) {
  ------------------
  |  Branch (1547:7): [True: 71, False: 5.64k]
  ------------------
 1548|     71|    return 0;
 1549|     71|  }
 1550|       |
 1551|       |  /* get number of digits and add that */
 1552|  5.64k|  r = (a->used - 1) * DIGIT_BIT;
  ------------------
  |  |   68|  5.64k|#define DIGIT_BIT 60
  ------------------
 1553|       |
 1554|       |  /* take the last digit and count the bits in it */
 1555|  5.64k|  q = a->dp[a->used - 1];
 1556|   126k|  while (q > ((mp_digit) 0)) {
  ------------------
  |  Branch (1556:10): [True: 120k, False: 5.64k]
  ------------------
 1557|   120k|    ++r;
 1558|   120k|    q >>= ((mp_digit) 1);
 1559|   120k|  }
 1560|  5.64k|  return r;
 1561|  5.71k|}
bignum.c:mp_to_unsigned_bin:
  990|    784|{
  991|    784|  int     x, res;
  992|    784|  mp_int  t;
  993|       |
  994|    784|  if ((res = mp_init_copy (&t, a)) != MP_OKAY) {
  ------------------
  |  |   93|    784|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (994:7): [True: 0, False: 784]
  ------------------
  995|      0|    return res;
  996|      0|  }
  997|       |
  998|    784|  x = 0;
  999|  85.4k|  while (mp_iszero (&t) == 0) {
  ------------------
  |  |  125|  85.4k|#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   97|    784|#define MP_YES        1   /* yes response */
  |  |  ------------------
  |  |               #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   98|  84.6k|#define MP_NO         0   /* no response */
  |  |  ------------------
  |  |  |  Branch (125:23): [True: 784, False: 84.6k]
  |  |  ------------------
  ------------------
  |  Branch (999:10): [True: 84.6k, False: 784]
  ------------------
 1000|  84.6k|#ifndef MP_8BIT
 1001|  84.6k|      b[x++] = (unsigned char) (t.dp[0] & 255);
 1002|       |#else
 1003|       |      b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7));
 1004|       |#endif
 1005|  84.6k|    if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) {
  ------------------
  |  |   93|  84.6k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1005:9): [True: 0, False: 84.6k]
  ------------------
 1006|      0|      mp_clear (&t);
 1007|      0|      return res;
 1008|      0|    }
 1009|  84.6k|  }
 1010|    784|  bn_reverse (b, x);
 1011|    784|  mp_clear (&t);
 1012|    784|  return MP_OKAY;
  ------------------
  |  |   93|    784|#define MP_OKAY       0   /* ok result */
  ------------------
 1013|    784|}
bignum.c:mp_init_copy:
 1094|   235k|{
 1095|   235k|  int     res;
 1096|       |
 1097|   235k|  if ((res = mp_init (a)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1097:7): [True: 0, False: 235k]
  ------------------
 1098|      0|    return res;
 1099|      0|  }
 1100|   235k|  return mp_copy (b, a);
 1101|   235k|}
bignum.c:mp_copy:
 1122|  2.06M|{
 1123|  2.06M|  int     res, n;
 1124|       |
 1125|       |  /* if dst == src do nothing */
 1126|  2.06M|  if (a == b) {
  ------------------
  |  Branch (1126:7): [True: 1.83M, False: 239k]
  ------------------
 1127|  1.83M|    return MP_OKAY;
  ------------------
  |  |   93|  1.83M|#define MP_OKAY       0   /* ok result */
  ------------------
 1128|  1.83M|  }
 1129|       |
 1130|       |  /* grow dest */
 1131|   239k|  if (b->alloc < a->used) {
  ------------------
  |  Branch (1131:7): [True: 208k, False: 30.6k]
  ------------------
 1132|   208k|     if ((res = mp_grow (b, a->used)) != MP_OKAY) {
  ------------------
  |  |   93|   208k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1132:10): [True: 0, False: 208k]
  ------------------
 1133|      0|        return res;
 1134|      0|     }
 1135|   208k|  }
 1136|       |
 1137|       |  /* zero b and copy the parameters over */
 1138|   239k|  {
 1139|   239k|    register mp_digit *tmpa, *tmpb;
 1140|       |
 1141|       |    /* pointer aliases */
 1142|       |
 1143|       |    /* source */
 1144|   239k|    tmpa = a->dp;
 1145|       |
 1146|       |    /* destination */
 1147|   239k|    tmpb = b->dp;
 1148|       |
 1149|       |    /* copy all the digits */
 1150|  5.93M|    for (n = 0; n < a->used; n++) {
  ------------------
  |  Branch (1150:17): [True: 5.69M, False: 239k]
  ------------------
 1151|  5.69M|      *tmpb++ = *tmpa++;
 1152|  5.69M|    }
 1153|       |
 1154|       |    /* clear high digits */
 1155|   239k|    for (; n < b->used; n++) {
  ------------------
  |  Branch (1155:12): [True: 0, False: 239k]
  ------------------
 1156|      0|      *tmpb++ = 0;
 1157|      0|    }
 1158|   239k|  }
 1159|       |
 1160|       |  /* copy used count and sign */
 1161|   239k|  b->used = a->used;
 1162|   239k|  b->sign = a->sign;
 1163|   239k|  return MP_OKAY;
  ------------------
  |  |   93|   239k|#define MP_OKAY       0   /* ok result */
  ------------------
 1164|   239k|}
bignum.c:mp_grow:
 1257|   213k|{
 1258|   213k|  int     i;
 1259|   213k|  mp_digit *tmp;
 1260|       |
 1261|       |  /* if the alloc size is smaller alloc more ram */
 1262|   213k|  if (a->alloc < size) {
  ------------------
  |  Branch (1262:7): [True: 213k, False: 46]
  ------------------
 1263|       |    /* ensure there are always at least MP_PREC digits extra on top */
 1264|   213k|    size += (MP_PREC * 2) - (size % MP_PREC);
  ------------------
  |  |  110|   213k|      #define MP_PREC                 8      /* default digits of precision */
  ------------------
                  size += (MP_PREC * 2) - (size % MP_PREC);
  ------------------
  |  |  110|   213k|      #define MP_PREC                 8      /* default digits of precision */
  ------------------
 1265|       |
 1266|       |    /* reallocate the array a->dp
 1267|       |     *
 1268|       |     * We store the return in a temporary variable
 1269|       |     * in case the operation failed we don't want
 1270|       |     * to overwrite the dp member of a.
 1271|       |     */
 1272|   213k|    tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size);
  ------------------
  |  |   81|   213k|#define XREALLOC os_realloc
  |  |  ------------------
  |  |  |  |  508|   213k|#define os_realloc(p, s) realloc((p), (s))
  |  |  ------------------
  ------------------
 1273|   213k|    if (tmp == NULL) {
  ------------------
  |  Branch (1273:9): [True: 0, False: 213k]
  ------------------
 1274|       |      /* reallocation failed but "a" is still valid [can be freed] */
 1275|      0|      return MP_MEM;
  ------------------
  |  |   94|      0|#define MP_MEM        -2  /* out of mem */
  ------------------
 1276|      0|    }
 1277|       |
 1278|       |    /* reallocation succeeded so set a->dp */
 1279|   213k|    a->dp = tmp;
 1280|       |
 1281|       |    /* zero excess digits */
 1282|   213k|    i        = a->alloc;
 1283|   213k|    a->alloc = size;
 1284|  6.89M|    for (; i < a->alloc; i++) {
  ------------------
  |  Branch (1284:12): [True: 6.68M, False: 213k]
  ------------------
 1285|  6.68M|      a->dp[i] = 0;
 1286|  6.68M|    }
 1287|   213k|  }
 1288|   213k|  return MP_OKAY;
  ------------------
  |  |   93|   213k|#define MP_OKAY       0   /* ok result */
  ------------------
 1289|   213k|}
bignum.c:mp_div_2d:
 1018|  1.59M|{
 1019|  1.59M|  mp_digit D, r, rr;
 1020|  1.59M|  int     x, res;
 1021|  1.59M|  mp_int  t;
 1022|       |
 1023|       |
 1024|       |  /* if the shift count is <= 0 then we do no work */
 1025|  1.59M|  if (b <= 0) {
  ------------------
  |  Branch (1025:7): [True: 0, False: 1.59M]
  ------------------
 1026|      0|    res = mp_copy (a, c);
 1027|      0|    if (d != NULL) {
  ------------------
  |  Branch (1027:9): [True: 0, False: 0]
  ------------------
 1028|      0|      mp_zero (d);
 1029|      0|    }
 1030|      0|    return res;
 1031|      0|  }
 1032|       |
 1033|  1.59M|  if ((res = mp_init (&t)) != MP_OKAY) {
  ------------------
  |  |   93|  1.59M|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1033:7): [True: 0, False: 1.59M]
  ------------------
 1034|      0|    return res;
 1035|      0|  }
 1036|       |
 1037|       |  /* get the remainder */
 1038|  1.59M|  if (d != NULL) {
  ------------------
  |  Branch (1038:7): [True: 0, False: 1.59M]
  ------------------
 1039|      0|    if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1039:9): [True: 0, False: 0]
  ------------------
 1040|      0|      mp_clear (&t);
 1041|      0|      return res;
 1042|      0|    }
 1043|      0|  }
 1044|       |
 1045|       |  /* copy */
 1046|  1.59M|  if ((res = mp_copy (a, c)) != MP_OKAY) {
  ------------------
  |  |   93|  1.59M|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1046:7): [True: 0, False: 1.59M]
  ------------------
 1047|      0|    mp_clear (&t);
 1048|      0|    return res;
 1049|      0|  }
 1050|       |
 1051|       |  /* shift by as many digits in the bit count */
 1052|  1.59M|  if (b >= (int)DIGIT_BIT) {
  ------------------
  |  |   68|  1.59M|#define DIGIT_BIT 60
  ------------------
  |  Branch (1052:7): [True: 0, False: 1.59M]
  ------------------
 1053|      0|    mp_rshd (c, b / DIGIT_BIT);
  ------------------
  |  |   68|      0|#define DIGIT_BIT 60
  ------------------
 1054|      0|  }
 1055|       |
 1056|       |  /* shift any bit count < DIGIT_BIT */
 1057|  1.59M|  D = (mp_digit) (b % DIGIT_BIT);
  ------------------
  |  |   68|  1.59M|#define DIGIT_BIT 60
  ------------------
 1058|  1.59M|  if (D != 0) {
  ------------------
  |  Branch (1058:7): [True: 1.59M, False: 0]
  ------------------
 1059|  1.59M|    register mp_digit *tmpc, mask, shift;
 1060|       |
 1061|       |    /* mask */
 1062|  1.59M|    mask = (((mp_digit)1) << D) - 1;
 1063|       |
 1064|       |    /* shift for lsb */
 1065|  1.59M|    shift = DIGIT_BIT - D;
  ------------------
  |  |   68|  1.59M|#define DIGIT_BIT 60
  ------------------
 1066|       |
 1067|       |    /* alias */
 1068|  1.59M|    tmpc = c->dp + (c->used - 1);
 1069|       |
 1070|       |    /* carry */
 1071|  1.59M|    r = 0;
 1072|  28.3M|    for (x = c->used - 1; x >= 0; x--) {
  ------------------
  |  Branch (1072:27): [True: 26.7M, False: 1.59M]
  ------------------
 1073|       |      /* get the lower  bits of this word in a temp */
 1074|  26.7M|      rr = *tmpc & mask;
 1075|       |
 1076|       |      /* shift the current word and mix in the carry bits from the previous word */
 1077|  26.7M|      *tmpc = (*tmpc >> D) | (r << shift);
 1078|  26.7M|      --tmpc;
 1079|       |
 1080|       |      /* set the carry to the carry bits of the current word found above */
 1081|  26.7M|      r = rr;
 1082|  26.7M|    }
 1083|  1.59M|  }
 1084|  1.59M|  mp_clamp (c);
 1085|  1.59M|  if (d != NULL) {
  ------------------
  |  Branch (1085:7): [True: 0, False: 1.59M]
  ------------------
 1086|      0|    mp_exch (&t, d);
 1087|      0|  }
 1088|  1.59M|  mp_clear (&t);
 1089|  1.59M|  return MP_OKAY;
  ------------------
  |  |   93|  1.59M|#define MP_OKAY       0   /* ok result */
  ------------------
 1090|  1.59M|}
bignum.c:mp_zero:
 1106|  36.8k|{
 1107|  36.8k|  int       n;
 1108|  36.8k|  mp_digit *tmp;
 1109|       |
 1110|  36.8k|  a->sign = MP_ZPOS;
  ------------------
  |  |   90|  36.8k|#define MP_ZPOS       0   /* positive integer */
  ------------------
 1111|  36.8k|  a->used = 0;
 1112|       |
 1113|  36.8k|  tmp = a->dp;
 1114|   604k|  for (n = 0; n < a->alloc; n++) {
  ------------------
  |  Branch (1114:15): [True: 568k, False: 36.8k]
  ------------------
 1115|   568k|     *tmp++ = 0;
 1116|   568k|  }
 1117|  36.8k|}
bignum.c:mp_mod_2d:
 1566|   235k|{
 1567|   235k|  int     x, res;
 1568|       |
 1569|       |  /* if b is <= 0 then zero the int */
 1570|   235k|  if (b <= 0) {
  ------------------
  |  Branch (1570:7): [True: 0, False: 235k]
  ------------------
 1571|      0|    mp_zero (c);
 1572|      0|    return MP_OKAY;
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
 1573|      0|  }
 1574|       |
 1575|       |  /* if the modulus is larger than the value than return */
 1576|   235k|  if (b >= (int) (a->used * DIGIT_BIT)) {
  ------------------
  |  |   68|   235k|#define DIGIT_BIT 60
  ------------------
  |  Branch (1576:7): [True: 24.2k, False: 210k]
  ------------------
 1577|  24.2k|    res = mp_copy (a, c);
 1578|  24.2k|    return res;
 1579|  24.2k|  }
 1580|       |
 1581|       |  /* copy */
 1582|   210k|  if ((res = mp_copy (a, c)) != MP_OKAY) {
  ------------------
  |  |   93|   210k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1582:7): [True: 0, False: 210k]
  ------------------
 1583|      0|    return res;
 1584|      0|  }
 1585|       |
 1586|       |  /* zero digits above the last digit of the modulus */
 1587|  2.64M|  for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) {
  ------------------
  |  |   68|   210k|#define DIGIT_BIT 60
  ------------------
                for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) {
  ------------------
  |  |   68|   210k|#define DIGIT_BIT 60
  ------------------
  |  Branch (1587:31): [True: 210k, False: 0]
  |  Branch (1587:62): [True: 2.43M, False: 210k]
  ------------------
 1588|  2.43M|    c->dp[x] = 0;
 1589|  2.43M|  }
 1590|       |  /* clear the digit that is not completely outside/inside the modulus */
 1591|   210k|  c->dp[b / DIGIT_BIT] &=
  ------------------
  |  |   68|   210k|#define DIGIT_BIT 60
  ------------------
 1592|   210k|    (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1));
  ------------------
  |  |   68|   210k|#define DIGIT_BIT 60
  ------------------
 1593|   210k|  mp_clamp (c);
 1594|   210k|  return MP_OKAY;
  ------------------
  |  |   93|   210k|#define MP_OKAY       0   /* ok result */
  ------------------
 1595|   210k|}
bignum.c:mp_rshd:
 1169|   470k|{
 1170|   470k|  int     x;
 1171|       |
 1172|       |  /* if b <= 0 then ignore it */
 1173|   470k|  if (b <= 0) {
  ------------------
  |  Branch (1173:7): [True: 3.15k, False: 467k]
  ------------------
 1174|  3.15k|    return;
 1175|  3.15k|  }
 1176|       |
 1177|       |  /* if b > used then simply zero it and return */
 1178|   467k|  if (a->used <= b) {
  ------------------
  |  Branch (1178:7): [True: 22.8k, False: 444k]
  ------------------
 1179|  22.8k|    mp_zero (a);
 1180|  22.8k|    return;
 1181|  22.8k|  }
 1182|       |
 1183|   444k|  {
 1184|   444k|    register mp_digit *bottom, *top;
 1185|       |
 1186|       |    /* shift the digits down */
 1187|       |
 1188|       |    /* bottom */
 1189|   444k|    bottom = a->dp;
 1190|       |
 1191|       |    /* top [offset into digits] */
 1192|   444k|    top = a->dp + b;
 1193|       |
 1194|       |    /* this is implemented as a sliding window where
 1195|       |     * the window is b-digits long and digits from
 1196|       |     * the top of the window are copied to the bottom
 1197|       |     *
 1198|       |     * e.g.
 1199|       |
 1200|       |     b-2 | b-1 | b0 | b1 | b2 | ... | bb |   ---->
 1201|       |                 /\                   |      ---->
 1202|       |                  \-------------------/      ---->
 1203|       |     */
 1204|  6.08M|    for (x = 0; x < (a->used - b); x++) {
  ------------------
  |  Branch (1204:17): [True: 5.63M, False: 444k]
  ------------------
 1205|  5.63M|      *bottom++ = *top++;
 1206|  5.63M|    }
 1207|       |
 1208|       |    /* zero the top digits */
 1209|  6.37M|    for (; x < a->used; x++) {
  ------------------
  |  Branch (1209:12): [True: 5.92M, False: 444k]
  ------------------
 1210|  5.92M|      *bottom++ = 0;
 1211|  5.92M|    }
 1212|   444k|  }
 1213|       |
 1214|       |  /* remove excess digits */
 1215|   444k|  a->used -= b;
 1216|   444k|}
bignum.c:mp_clamp:
 1240|  4.42M|{
 1241|       |  /* decrease used while the most significant digit is
 1242|       |   * zero.
 1243|       |   */
 1244|  8.69M|  while (a->used > 0 && a->dp[a->used - 1] == 0) {
  ------------------
  |  Branch (1244:10): [True: 8.65M, False: 49.1k]
  |  Branch (1244:25): [True: 4.27M, False: 4.37M]
  ------------------
 1245|  4.27M|    --(a->used);
 1246|  4.27M|  }
 1247|       |
 1248|       |  /* reset the sign flag if used == 0 */
 1249|  4.42M|  if (a->used == 0) {
  ------------------
  |  Branch (1249:7): [True: 49.1k, False: 4.37M]
  ------------------
 1250|  49.1k|    a->sign = MP_ZPOS;
  ------------------
  |  |   90|  49.1k|#define MP_ZPOS       0   /* positive integer */
  ------------------
 1251|  49.1k|  }
 1252|  4.42M|}
bignum.c:mp_exch:
 1223|   707k|{
 1224|   707k|  mp_int  t;
 1225|       |
 1226|   707k|  t  = *a;
 1227|   707k|  *a = *b;
 1228|   707k|  *b = t;
 1229|   707k|}
bignum.c:bn_reverse:
  195|    784|{
  196|    784|  int     ix, iy;
  197|    784|  unsigned char t;
  198|       |
  199|    784|  ix = 0;
  200|    784|  iy = len - 1;
  201|  42.8k|  while (ix < iy) {
  ------------------
  |  Branch (201:10): [True: 42.0k, False: 784]
  ------------------
  202|  42.0k|    t     = s[ix];
  203|  42.0k|    s[ix] = s[iy];
  204|  42.0k|    s[iy] = t;
  205|  42.0k|    ++ix;
  206|  42.0k|    --iy;
  207|  42.0k|  }
  208|    784|}
bignum.c:mp_read_unsigned_bin:
  955|  2.88k|{
  956|  2.88k|  int     res;
  957|       |
  958|       |  /* make sure there are at least two digits */
  959|  2.88k|  if (a->alloc < 2) {
  ------------------
  |  Branch (959:7): [True: 0, False: 2.88k]
  ------------------
  960|      0|     if ((res = mp_grow(a, 2)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (960:10): [True: 0, False: 0]
  ------------------
  961|      0|        return res;
  962|      0|     }
  963|      0|  }
  964|       |
  965|       |  /* zero the int */
  966|  2.88k|  mp_zero (a);
  967|       |
  968|       |  /* read the bytes in */
  969|   234k|  while (c-- > 0) {
  ------------------
  |  Branch (969:10): [True: 231k, False: 2.88k]
  ------------------
  970|   231k|    if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) {
  ------------------
  |  |   93|   231k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (970:9): [True: 0, False: 231k]
  ------------------
  971|      0|      return res;
  972|      0|    }
  973|       |
  974|   231k|#ifndef MP_8BIT
  975|   231k|      a->dp[0] |= *b++;
  976|   231k|      a->used += 1;
  977|       |#else
  978|       |      a->dp[0] = (*b & MP_MASK);
  979|       |      a->dp[1] |= ((*b++ >> 7U) & 1);
  980|       |      a->used += 2;
  981|       |#endif
  982|   231k|  }
  983|  2.88k|  mp_clamp (a);
  984|  2.88k|  return MP_OKAY;
  ------------------
  |  |   93|  2.88k|#define MP_OKAY       0   /* ok result */
  ------------------
  985|  2.88k|}
bignum.c:mp_mul_2d:
 1377|   233k|{
 1378|   233k|  mp_digit d;
 1379|   233k|  int      res;
 1380|       |
 1381|       |  /* copy */
 1382|   233k|  if (a != c) {
  ------------------
  |  Branch (1382:7): [True: 0, False: 233k]
  ------------------
 1383|      0|     if ((res = mp_copy (a, c)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1383:10): [True: 0, False: 0]
  ------------------
 1384|      0|       return res;
 1385|      0|     }
 1386|      0|  }
 1387|       |
 1388|   233k|  if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) {
  ------------------
  |  |   68|   233k|#define DIGIT_BIT 60
  ------------------
  |  Branch (1388:7): [True: 3.20k, False: 229k]
  ------------------
 1389|  3.20k|     if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) {
  ------------------
  |  |   68|  3.20k|#define DIGIT_BIT 60
  ------------------
                   if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) {
  ------------------
  |  |   93|  3.20k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1389:10): [True: 0, False: 3.20k]
  ------------------
 1390|      0|       return res;
 1391|      0|     }
 1392|  3.20k|  }
 1393|       |
 1394|       |  /* shift by as many digits in the bit count */
 1395|   233k|  if (b >= (int)DIGIT_BIT) {
  ------------------
  |  |   68|   233k|#define DIGIT_BIT 60
  ------------------
  |  Branch (1395:7): [True: 1.61k, False: 231k]
  ------------------
 1396|  1.61k|    if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) {
  ------------------
  |  |   68|  1.61k|#define DIGIT_BIT 60
  ------------------
                  if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) {
  ------------------
  |  |   93|  1.61k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1396:9): [True: 0, False: 1.61k]
  ------------------
 1397|      0|      return res;
 1398|      0|    }
 1399|  1.61k|  }
 1400|       |
 1401|       |  /* shift any bit count < DIGIT_BIT */
 1402|   233k|  d = (mp_digit) (b % DIGIT_BIT);
  ------------------
  |  |   68|   233k|#define DIGIT_BIT 60
  ------------------
 1403|   233k|  if (d != 0) {
  ------------------
  |  Branch (1403:7): [True: 233k, False: 58]
  ------------------
 1404|   233k|    register mp_digit *tmpc, shift, mask, r, rr;
 1405|   233k|    register int x;
 1406|       |
 1407|       |    /* bitmask for carries */
 1408|   233k|    mask = (((mp_digit)1) << d) - 1;
 1409|       |
 1410|       |    /* shift for msbs */
 1411|   233k|    shift = DIGIT_BIT - d;
  ------------------
  |  |   68|   233k|#define DIGIT_BIT 60
  ------------------
 1412|       |
 1413|       |    /* alias */
 1414|   233k|    tmpc = c->dp;
 1415|       |
 1416|       |    /* carry */
 1417|   233k|    r    = 0;
 1418|  10.8M|    for (x = 0; x < c->used; x++) {
  ------------------
  |  Branch (1418:17): [True: 10.6M, False: 233k]
  ------------------
 1419|       |      /* get the higher bits of the current word */
 1420|  10.6M|      rr = (*tmpc >> shift) & mask;
 1421|       |
 1422|       |      /* shift the current word and OR in the carry */
 1423|  10.6M|      *tmpc = ((*tmpc << d) | r) & MP_MASK;
  ------------------
  |  |   84|  10.6M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  10.6M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 1424|  10.6M|      ++tmpc;
 1425|       |
 1426|       |      /* set the carry to the carry bits of the current word */
 1427|  10.6M|      r = rr;
 1428|  10.6M|    }
 1429|       |
 1430|       |    /* set final carry */
 1431|   233k|    if (r != 0) {
  ------------------
  |  Branch (1431:9): [True: 786, False: 232k]
  ------------------
 1432|    786|       c->dp[(c->used)++] = r;
 1433|    786|    }
 1434|   233k|  }
 1435|   233k|  mp_clamp (c);
 1436|   233k|  return MP_OKAY;
  ------------------
  |  |   93|   233k|#define MP_OKAY       0   /* ok result */
  ------------------
 1437|   233k|}
bignum.c:mp_lshd:
 1495|  10.2k|{
 1496|  10.2k|  int     x, res;
 1497|       |
 1498|       |  /* if its less than zero return */
 1499|  10.2k|  if (b <= 0) {
  ------------------
  |  Branch (1499:7): [True: 0, False: 10.2k]
  ------------------
 1500|      0|    return MP_OKAY;
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
 1501|      0|  }
 1502|       |
 1503|       |  /* grow to fit the new digits */
 1504|  10.2k|  if (a->alloc < a->used + b) {
  ------------------
  |  Branch (1504:7): [True: 0, False: 10.2k]
  ------------------
 1505|      0|     if ((res = mp_grow (a, a->used + b)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1505:10): [True: 0, False: 0]
  ------------------
 1506|      0|       return res;
 1507|      0|     }
 1508|      0|  }
 1509|       |
 1510|  10.2k|  {
 1511|  10.2k|    register mp_digit *top, *bottom;
 1512|       |
 1513|       |    /* increment the used by the shift amount then copy upwards */
 1514|  10.2k|    a->used += b;
 1515|       |
 1516|       |    /* top */
 1517|  10.2k|    top = a->dp + a->used - 1;
 1518|       |
 1519|       |    /* base */
 1520|  10.2k|    bottom = a->dp + a->used - 1 - b;
 1521|       |
 1522|       |    /* much like mp_rshd this is implemented using a sliding window
 1523|       |     * except the window goes the otherway around.  Copying from
 1524|       |     * the bottom to the top.  see bn_mp_rshd.c for more info.
 1525|       |     */
 1526|  31.8k|    for (x = a->used - 1; x >= b; x--) {
  ------------------
  |  Branch (1526:27): [True: 21.5k, False: 10.2k]
  ------------------
 1527|  21.5k|      *top-- = *bottom--;
 1528|  21.5k|    }
 1529|       |
 1530|       |    /* zero the lower digits */
 1531|  10.2k|    top = a->dp;
 1532|  91.6k|    for (x = 0; x < b; x++) {
  ------------------
  |  Branch (1532:17): [True: 81.3k, False: 10.2k]
  ------------------
 1533|  81.3k|      *top++ = 0;
 1534|  81.3k|    }
 1535|  10.2k|  }
 1536|  10.2k|  return MP_OKAY;
  ------------------
  |  |   93|  10.2k|#define MP_OKAY       0   /* ok result */
  ------------------
 1537|  10.2k|}
bignum.c:mp_cmp:
  679|  1.66M|{
  680|       |  /* compare based on sign */
  681|  1.66M|  if (a->sign != b->sign) {
  ------------------
  |  Branch (681:7): [True: 0, False: 1.66M]
  ------------------
  682|      0|     if (a->sign == MP_NEG) {
  ------------------
  |  |   91|      0|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (682:10): [True: 0, False: 0]
  ------------------
  683|      0|        return MP_LT;
  ------------------
  |  |   86|      0|#define MP_LT        -1   /* less than */
  ------------------
  684|      0|     } else {
  685|      0|        return MP_GT;
  ------------------
  |  |   88|      0|#define MP_GT         1   /* greater than */
  ------------------
  686|      0|     }
  687|      0|  }
  688|       |
  689|       |  /* compare digits */
  690|  1.66M|  if (a->sign == MP_NEG) {
  ------------------
  |  |   91|  1.66M|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (690:7): [True: 0, False: 1.66M]
  ------------------
  691|       |     /* if negative compare opposite direction */
  692|      0|     return mp_cmp_mag(b, a);
  693|  1.66M|  } else {
  694|  1.66M|     return mp_cmp_mag(a, b);
  695|  1.66M|  }
  696|  1.66M|}
bignum.c:mp_cmp_mag:
  920|  2.28M|{
  921|  2.28M|  int     n;
  922|  2.28M|  mp_digit *tmpa, *tmpb;
  923|       |
  924|       |  /* compare based on # of non-zero digits */
  925|  2.28M|  if (a->used > b->used) {
  ------------------
  |  Branch (925:7): [True: 58.4k, False: 2.23M]
  ------------------
  926|  58.4k|    return MP_GT;
  ------------------
  |  |   88|  58.4k|#define MP_GT         1   /* greater than */
  ------------------
  927|  58.4k|  }
  928|       |
  929|  2.23M|  if (a->used < b->used) {
  ------------------
  |  Branch (929:7): [True: 49.1k, False: 2.18M]
  ------------------
  930|  49.1k|    return MP_LT;
  ------------------
  |  |   86|  49.1k|#define MP_LT        -1   /* less than */
  ------------------
  931|  49.1k|  }
  932|       |
  933|       |  /* alias for a */
  934|  2.18M|  tmpa = a->dp + (a->used - 1);
  935|       |
  936|       |  /* alias for b */
  937|  2.18M|  tmpb = b->dp + (a->used - 1);
  938|       |
  939|       |  /* compare based on digits  */
  940|  2.38M|  for (n = 0; n < a->used; ++n, --tmpa, --tmpb) {
  ------------------
  |  Branch (940:15): [True: 2.37M, False: 6.78k]
  ------------------
  941|  2.37M|    if (*tmpa > *tmpb) {
  ------------------
  |  Branch (941:9): [True: 1.59M, False: 785k]
  ------------------
  942|  1.59M|      return MP_GT;
  ------------------
  |  |   88|  1.59M|#define MP_GT         1   /* greater than */
  ------------------
  943|  1.59M|    }
  944|       |
  945|   785k|    if (*tmpa < *tmpb) {
  ------------------
  |  Branch (945:9): [True: 583k, False: 201k]
  ------------------
  946|   583k|      return MP_LT;
  ------------------
  |  |   86|   583k|#define MP_LT        -1   /* less than */
  ------------------
  947|   583k|    }
  948|   785k|  }
  949|  6.78k|  return MP_EQ;
  ------------------
  |  |   87|  6.78k|#define MP_EQ         0   /* equal to */
  ------------------
  950|  2.18M|}
bignum.c:mp_cmp_d:
  701|   235k|{
  702|       |  /* compare based on sign */
  703|   235k|  if (a->sign == MP_NEG) {
  ------------------
  |  |   91|   235k|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (703:7): [True: 8.67k, False: 226k]
  ------------------
  704|  8.67k|    return MP_LT;
  ------------------
  |  |   86|  8.67k|#define MP_LT        -1   /* less than */
  ------------------
  705|  8.67k|  }
  706|       |
  707|       |  /* compare based on magnitude */
  708|   226k|  if (a->used > 1) {
  ------------------
  |  Branch (708:7): [True: 213k, False: 13.0k]
  ------------------
  709|   213k|    return MP_GT;
  ------------------
  |  |   88|   213k|#define MP_GT         1   /* greater than */
  ------------------
  710|   213k|  }
  711|       |
  712|       |  /* compare the only digit of a to b */
  713|  13.0k|  if (a->dp[0] > b) {
  ------------------
  |  Branch (713:7): [True: 6.33k, False: 6.72k]
  ------------------
  714|  6.33k|    return MP_GT;
  ------------------
  |  |   88|  6.33k|#define MP_GT         1   /* greater than */
  ------------------
  715|  6.72k|  } else if (a->dp[0] < b) {
  ------------------
  |  Branch (715:14): [True: 0, False: 6.72k]
  ------------------
  716|      0|    return MP_LT;
  ------------------
  |  |   86|      0|#define MP_LT        -1   /* less than */
  ------------------
  717|  6.72k|  } else {
  718|  6.72k|    return MP_EQ;
  ------------------
  |  |   87|  6.72k|#define MP_EQ         0   /* equal to */
  ------------------
  719|  6.72k|  }
  720|  13.0k|}
bignum.c:mp_add:
  417|   388k|{
  418|   388k|  int     sa, sb, res;
  419|       |
  420|       |  /* get sign of both inputs */
  421|   388k|  sa = a->sign;
  422|   388k|  sb = b->sign;
  423|       |
  424|       |  /* handle two cases, not four */
  425|   388k|  if (sa == sb) {
  ------------------
  |  Branch (425:7): [True: 379k, False: 8.67k]
  ------------------
  426|       |    /* both positive or both negative */
  427|       |    /* add their magnitudes, copy the sign */
  428|   379k|    c->sign = sa;
  429|   379k|    res = s_mp_add (a, b, c);
  430|   379k|  } else {
  431|       |    /* one positive, the other negative */
  432|       |    /* subtract the one with the greater magnitude from */
  433|       |    /* the one of the lesser magnitude.  The result gets */
  434|       |    /* the sign of the one with the greater magnitude. */
  435|  8.67k|    if (mp_cmp_mag (a, b) == MP_LT) {
  ------------------
  |  |   86|  8.67k|#define MP_LT        -1   /* less than */
  ------------------
  |  Branch (435:9): [True: 8.67k, False: 0]
  ------------------
  436|  8.67k|      c->sign = sb;
  437|  8.67k|      res = s_mp_sub (b, a, c);
  438|  8.67k|    } else {
  439|      0|      c->sign = sa;
  440|      0|      res = s_mp_sub (a, b, c);
  441|      0|    }
  442|  8.67k|  }
  443|   388k|  return res;
  444|   388k|}
bignum.c:s_mp_add:
  213|   379k|{
  214|   379k|  mp_int *x;
  215|   379k|  int     olduse, res, min, max;
  216|       |
  217|       |  /* find sizes, we let |a| <= |b| which means we have to sort
  218|       |   * them.  "x" will point to the input with the most digits
  219|       |   */
  220|   379k|  if (a->used > b->used) {
  ------------------
  |  Branch (220:7): [True: 364k, False: 15.2k]
  ------------------
  221|   364k|    min = b->used;
  222|   364k|    max = a->used;
  223|   364k|    x = a;
  224|   364k|  } else {
  225|  15.2k|    min = a->used;
  226|  15.2k|    max = b->used;
  227|  15.2k|    x = b;
  228|  15.2k|  }
  229|       |
  230|       |  /* init result */
  231|   379k|  if (c->alloc < max + 1) {
  ------------------
  |  Branch (231:7): [True: 681, False: 378k]
  ------------------
  232|    681|    if ((res = mp_grow (c, max + 1)) != MP_OKAY) {
  ------------------
  |  |   93|    681|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (232:9): [True: 0, False: 681]
  ------------------
  233|      0|      return res;
  234|      0|    }
  235|    681|  }
  236|       |
  237|       |  /* get old used digit count and set new one */
  238|   379k|  olduse = c->used;
  239|   379k|  c->used = max + 1;
  240|       |
  241|   379k|  {
  242|   379k|    register mp_digit u, *tmpa, *tmpb, *tmpc;
  243|   379k|    register int i;
  244|       |
  245|       |    /* alias for digit pointers */
  246|       |
  247|       |    /* first input */
  248|   379k|    tmpa = a->dp;
  249|       |
  250|       |    /* second input */
  251|   379k|    tmpb = b->dp;
  252|       |
  253|       |    /* destination */
  254|   379k|    tmpc = c->dp;
  255|       |
  256|       |    /* zero the carry */
  257|   379k|    u = 0;
  258|  3.85M|    for (i = 0; i < min; i++) {
  ------------------
  |  Branch (258:17): [True: 3.47M, False: 379k]
  ------------------
  259|       |      /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */
  260|  3.47M|      *tmpc = *tmpa++ + *tmpb++ + u;
  261|       |
  262|       |      /* U = carry bit of T[i] */
  263|  3.47M|      u = *tmpc >> ((mp_digit)DIGIT_BIT);
  ------------------
  |  |   68|  3.47M|#define DIGIT_BIT 60
  ------------------
  264|       |
  265|       |      /* take away carry bit from T[i] */
  266|  3.47M|      *tmpc++ &= MP_MASK;
  ------------------
  |  |   84|  3.47M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  3.47M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
  267|  3.47M|    }
  268|       |
  269|       |    /* now copy higher words if any, that is in A+B
  270|       |     * if A or B has more digits add those in
  271|       |     */
  272|   379k|    if (min != max) {
  ------------------
  |  Branch (272:9): [True: 365k, False: 14.4k]
  ------------------
  273|  3.58M|      for (; i < max; i++) {
  ------------------
  |  Branch (273:14): [True: 3.22M, False: 365k]
  ------------------
  274|       |        /* T[i] = X[i] + U */
  275|  3.22M|        *tmpc = x->dp[i] + u;
  276|       |
  277|       |        /* U = carry bit of T[i] */
  278|  3.22M|        u = *tmpc >> ((mp_digit)DIGIT_BIT);
  ------------------
  |  |   68|  3.22M|#define DIGIT_BIT 60
  ------------------
  279|       |
  280|       |        /* take away carry bit from T[i] */
  281|  3.22M|        *tmpc++ &= MP_MASK;
  ------------------
  |  |   84|  3.22M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  3.22M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
  282|  3.22M|      }
  283|   365k|    }
  284|       |
  285|       |    /* add carry */
  286|   379k|    *tmpc++ = u;
  287|       |
  288|       |    /* clear digits above oldused */
  289|   379k|    for (i = c->used; i < olduse; i++) {
  ------------------
  |  Branch (289:23): [True: 0, False: 379k]
  ------------------
  290|      0|      *tmpc++ = 0;
  291|      0|    }
  292|   379k|  }
  293|       |
  294|   379k|  mp_clamp (c);
  295|   379k|  return MP_OKAY;
  ------------------
  |  |   93|   379k|#define MP_OKAY       0   /* ok result */
  ------------------
  296|   379k|}
bignum.c:s_mp_sub:
  301|  1.29M|{
  302|  1.29M|  int     olduse, res, min, max;
  303|       |
  304|       |  /* find sizes */
  305|  1.29M|  min = b->used;
  306|  1.29M|  max = a->used;
  307|       |
  308|       |  /* init result */
  309|  1.29M|  if (c->alloc < max) {
  ------------------
  |  Branch (309:7): [True: 0, False: 1.29M]
  ------------------
  310|      0|    if ((res = mp_grow (c, max)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (310:9): [True: 0, False: 0]
  ------------------
  311|      0|      return res;
  312|      0|    }
  313|      0|  }
  314|  1.29M|  olduse = c->used;
  315|  1.29M|  c->used = max;
  316|       |
  317|  1.29M|  {
  318|  1.29M|    register mp_digit u, *tmpa, *tmpb, *tmpc;
  319|  1.29M|    register int i;
  320|       |
  321|       |    /* alias for digit pointers */
  322|  1.29M|    tmpa = a->dp;
  323|  1.29M|    tmpb = b->dp;
  324|  1.29M|    tmpc = c->dp;
  325|       |
  326|       |    /* set carry to zero */
  327|  1.29M|    u = 0;
  328|  24.5M|    for (i = 0; i < min; i++) {
  ------------------
  |  Branch (328:17): [True: 23.2M, False: 1.29M]
  ------------------
  329|       |      /* T[i] = A[i] - B[i] - U */
  330|  23.2M|      *tmpc = *tmpa++ - *tmpb++ - u;
  331|       |
  332|       |      /* U = carry bit of T[i]
  333|       |       * Note this saves performing an AND operation since
  334|       |       * if a carry does occur it will propagate all the way to the
  335|       |       * MSB.  As a result a single shift is enough to get the carry
  336|       |       */
  337|  23.2M|      u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1));
  ------------------
  |  |   18|  23.2M|#define CHAR_BIT 8
  ------------------
  338|       |
  339|       |      /* Clear carry from T[i] */
  340|  23.2M|      *tmpc++ &= MP_MASK;
  ------------------
  |  |   84|  23.2M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  23.2M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
  341|  23.2M|    }
  342|       |
  343|       |    /* now copy higher words if any, e.g. if A has more digits than B  */
  344|  1.37M|    for (; i < max; i++) {
  ------------------
  |  Branch (344:12): [True: 81.6k, False: 1.29M]
  ------------------
  345|       |      /* T[i] = A[i] - U */
  346|  81.6k|      *tmpc = *tmpa++ - u;
  347|       |
  348|       |      /* U = carry bit of T[i] */
  349|  81.6k|      u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1));
  ------------------
  |  |   18|  81.6k|#define CHAR_BIT 8
  ------------------
  350|       |
  351|       |      /* Clear carry from T[i] */
  352|  81.6k|      *tmpc++ &= MP_MASK;
  ------------------
  |  |   84|  81.6k|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  81.6k|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
  353|  81.6k|    }
  354|       |
  355|       |    /* clear digits above used (since we may not have grown result above) */
  356|  1.29M|    for (i = c->used; i < olduse; i++) {
  ------------------
  |  Branch (356:23): [True: 0, False: 1.29M]
  ------------------
  357|      0|      *tmpc++ = 0;
  358|      0|    }
  359|  1.29M|  }
  360|       |
  361|  1.29M|  mp_clamp (c);
  362|  1.29M|  return MP_OKAY;
  ------------------
  |  |   93|  1.29M|#define MP_OKAY       0   /* ok result */
  ------------------
  363|  1.29M|}
bignum.c:mp_sub:
  449|   614k|{
  450|   614k|  int     sa, sb, res;
  451|       |
  452|   614k|  sa = a->sign;
  453|   614k|  sb = b->sign;
  454|       |
  455|   614k|  if (sa != sb) {
  ------------------
  |  Branch (455:7): [True: 0, False: 614k]
  ------------------
  456|       |    /* subtract a negative from a positive, OR */
  457|       |    /* subtract a positive from a negative. */
  458|       |    /* In either case, ADD their magnitudes, */
  459|       |    /* and use the sign of the first number. */
  460|      0|    c->sign = sa;
  461|      0|    res = s_mp_add (a, b, c);
  462|   614k|  } else {
  463|       |    /* subtract a positive from a positive, OR */
  464|       |    /* subtract a negative from a negative. */
  465|       |    /* First, take the difference between their */
  466|       |    /* magnitudes, then... */
  467|   614k|    if (mp_cmp_mag (a, b) != MP_LT) {
  ------------------
  |  |   86|   614k|#define MP_LT        -1   /* less than */
  ------------------
  |  Branch (467:9): [True: 605k, False: 8.67k]
  ------------------
  468|       |      /* Copy the sign from the first */
  469|   605k|      c->sign = sa;
  470|       |      /* The first has a larger or equal magnitude */
  471|   605k|      res = s_mp_sub (a, b, c);
  472|   605k|    } else {
  473|       |      /* The result has the *opposite* sign from */
  474|       |      /* the first number. */
  475|  8.67k|      c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS;
  ------------------
  |  |   90|  8.67k|#define MP_ZPOS       0   /* positive integer */
  ------------------
                    c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS;
  ------------------
  |  |   91|  8.67k|#define MP_NEG        1   /* negative */
  ------------------
                    c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS;
  ------------------
  |  |   90|  8.67k|#define MP_ZPOS       0   /* positive integer */
  ------------------
  |  Branch (475:17): [True: 8.67k, False: 0]
  ------------------
  476|       |      /* The second has a larger magnitude */
  477|  8.67k|      res = s_mp_sub (b, a, c);
  478|  8.67k|    }
  479|   614k|  }
  480|   614k|  return res;
  481|   614k|}
bignum.c:mp_mul:
  486|  33.7k|{
  487|  33.7k|  int     res, neg;
  488|  33.7k|  neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;
  ------------------
  |  |   90|  33.7k|#define MP_ZPOS       0   /* positive integer */
  ------------------
                neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;
  ------------------
  |  |   91|  33.7k|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (488:9): [True: 33.7k, False: 0]
  ------------------
  489|       |
  490|       |  /* use Toom-Cook? */
  491|       |#ifdef BN_MP_TOOM_MUL_C
  492|       |  if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) {
  493|       |    res = mp_toom_mul(a, b, c);
  494|       |  } else
  495|       |#endif
  496|       |#ifdef BN_MP_KARATSUBA_MUL_C
  497|       |  /* use Karatsuba? */
  498|       |  if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) {
  499|       |    res = mp_karatsuba_mul (a, b, c);
  500|       |  } else
  501|       |#endif
  502|  33.7k|  {
  503|       |    /* can we use the fast multiplier?
  504|       |     *
  505|       |     * The fast multiplier can be used if the output will
  506|       |     * have less than MP_WARRAY digits and the number of
  507|       |     * digits won't affect carry propagation
  508|       |     */
  509|       |#ifdef BN_FAST_S_MP_MUL_DIGS_C
  510|       |    int     digs = a->used + b->used + 1;
  511|       |
  512|       |    if ((digs < MP_WARRAY) &&
  513|       |        MIN(a->used, b->used) <=
  514|       |        (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) {
  515|       |      res = fast_s_mp_mul_digs (a, b, c, digs);
  516|       |    } else
  517|       |#endif
  518|  33.7k|#ifdef BN_S_MP_MUL_DIGS_C
  519|  33.7k|      res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */
  ------------------
  |  |  131|  33.7k|#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1)
  ------------------
  520|       |#else
  521|       |#error mp_mul could fail
  522|       |      res = MP_VAL;
  523|       |#endif
  524|       |
  525|  33.7k|  }
  526|  33.7k|  c->sign = (c->used > 0) ? neg : MP_ZPOS;
  ------------------
  |  |   90|  34.5k|#define MP_ZPOS       0   /* positive integer */
  ------------------
  |  Branch (526:13): [True: 32.8k, False: 808]
  ------------------
  527|  33.7k|  return res;
  528|  33.7k|}
bignum.c:s_mp_mul_digs:
 2334|   268k|{
 2335|   268k|  mp_int  t;
 2336|   268k|  int     res, pa, pb, ix, iy;
 2337|   268k|  mp_digit u;
 2338|   268k|  mp_word r;
 2339|   268k|  mp_digit tmpx, *tmpt, *tmpy;
 2340|       |
 2341|       |#ifdef BN_FAST_S_MP_MUL_DIGS_C
 2342|       |  /* can we use the fast multiplier? */
 2343|       |  if (((digs) < MP_WARRAY) &&
 2344|       |      MIN (a->used, b->used) <
 2345|       |          (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) {
 2346|       |    return fast_s_mp_mul_digs (a, b, c, digs);
 2347|       |  }
 2348|       |#endif
 2349|       |
 2350|   268k|  if ((res = mp_init_size (&t, digs)) != MP_OKAY) {
  ------------------
  |  |   93|   268k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2350:7): [True: 0, False: 268k]
  ------------------
 2351|      0|    return res;
 2352|      0|  }
 2353|   268k|  t.used = digs;
 2354|       |
 2355|       |  /* compute the digits of the product directly */
 2356|   268k|  pa = a->used;
 2357|  3.47M|  for (ix = 0; ix < pa; ix++) {
  ------------------
  |  Branch (2357:16): [True: 3.20M, False: 268k]
  ------------------
 2358|       |    /* set the carry to zero */
 2359|  3.20M|    u = 0;
 2360|       |
 2361|       |    /* limit ourselves to making digs digits of output */
 2362|  3.20M|    pb = MIN (b->used, digs - ix);
  ------------------
  |  |  468|  3.20M|#define MIN(a, b) ((a) < (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (468:20): [True: 656k, False: 2.55M]
  |  |  ------------------
  ------------------
 2363|       |
 2364|       |    /* setup some aliases */
 2365|       |    /* copy of the digit from a used within the nested loop */
 2366|  3.20M|    tmpx = a->dp[ix];
 2367|       |
 2368|       |    /* an alias for the destination shifted ix places */
 2369|  3.20M|    tmpt = t.dp + ix;
 2370|       |
 2371|       |    /* an alias for the digits of b */
 2372|  3.20M|    tmpy = b->dp;
 2373|       |
 2374|       |    /* compute the columns of the output and propagate the carry */
 2375|  33.8M|    for (iy = 0; iy < pb; iy++) {
  ------------------
  |  Branch (2375:18): [True: 30.6M, False: 3.20M]
  ------------------
 2376|       |      /* compute the column as a mp_word */
 2377|  30.6M|      r       = ((mp_word)*tmpt) +
 2378|  30.6M|                ((mp_word)tmpx) * ((mp_word)*tmpy++) +
 2379|  30.6M|                ((mp_word) u);
 2380|       |
 2381|       |      /* the new column is the lower part of the result */
 2382|  30.6M|      *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK));
  ------------------
  |  |   84|  30.6M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  30.6M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 2383|       |
 2384|       |      /* get the carry word from the result */
 2385|  30.6M|      u       = (mp_digit) (r >> ((mp_word) DIGIT_BIT));
  ------------------
  |  |   68|  30.6M|#define DIGIT_BIT 60
  ------------------
 2386|  30.6M|    }
 2387|       |    /* set carry if it is placed below digs */
 2388|  3.20M|    if (ix + iy < digs) {
  ------------------
  |  Branch (2388:9): [True: 656k, False: 2.55M]
  ------------------
 2389|   656k|      *tmpt = u;
 2390|   656k|    }
 2391|  3.20M|  }
 2392|       |
 2393|   268k|  mp_clamp (&t);
 2394|   268k|  mp_exch (&t, c);
 2395|       |
 2396|   268k|  mp_clear (&t);
 2397|   268k|  return MP_OKAY;
  ------------------
  |  |   93|   268k|#define MP_OKAY       0   /* ok result */
  ------------------
 2398|   268k|}
bignum.c:mp_init_size:
 2493|   705k|{
 2494|   705k|  int x;
 2495|       |
 2496|       |  /* pad size so there are always extra digits */
 2497|   705k|  size += (MP_PREC * 2) - (size % MP_PREC);
  ------------------
  |  |  110|   705k|      #define MP_PREC                 8      /* default digits of precision */
  ------------------
                size += (MP_PREC * 2) - (size % MP_PREC);
  ------------------
  |  |  110|   705k|      #define MP_PREC                 8      /* default digits of precision */
  ------------------
 2498|       |
 2499|       |  /* alloc mem */
 2500|   705k|  a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size);
  ------------------
  |  |   79|   705k|#define XMALLOC  os_malloc
  |  |  ------------------
  |  |  |  |  505|   705k|#define os_malloc(s) malloc((s))
  |  |  ------------------
  ------------------
 2501|   705k|  if (a->dp == NULL) {
  ------------------
  |  Branch (2501:7): [True: 0, False: 705k]
  ------------------
 2502|      0|    return MP_MEM;
  ------------------
  |  |   94|      0|#define MP_MEM        -2  /* out of mem */
  ------------------
 2503|      0|  }
 2504|       |
 2505|       |  /* set the members */
 2506|   705k|  a->used  = 0;
 2507|   705k|  a->alloc = size;
 2508|   705k|  a->sign  = MP_ZPOS;
  ------------------
  |  |   90|   705k|#define MP_ZPOS       0   /* positive integer */
  ------------------
 2509|       |
 2510|       |  /* zero the digits */
 2511|  24.4M|  for (x = 0; x < size; x++) {
  ------------------
  |  Branch (2511:15): [True: 23.7M, False: 705k]
  ------------------
 2512|  23.7M|      a->dp[x] = 0;
 2513|  23.7M|  }
 2514|       |
 2515|   705k|  return MP_OKAY;
  ------------------
  |  |   93|   705k|#define MP_OKAY       0   /* ok result */
  ------------------
 2516|   705k|}
bignum.c:mp_mod:
  553|    806|{
  554|    806|  mp_int  t;
  555|    806|  int     res;
  556|       |
  557|    806|  if ((res = mp_init (&t)) != MP_OKAY) {
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (557:7): [True: 0, False: 806]
  ------------------
  558|      0|    return res;
  559|      0|  }
  560|       |
  561|    806|  if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) {
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (561:7): [True: 0, False: 806]
  ------------------
  562|      0|    mp_clear (&t);
  563|      0|    return res;
  564|      0|  }
  565|       |
  566|    806|  if (t.sign != b->sign) {
  ------------------
  |  Branch (566:7): [True: 0, False: 806]
  ------------------
  567|      0|    res = mp_add (b, &t, c);
  568|    806|  } else {
  569|    806|    res = MP_OKAY;
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
  570|    806|    mp_exch (&t, c);
  571|    806|  }
  572|       |
  573|    806|  mp_clear (&t);
  574|    806|  return res;
  575|    806|}
bignum.c:mp_div:
 1602|  1.61k|{
 1603|  1.61k|   mp_int ta, tb, tq, q;
 1604|  1.61k|   int    res, n, n2;
 1605|       |
 1606|       |  /* is divisor zero ? */
 1607|  1.61k|  if (mp_iszero (b) == 1) {
  ------------------
  |  |  125|  1.61k|#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   97|      6|#define MP_YES        1   /* yes response */
  |  |  ------------------
  |  |               #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   98|  1.61k|#define MP_NO         0   /* no response */
  |  |  ------------------
  |  |  |  Branch (125:23): [True: 6, False: 1.61k]
  |  |  ------------------
  ------------------
  |  Branch (1607:7): [True: 6, False: 1.61k]
  ------------------
 1608|      6|    return MP_VAL;
  ------------------
  |  |   95|      6|#define MP_VAL        -3  /* invalid input */
  ------------------
 1609|      6|  }
 1610|       |
 1611|       |  /* if a < b then q=0, r = a */
 1612|  1.61k|  if (mp_cmp_mag (a, b) == MP_LT) {
  ------------------
  |  |   86|  1.61k|#define MP_LT        -1   /* less than */
  ------------------
  |  Branch (1612:7): [True: 797, False: 815]
  ------------------
 1613|    797|    if (d != NULL) {
  ------------------
  |  Branch (1613:9): [True: 797, False: 0]
  ------------------
 1614|    797|      res = mp_copy (a, d);
 1615|    797|    } else {
 1616|      0|      res = MP_OKAY;
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
 1617|      0|    }
 1618|    797|    if (c != NULL) {
  ------------------
  |  Branch (1618:9): [True: 0, False: 797]
  ------------------
 1619|      0|      mp_zero (c);
 1620|      0|    }
 1621|    797|    return res;
 1622|    797|  }
 1623|       |
 1624|       |  /* init our temps */
 1625|    815|  if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL)) != MP_OKAY) {
  ------------------
  |  |   93|    815|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1625:7): [True: 0, False: 815]
  ------------------
 1626|      0|     return res;
 1627|      0|  }
 1628|       |
 1629|       |
 1630|    815|  mp_set(&tq, 1);
 1631|    815|  n = mp_count_bits(a) - mp_count_bits(b);
 1632|    815|  if (((res = mp_abs(a, &ta)) != MP_OKAY) ||
  ------------------
  |  |   93|    815|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1632:7): [True: 0, False: 815]
  ------------------
 1633|    815|      ((res = mp_abs(b, &tb)) != MP_OKAY) ||
  ------------------
  |  |   93|    815|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1633:7): [True: 0, False: 815]
  ------------------
 1634|    815|      ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) ||
  ------------------
  |  |   93|    815|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1634:7): [True: 0, False: 815]
  ------------------
 1635|    815|      ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) {
  ------------------
  |  |   93|    815|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1635:7): [True: 0, False: 815]
  ------------------
 1636|      0|      goto LBL_ERR;
 1637|      0|  }
 1638|       |
 1639|   756k|  while (n-- >= 0) {
  ------------------
  |  Branch (1639:10): [True: 755k, False: 815]
  ------------------
 1640|   755k|     if (mp_cmp(&tb, &ta) != MP_GT) {
  ------------------
  |  |   88|   755k|#define MP_GT         1   /* greater than */
  ------------------
  |  Branch (1640:10): [True: 379k, False: 375k]
  ------------------
 1641|   379k|        if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) ||
  ------------------
  |  |   93|   379k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1641:13): [True: 0, False: 379k]
  ------------------
 1642|   379k|            ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) {
  ------------------
  |  |   93|   379k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1642:13): [True: 0, False: 379k]
  ------------------
 1643|      0|           goto LBL_ERR;
 1644|      0|        }
 1645|   379k|     }
 1646|   755k|     if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) ||
  ------------------
  |  |   93|   755k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1646:10): [True: 0, False: 755k]
  ------------------
 1647|   755k|         ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) {
  ------------------
  |  |   93|   755k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1647:10): [True: 0, False: 755k]
  ------------------
 1648|      0|           goto LBL_ERR;
 1649|      0|     }
 1650|   755k|  }
 1651|       |
 1652|       |  /* now q == quotient and ta == remainder */
 1653|    815|  n  = a->sign;
 1654|    815|  n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG);
  ------------------
  |  |   90|    815|#define MP_ZPOS       0   /* positive integer */
  ------------------
                n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG);
  ------------------
  |  |   91|      0|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (1654:9): [True: 815, False: 0]
  ------------------
 1655|    815|  if (c != NULL) {
  ------------------
  |  Branch (1655:7): [True: 806, False: 9]
  ------------------
 1656|    806|     mp_exch(c, &q);
 1657|    806|     c->sign  = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2;
  ------------------
  |  |  125|    806|#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   97|      0|#define MP_YES        1   /* yes response */
  |  |  ------------------
  |  |               #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   98|    806|#define MP_NO         0   /* no response */
  |  |  ------------------
  |  |  |  Branch (125:23): [True: 0, False: 806]
  |  |  ------------------
  ------------------
                   c->sign  = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2;
  ------------------
  |  |   97|    806|#define MP_YES        1   /* yes response */
  ------------------
                   c->sign  = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2;
  ------------------
  |  |   90|      0|#define MP_ZPOS       0   /* positive integer */
  ------------------
  |  Branch (1657:17): [True: 0, False: 806]
  ------------------
 1658|    806|  }
 1659|    815|  if (d != NULL) {
  ------------------
  |  Branch (1659:7): [True: 9, False: 806]
  ------------------
 1660|      9|     mp_exch(d, &ta);
 1661|      9|     d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n;
  ------------------
  |  |  125|      9|#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   97|      9|#define MP_YES        1   /* yes response */
  |  |  ------------------
  |  |               #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
  |  |  ------------------
  |  |  |  |   98|      0|#define MP_NO         0   /* no response */
  |  |  ------------------
  |  |  |  Branch (125:23): [True: 9, False: 0]
  |  |  ------------------
  ------------------
                   d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n;
  ------------------
  |  |   97|      9|#define MP_YES        1   /* yes response */
  ------------------
                   d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n;
  ------------------
  |  |   90|      9|#define MP_ZPOS       0   /* positive integer */
  ------------------
  |  Branch (1661:16): [True: 9, False: 0]
  ------------------
 1662|      9|  }
 1663|    815|LBL_ERR:
 1664|       |   mp_clear_multi(&ta, &tb, &tq, &q, NULL);
 1665|    815|   return res;
 1666|    815|}
bignum.c:mp_init_multi:
 1442|    815|{
 1443|    815|    mp_err res = MP_OKAY;      /* Assume ok until proven otherwise */
  ------------------
  |  |   93|    815|#define MP_OKAY       0   /* ok result */
  ------------------
 1444|    815|    int n = 0;                 /* Number of ok inits */
 1445|    815|    mp_int* cur_arg = mp;
 1446|    815|    va_list args;
 1447|       |
 1448|    815|    va_start(args, mp);        /* init args to next argument from caller */
 1449|  4.07k|    while (cur_arg != NULL) {
  ------------------
  |  Branch (1449:12): [True: 3.26k, False: 815]
  ------------------
 1450|  3.26k|        if (mp_init(cur_arg) != MP_OKAY) {
  ------------------
  |  |   93|  3.26k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1450:13): [True: 0, False: 3.26k]
  ------------------
 1451|       |            /* Oops - error! Back-track and mp_clear what we already
 1452|       |               succeeded in init-ing, then return error.
 1453|       |            */
 1454|      0|            va_list clean_args;
 1455|       |
 1456|       |            /* end the current list */
 1457|      0|            va_end(args);
 1458|       |
 1459|       |            /* now start cleaning up */
 1460|      0|            cur_arg = mp;
 1461|      0|            va_start(clean_args, mp);
 1462|      0|            while (n--) {
  ------------------
  |  Branch (1462:20): [True: 0, False: 0]
  ------------------
 1463|      0|                mp_clear(cur_arg);
 1464|      0|                cur_arg = va_arg(clean_args, mp_int*);
 1465|      0|            }
 1466|      0|            va_end(clean_args);
 1467|      0|            return MP_MEM;
  ------------------
  |  |   94|      0|#define MP_MEM        -2  /* out of mem */
  ------------------
 1468|      0|        }
 1469|  3.26k|        n++;
 1470|  3.26k|        cur_arg = va_arg(args, mp_int*);
 1471|  3.26k|    }
 1472|    815|    va_end(args);
 1473|    815|    return res;                /* Assumed ok, if error flagged above. */
 1474|    815|}
bignum.c:mp_set:
 1318|  10.2k|{
 1319|  10.2k|  mp_zero (a);
 1320|  10.2k|  a->dp[0] = b & MP_MASK;
  ------------------
  |  |   84|  10.2k|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  10.2k|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 1321|  10.2k|  a->used  = (a->dp[0] != 0) ? 1 : 0;
  ------------------
  |  Branch (1321:14): [True: 10.2k, False: 0]
  ------------------
 1322|  10.2k|}
bignum.c:mp_abs:
 1298|  1.63k|{
 1299|  1.63k|  int     res;
 1300|       |
 1301|       |  /* copy a to b */
 1302|  1.63k|  if (a != b) {
  ------------------
  |  Branch (1302:7): [True: 1.63k, False: 0]
  ------------------
 1303|  1.63k|     if ((res = mp_copy (a, b)) != MP_OKAY) {
  ------------------
  |  |   93|  1.63k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1303:10): [True: 0, False: 1.63k]
  ------------------
 1304|      0|       return res;
 1305|      0|     }
 1306|  1.63k|  }
 1307|       |
 1308|       |  /* force the sign of b to positive */
 1309|  1.63k|  b->sign = MP_ZPOS;
  ------------------
  |  |   90|  1.63k|#define MP_ZPOS       0   /* positive integer */
  ------------------
 1310|       |
 1311|  1.63k|  return MP_OKAY;
  ------------------
  |  |   93|  1.63k|#define MP_OKAY       0   /* ok result */
  ------------------
 1312|  1.63k|}
bignum.c:mp_clear_multi:
 1480|    815|{
 1481|    815|    mp_int* next_mp = mp;
 1482|    815|    va_list args;
 1483|    815|    va_start(args, mp);
 1484|  4.07k|    while (next_mp != NULL) {
  ------------------
  |  Branch (1484:12): [True: 3.26k, False: 815]
  ------------------
 1485|  3.26k|        mp_clear(next_mp);
 1486|  3.26k|        next_mp = va_arg(args, mp_int*);
 1487|  3.26k|    }
 1488|       |    va_end(args);
 1489|    815|}
bignum.c:mp_exptmod:
  584|    812|{
  585|    812|  int dr;
  586|       |
  587|       |  /* modulus P must be positive */
  588|    812|  if (P->sign == MP_NEG) {
  ------------------
  |  |   91|    812|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (588:7): [True: 0, False: 812]
  ------------------
  589|      0|     return MP_VAL;
  ------------------
  |  |   95|      0|#define MP_VAL        -3  /* invalid input */
  ------------------
  590|      0|  }
  591|       |
  592|       |  /* if exponent X is negative we have to recurse */
  593|    812|  if (X->sign == MP_NEG) {
  ------------------
  |  |   91|    812|#define MP_NEG        1   /* negative */
  ------------------
  |  Branch (593:7): [True: 0, False: 812]
  ------------------
  594|      0|#ifdef LTM_NO_NEG_EXP
  595|      0|        return MP_VAL;
  ------------------
  |  |   95|      0|#define MP_VAL        -3  /* invalid input */
  ------------------
  596|       |#else /* LTM_NO_NEG_EXP */
  597|       |#ifdef BN_MP_INVMOD_C
  598|       |     mp_int tmpG, tmpX;
  599|       |     int err;
  600|       |
  601|       |     /* first compute 1/G mod P */
  602|       |     if ((err = mp_init(&tmpG)) != MP_OKAY) {
  603|       |        return err;
  604|       |     }
  605|       |     if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) {
  606|       |        mp_clear(&tmpG);
  607|       |        return err;
  608|       |     }
  609|       |
  610|       |     /* now get |X| */
  611|       |     if ((err = mp_init(&tmpX)) != MP_OKAY) {
  612|       |        mp_clear(&tmpG);
  613|       |        return err;
  614|       |     }
  615|       |     if ((err = mp_abs(X, &tmpX)) != MP_OKAY) {
  616|       |        mp_clear_multi(&tmpG, &tmpX, NULL);
  617|       |        return err;
  618|       |     }
  619|       |
  620|       |     /* and now compute (1/G)**|X| instead of G**X [X < 0] */
  621|       |     err = mp_exptmod(&tmpG, &tmpX, P, Y);
  622|       |     mp_clear_multi(&tmpG, &tmpX, NULL);
  623|       |     return err;
  624|       |#else
  625|       |#error mp_exptmod would always fail
  626|       |     /* no invmod */
  627|       |     return MP_VAL;
  628|       |#endif
  629|       |#endif /* LTM_NO_NEG_EXP */
  630|      0|  }
  631|       |
  632|       |/* modified diminished radix reduction */
  633|       |#if defined(BN_MP_REDUCE_IS_2K_L_C) && defined(BN_MP_REDUCE_2K_L_C) && defined(BN_S_MP_EXPTMOD_C)
  634|       |  if (mp_reduce_is_2k_l(P) == MP_YES) {
  635|       |     return s_mp_exptmod(G, X, P, Y, 1);
  636|       |  }
  637|       |#endif
  638|       |
  639|       |#ifdef BN_MP_DR_IS_MODULUS_C
  640|       |  /* is it a DR modulus? */
  641|       |  dr = mp_dr_is_modulus(P);
  642|       |#else
  643|       |  /* default to no */
  644|    812|  dr = 0;
  645|    812|#endif
  646|       |
  647|       |#ifdef BN_MP_REDUCE_IS_2K_C
  648|       |  /* if not, is it a unrestricted DR modulus? */
  649|       |  if (dr == 0) {
  650|       |     dr = mp_reduce_is_2k(P) << 1;
  651|       |  }
  652|       |#endif
  653|       |
  654|       |  /* if the modulus is odd or dr != 0 use the montgomery method */
  655|       |#ifdef BN_MP_EXPTMOD_FAST_C
  656|       |  if (mp_isodd (P) == 1 || dr !=  0) {
  657|       |    return mp_exptmod_fast (G, X, P, Y, dr);
  658|       |  } else {
  659|       |#endif
  660|    812|#ifdef BN_S_MP_EXPTMOD_C
  661|       |    /* otherwise use the generic Barrett reduction technique */
  662|    812|    return s_mp_exptmod (G, X, P, Y, 0);
  663|       |#else
  664|       |#error mp_exptmod could fail
  665|       |    /* no exptmod for evens */
  666|       |    return MP_VAL;
  667|       |#endif
  668|       |#ifdef BN_MP_EXPTMOD_FAST_C
  669|       |  }
  670|       |#endif
  671|      0|  if (dr == 0) {
  ------------------
  |  Branch (671:7): [True: 0, False: 0]
  ------------------
  672|       |    /* avoid compiler warnings about possibly unused variable */
  673|      0|  }
  674|      0|}
bignum.c:s_mp_exptmod:
 1876|    812|{
 1877|    812|  mp_int  M[TAB_SIZE], res, mu;
 1878|    812|  mp_digit buf;
 1879|    812|  int     err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize;
 1880|    812|  int (*redux)(mp_int*,mp_int*,mp_int*);
 1881|       |
 1882|       |  /* find window size */
 1883|    812|  x = mp_count_bits (X);
 1884|    812|  if (x <= 7) {
  ------------------
  |  Branch (1884:7): [True: 124, False: 688]
  ------------------
 1885|    124|    winsize = 2;
 1886|    688|  } else if (x <= 36) {
  ------------------
  |  Branch (1886:14): [True: 429, False: 259]
  ------------------
 1887|    429|    winsize = 3;
 1888|    429|  } else if (x <= 140) {
  ------------------
  |  Branch (1888:14): [True: 2, False: 257]
  ------------------
 1889|      2|    winsize = 4;
 1890|    257|  } else if (x <= 450) {
  ------------------
  |  Branch (1890:14): [True: 42, False: 215]
  ------------------
 1891|     42|    winsize = 5;
 1892|    215|  } else if (x <= 1303) {
  ------------------
  |  Branch (1892:14): [True: 215, False: 0]
  ------------------
 1893|    215|    winsize = 6;
 1894|    215|  } else if (x <= 3529) {
  ------------------
  |  Branch (1894:14): [True: 0, False: 0]
  ------------------
 1895|      0|    winsize = 7;
 1896|      0|  } else {
 1897|      0|    winsize = 8;
 1898|      0|  }
 1899|       |
 1900|    812|#ifdef MP_LOW_MEM
 1901|    812|    if (winsize > 5) {
  ------------------
  |  Branch (1901:9): [True: 215, False: 597]
  ------------------
 1902|    215|       winsize = 5;
 1903|    215|    }
 1904|    812|#endif
 1905|       |
 1906|       |  /* init M array */
 1907|       |  /* init first cell */
 1908|    812|  if ((err = mp_init(&M[1])) != MP_OKAY) {
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1908:7): [True: 0, False: 812]
  ------------------
 1909|      0|     return err;
 1910|      0|  }
 1911|       |
 1912|       |  /* now init the second half of the array */
 1913|  6.90k|  for (x = 1<<(winsize-1); x < (1 << winsize); x++) {
  ------------------
  |  Branch (1913:28): [True: 6.09k, False: 812]
  ------------------
 1914|  6.09k|    if ((err = mp_init(&M[x])) != MP_OKAY) {
  ------------------
  |  |   93|  6.09k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1914:9): [True: 0, False: 6.09k]
  ------------------
 1915|      0|      for (y = 1<<(winsize-1); y < x; y++) {
  ------------------
  |  Branch (1915:32): [True: 0, False: 0]
  ------------------
 1916|      0|        mp_clear (&M[y]);
 1917|      0|      }
 1918|      0|      mp_clear(&M[1]);
 1919|      0|      return err;
 1920|      0|    }
 1921|  6.09k|  }
 1922|       |
 1923|       |  /* create mu, used for Barrett reduction */
 1924|    812|  if ((err = mp_init (&mu)) != MP_OKAY) {
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1924:7): [True: 0, False: 812]
  ------------------
 1925|      0|    goto LBL_M;
 1926|      0|  }
 1927|       |
 1928|    812|  if (redmode == 0) {
  ------------------
  |  Branch (1928:7): [True: 812, False: 0]
  ------------------
 1929|    812|     if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) {
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1929:10): [True: 6, False: 806]
  ------------------
 1930|      6|        goto LBL_MU;
 1931|      6|     }
 1932|    806|     redux = mp_reduce;
 1933|    806|  } else {
 1934|      0|     if ((err = mp_reduce_2k_setup_l (P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1934:10): [True: 0, False: 0]
  ------------------
 1935|      0|        goto LBL_MU;
 1936|      0|     }
 1937|      0|     redux = mp_reduce_2k_l;
 1938|      0|  }
 1939|       |
 1940|       |  /* create M table
 1941|       |   *
 1942|       |   * The M table contains powers of the base,
 1943|       |   * e.g. M[x] = G**x mod P
 1944|       |   *
 1945|       |   * The first half of the table is not
 1946|       |   * computed though accept for M[0] and M[1]
 1947|       |   */
 1948|    806|  if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) {
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1948:7): [True: 0, False: 806]
  ------------------
 1949|      0|    goto LBL_MU;
 1950|      0|  }
 1951|       |
 1952|       |  /* compute the value at M[1<<(winsize-1)] by squaring
 1953|       |   * M[1] (winsize-1) times
 1954|       |   */
 1955|    806|  if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) {
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1955:7): [True: 0, False: 806]
  ------------------
 1956|      0|    goto LBL_MU;
 1957|      0|  }
 1958|       |
 1959|  2.81k|  for (x = 0; x < (winsize - 1); x++) {
  ------------------
  |  Branch (1959:15): [True: 2.00k, False: 806]
  ------------------
 1960|       |    /* square it */
 1961|  2.00k|    if ((err = mp_sqr (&M[1 << (winsize - 1)],
  ------------------
  |  Branch (1961:9): [True: 0, False: 2.00k]
  ------------------
 1962|  2.00k|                       &M[1 << (winsize - 1)])) != MP_OKAY) {
  ------------------
  |  |   93|  2.00k|#define MP_OKAY       0   /* ok result */
  ------------------
 1963|      0|      goto LBL_MU;
 1964|      0|    }
 1965|       |
 1966|       |    /* reduce modulo P */
 1967|  2.00k|    if ((err = redux (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|  2.00k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1967:9): [True: 0, False: 2.00k]
  ------------------
 1968|      0|      goto LBL_MU;
 1969|      0|    }
 1970|  2.00k|  }
 1971|       |
 1972|       |  /* create upper table, that is M[x] = M[x-1] * M[1] (mod P)
 1973|       |   * for x = (2**(winsize - 1) + 1) to (2**winsize - 1)
 1974|       |   */
 1975|  6.07k|  for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) {
  ------------------
  |  Branch (1975:38): [True: 5.27k, False: 806]
  ------------------
 1976|  5.27k|    if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) {
  ------------------
  |  |   93|  5.27k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1976:9): [True: 0, False: 5.27k]
  ------------------
 1977|      0|      goto LBL_MU;
 1978|      0|    }
 1979|  5.27k|    if ((err = redux (&M[x], P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|  5.27k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1979:9): [True: 0, False: 5.27k]
  ------------------
 1980|      0|      goto LBL_MU;
 1981|      0|    }
 1982|  5.27k|  }
 1983|       |
 1984|       |  /* setup result */
 1985|    806|  if ((err = mp_init (&res)) != MP_OKAY) {
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (1985:7): [True: 0, False: 806]
  ------------------
 1986|      0|    goto LBL_MU;
 1987|      0|  }
 1988|    806|  mp_set (&res, 1);
 1989|       |
 1990|       |  /* set initial mode and bit cnt */
 1991|    806|  mode   = 0;
 1992|    806|  bitcnt = 1;
 1993|    806|  buf    = 0;
 1994|    806|  digidx = X->used - 1;
 1995|    806|  bitcpy = 0;
 1996|    806|  bitbuf = 0;
 1997|       |
 1998|   228k|  for (;;) {
 1999|       |    /* grab next digit as required */
 2000|   228k|    if (--bitcnt == 0) {
  ------------------
  |  Branch (2000:9): [True: 4.60k, False: 224k]
  ------------------
 2001|       |      /* if digidx == -1 we are out of digits */
 2002|  4.60k|      if (digidx == -1) {
  ------------------
  |  Branch (2002:11): [True: 806, False: 3.80k]
  ------------------
 2003|    806|        break;
 2004|    806|      }
 2005|       |      /* read next digit and reset the bitcnt */
 2006|  3.80k|      buf    = X->dp[digidx--];
 2007|  3.80k|      bitcnt = (int) DIGIT_BIT;
  ------------------
  |  |   68|  3.80k|#define DIGIT_BIT 60
  ------------------
 2008|  3.80k|    }
 2009|       |
 2010|       |    /* grab the next msb from the exponent */
 2011|   228k|    y     = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1;
  ------------------
  |  |   68|   228k|#define DIGIT_BIT 60
  ------------------
 2012|   228k|    buf <<= (mp_digit)1;
 2013|       |
 2014|       |    /* if the bit is zero and mode == 0 then we ignore it
 2015|       |     * These represent the leading zero bits before the first 1 bit
 2016|       |     * in the exponent.  Technically this opt is not required but it
 2017|       |     * does lower the # of trivial squaring/reductions used
 2018|       |     */
 2019|   228k|    if (mode == 0 && y == 0) {
  ------------------
  |  Branch (2019:9): [True: 29.5k, False: 198k]
  |  Branch (2019:22): [True: 28.7k, False: 794]
  ------------------
 2020|  28.7k|      continue;
 2021|  28.7k|    }
 2022|       |
 2023|       |    /* if the bit is zero and mode == 1 then we square */
 2024|   199k|    if (mode == 1 && y == 0) {
  ------------------
  |  Branch (2024:9): [True: 90.2k, False: 109k]
  |  Branch (2024:22): [True: 62.7k, False: 27.4k]
  ------------------
 2025|  62.7k|      if ((err = mp_sqr (&res, &res)) != MP_OKAY) {
  ------------------
  |  |   93|  62.7k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2025:11): [True: 0, False: 62.7k]
  ------------------
 2026|      0|        goto LBL_RES;
 2027|      0|      }
 2028|  62.7k|      if ((err = redux (&res, P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|  62.7k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2028:11): [True: 0, False: 62.7k]
  ------------------
 2029|      0|        goto LBL_RES;
 2030|      0|      }
 2031|  62.7k|      continue;
 2032|  62.7k|    }
 2033|       |
 2034|       |    /* else we add it to the window */
 2035|   136k|    bitbuf |= (y << (winsize - ++bitcpy));
 2036|   136k|    mode    = 2;
 2037|       |
 2038|   136k|    if (bitcpy == winsize) {
  ------------------
  |  Branch (2038:9): [True: 27.8k, False: 108k]
  ------------------
 2039|       |      /* ok window is filled so square as required and multiply  */
 2040|       |      /* square first */
 2041|   163k|      for (x = 0; x < winsize; x++) {
  ------------------
  |  Branch (2041:19): [True: 135k, False: 27.8k]
  ------------------
 2042|   135k|        if ((err = mp_sqr (&res, &res)) != MP_OKAY) {
  ------------------
  |  |   93|   135k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2042:13): [True: 0, False: 135k]
  ------------------
 2043|      0|          goto LBL_RES;
 2044|      0|        }
 2045|   135k|        if ((err = redux (&res, P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|   135k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2045:13): [True: 0, False: 135k]
  ------------------
 2046|      0|          goto LBL_RES;
 2047|      0|        }
 2048|   135k|      }
 2049|       |
 2050|       |      /* then multiply */
 2051|  27.8k|      if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) {
  ------------------
  |  |   93|  27.8k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2051:11): [True: 0, False: 27.8k]
  ------------------
 2052|      0|        goto LBL_RES;
 2053|      0|      }
 2054|  27.8k|      if ((err = redux (&res, P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|  27.8k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2054:11): [True: 0, False: 27.8k]
  ------------------
 2055|      0|        goto LBL_RES;
 2056|      0|      }
 2057|       |
 2058|       |      /* empty window and reset */
 2059|  27.8k|      bitcpy = 0;
 2060|  27.8k|      bitbuf = 0;
 2061|  27.8k|      mode   = 1;
 2062|  27.8k|    }
 2063|   136k|  }
 2064|       |
 2065|       |  /* if bits remain then square/multiply */
 2066|    806|  if (mode == 2 && bitcpy > 0) {
  ------------------
  |  Branch (2066:7): [True: 394, False: 412]
  |  Branch (2066:20): [True: 394, False: 0]
  ------------------
 2067|       |    /* square then multiply if the bit is set */
 2068|  1.02k|    for (x = 0; x < bitcpy; x++) {
  ------------------
  |  Branch (2068:17): [True: 631, False: 394]
  ------------------
 2069|    631|      if ((err = mp_sqr (&res, &res)) != MP_OKAY) {
  ------------------
  |  |   93|    631|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2069:11): [True: 0, False: 631]
  ------------------
 2070|      0|        goto LBL_RES;
 2071|      0|      }
 2072|    631|      if ((err = redux (&res, P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|    631|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2072:11): [True: 0, False: 631]
  ------------------
 2073|      0|        goto LBL_RES;
 2074|      0|      }
 2075|       |
 2076|    631|      bitbuf <<= 1;
 2077|    631|      if ((bitbuf & (1 << winsize)) != 0) {
  ------------------
  |  Branch (2077:11): [True: 538, False: 93]
  ------------------
 2078|       |        /* then multiply */
 2079|    538|        if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) {
  ------------------
  |  |   93|    538|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2079:13): [True: 0, False: 538]
  ------------------
 2080|      0|          goto LBL_RES;
 2081|      0|        }
 2082|    538|        if ((err = redux (&res, P, &mu)) != MP_OKAY) {
  ------------------
  |  |   93|    538|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2082:13): [True: 0, False: 538]
  ------------------
 2083|      0|          goto LBL_RES;
 2084|      0|        }
 2085|    538|      }
 2086|    631|    }
 2087|    394|  }
 2088|       |
 2089|    806|  mp_exch (&res, Y);
 2090|    806|  err = MP_OKAY;
  ------------------
  |  |   93|    806|#define MP_OKAY       0   /* ok result */
  ------------------
 2091|    806|LBL_RES:mp_clear (&res);
 2092|    812|LBL_MU:mp_clear (&mu);
 2093|    812|LBL_M:
 2094|    812|  mp_clear(&M[1]);
 2095|  6.90k|  for (x = 1<<(winsize-1); x < (1 << winsize); x++) {
  ------------------
  |  Branch (2095:28): [True: 6.09k, False: 812]
  ------------------
 2096|  6.09k|    mp_clear (&M[x]);
 2097|  6.09k|  }
 2098|    812|  return err;
 2099|    812|}
bignum.c:mp_reduce_setup:
 2236|    812|{
 2237|    812|  int     res;
 2238|       |
 2239|    812|  if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) {
  ------------------
  |  |   68|    812|#define DIGIT_BIT 60
  ------------------
                if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) {
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2239:7): [True: 0, False: 812]
  ------------------
 2240|      0|    return res;
 2241|      0|  }
 2242|    812|  return mp_div (a, b, a, NULL);
 2243|    812|}
bignum.c:mp_2expt:
 2211|    812|{
 2212|    812|  int     res;
 2213|       |
 2214|       |  /* zero a as per default */
 2215|    812|  mp_zero (a);
 2216|       |
 2217|       |  /* grow a to accommodate the single bit */
 2218|    812|  if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) {
  ------------------
  |  |   68|    812|#define DIGIT_BIT 60
  ------------------
                if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) {
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2218:7): [True: 0, False: 812]
  ------------------
 2219|      0|    return res;
 2220|      0|  }
 2221|       |
 2222|       |  /* set the used count of where the bit will go */
 2223|    812|  a->used = b / DIGIT_BIT + 1;
  ------------------
  |  |   68|    812|#define DIGIT_BIT 60
  ------------------
 2224|       |
 2225|       |  /* put the single bit in its place */
 2226|    812|  a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT);
  ------------------
  |  |   68|    812|#define DIGIT_BIT 60
  ------------------
                a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT);
  ------------------
  |  |   68|    812|#define DIGIT_BIT 60
  ------------------
 2227|       |
 2228|    812|  return MP_OKAY;
  ------------------
  |  |   93|    812|#define MP_OKAY       0   /* ok result */
  ------------------
 2229|    812|}
bignum.c:mp_reduce:
 2251|   235k|{
 2252|   235k|  mp_int  q;
 2253|   235k|  int     res, um = m->used;
 2254|       |
 2255|       |  /* q = x */
 2256|   235k|  if ((res = mp_init_copy (&q, x)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2256:7): [True: 0, False: 235k]
  ------------------
 2257|      0|    return res;
 2258|      0|  }
 2259|       |
 2260|       |  /* q1 = x / b**(k-1)  */
 2261|   235k|  mp_rshd (&q, um - 1);
 2262|       |
 2263|       |  /* according to HAC this optimization is ok */
 2264|   235k|  if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) {
  ------------------
  |  |   68|   235k|#define DIGIT_BIT 60
  ------------------
  |  Branch (2264:7): [True: 0, False: 235k]
  ------------------
 2265|      0|    if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) {
  ------------------
  |  |   93|      0|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2265:9): [True: 0, False: 0]
  ------------------
 2266|      0|      goto CLEANUP;
 2267|      0|    }
 2268|   235k|  } else {
 2269|   235k|#ifdef BN_S_MP_MUL_HIGH_DIGS_C
 2270|   235k|    if ((res = s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2270:9): [True: 0, False: 235k]
  ------------------
 2271|      0|      goto CLEANUP;
 2272|      0|    }
 2273|       |#elif defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C)
 2274|       |    if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) {
 2275|       |      goto CLEANUP;
 2276|       |    }
 2277|       |#else
 2278|       |    {
 2279|       |#error mp_reduce would always fail
 2280|       |      res = MP_VAL;
 2281|       |      goto CLEANUP;
 2282|       |    }
 2283|       |#endif
 2284|   235k|  }
 2285|       |
 2286|       |  /* q3 = q2 / b**(k+1) */
 2287|   235k|  mp_rshd (&q, um + 1);
 2288|       |
 2289|       |  /* x = x mod b**(k+1), quick (no division) */
 2290|   235k|  if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) {
  ------------------
  |  |   68|   235k|#define DIGIT_BIT 60
  ------------------
                if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2290:7): [True: 0, False: 235k]
  ------------------
 2291|      0|    goto CLEANUP;
 2292|      0|  }
 2293|       |
 2294|       |  /* q = q * m mod b**(k+1), quick (no division) */
 2295|   235k|  if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2295:7): [True: 0, False: 235k]
  ------------------
 2296|      0|    goto CLEANUP;
 2297|      0|  }
 2298|       |
 2299|       |  /* x = x - q */
 2300|   235k|  if ((res = mp_sub (x, &q, x)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2300:7): [True: 0, False: 235k]
  ------------------
 2301|      0|    goto CLEANUP;
 2302|      0|  }
 2303|       |
 2304|       |  /* If x < 0, add b**(k+1) to it */
 2305|   235k|  if (mp_cmp_d (x, 0) == MP_LT) {
  ------------------
  |  |   86|   235k|#define MP_LT        -1   /* less than */
  ------------------
  |  Branch (2305:7): [True: 8.67k, False: 226k]
  ------------------
 2306|  8.67k|    mp_set (&q, 1);
 2307|  8.67k|    if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) {
  ------------------
  |  |   93|  8.67k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2307:9): [True: 0, False: 8.67k]
  ------------------
 2308|      0|      goto CLEANUP;
 2309|      0|    }
 2310|  8.67k|    if ((res = mp_add (x, &q, x)) != MP_OKAY) {
  ------------------
  |  |   93|  8.67k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2310:9): [True: 0, False: 8.67k]
  ------------------
 2311|      0|      goto CLEANUP;
 2312|      0|    }
 2313|  8.67k|  }
 2314|       |
 2315|       |  /* Back off if it's too big */
 2316|   907k|  while (mp_cmp (x, m) != MP_LT) {
  ------------------
  |  |   86|   907k|#define MP_LT        -1   /* less than */
  ------------------
  |  Branch (2316:10): [True: 672k, False: 235k]
  ------------------
 2317|   672k|    if ((res = s_mp_sub (x, m, x)) != MP_OKAY) {
  ------------------
  |  |   93|   672k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2317:9): [True: 0, False: 672k]
  ------------------
 2318|      0|      goto CLEANUP;
 2319|      0|    }
 2320|   672k|  }
 2321|       |
 2322|   235k|CLEANUP:
 2323|   235k|  mp_clear (&q);
 2324|       |
 2325|   235k|  return res;
 2326|   235k|}
bignum.c:s_mp_mul_high_digs:
 2587|   235k|{
 2588|   235k|  mp_int  t;
 2589|   235k|  int     res, pa, pb, ix, iy;
 2590|   235k|  mp_digit u;
 2591|   235k|  mp_word r;
 2592|   235k|  mp_digit tmpx, *tmpt, *tmpy;
 2593|       |
 2594|       |  /* can we use the fast multiplier? */
 2595|       |#ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C
 2596|       |  if (((a->used + b->used + 1) < MP_WARRAY)
 2597|       |      && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) {
 2598|       |    return fast_s_mp_mul_high_digs (a, b, c, digs);
 2599|       |  }
 2600|       |#endif
 2601|       |
 2602|   235k|  if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) {
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2602:7): [True: 0, False: 235k]
  ------------------
 2603|      0|    return res;
 2604|      0|  }
 2605|   235k|  t.used = a->used + b->used + 1;
 2606|       |
 2607|   235k|  pa = a->used;
 2608|   235k|  pb = b->used;
 2609|  3.10M|  for (ix = 0; ix < pa; ix++) {
  ------------------
  |  Branch (2609:16): [True: 2.86M, False: 235k]
  ------------------
 2610|       |    /* clear the carry */
 2611|  2.86M|    u = 0;
 2612|       |
 2613|       |    /* left hand side of A[ix] * B[iy] */
 2614|  2.86M|    tmpx = a->dp[ix];
 2615|       |
 2616|       |    /* alias to the address of where the digits will be stored */
 2617|  2.86M|    tmpt = &(t.dp[digs]);
 2618|       |
 2619|       |    /* alias for where to read the right hand side from */
 2620|  2.86M|    tmpy = b->dp + (digs - ix);
 2621|       |
 2622|  26.7M|    for (iy = digs - ix; iy < pb; iy++) {
  ------------------
  |  Branch (2622:26): [True: 23.9M, False: 2.86M]
  ------------------
 2623|       |      /* calculate the double precision result */
 2624|  23.9M|      r       = ((mp_word)*tmpt) +
 2625|  23.9M|                ((mp_word)tmpx) * ((mp_word)*tmpy++) +
 2626|  23.9M|                ((mp_word) u);
 2627|       |
 2628|       |      /* get the lower part */
 2629|  23.9M|      *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK));
  ------------------
  |  |   84|  23.9M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  23.9M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 2630|       |
 2631|       |      /* carry the carry */
 2632|  23.9M|      u       = (mp_digit) (r >> ((mp_word) DIGIT_BIT));
  ------------------
  |  |   68|  23.9M|#define DIGIT_BIT 60
  ------------------
 2633|  23.9M|    }
 2634|  2.86M|    *tmpt = u;
 2635|  2.86M|  }
 2636|   235k|  mp_clamp (&t);
 2637|   235k|  mp_exch (&t, c);
 2638|   235k|  mp_clear (&t);
 2639|   235k|  return MP_OKAY;
  ------------------
  |  |   93|   235k|#define MP_OKAY       0   /* ok result */
  ------------------
 2640|   235k|}
bignum.c:mp_sqr:
 2104|   201k|{
 2105|   201k|  int     res;
 2106|       |
 2107|       |#ifdef BN_MP_TOOM_SQR_C
 2108|       |  /* use Toom-Cook? */
 2109|       |  if (a->used >= TOOM_SQR_CUTOFF) {
 2110|       |    res = mp_toom_sqr(a, b);
 2111|       |  /* Karatsuba? */
 2112|       |  } else
 2113|       |#endif
 2114|       |#ifdef BN_MP_KARATSUBA_SQR_C
 2115|       |if (a->used >= KARATSUBA_SQR_CUTOFF) {
 2116|       |    res = mp_karatsuba_sqr (a, b);
 2117|       |  } else
 2118|       |#endif
 2119|   201k|  {
 2120|       |#ifdef BN_FAST_S_MP_SQR_C
 2121|       |    /* can we use the fast comba multiplier? */
 2122|       |    if ((a->used * 2 + 1) < MP_WARRAY &&
 2123|       |         a->used <
 2124|       |         (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) {
 2125|       |      res = fast_s_mp_sqr (a, b);
 2126|       |    } else
 2127|       |#endif
 2128|   201k|#ifdef BN_S_MP_SQR_C
 2129|   201k|      res = s_mp_sqr (a, b);
 2130|       |#else
 2131|       |#error mp_sqr could fail
 2132|       |      res = MP_VAL;
 2133|       |#endif
 2134|   201k|  }
 2135|   201k|  b->sign = MP_ZPOS;
  ------------------
  |  |   90|   201k|#define MP_ZPOS       0   /* positive integer */
  ------------------
 2136|   201k|  return res;
 2137|   201k|}
bignum.c:s_mp_sqr:
 2521|   201k|{
 2522|   201k|  mp_int  t;
 2523|   201k|  int     res, ix, iy, pa;
 2524|   201k|  mp_word r;
 2525|   201k|  mp_digit u, tmpx, *tmpt;
 2526|       |
 2527|   201k|  pa = a->used;
 2528|   201k|  if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) {
  ------------------
  |  |   93|   201k|#define MP_OKAY       0   /* ok result */
  ------------------
  |  Branch (2528:7): [True: 0, False: 201k]
  ------------------
 2529|      0|    return res;
 2530|      0|  }
 2531|       |
 2532|       |  /* default used is maximum possible size */
 2533|   201k|  t.used = 2*pa + 1;
 2534|       |
 2535|  2.71M|  for (ix = 0; ix < pa; ix++) {
  ------------------
  |  Branch (2535:16): [True: 2.51M, False: 201k]
  ------------------
 2536|       |    /* first calculate the digit at 2*ix */
 2537|       |    /* calculate double precision result */
 2538|  2.51M|    r = ((mp_word) t.dp[2*ix]) +
 2539|  2.51M|        ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]);
 2540|       |
 2541|       |    /* store lower part in result */
 2542|  2.51M|    t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK));
  ------------------
  |  |   84|  2.51M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  2.51M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 2543|       |
 2544|       |    /* get the carry */
 2545|  2.51M|    u           = (mp_digit)(r >> ((mp_word) DIGIT_BIT));
  ------------------
  |  |   68|  2.51M|#define DIGIT_BIT 60
  ------------------
 2546|       |
 2547|       |    /* left hand side of A[ix] * A[iy] */
 2548|  2.51M|    tmpx        = a->dp[ix];
 2549|       |
 2550|       |    /* alias for where to store the results */
 2551|  2.51M|    tmpt        = t.dp + (2*ix + 1);
 2552|       |
 2553|  21.0M|    for (iy = ix + 1; iy < pa; iy++) {
  ------------------
  |  Branch (2553:23): [True: 18.5M, False: 2.51M]
  ------------------
 2554|       |      /* first calculate the product */
 2555|  18.5M|      r       = ((mp_word)tmpx) * ((mp_word)a->dp[iy]);
 2556|       |
 2557|       |      /* now calculate the double precision result, note we use
 2558|       |       * addition instead of *2 since it's easier to optimize
 2559|       |       */
 2560|  18.5M|      r       = ((mp_word) *tmpt) + r + r + ((mp_word) u);
 2561|       |
 2562|       |      /* store lower part */
 2563|  18.5M|      *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK));
  ------------------
  |  |   84|  18.5M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  18.5M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 2564|       |
 2565|       |      /* get carry */
 2566|  18.5M|      u       = (mp_digit)(r >> ((mp_word) DIGIT_BIT));
  ------------------
  |  |   68|  18.5M|#define DIGIT_BIT 60
  ------------------
 2567|  18.5M|    }
 2568|       |    /* propagate upwards */
 2569|  4.70M|    while (u != ((mp_digit) 0)) {
  ------------------
  |  Branch (2569:12): [True: 2.18M, False: 2.51M]
  ------------------
 2570|  2.18M|      r       = ((mp_word) *tmpt) + ((mp_word) u);
 2571|  2.18M|      *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK));
  ------------------
  |  |   84|  2.18M|#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
  |  |  ------------------
  |  |  |  |   68|  2.18M|#define DIGIT_BIT 60
  |  |  ------------------
  ------------------
 2572|  2.18M|      u       = (mp_digit)(r >> ((mp_word) DIGIT_BIT));
  ------------------
  |  |   68|  2.18M|#define DIGIT_BIT 60
  ------------------
 2573|  2.18M|    }
 2574|  2.51M|  }
 2575|       |
 2576|   201k|  mp_clamp (&t);
 2577|   201k|  mp_exch (&t, b);
 2578|   201k|  mp_clear (&t);
 2579|   201k|  return MP_OKAY;
  ------------------
  |  |   93|   201k|#define MP_OKAY       0   /* ok result */
  ------------------
 2580|   201k|}

pkcs1_encrypt:
   84|    419|{
   85|    419|	size_t modlen;
   86|       |
   87|    419|	modlen = crypto_rsa_get_modulus_len(key);
   88|       |
   89|    419|	if (pkcs1_generate_encryption_block(block_type, modlen, in, inlen,
  ------------------
  |  Branch (89:6): [True: 8, False: 411]
  ------------------
   90|    419|					    out, outlen) < 0)
   91|      8|		return -1;
   92|       |
   93|    411|	return crypto_rsa_exptmod(out, modlen, out, outlen, key, use_private);
   94|    419|}
pkcs1_decrypt_public_key:
  137|    356|{
  138|    356|	size_t len;
  139|    356|	u8 *pos;
  140|       |
  141|    356|	len = *plain_len;
  142|    356|	if (crypto_rsa_exptmod(crypt, crypt_len, plain, &len, key, 0) < 0)
  ------------------
  |  Branch (142:6): [True: 85, False: 271]
  ------------------
  143|     85|		return -1;
  144|       |
  145|       |	/*
  146|       |	 * PKCS #1 v1.5, 8.1:
  147|       |	 *
  148|       |	 * EB = 00 || BT || PS || 00 || D
  149|       |	 * BT = 00 or 01
  150|       |	 * PS = k-3-||D|| times (00 if BT=00) or (FF if BT=01)
  151|       |	 * k = length of modulus in octets
  152|       |	 *
  153|       |	 * Based on 10.1.3, "The block type shall be 01" for a signature.
  154|       |	 */
  155|       |
  156|    271|	if (len < 3 + 8 + 16 /* min hash len */ ||
  ------------------
  |  Branch (156:6): [True: 38, False: 233]
  ------------------
  157|    233|	    plain[0] != 0x00 || plain[1] != 0x01) {
  ------------------
  |  Branch (157:6): [True: 59, False: 174]
  |  Branch (157:26): [True: 31, False: 143]
  ------------------
  158|    128|		wpa_printf(MSG_INFO, "LibTomCrypt: Invalid signature EB "
  159|    128|			   "structure");
  160|    128|		wpa_hexdump_key(MSG_DEBUG, "Signature EB", plain, len);
  161|    128|		return -1;
  162|    128|	}
  163|       |
  164|    143|	pos = plain + 3;
  165|       |	/* BT = 01 */
  166|    143|	if (plain[2] != 0xff) {
  ------------------
  |  Branch (166:6): [True: 6, False: 137]
  ------------------
  167|      6|		wpa_printf(MSG_INFO, "LibTomCrypt: Invalid signature "
  168|      6|			   "PS (BT=01)");
  169|      6|		wpa_hexdump_key(MSG_DEBUG, "Signature EB", plain, len);
  170|      6|		return -1;
  171|      6|	}
  172|  5.72k|	while (pos < plain + len && *pos == 0xff)
  ------------------
  |  Branch (172:9): [True: 5.72k, False: 1]
  |  Branch (172:30): [True: 5.58k, False: 136]
  ------------------
  173|  5.58k|		pos++;
  174|       |
  175|    137|	if (pos - plain - 2 < 8) {
  ------------------
  |  Branch (175:6): [True: 14, False: 123]
  ------------------
  176|       |		/* PKCS #1 v1.5, 8.1: At least eight octets long PS */
  177|     14|		wpa_printf(MSG_INFO, "LibTomCrypt: Too short signature "
  178|     14|			   "padding");
  179|     14|		wpa_hexdump_key(MSG_DEBUG, "Signature EB", plain, len);
  180|     14|		return -1;
  181|     14|	}
  182|       |
  183|    123|	if (pos + 16 /* min hash len */ >= plain + len || *pos != 0x00) {
  ------------------
  |  Branch (183:6): [True: 3, False: 120]
  |  Branch (183:52): [True: 5, False: 115]
  ------------------
  184|      8|		wpa_printf(MSG_INFO, "LibTomCrypt: Invalid signature EB "
  185|      8|			   "structure (2)");
  186|      8|		wpa_hexdump_key(MSG_DEBUG, "Signature EB", plain, len);
  187|      8|		return -1;
  188|      8|	}
  189|    115|	pos++;
  190|    115|	len -= pos - plain;
  191|       |
  192|       |	/* Strip PKCS #1 header */
  193|    115|	os_memmove(plain, pos, len);
  ------------------
  |  |  526|    115|#define os_memmove(d, s, n) memmove((d), (s), (n))
  ------------------
  194|    115|	*plain_len = len;
  195|       |
  196|    115|	return 0;
  197|    123|}
pkcs1.c:pkcs1_generate_encryption_block:
   21|    419|{
   22|    419|	size_t ps_len;
   23|    419|	u8 *pos;
   24|       |
   25|       |	/*
   26|       |	 * PKCS #1 v1.5, 8.1:
   27|       |	 *
   28|       |	 * EB = 00 || BT || PS || 00 || D
   29|       |	 * BT = 00 or 01 for private-key operation; 02 for public-key operation
   30|       |	 * PS = k-3-||D||; at least eight octets
   31|       |	 * (BT=0: PS=0x00, BT=1: PS=0xff, BT=2: PS=pseudorandom non-zero)
   32|       |	 * k = length of modulus in octets (modlen)
   33|       |	 */
   34|       |
   35|    419|	if (modlen < 12 || modlen > *outlen || inlen > modlen - 11) {
  ------------------
  |  Branch (35:6): [True: 5, False: 414]
  |  Branch (35:21): [True: 0, False: 414]
  |  Branch (35:41): [True: 3, False: 411]
  ------------------
   36|      8|		wpa_printf(MSG_DEBUG, "PKCS #1: %s - Invalid buffer "
   37|      8|			   "lengths (modlen=%lu outlen=%lu inlen=%lu)",
   38|      8|			   __func__, (unsigned long) modlen,
   39|      8|			   (unsigned long) *outlen,
   40|      8|			   (unsigned long) inlen);
   41|      8|		return -1;
   42|      8|	}
   43|       |
   44|    411|	pos = out;
   45|    411|	*pos++ = 0x00;
   46|    411|	*pos++ = block_type; /* BT */
   47|    411|	ps_len = modlen - inlen - 3;
   48|    411|	switch (block_type) {
   49|      0|	case 0:
  ------------------
  |  Branch (49:2): [True: 0, False: 411]
  ------------------
   50|      0|		os_memset(pos, 0x00, ps_len);
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   51|      0|		pos += ps_len;
   52|      0|		break;
   53|      0|	case 1:
  ------------------
  |  Branch (53:2): [True: 0, False: 411]
  ------------------
   54|      0|		os_memset(pos, 0xff, ps_len);
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   55|      0|		pos += ps_len;
   56|      0|		break;
   57|    411|	case 2:
  ------------------
  |  Branch (57:2): [True: 411, False: 0]
  ------------------
   58|    411|		if (os_get_random(pos, ps_len) < 0) {
  ------------------
  |  Branch (58:7): [True: 0, False: 411]
  ------------------
   59|      0|			wpa_printf(MSG_DEBUG, "PKCS #1: %s - Failed to get "
   60|      0|				   "random data for PS", __func__);
   61|      0|			return -1;
   62|      0|		}
   63|  29.8k|		while (ps_len--) {
  ------------------
  |  Branch (63:10): [True: 29.4k, False: 411]
  ------------------
   64|  29.4k|			if (*pos == 0x00)
  ------------------
  |  Branch (64:8): [True: 411, False: 29.0k]
  ------------------
   65|    411|				*pos = 0x01;
   66|  29.4k|			pos++;
   67|  29.4k|		}
   68|    411|		break;
   69|      0|	default:
  ------------------
  |  Branch (69:2): [True: 0, False: 411]
  ------------------
   70|      0|		wpa_printf(MSG_DEBUG, "PKCS #1: %s - Unsupported block type "
   71|      0|			   "%d", __func__, block_type);
   72|      0|		return -1;
   73|    411|	}
   74|    411|	*pos++ = 0x00;
   75|    411|	os_memcpy(pos, in, inlen); /* D */
  ------------------
  |  |  523|    411|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   76|       |
   77|    411|	return 0;
   78|    411|}

crypto_rsa_import_public_key:
   62|    931|{
   63|    931|	struct crypto_rsa_key *key;
   64|    931|	struct asn1_hdr hdr;
   65|    931|	const u8 *pos, *end;
   66|       |
   67|    931|	key = os_zalloc(sizeof(*key));
   68|    931|	if (key == NULL)
  ------------------
  |  Branch (68:6): [True: 0, False: 931]
  ------------------
   69|      0|		return NULL;
   70|       |
   71|    931|	key->n = bignum_init();
   72|    931|	key->e = bignum_init();
   73|    931|	if (key->n == NULL || key->e == NULL) {
  ------------------
  |  Branch (73:6): [True: 0, False: 931]
  |  Branch (73:24): [True: 0, False: 931]
  ------------------
   74|      0|		crypto_rsa_free(key);
   75|      0|		return NULL;
   76|      0|	}
   77|       |
   78|       |	/*
   79|       |	 * PKCS #1, 7.1:
   80|       |	 * RSAPublicKey ::= SEQUENCE {
   81|       |	 *     modulus INTEGER, -- n
   82|       |	 *     publicExponent INTEGER -- e
   83|       |	 * }
   84|       |	 */
   85|       |
   86|    931|	if (asn1_get_next(buf, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (86:6): [True: 3, False: 928]
  |  Branch (86:43): [True: 10, False: 918]
  ------------------
   87|     13|		asn1_unexpected(&hdr, "RSA: Expected SEQUENCE (public key)");
   88|     13|		goto error;
   89|     13|	}
   90|    918|	pos = hdr.payload;
   91|    918|	end = pos + hdr.length;
   92|       |
   93|    918|	pos = crypto_rsa_parse_integer(pos, end, key->n);
   94|    918|	pos = crypto_rsa_parse_integer(pos, end, key->e);
   95|       |
   96|    918|	if (pos == NULL)
  ------------------
  |  Branch (96:6): [True: 28, False: 890]
  ------------------
   97|     28|		goto error;
   98|       |
   99|    890|	if (pos != end) {
  ------------------
  |  Branch (99:6): [True: 2, False: 888]
  ------------------
  100|      2|		wpa_hexdump(MSG_DEBUG,
  101|      2|			    "RSA: Extra data in public key SEQUENCE",
  102|      2|			    pos, end - pos);
  103|      2|		goto error;
  104|      2|	}
  105|       |
  106|    888|	return key;
  107|       |
  108|     43|error:
  109|     43|	crypto_rsa_free(key);
  110|       |	return NULL;
  111|    890|}
crypto_rsa_get_modulus_len:
  241|  1.12k|{
  242|  1.12k|	return bignum_get_unsigned_bin_len(key->n);
  243|  1.12k|}
crypto_rsa_exptmod:
  258|    767|{
  259|    767|	struct bignum *tmp, *a = NULL, *b = NULL;
  260|    767|	int ret = -1;
  261|    767|	size_t modlen;
  262|       |
  263|    767|	if (use_private && !key->private_key)
  ------------------
  |  Branch (263:6): [True: 0, False: 767]
  |  Branch (263:21): [True: 0, False: 0]
  ------------------
  264|      0|		return -1;
  265|       |
  266|    767|	tmp = bignum_init();
  267|    767|	if (tmp == NULL)
  ------------------
  |  Branch (267:6): [True: 0, False: 767]
  ------------------
  268|      0|		return -1;
  269|       |
  270|    767|	if (bignum_set_unsigned_bin(tmp, in, inlen) < 0)
  ------------------
  |  Branch (270:6): [True: 0, False: 767]
  ------------------
  271|      0|		goto error;
  272|    767|	if (bignum_cmp(key->n, tmp) < 0) {
  ------------------
  |  Branch (272:6): [True: 60, False: 707]
  ------------------
  273|       |		/* Too large input value for the RSA key modulus */
  274|     60|		goto error;
  275|     60|	}
  276|       |
  277|    707|	if (use_private) {
  ------------------
  |  Branch (277:6): [True: 0, False: 707]
  ------------------
  278|       |		/*
  279|       |		 * Decrypt (or sign) using Chinese remainder theorem to speed
  280|       |		 * up calculation. This is equivalent to tmp = tmp^d mod n
  281|       |		 * (which would require more CPU to calculate directly).
  282|       |		 *
  283|       |		 * dmp1 = (1/e) mod (p-1)
  284|       |		 * dmq1 = (1/e) mod (q-1)
  285|       |		 * iqmp = (1/q) mod p, where p > q
  286|       |		 * m1 = c^dmp1 mod p
  287|       |		 * m2 = c^dmq1 mod q
  288|       |		 * h = q^-1 (m1 - m2) mod p
  289|       |		 * m = m2 + hq
  290|       |		 */
  291|      0|		a = bignum_init();
  292|      0|		b = bignum_init();
  293|      0|		if (a == NULL || b == NULL)
  ------------------
  |  Branch (293:7): [True: 0, False: 0]
  |  Branch (293:20): [True: 0, False: 0]
  ------------------
  294|      0|			goto error;
  295|       |
  296|       |		/* a = tmp^dmp1 mod p */
  297|      0|		if (bignum_exptmod(tmp, key->dmp1, key->p, a) < 0)
  ------------------
  |  Branch (297:7): [True: 0, False: 0]
  ------------------
  298|      0|			goto error;
  299|       |
  300|       |		/* b = tmp^dmq1 mod q */
  301|      0|		if (bignum_exptmod(tmp, key->dmq1, key->q, b) < 0)
  ------------------
  |  Branch (301:7): [True: 0, False: 0]
  ------------------
  302|      0|			goto error;
  303|       |
  304|       |		/* tmp = (a - b) * (1/q mod p) (mod p) */
  305|      0|		if (bignum_sub(a, b, tmp) < 0 ||
  ------------------
  |  Branch (305:7): [True: 0, False: 0]
  ------------------
  306|      0|		    bignum_mulmod(tmp, key->iqmp, key->p, tmp) < 0)
  ------------------
  |  Branch (306:7): [True: 0, False: 0]
  ------------------
  307|      0|			goto error;
  308|       |
  309|       |		/* tmp = b + q * tmp */
  310|      0|		if (bignum_mul(tmp, key->q, tmp) < 0 ||
  ------------------
  |  Branch (310:7): [True: 0, False: 0]
  ------------------
  311|      0|		    bignum_add(tmp, b, tmp) < 0)
  ------------------
  |  Branch (311:7): [True: 0, False: 0]
  ------------------
  312|      0|			goto error;
  313|    707|	} else {
  314|       |		/* Encrypt (or verify signature) */
  315|       |		/* tmp = tmp^e mod N */
  316|    707|		if (bignum_exptmod(tmp, key->e, key->n, tmp) < 0)
  ------------------
  |  Branch (316:7): [True: 3, False: 704]
  ------------------
  317|      3|			goto error;
  318|    707|	}
  319|       |
  320|    704|	modlen = crypto_rsa_get_modulus_len(key);
  321|    704|	if (modlen > *outlen) {
  ------------------
  |  Branch (321:6): [True: 22, False: 682]
  ------------------
  322|     22|		*outlen = modlen;
  323|     22|		goto error;
  324|     22|	}
  325|       |
  326|    682|	if (bignum_get_unsigned_bin_len(tmp) > modlen)
  ------------------
  |  Branch (326:6): [True: 0, False: 682]
  ------------------
  327|      0|		goto error; /* should never happen */
  328|       |
  329|    682|	*outlen = modlen;
  330|    682|	os_memset(out, 0, modlen);
  ------------------
  |  |  529|    682|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  331|    682|	if (bignum_get_unsigned_bin(
  ------------------
  |  Branch (331:6): [True: 0, False: 682]
  ------------------
  332|    682|		    tmp, out +
  333|    682|		    (modlen - bignum_get_unsigned_bin_len(tmp)), NULL) < 0)
  334|      0|		goto error;
  335|       |
  336|    682|	ret = 0;
  337|       |
  338|    767|error:
  339|    767|	bignum_deinit(tmp);
  340|    767|	bignum_deinit(a);
  341|    767|	bignum_deinit(b);
  342|    767|	return ret;
  343|    682|}
crypto_rsa_free:
  354|  5.35k|{
  355|  5.35k|	if (key) {
  ------------------
  |  Branch (355:6): [True: 931, False: 4.42k]
  ------------------
  356|    931|		bignum_deinit(key->n);
  357|    931|		bignum_deinit(key->e);
  358|    931|		bignum_deinit(key->d);
  359|    931|		bignum_deinit(key->p);
  360|    931|		bignum_deinit(key->q);
  361|    931|		bignum_deinit(key->dmp1);
  362|    931|		bignum_deinit(key->dmq1);
  363|    931|		bignum_deinit(key->iqmp);
  364|    931|		os_free(key);
  ------------------
  |  |  511|    931|#define os_free(p) free((p))
  ------------------
  365|    931|	}
  366|  5.35k|}
rsa.c:crypto_rsa_parse_integer:
   33|  1.83k|{
   34|  1.83k|	struct asn1_hdr hdr;
   35|       |
   36|  1.83k|	if (pos == NULL)
  ------------------
  |  Branch (36:6): [True: 9, False: 1.82k]
  ------------------
   37|      9|		return NULL;
   38|       |
   39|  1.82k|	if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (39:6): [True: 13, False: 1.81k]
  ------------------
   40|  1.81k|	    !asn1_is_integer(&hdr)) {
  ------------------
  |  Branch (40:6): [True: 15, False: 1.79k]
  ------------------
   41|     28|		asn1_unexpected(&hdr, "RSA: Expected INTEGER");
   42|     28|		return NULL;
   43|     28|	}
   44|       |
   45|  1.79k|	if (bignum_set_unsigned_bin(num, hdr.payload, hdr.length) < 0) {
  ------------------
  |  Branch (45:6): [True: 0, False: 1.79k]
  ------------------
   46|      0|		wpa_printf(MSG_DEBUG, "RSA: Failed to parse INTEGER");
   47|      0|		return NULL;
   48|      0|	}
   49|       |
   50|  1.79k|	return hdr.payload + hdr.length;
   51|  1.79k|}

tls_alert:
   26|  43.8k|{
   27|  43.8k|	conn->alert_level = level;
   28|  43.8k|	conn->alert_description = description;
   29|  43.8k|}
tlsv1_client_free_dh:
   33|  4.19k|{
   34|  4.19k|	os_free(conn->dh_p);
  ------------------
  |  |  511|  4.19k|#define os_free(p) free((p))
  ------------------
   35|  4.19k|	os_free(conn->dh_g);
  ------------------
  |  |  511|  4.19k|#define os_free(p) free((p))
  ------------------
   36|  4.19k|	os_free(conn->dh_ys);
  ------------------
  |  |  511|  4.19k|#define os_free(p) free((p))
  ------------------
   37|       |	conn->dh_p = conn->dh_g = conn->dh_ys = NULL;
   38|  4.19k|}
tls_client_highest_ver:
   42|  3.53k|{
   43|  3.53k|	u16 tls_version = TLS_VERSION;
  ------------------
  |  |   18|  3.53k|#define TLS_VERSION TLS_VERSION_1_2
  |  |  ------------------
  |  |  |  |   16|  3.53k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  |  |  ------------------
  ------------------
   44|       |
   45|       |	/* Pick the highest locally enabled TLS version */
   46|  3.53k|#ifdef CONFIG_TLSV12
   47|  3.53k|	if ((conn->flags & TLS_CONN_DISABLE_TLSv1_2) &&
  ------------------
  |  |  110|  3.53k|#define TLS_CONN_DISABLE_TLSv1_2 BIT(6)
  |  |  ------------------
  |  |  |  |  458|  3.53k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (47:6): [True: 0, False: 3.53k]
  ------------------
   48|      0|	    tls_version == TLS_VERSION_1_2)
  ------------------
  |  |   16|      0|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (48:6): [True: 0, False: 0]
  ------------------
   49|      0|		tls_version = TLS_VERSION_1_1;
  ------------------
  |  |   15|      0|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
   50|  3.53k|#endif /* CONFIG_TLSV12 */
   51|  3.53k|#ifdef CONFIG_TLSV11
   52|  3.53k|	if ((conn->flags & TLS_CONN_DISABLE_TLSv1_1) &&
  ------------------
  |  |  109|  3.53k|#define TLS_CONN_DISABLE_TLSv1_1 BIT(5)
  |  |  ------------------
  |  |  |  |  458|  3.53k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (52:6): [True: 0, False: 3.53k]
  ------------------
   53|      0|	    tls_version == TLS_VERSION_1_1)
  ------------------
  |  |   15|      0|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
  |  Branch (53:6): [True: 0, False: 0]
  ------------------
   54|      0|		tls_version = TLS_VERSION_1;
  ------------------
  |  |   14|      0|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
   55|  3.53k|#endif /* CONFIG_TLSV11 */
   56|  3.53k|	if ((conn->flags & TLS_CONN_DISABLE_TLSv1_0) &&
  ------------------
  |  |  112|  3.53k|#define TLS_CONN_DISABLE_TLSv1_0 BIT(8)
  |  |  ------------------
  |  |  |  |  458|  3.53k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (56:6): [True: 0, False: 3.53k]
  ------------------
   57|      0|	    tls_version == TLS_VERSION_1)
  ------------------
  |  |   14|      0|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
  |  Branch (57:6): [True: 0, False: 0]
  ------------------
   58|      0|		return 0;
   59|       |
   60|  3.53k|	return tls_version;
   61|  3.53k|}
tls_derive_pre_master_secret:
   66|    426|{
   67|    426|	WPA_PUT_BE16(pre_master_secret, tls_client_highest_ver(conn));
   68|    426|	if (os_get_random(pre_master_secret + 2,
  ------------------
  |  Branch (68:6): [True: 0, False: 426]
  ------------------
   69|    426|			  TLS_PRE_MASTER_SECRET_LEN - 2))
  ------------------
  |  |   27|    426|#define TLS_PRE_MASTER_SECRET_LEN 48
  ------------------
   70|      0|		return -1;
   71|    426|	return 0;
   72|    426|}
tls_derive_keys:
   77|    477|{
   78|    477|	u8 seed[2 * TLS_RANDOM_LEN];
   79|    477|	u8 key_block[TLS_MAX_KEY_BLOCK_LEN];
   80|    477|	u8 *pos;
   81|    477|	size_t key_block_len;
   82|       |
   83|    477|	if (pre_master_secret) {
  ------------------
  |  Branch (83:6): [True: 477, False: 0]
  ------------------
   84|    477|		wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: pre_master_secret",
   85|    477|				pre_master_secret, pre_master_secret_len);
   86|    477|		os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   87|    477|		os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random,
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   88|    477|			  TLS_RANDOM_LEN);
   89|    477|		if (tls_prf(conn->rl.tls_version,
  ------------------
  |  Branch (89:7): [True: 0, False: 477]
  ------------------
   90|    477|			    pre_master_secret, pre_master_secret_len,
   91|    477|			    "master secret", seed, 2 * TLS_RANDOM_LEN,
  ------------------
  |  |   26|    477|#define TLS_RANDOM_LEN 32
  ------------------
   92|    477|			    conn->master_secret, TLS_MASTER_SECRET_LEN)) {
  ------------------
  |  |   28|    477|#define TLS_MASTER_SECRET_LEN 48
  ------------------
   93|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive "
   94|      0|				   "master_secret");
   95|      0|			return -1;
   96|      0|		}
   97|    477|		wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: master_secret",
   98|    477|				conn->master_secret, TLS_MASTER_SECRET_LEN);
  ------------------
  |  |   28|    477|#define TLS_MASTER_SECRET_LEN 48
  ------------------
   99|    477|	}
  100|       |
  101|    477|	os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  102|    477|	os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random, TLS_RANDOM_LEN);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  103|    477|	key_block_len = 2 * (conn->rl.hash_size + conn->rl.key_material_len);
  104|    477|	if (conn->rl.tls_version == TLS_VERSION_1)
  ------------------
  |  |   14|    477|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
  |  Branch (104:6): [True: 280, False: 197]
  ------------------
  105|    280|		key_block_len += 2 * conn->rl.iv_size;
  106|    477|	if (tls_prf(conn->rl.tls_version,
  ------------------
  |  Branch (106:6): [True: 0, False: 477]
  ------------------
  107|    477|		    conn->master_secret, TLS_MASTER_SECRET_LEN,
  ------------------
  |  |   28|    477|#define TLS_MASTER_SECRET_LEN 48
  ------------------
  108|    477|		    "key expansion", seed, 2 * TLS_RANDOM_LEN,
  ------------------
  |  |   26|    477|#define TLS_RANDOM_LEN 32
  ------------------
  109|    477|		    key_block, key_block_len)) {
  110|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive key_block");
  111|      0|		return -1;
  112|      0|	}
  113|    477|	wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: key_block",
  114|    477|			key_block, key_block_len);
  115|       |
  116|    477|	pos = key_block;
  117|       |
  118|       |	/* client_write_MAC_secret */
  119|    477|	os_memcpy(conn->rl.write_mac_secret, pos, conn->rl.hash_size);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  120|    477|	pos += conn->rl.hash_size;
  121|       |	/* server_write_MAC_secret */
  122|    477|	os_memcpy(conn->rl.read_mac_secret, pos, conn->rl.hash_size);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  123|    477|	pos += conn->rl.hash_size;
  124|       |
  125|       |	/* client_write_key */
  126|    477|	os_memcpy(conn->rl.write_key, pos, conn->rl.key_material_len);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  127|    477|	pos += conn->rl.key_material_len;
  128|       |	/* server_write_key */
  129|    477|	os_memcpy(conn->rl.read_key, pos, conn->rl.key_material_len);
  ------------------
  |  |  523|    477|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  130|    477|	pos += conn->rl.key_material_len;
  131|       |
  132|    477|	if (conn->rl.tls_version == TLS_VERSION_1) {
  ------------------
  |  |   14|    477|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
  |  Branch (132:6): [True: 280, False: 197]
  ------------------
  133|       |		/* client_write_IV */
  134|    280|		os_memcpy(conn->rl.write_iv, pos, conn->rl.iv_size);
  ------------------
  |  |  523|    280|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  135|    280|		pos += conn->rl.iv_size;
  136|       |		/* server_write_IV */
  137|    280|		os_memcpy(conn->rl.read_iv, pos, conn->rl.iv_size);
  ------------------
  |  |  523|    280|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  138|    280|	} else {
  139|       |		/*
  140|       |		 * Use IV field to set the mask value for TLS v1.1. A fixed
  141|       |		 * mask of zero is used per the RFC 4346, 6.2.3.2 CBC Block
  142|       |		 * Cipher option 2a.
  143|       |		 */
  144|    197|		os_memset(conn->rl.write_iv, 0, conn->rl.iv_size);
  ------------------
  |  |  529|    197|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  145|    197|	}
  146|       |
  147|    477|	return 0;
  148|    477|}
tlsv1_client_handshake:
  167|  66.6k|{
  168|  66.6k|	const u8 *pos, *end;
  169|  66.6k|	u8 *msg = NULL, *in_msg = NULL, *in_pos, *in_end, alert, ct;
  170|  66.6k|	size_t in_msg_len;
  171|  66.6k|	int no_appl_data;
  172|  66.6k|	int used;
  173|       |
  174|  66.6k|	if (need_more_data)
  ------------------
  |  Branch (174:6): [True: 0, False: 66.6k]
  ------------------
  175|      0|		*need_more_data = 0;
  176|       |
  177|  66.6k|	if (conn->state == CLIENT_HELLO) {
  ------------------
  |  Branch (177:6): [True: 3.10k, False: 63.5k]
  ------------------
  178|  3.10k|		if (in_len)
  ------------------
  |  Branch (178:7): [True: 0, False: 3.10k]
  ------------------
  179|      0|			return NULL;
  180|  3.10k|		return tls_send_client_hello(conn, out_len);
  181|  3.10k|	}
  182|       |
  183|  63.5k|	if (conn->partial_input) {
  ------------------
  |  Branch (183:6): [True: 0, False: 63.5k]
  ------------------
  184|      0|		if (wpabuf_resize(&conn->partial_input, in_len) < 0) {
  ------------------
  |  Branch (184:7): [True: 0, False: 0]
  ------------------
  185|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
  186|      0|				   "memory for pending record");
  187|      0|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  188|      0|				  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  189|      0|			goto failed;
  190|      0|		}
  191|      0|		wpabuf_put_data(conn->partial_input, in_data, in_len);
  192|      0|		in_data = wpabuf_head(conn->partial_input);
  193|      0|		in_len = wpabuf_len(conn->partial_input);
  194|      0|	}
  195|       |
  196|  63.5k|	if (in_data == NULL || in_len == 0)
  ------------------
  |  Branch (196:6): [True: 0, False: 63.5k]
  |  Branch (196:25): [True: 121, False: 63.3k]
  ------------------
  197|    121|		return NULL;
  198|       |
  199|  63.3k|	pos = in_data;
  200|  63.3k|	end = in_data + in_len;
  201|  63.3k|	in_msg = os_malloc(in_len);
  ------------------
  |  |  505|  63.3k|#define os_malloc(s) malloc((s))
  ------------------
  202|  63.3k|	if (in_msg == NULL)
  ------------------
  |  Branch (202:6): [True: 0, False: 63.3k]
  ------------------
  203|      0|		return NULL;
  204|       |
  205|       |	/* Each received packet may include multiple records */
  206|   119k|	while (pos < end) {
  ------------------
  |  Branch (206:9): [True: 100k, False: 18.4k]
  ------------------
  207|   100k|		in_msg_len = in_len;
  208|   100k|		used = tlsv1_record_receive(&conn->rl, pos, end - pos,
  209|   100k|					    in_msg, &in_msg_len, &alert);
  210|   100k|		if (used < 0) {
  ------------------
  |  Branch (210:7): [True: 40.5k, False: 60.0k]
  ------------------
  211|  40.5k|			wpa_printf(MSG_DEBUG, "TLSv1: Processing received "
  212|  40.5k|				   "record failed");
  213|  40.5k|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL, alert);
  ------------------
  |  |  128|  40.5k|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  214|  40.5k|			goto failed;
  215|  40.5k|		}
  216|  60.0k|		if (used == 0) {
  ------------------
  |  Branch (216:7): [True: 96, False: 59.9k]
  ------------------
  217|     96|			struct wpabuf *partial;
  218|     96|			wpa_printf(MSG_DEBUG, "TLSv1: Need more data");
  219|     96|			partial = wpabuf_alloc_copy(pos, end - pos);
  220|     96|			wpabuf_free(conn->partial_input);
  221|     96|			conn->partial_input = partial;
  222|     96|			if (conn->partial_input == NULL) {
  ------------------
  |  Branch (222:8): [True: 0, False: 96]
  ------------------
  223|      0|				wpa_printf(MSG_DEBUG, "TLSv1: Failed to "
  224|      0|					   "allocate memory for pending "
  225|      0|					   "record");
  226|      0|				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  227|      0|					  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  228|      0|				goto failed;
  229|      0|			}
  230|     96|			os_free(in_msg);
  ------------------
  |  |  511|     96|#define os_free(p) free((p))
  ------------------
  231|     96|			if (need_more_data)
  ------------------
  |  Branch (231:8): [True: 0, False: 96]
  ------------------
  232|      0|				*need_more_data = 1;
  233|     96|			return NULL;
  234|     96|		}
  235|  59.9k|		ct = pos[0];
  236|       |
  237|  59.9k|		in_pos = in_msg;
  238|  59.9k|		in_end = in_msg + in_msg_len;
  239|       |
  240|       |		/* Each received record may include multiple messages of the
  241|       |		 * same ContentType. */
  242|  66.3k|		while (in_pos < in_end) {
  ------------------
  |  Branch (242:10): [True: 10.6k, False: 55.6k]
  ------------------
  243|  10.6k|			in_msg_len = in_end - in_pos;
  244|  10.6k|			if (tlsv1_client_process_handshake(conn, ct, in_pos,
  ------------------
  |  Branch (244:8): [True: 4.31k, False: 6.36k]
  ------------------
  245|  10.6k|							   &in_msg_len,
  246|  10.6k|							   appl_data,
  247|  10.6k|							   appl_data_len) < 0)
  248|  4.31k|				goto failed;
  249|  6.36k|			in_pos += in_msg_len;
  250|  6.36k|		}
  251|       |
  252|  55.6k|		pos += used;
  253|  55.6k|	}
  254|       |
  255|  18.4k|	os_free(in_msg);
  ------------------
  |  |  511|  18.4k|#define os_free(p) free((p))
  ------------------
  256|  18.4k|	in_msg = NULL;
  257|       |
  258|  18.4k|	no_appl_data = appl_data == NULL || *appl_data == NULL;
  ------------------
  |  Branch (258:17): [True: 0, False: 18.4k]
  |  Branch (258:38): [True: 18.4k, False: 0]
  ------------------
  259|  18.4k|	msg = tlsv1_client_handshake_write(conn, out_len, no_appl_data);
  260|       |
  261|  63.2k|failed:
  262|  63.2k|	os_free(in_msg);
  ------------------
  |  |  511|  63.2k|#define os_free(p) free((p))
  ------------------
  263|  63.2k|	if (conn->alert_level) {
  ------------------
  |  Branch (263:6): [True: 56.2k, False: 7.02k]
  ------------------
  264|  56.2k|		wpabuf_free(conn->partial_input);
  265|  56.2k|		conn->partial_input = NULL;
  266|  56.2k|		conn->state = FAILED;
  267|  56.2k|		os_free(msg);
  ------------------
  |  |  511|  56.2k|#define os_free(p) free((p))
  ------------------
  268|  56.2k|		msg = tlsv1_client_send_alert(conn, conn->alert_level,
  269|  56.2k|					      conn->alert_description,
  270|  56.2k|					      out_len);
  271|  56.2k|	} else if (msg == NULL) {
  ------------------
  |  Branch (271:13): [True: 6.54k, False: 486]
  ------------------
  272|  6.54k|		msg = os_zalloc(1);
  273|  6.54k|		*out_len = 0;
  274|  6.54k|	}
  275|       |
  276|  63.2k|	if (need_more_data == NULL || !(*need_more_data)) {
  ------------------
  |  Branch (276:6): [True: 63.2k, False: 0]
  |  Branch (276:32): [True: 0, False: 0]
  ------------------
  277|  63.2k|		wpabuf_free(conn->partial_input);
  278|  63.2k|		conn->partial_input = NULL;
  279|  63.2k|	}
  280|       |
  281|  63.2k|	return msg;
  282|  18.4k|}
tlsv1_client_encrypt:
  300|     24|{
  301|     24|	size_t rlen;
  302|       |
  303|     24|	wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Plaintext AppData",
  304|     24|			in_data, in_len);
  305|       |
  306|     24|	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_APPLICATION_DATA,
  ------------------
  |  Branch (306:6): [True: 0, False: 24]
  ------------------
  307|     24|			      out_data, out_len, in_data, in_len, &rlen) < 0) {
  308|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
  309|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  310|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  311|      0|		return -1;
  312|      0|	}
  313|       |
  314|     24|	return rlen;
  315|     24|}
tlsv1_client_decrypt:
  333|     23|{
  334|     23|	const u8 *in_end, *pos;
  335|     23|	int used;
  336|     23|	u8 alert, *out_pos, ct;
  337|     23|	size_t olen;
  338|     23|	struct wpabuf *buf = NULL;
  339|       |
  340|     23|	if (need_more_data)
  ------------------
  |  Branch (340:6): [True: 0, False: 23]
  ------------------
  341|      0|		*need_more_data = 0;
  342|       |
  343|     23|	if (conn->partial_input) {
  ------------------
  |  Branch (343:6): [True: 0, False: 23]
  ------------------
  344|      0|		if (wpabuf_resize(&conn->partial_input, in_len) < 0) {
  ------------------
  |  Branch (344:7): [True: 0, False: 0]
  ------------------
  345|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
  346|      0|				   "memory for pending record");
  347|      0|			alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  348|      0|			goto fail;
  349|      0|		}
  350|      0|		wpabuf_put_data(conn->partial_input, in_data, in_len);
  351|      0|		in_data = wpabuf_head(conn->partial_input);
  352|      0|		in_len = wpabuf_len(conn->partial_input);
  353|      0|	}
  354|       |
  355|     23|	pos = in_data;
  356|     23|	in_end = in_data + in_len;
  357|       |
  358|     25|	while (pos < in_end) {
  ------------------
  |  Branch (358:9): [True: 23, False: 2]
  ------------------
  359|     23|		ct = pos[0];
  360|     23|		if (wpabuf_resize(&buf, in_end - pos) < 0) {
  ------------------
  |  Branch (360:7): [True: 0, False: 23]
  ------------------
  361|      0|			alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  362|      0|			goto fail;
  363|      0|		}
  364|     23|		out_pos = wpabuf_put(buf, 0);
  365|     23|		olen = wpabuf_tailroom(buf);
  366|     23|		used = tlsv1_record_receive(&conn->rl, pos, in_end - pos,
  367|     23|					    out_pos, &olen, &alert);
  368|     23|		if (used < 0) {
  ------------------
  |  Branch (368:7): [True: 2, False: 21]
  ------------------
  369|      2|			wpa_printf(MSG_DEBUG, "TLSv1: Record layer processing "
  370|      2|				   "failed");
  371|      2|			goto fail;
  372|      2|		}
  373|     21|		if (used == 0) {
  ------------------
  |  Branch (373:7): [True: 19, False: 2]
  ------------------
  374|     19|			struct wpabuf *partial;
  375|     19|			wpa_printf(MSG_DEBUG, "TLSv1: Need more data");
  376|     19|			partial = wpabuf_alloc_copy(pos, in_end - pos);
  377|     19|			wpabuf_free(conn->partial_input);
  378|     19|			conn->partial_input = partial;
  379|     19|			if (conn->partial_input == NULL) {
  ------------------
  |  Branch (379:8): [True: 0, False: 19]
  ------------------
  380|      0|				wpa_printf(MSG_DEBUG, "TLSv1: Failed to "
  381|      0|					   "allocate memory for pending "
  382|      0|					   "record");
  383|      0|				alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  384|      0|				goto fail;
  385|      0|			}
  386|     19|			if (need_more_data)
  ------------------
  |  Branch (386:8): [True: 0, False: 19]
  ------------------
  387|      0|				*need_more_data = 1;
  388|     19|			return buf;
  389|     19|		}
  390|       |
  391|      2|		if (ct == TLS_CONTENT_TYPE_ALERT) {
  ------------------
  |  Branch (391:7): [True: 0, False: 2]
  ------------------
  392|      0|			if (olen < 2) {
  ------------------
  |  Branch (392:8): [True: 0, False: 0]
  ------------------
  393|      0|				wpa_printf(MSG_DEBUG, "TLSv1: Alert "
  394|      0|					   "underflow");
  395|      0|				alert = TLS_ALERT_DECODE_ERROR;
  ------------------
  |  |  146|      0|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  396|      0|				goto fail;
  397|      0|			}
  398|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
  399|      0|				   out_pos[0], out_pos[1]);
  400|      0|			if (out_pos[0] == TLS_ALERT_LEVEL_WARNING) {
  ------------------
  |  |  127|      0|#define TLS_ALERT_LEVEL_WARNING 1
  ------------------
  |  Branch (400:8): [True: 0, False: 0]
  ------------------
  401|       |				/* Continue processing */
  402|      0|				pos += used;
  403|      0|				continue;
  404|      0|			}
  405|       |
  406|      0|			alert = out_pos[1];
  407|      0|			goto fail;
  408|      0|		}
  409|       |
  410|      2|		if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
  ------------------
  |  Branch (410:7): [True: 0, False: 2]
  ------------------
  411|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Unexpected content type "
  412|      0|				   "0x%x when decrypting application data",
  413|      0|				   pos[0]);
  414|      0|			alert = TLS_ALERT_UNEXPECTED_MESSAGE;
  ------------------
  |  |  132|      0|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
  415|      0|			goto fail;
  416|      0|		}
  417|       |
  418|      2|		wpabuf_put(buf, olen);
  419|       |
  420|      2|		pos += used;
  421|      2|	}
  422|       |
  423|      2|	wpabuf_free(conn->partial_input);
  424|      2|	conn->partial_input = NULL;
  425|      2|	return buf;
  426|       |
  427|      2|fail:
  428|      2|	wpabuf_free(buf);
  429|      2|	wpabuf_free(conn->partial_input);
  430|      2|	conn->partial_input = NULL;
  431|      2|	tls_alert(conn, TLS_ALERT_LEVEL_FATAL, alert);
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  432|       |	return NULL;
  433|     23|}
tlsv1_client_global_init:
  443|  3.10k|{
  444|  3.10k|	return crypto_global_init();
  445|  3.10k|}
tlsv1_client_global_deinit:
  456|  3.10k|{
  457|  3.10k|	crypto_global_deinit();
  458|  3.10k|}
tlsv1_client_init:
  466|  3.10k|{
  467|  3.10k|	struct tlsv1_client *conn;
  468|  3.10k|	size_t count;
  469|  3.10k|	u16 *suites;
  470|       |
  471|  3.10k|	conn = os_zalloc(sizeof(*conn));
  472|  3.10k|	if (conn == NULL)
  ------------------
  |  Branch (472:6): [True: 0, False: 3.10k]
  ------------------
  473|      0|		return NULL;
  474|       |
  475|  3.10k|	conn->state = CLIENT_HELLO;
  476|       |
  477|  3.10k|	if (tls_verify_hash_init(&conn->verify) < 0) {
  ------------------
  |  Branch (477:6): [True: 0, False: 3.10k]
  ------------------
  478|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to initialize verify "
  479|      0|			   "hash");
  480|      0|		os_free(conn);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  481|      0|		return NULL;
  482|      0|	}
  483|       |
  484|  3.10k|	count = 0;
  485|  3.10k|	suites = conn->cipher_suites;
  486|  3.10k|	suites[count++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  ------------------
  |  |  100|  3.10k|#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256	0x006B /* RFC 5246 */
  ------------------
  487|  3.10k|	suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  ------------------
  |  |   92|  3.10k|#define TLS_RSA_WITH_AES_256_CBC_SHA256		0x003D /* RFC 5246 */
  ------------------
  488|  3.10k|	suites[count++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  ------------------
  |  |   88|  3.10k|#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA	0x0039 /* RFC 3268 */
  ------------------
  489|  3.10k|	suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  ------------------
  |  |   84|  3.10k|#define TLS_RSA_WITH_AES_256_CBC_SHA		0x0035 /* RFC 3268 */
  ------------------
  490|  3.10k|	suites[count++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  ------------------
  |  |   96|  3.10k|#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256	0x0067 /* RFC 5246 */
  ------------------
  491|  3.10k|	suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  ------------------
  |  |   91|  3.10k|#define TLS_RSA_WITH_AES_128_CBC_SHA256		0x003C /* RFC 5246 */
  ------------------
  492|  3.10k|	suites[count++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  ------------------
  |  |   82|  3.10k|#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA	0x0033 /* RFC 3268 */
  ------------------
  493|  3.10k|	suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  ------------------
  |  |   78|  3.10k|#define TLS_RSA_WITH_AES_128_CBC_SHA		0x002F /* RFC 3268 */
  ------------------
  494|  3.10k|	suites[count++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  ------------------
  |  |   72|  3.10k|#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA	0x0016 /* RFC 2246 */
  ------------------
  495|  3.10k|	suites[count++] = TLS_RSA_WITH_3DES_EDE_CBC_SHA;
  ------------------
  |  |   60|  3.10k|#define TLS_RSA_WITH_3DES_EDE_CBC_SHA		0x000A /* RFC 2246 */
  ------------------
  496|  3.10k|	suites[count++] = TLS_RSA_WITH_RC4_128_SHA;
  ------------------
  |  |   55|  3.10k|#define TLS_RSA_WITH_RC4_128_SHA		0x0005 /* RFC 2246 */
  ------------------
  497|  3.10k|	suites[count++] = TLS_RSA_WITH_RC4_128_MD5;
  ------------------
  |  |   54|  3.10k|#define TLS_RSA_WITH_RC4_128_MD5		0x0004 /* RFC 2246 */
  ------------------
  498|  3.10k|	conn->num_cipher_suites = count;
  499|       |
  500|  3.10k|	conn->rl.tls_version = TLS_VERSION;
  ------------------
  |  |   18|  3.10k|#define TLS_VERSION TLS_VERSION_1_2
  |  |  ------------------
  |  |  |  |   16|  3.10k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  |  |  ------------------
  ------------------
  501|       |
  502|  3.10k|	return conn;
  503|  3.10k|}
tlsv1_client_deinit:
  511|  3.10k|{
  512|  3.10k|	crypto_public_key_free(conn->server_rsa_key);
  513|  3.10k|	tlsv1_record_set_cipher_suite(&conn->rl, TLS_NULL_WITH_NULL_NULL);
  ------------------
  |  |   50|  3.10k|#define TLS_NULL_WITH_NULL_NULL			0x0000 /* RFC 2246 */
  ------------------
  514|  3.10k|	tlsv1_record_change_write_cipher(&conn->rl);
  515|  3.10k|	tlsv1_record_change_read_cipher(&conn->rl);
  516|  3.10k|	tls_verify_hash_free(&conn->verify);
  517|  3.10k|	os_free(conn->client_hello_ext);
  ------------------
  |  |  511|  3.10k|#define os_free(p) free((p))
  ------------------
  518|  3.10k|	tlsv1_client_free_dh(conn);
  519|  3.10k|	tlsv1_cred_free(conn->cred);
  520|  3.10k|	wpabuf_free(conn->partial_input);
  521|  3.10k|	x509_certificate_chain_free(conn->server_cert);
  522|  3.10k|	os_free(conn);
  ------------------
  |  |  511|  3.10k|#define os_free(p) free((p))
  ------------------
  523|  3.10k|}
tlsv1_client_established:
  532|   129k|{
  533|   129k|	return conn->state == ESTABLISHED;
  534|   129k|}
tlsv1_client_set_cb:
  891|  3.10k|{
  892|  3.10k|	conn->event_cb = event_cb;
  893|  3.10k|	conn->cb_ctx = cb_ctx;
  894|  3.10k|	conn->cert_in_cb = !!cert_in_cb;
  895|  3.10k|}

tlsv1_client_process_handshake:
 1487|  10.6k|{
 1488|  10.6k|	if (ct == TLS_CONTENT_TYPE_ALERT) {
  ------------------
  |  Branch (1488:6): [True: 480, False: 10.2k]
  ------------------
 1489|    480|		if (*len < 2) {
  ------------------
  |  Branch (1489:7): [True: 278, False: 202]
  ------------------
 1490|    278|			wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");
 1491|    278|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|    278|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1492|    278|				  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|    278|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1493|    278|			return -1;
 1494|    278|		}
 1495|    202|		wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
 1496|    202|			   buf[0], buf[1]);
 1497|    202|		*len = 2;
 1498|    202|		conn->state = FAILED;
 1499|    202|		return -1;
 1500|    480|	}
 1501|       |
 1502|  10.2k|	if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
  ------------------
  |  Branch (1502:6): [True: 9.41k, False: 790]
  |  Branch (1502:42): [True: 9.11k, False: 292]
  ------------------
 1503|  9.11k|	    buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
  ------------------
  |  Branch (1503:6): [True: 2.47k, False: 6.64k]
  ------------------
 1504|  2.47k|		size_t hr_len = WPA_GET_BE24(buf + 1);
 1505|  2.47k|		if (hr_len > *len - 4) {
  ------------------
  |  Branch (1505:7): [True: 634, False: 1.84k]
  ------------------
 1506|    634|			wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
 1507|    634|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|    634|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1508|    634|				  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|    634|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1509|    634|			return -1;
 1510|    634|		}
 1511|  1.84k|		wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
 1512|  1.84k|		*len = 4 + hr_len;
 1513|  1.84k|		return 0;
 1514|  2.47k|	}
 1515|       |
 1516|  7.72k|	switch (conn->state) {
 1517|  2.84k|	case SERVER_HELLO:
  ------------------
  |  Branch (1517:2): [True: 2.84k, False: 4.88k]
  ------------------
 1518|  2.84k|		if (tls_process_server_hello(conn, ct, buf, len))
  ------------------
  |  Branch (1518:7): [True: 236, False: 2.60k]
  ------------------
 1519|    236|			return -1;
 1520|  2.60k|		break;
 1521|  2.60k|	case SERVER_CERTIFICATE:
  ------------------
  |  Branch (1521:2): [True: 2.60k, False: 5.12k]
  ------------------
 1522|  2.60k|		if (tls_process_certificate(conn, ct, buf, len))
  ------------------
  |  Branch (1522:7): [True: 1.71k, False: 886]
  ------------------
 1523|  1.71k|			return -1;
 1524|    886|		break;
 1525|    886|	case SERVER_KEY_EXCHANGE:
  ------------------
  |  Branch (1525:2): [True: 817, False: 6.90k]
  ------------------
 1526|    817|		if (tls_process_server_key_exchange(conn, ct, buf, len))
  ------------------
  |  Branch (1526:7): [True: 336, False: 481]
  ------------------
 1527|    336|			return -1;
 1528|    481|		break;
 1529|    481|	case SERVER_CERTIFICATE_REQUEST:
  ------------------
  |  Branch (1529:2): [True: 56, False: 7.66k]
  ------------------
 1530|     56|		if (tls_process_certificate_request(conn, ct, buf, len))
  ------------------
  |  Branch (1530:7): [True: 5, False: 51]
  ------------------
 1531|      5|			return -1;
 1532|     51|		break;
 1533|    122|	case SERVER_HELLO_DONE:
  ------------------
  |  Branch (1533:2): [True: 122, False: 7.60k]
  ------------------
 1534|    122|		if (tls_process_server_hello_done(conn, ct, buf, len))
  ------------------
  |  Branch (1534:7): [True: 47, False: 75]
  ------------------
 1535|     47|			return -1;
 1536|     75|		break;
 1537|    407|	case SERVER_CHANGE_CIPHER_SPEC:
  ------------------
  |  Branch (1537:2): [True: 407, False: 7.31k]
  ------------------
 1538|    407|		if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
  ------------------
  |  Branch (1538:7): [True: 9, False: 398]
  ------------------
 1539|      9|			return -1;
 1540|    398|		break;
 1541|    398|	case SERVER_FINISHED:
  ------------------
  |  Branch (1541:2): [True: 65, False: 7.65k]
  ------------------
 1542|     65|		if (tls_process_server_finished(conn, ct, buf, len))
  ------------------
  |  Branch (1542:7): [True: 41, False: 24]
  ------------------
 1543|     41|			return -1;
 1544|     24|		break;
 1545|     24|	case ACK_FINISHED:
  ------------------
  |  Branch (1545:2): [True: 0, False: 7.72k]
  ------------------
 1546|      0|		if (out_data &&
  ------------------
  |  Branch (1546:7): [True: 0, False: 0]
  ------------------
 1547|      0|		    tls_process_application_data(conn, ct, buf, len, out_data,
  ------------------
  |  Branch (1547:7): [True: 0, False: 0]
  ------------------
 1548|      0|						 out_len))
 1549|      0|			return -1;
 1550|      0|		break;
 1551|    810|	default:
  ------------------
  |  Branch (1551:2): [True: 810, False: 6.91k]
  ------------------
 1552|    810|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
 1553|    810|			   "while processing received message",
 1554|    810|			   conn->state);
 1555|    810|		return -1;
 1556|  7.72k|	}
 1557|       |
 1558|  4.52k|	if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
  ------------------
  |  Branch (1558:6): [True: 4.12k, False: 398]
  ------------------
 1559|  4.12k|		tls_verify_hash_add(&conn->verify, buf, *len);
 1560|       |
 1561|  4.52k|	return 0;
 1562|  7.72k|}
tlsv1_client_read.c:tls_process_server_hello:
   80|  2.84k|{
   81|  2.84k|	const u8 *pos, *end;
   82|  2.84k|	size_t left, len, i;
   83|  2.84k|	u16 cipher_suite;
   84|  2.84k|	u16 tls_version;
   85|       |
   86|  2.84k|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
  ------------------
  |  Branch (86:6): [True: 10, False: 2.83k]
  ------------------
   87|     10|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
   88|     10|			   "received content type 0x%x", ct);
   89|     10|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     10|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
   90|     10|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|     10|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
   91|     10|		return -1;
   92|     10|	}
   93|       |
   94|  2.83k|	pos = in_data;
   95|  2.83k|	left = *in_len;
   96|       |
   97|  2.83k|	if (left < 4)
  ------------------
  |  Branch (97:6): [True: 26, False: 2.80k]
  ------------------
   98|     26|		goto decode_error;
   99|       |
  100|       |	/* HandshakeType msg_type */
  101|  2.80k|	if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) {
  ------------------
  |  Branch (101:6): [True: 25, False: 2.78k]
  ------------------
  102|     25|		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
  103|     25|			   "message %d (expected ServerHello)", *pos);
  104|     25|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     25|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  105|     25|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|     25|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
  106|     25|		return -1;
  107|     25|	}
  108|  2.78k|	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello");
  109|  2.78k|	pos++;
  110|       |	/* uint24 length */
  111|  2.78k|	len = WPA_GET_BE24(pos);
  112|  2.78k|	pos += 3;
  113|  2.78k|	left -= 4;
  114|       |
  115|  2.78k|	if (len > left)
  ------------------
  |  Branch (115:6): [True: 24, False: 2.75k]
  ------------------
  116|     24|		goto decode_error;
  117|       |
  118|       |	/* body - ServerHello */
  119|       |
  120|  2.75k|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len);
  121|  2.75k|	end = pos + len;
  122|       |
  123|       |	/* ProtocolVersion server_version */
  124|  2.75k|	if (end - pos < 2)
  ------------------
  |  Branch (124:6): [True: 8, False: 2.75k]
  ------------------
  125|      8|		goto decode_error;
  126|  2.75k|	tls_version = WPA_GET_BE16(pos);
  127|  2.75k|	if (!tls_version_ok(tls_version) ||
  ------------------
  |  Branch (127:6): [True: 27, False: 2.72k]
  ------------------
  128|  2.72k|	    tls_version_disabled(conn, tls_version)) {
  ------------------
  |  Branch (128:6): [True: 0, False: 2.72k]
  ------------------
  129|     27|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in "
  130|     27|			   "ServerHello %u.%u", pos[0], pos[1]);
  131|     27|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     27|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  132|     27|			  TLS_ALERT_PROTOCOL_VERSION);
  ------------------
  |  |  149|     27|#define TLS_ALERT_PROTOCOL_VERSION		70
  ------------------
  133|     27|		return -1;
  134|     27|	}
  135|  2.72k|	pos += 2;
  136|       |
  137|  2.72k|	wpa_printf(MSG_DEBUG, "TLSv1: Using TLS v%s",
  138|  2.72k|		   tls_version_str(tls_version));
  139|  2.72k|	conn->rl.tls_version = tls_version;
  140|       |
  141|       |	/* Random random */
  142|  2.72k|	if (end - pos < TLS_RANDOM_LEN)
  ------------------
  |  |   26|  2.72k|#define TLS_RANDOM_LEN 32
  ------------------
  |  Branch (142:6): [True: 13, False: 2.71k]
  ------------------
  143|     13|		goto decode_error;
  144|       |
  145|  2.71k|	os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN);
  ------------------
  |  |  523|  2.71k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  146|  2.71k|	pos += TLS_RANDOM_LEN;
  ------------------
  |  |   26|  2.71k|#define TLS_RANDOM_LEN 32
  ------------------
  147|  2.71k|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
  148|  2.71k|		    conn->server_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|  2.71k|#define TLS_RANDOM_LEN 32
  ------------------
  149|       |
  150|       |	/* SessionID session_id */
  151|  2.71k|	if (end - pos < 1)
  ------------------
  |  Branch (151:6): [True: 1, False: 2.71k]
  ------------------
  152|      1|		goto decode_error;
  153|  2.71k|	if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN)
  ------------------
  |  |   29|  2.70k|#define TLS_SESSION_ID_MAX_LEN 32
  ------------------
  |  Branch (153:6): [True: 9, False: 2.70k]
  |  Branch (153:30): [True: 4, False: 2.69k]
  ------------------
  154|     13|		goto decode_error;
  155|  2.69k|	if (conn->session_id_len && conn->session_id_len == *pos &&
  ------------------
  |  Branch (155:6): [True: 0, False: 2.69k]
  |  Branch (155:30): [True: 0, False: 0]
  ------------------
  156|      0|	    os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) {
  ------------------
  |  |  532|      0|#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
  ------------------
  |  Branch (156:6): [True: 0, False: 0]
  ------------------
  157|      0|		pos += 1 + conn->session_id_len;
  158|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session");
  159|      0|		conn->session_resumed = 1;
  160|  2.69k|	} else {
  161|  2.69k|		conn->session_id_len = *pos;
  162|  2.69k|		pos++;
  163|  2.69k|		os_memcpy(conn->session_id, pos, conn->session_id_len);
  ------------------
  |  |  523|  2.69k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  164|  2.69k|		pos += conn->session_id_len;
  165|  2.69k|	}
  166|  2.69k|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
  167|  2.69k|		    conn->session_id, conn->session_id_len);
  168|       |
  169|       |	/* CipherSuite cipher_suite */
  170|  2.69k|	if (end - pos < 2)
  ------------------
  |  Branch (170:6): [True: 4, False: 2.69k]
  ------------------
  171|      4|		goto decode_error;
  172|  2.69k|	cipher_suite = WPA_GET_BE16(pos);
  173|  2.69k|	pos += 2;
  174|  13.0k|	for (i = 0; i < conn->num_cipher_suites; i++) {
  ------------------
  |  Branch (174:14): [True: 13.0k, False: 24]
  ------------------
  175|  13.0k|		if (cipher_suite == conn->cipher_suites[i])
  ------------------
  |  Branch (175:7): [True: 2.66k, False: 10.3k]
  ------------------
  176|  2.66k|			break;
  177|  13.0k|	}
  178|  2.69k|	if (i == conn->num_cipher_suites) {
  ------------------
  |  Branch (178:6): [True: 24, False: 2.66k]
  ------------------
  179|     24|		wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
  180|     24|			   "cipher suite 0x%04x", cipher_suite);
  181|     24|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     24|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  182|     24|			  TLS_ALERT_ILLEGAL_PARAMETER);
  ------------------
  |  |  143|     24|#define TLS_ALERT_ILLEGAL_PARAMETER		47
  ------------------
  183|     24|		return -1;
  184|     24|	}
  185|       |
  186|  2.66k|	if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) {
  ------------------
  |  Branch (186:6): [True: 0, False: 2.66k]
  |  Branch (186:31): [True: 0, False: 0]
  ------------------
  187|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different "
  188|      0|			   "cipher suite for a resumed connection (0x%04x != "
  189|      0|			   "0x%04x)", cipher_suite, conn->prev_cipher_suite);
  190|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  191|      0|			  TLS_ALERT_ILLEGAL_PARAMETER);
  ------------------
  |  |  143|      0|#define TLS_ALERT_ILLEGAL_PARAMETER		47
  ------------------
  192|      0|		return -1;
  193|      0|	}
  194|       |
  195|  2.66k|	if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
  ------------------
  |  Branch (195:6): [True: 0, False: 2.66k]
  ------------------
  196|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
  197|      0|			   "record layer");
  198|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  199|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  200|      0|		return -1;
  201|      0|	}
  202|       |
  203|  2.66k|	conn->prev_cipher_suite = cipher_suite;
  204|       |
  205|       |	/* CompressionMethod compression_method */
  206|  2.66k|	if (end - pos < 1)
  ------------------
  |  Branch (206:6): [True: 2, False: 2.66k]
  ------------------
  207|      2|		goto decode_error;
  208|  2.66k|	if (*pos != TLS_COMPRESSION_NULL) {
  ------------------
  |  |  105|  2.66k|#define TLS_COMPRESSION_NULL 0
  ------------------
  |  Branch (208:6): [True: 9, False: 2.65k]
  ------------------
  209|      9|		wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
  210|      9|			   "compression 0x%02x", *pos);
  211|      9|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      9|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  212|      9|			  TLS_ALERT_ILLEGAL_PARAMETER);
  ------------------
  |  |  143|      9|#define TLS_ALERT_ILLEGAL_PARAMETER		47
  ------------------
  213|      9|		return -1;
  214|      9|	}
  215|  2.65k|	pos++;
  216|       |
  217|  2.65k|	if (end - pos >= 2) {
  ------------------
  |  Branch (217:6): [True: 53, False: 2.60k]
  ------------------
  218|     53|		u16 ext_len;
  219|       |
  220|     53|		ext_len = WPA_GET_BE16(pos);
  221|     53|		pos += 2;
  222|     53|		if (end - pos < ext_len) {
  ------------------
  |  Branch (222:7): [True: 16, False: 37]
  ------------------
  223|     16|			wpa_printf(MSG_INFO,
  224|     16|				   "TLSv1: Invalid ServerHello extension length: %u (left: %u)",
  225|     16|				   ext_len, (unsigned int) (end - pos));
  226|     16|			goto decode_error;
  227|     16|		}
  228|       |
  229|     37|		if (tls_process_server_hello_extensions(conn, pos, ext_len))
  ------------------
  |  Branch (229:7): [True: 27, False: 10]
  ------------------
  230|     27|			goto decode_error;
  231|     10|		pos += ext_len;
  232|     10|	}
  233|       |
  234|  2.61k|	if (end != pos) {
  ------------------
  |  Branch (234:6): [True: 7, False: 2.60k]
  ------------------
  235|      7|		wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the "
  236|      7|			    "end of ServerHello", pos, end - pos);
  237|      7|		goto decode_error;
  238|      7|	}
  239|       |
  240|  2.60k|	if (conn->session_ticket_included && conn->session_ticket_cb) {
  ------------------
  |  Branch (240:6): [True: 0, False: 2.60k]
  |  Branch (240:39): [True: 0, False: 0]
  ------------------
  241|       |		/* TODO: include SessionTicket extension if one was included in
  242|       |		 * ServerHello */
  243|      0|		int res = conn->session_ticket_cb(
  244|      0|			conn->session_ticket_cb_ctx, NULL, 0,
  245|      0|			conn->client_random, conn->server_random,
  246|      0|			conn->master_secret);
  247|      0|		if (res < 0) {
  ------------------
  |  Branch (247:7): [True: 0, False: 0]
  ------------------
  248|      0|			wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback "
  249|      0|				   "indicated failure");
  250|      0|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  251|      0|				  TLS_ALERT_HANDSHAKE_FAILURE);
  ------------------
  |  |  137|      0|#define TLS_ALERT_HANDSHAKE_FAILURE		40
  ------------------
  252|      0|			return -1;
  253|      0|		}
  254|      0|		conn->use_session_ticket = !!res;
  255|      0|	}
  256|       |
  257|  2.60k|	if ((conn->session_resumed || conn->use_session_ticket) &&
  ------------------
  |  Branch (257:7): [True: 0, False: 2.60k]
  |  Branch (257:32): [True: 0, False: 2.60k]
  ------------------
  258|      0|	    tls_derive_keys(conn, NULL, 0)) {
  ------------------
  |  Branch (258:6): [True: 0, False: 0]
  ------------------
  259|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
  260|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  261|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  262|      0|		return -1;
  263|      0|	}
  264|       |
  265|  2.60k|	*in_len = end - in_data;
  266|       |
  267|  2.60k|	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
  ------------------
  |  Branch (267:17): [True: 0, False: 2.60k]
  |  Branch (267:42): [True: 0, False: 2.60k]
  ------------------
  268|  2.60k|		SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE;
  269|       |
  270|  2.60k|	return 0;
  271|       |
  272|    141|decode_error:
  273|    141|	wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello");
  274|    141|	tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|    141|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              	tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|    141|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  275|    141|	return -1;
  276|  2.60k|}
tlsv1_client_read.c:tls_version_disabled:
   31|  2.72k|{
   32|  2.72k|	return (((conn->flags & TLS_CONN_DISABLE_TLSv1_0) &&
  ------------------
  |  |  112|  2.72k|#define TLS_CONN_DISABLE_TLSv1_0 BIT(8)
  |  |  ------------------
  |  |  |  |  458|  2.72k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (32:11): [True: 0, False: 2.72k]
  ------------------
   33|      0|		 ver == TLS_VERSION_1) ||
  ------------------
  |  |   14|      0|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
  |  Branch (33:4): [True: 0, False: 0]
  ------------------
   34|  2.72k|		((conn->flags & TLS_CONN_DISABLE_TLSv1_1) &&
  ------------------
  |  |  109|  2.72k|#define TLS_CONN_DISABLE_TLSv1_1 BIT(5)
  |  |  ------------------
  |  |  |  |  458|  2.72k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (34:4): [True: 0, False: 2.72k]
  ------------------
   35|      0|		 ver == TLS_VERSION_1_1) ||
  ------------------
  |  |   15|      0|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
  |  Branch (35:4): [True: 0, False: 0]
  ------------------
   36|  2.72k|		((conn->flags & TLS_CONN_DISABLE_TLSv1_2) &&
  ------------------
  |  |  110|  2.72k|#define TLS_CONN_DISABLE_TLSv1_2 BIT(6)
  |  |  ------------------
  |  |  |  |  458|  2.72k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (36:4): [True: 0, False: 2.72k]
  ------------------
   37|      0|		 ver == TLS_VERSION_1_2));
  ------------------
  |  |   16|      0|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (37:4): [True: 0, False: 0]
  ------------------
   38|  2.72k|}
tlsv1_client_read.c:tls_process_server_hello_extensions:
   43|     37|{
   44|     37|	const u8 *end = pos + len;
   45|       |
   46|     37|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello extensions",
   47|     37|		    pos, len);
   48|    443|	while (pos < end) {
  ------------------
  |  Branch (48:9): [True: 433, False: 10]
  ------------------
   49|    433|		u16 ext, elen;
   50|       |
   51|    433|		if (end - pos < 4) {
  ------------------
  |  Branch (51:7): [True: 6, False: 427]
  ------------------
   52|      6|			wpa_printf(MSG_INFO, "TLSv1: Truncated ServerHello extension header");
   53|      6|			return -1;
   54|      6|		}
   55|       |
   56|    427|		ext = WPA_GET_BE16(pos);
   57|    427|		pos += 2;
   58|    427|		elen = WPA_GET_BE16(pos);
   59|    427|		pos += 2;
   60|       |
   61|    427|		if (elen > end - pos) {
  ------------------
  |  Branch (61:7): [True: 21, False: 406]
  ------------------
   62|     21|			wpa_printf(MSG_INFO, "TLSv1: Truncated ServerHello extension");
   63|     21|			return -1;
   64|     21|		}
   65|       |
   66|    406|		wpa_printf(MSG_DEBUG, "TLSv1: ServerHello ExtensionType %u",
   67|    406|			   ext);
   68|    406|		wpa_hexdump(MSG_DEBUG, "TLSv1: ServerHello extension data",
   69|    406|			    pos, elen);
   70|       |
   71|    406|		pos += elen;
   72|    406|	}
   73|       |
   74|     10|	return 0;
   75|     37|}
tlsv1_client_read.c:tls_process_certificate:
  356|  2.60k|{
  357|  2.60k|	const u8 *pos, *end;
  358|  2.60k|	size_t left, len, list_len, cert_len, idx;
  359|  2.60k|	u8 type;
  360|  2.60k|	struct x509_certificate *chain = NULL, *last = NULL, *cert;
  361|  2.60k|	int reason;
  362|       |
  363|  2.60k|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
  ------------------
  |  Branch (363:6): [True: 2, False: 2.60k]
  ------------------
  364|      2|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
  365|      2|			   "received content type 0x%x", ct);
  366|      2|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  367|      2|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      2|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
  368|      2|		return -1;
  369|      2|	}
  370|       |
  371|  2.60k|	pos = in_data;
  372|  2.60k|	left = *in_len;
  373|       |
  374|  2.60k|	if (left < 4) {
  ------------------
  |  Branch (374:6): [True: 3, False: 2.59k]
  ------------------
  375|      3|		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message "
  376|      3|			   "(len=%lu)", (unsigned long) left);
  377|      3|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      3|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      3|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  378|      3|		return -1;
  379|      3|	}
  380|       |
  381|  2.59k|	type = *pos++;
  382|  2.59k|	len = WPA_GET_BE24(pos);
  383|  2.59k|	pos += 3;
  384|  2.59k|	left -= 4;
  385|       |
  386|  2.59k|	if (len > left) {
  ------------------
  |  Branch (386:6): [True: 27, False: 2.57k]
  ------------------
  387|     27|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message "
  388|     27|			   "length (len=%lu != left=%lu)",
  389|     27|			   (unsigned long) len, (unsigned long) left);
  390|     27|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|     27|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|     27|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  391|     27|		return -1;
  392|     27|	}
  393|       |
  394|  2.57k|	if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE)
  ------------------
  |  Branch (394:6): [True: 199, False: 2.37k]
  ------------------
  395|    199|		return tls_process_server_key_exchange(conn, ct, in_data,
  396|    199|						       in_len);
  397|  2.37k|	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
  ------------------
  |  Branch (397:6): [True: 52, False: 2.32k]
  ------------------
  398|     52|		return tls_process_certificate_request(conn, ct, in_data,
  399|     52|						       in_len);
  400|  2.32k|	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
  ------------------
  |  Branch (400:6): [True: 11, False: 2.30k]
  ------------------
  401|     11|		return tls_process_server_hello_done(conn, ct, in_data,
  402|     11|						     in_len);
  403|  2.30k|	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
  ------------------
  |  Branch (403:6): [True: 12, False: 2.29k]
  ------------------
  404|     12|		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
  405|     12|			   "message %d (expected Certificate/"
  406|     12|			   "ServerKeyExchange/CertificateRequest/"
  407|     12|			   "ServerHelloDone)", type);
  408|     12|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     12|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  409|     12|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|     12|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
  410|     12|		return -1;
  411|     12|	}
  412|       |
  413|  2.29k|	wpa_printf(MSG_DEBUG,
  414|  2.29k|		   "TLSv1: Received Certificate (certificate_list len %lu)",
  415|  2.29k|		   (unsigned long) len);
  416|       |
  417|       |	/*
  418|       |	 * opaque ASN.1Cert<2^24-1>;
  419|       |	 *
  420|       |	 * struct {
  421|       |	 *     ASN.1Cert certificate_list<1..2^24-1>;
  422|       |	 * } Certificate;
  423|       |	 */
  424|       |
  425|  2.29k|	end = pos + len;
  426|       |
  427|  2.29k|	if (end - pos < 3) {
  ------------------
  |  Branch (427:6): [True: 3, False: 2.29k]
  ------------------
  428|      3|		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate "
  429|      3|			   "(left=%lu)", (unsigned long) left);
  430|      3|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      3|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      3|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  431|      3|		return -1;
  432|      3|	}
  433|       |
  434|  2.29k|	list_len = WPA_GET_BE24(pos);
  435|  2.29k|	pos += 3;
  436|       |
  437|  2.29k|	if ((size_t) (end - pos) != list_len) {
  ------------------
  |  Branch (437:6): [True: 30, False: 2.26k]
  ------------------
  438|     30|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list "
  439|     30|			   "length (len=%lu left=%lu)",
  440|     30|			   (unsigned long) list_len,
  441|     30|			   (unsigned long) (end - pos));
  442|     30|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|     30|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|     30|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  443|     30|		return -1;
  444|     30|	}
  445|       |
  446|  2.26k|	idx = 0;
  447|  3.86k|	while (pos < end) {
  ------------------
  |  Branch (447:9): [True: 3.03k, False: 823]
  ------------------
  448|  3.03k|		if (end - pos < 3) {
  ------------------
  |  Branch (448:7): [True: 2, False: 3.03k]
  ------------------
  449|      2|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
  450|      2|				   "certificate_list");
  451|      2|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  452|      2|				  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      2|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  453|      2|			x509_certificate_chain_free(chain);
  454|      2|			return -1;
  455|      2|		}
  456|       |
  457|  3.03k|		cert_len = WPA_GET_BE24(pos);
  458|  3.03k|		pos += 3;
  459|       |
  460|  3.03k|		if ((size_t) (end - pos) < cert_len) {
  ------------------
  |  Branch (460:7): [True: 48, False: 2.98k]
  ------------------
  461|     48|			wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate "
  462|     48|				   "length (len=%lu left=%lu)",
  463|     48|				   (unsigned long) cert_len,
  464|     48|				   (unsigned long) (end - pos));
  465|     48|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     48|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  466|     48|				  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|     48|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  467|     48|			x509_certificate_chain_free(chain);
  468|     48|			return -1;
  469|     48|		}
  470|       |
  471|  2.98k|		wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)",
  472|  2.98k|			   (unsigned long) idx, (unsigned long) cert_len);
  473|       |
  474|  2.98k|		if (idx == 0) {
  ------------------
  |  Branch (474:7): [True: 2.21k, False: 777]
  ------------------
  475|  2.21k|			crypto_public_key_free(conn->server_rsa_key);
  476|  2.21k|			if (tls_parse_cert(pos, cert_len,
  ------------------
  |  Branch (476:8): [True: 1.32k, False: 888]
  ------------------
  477|  2.21k|					   &conn->server_rsa_key)) {
  478|  1.32k|				wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
  479|  1.32k|					   "the certificate");
  480|  1.32k|				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|  1.32k|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  481|  1.32k|					  TLS_ALERT_BAD_CERTIFICATE);
  ------------------
  |  |  138|  1.32k|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  482|  1.32k|				x509_certificate_chain_free(chain);
  483|  1.32k|				return -1;
  484|  1.32k|			}
  485|  2.21k|		}
  486|       |
  487|  1.66k|		cert = x509_certificate_parse(pos, cert_len);
  488|  1.66k|		if (cert == NULL) {
  ------------------
  |  Branch (488:7): [True: 68, False: 1.59k]
  ------------------
  489|     68|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
  490|     68|				   "the certificate");
  491|     68|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     68|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  492|     68|				  TLS_ALERT_BAD_CERTIFICATE);
  ------------------
  |  |  138|     68|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  493|     68|			x509_certificate_chain_free(chain);
  494|     68|			return -1;
  495|     68|		}
  496|       |
  497|  1.59k|		tls_peer_cert_event(conn, idx, cert);
  498|       |
  499|  1.59k|		if (last == NULL)
  ------------------
  |  Branch (499:7): [True: 888, False: 709]
  ------------------
  500|    888|			chain = cert;
  501|    709|		else
  502|    709|			last->next = cert;
  503|  1.59k|		last = cert;
  504|       |
  505|  1.59k|		idx++;
  506|  1.59k|		pos += cert_len;
  507|  1.59k|	}
  508|       |
  509|    823|	if (conn->cred && conn->cred->server_cert_only && chain) {
  ------------------
  |  Branch (509:6): [True: 0, False: 823]
  |  Branch (509:20): [True: 0, False: 0]
  |  Branch (509:52): [True: 0, False: 0]
  ------------------
  510|      0|		u8 hash[SHA256_MAC_LEN];
  511|      0|		char buf[128];
  512|       |
  513|      0|		wpa_printf(MSG_DEBUG,
  514|      0|			   "TLSv1: Validate server certificate hash");
  515|      0|		x509_name_string(&chain->subject, buf, sizeof(buf));
  516|      0|		wpa_printf(MSG_DEBUG, "TLSv1: 0: %s", buf);
  517|      0|		if (sha256_vector(1, &chain->cert_start, &chain->cert_len,
  ------------------
  |  Branch (517:7): [True: 0, False: 0]
  ------------------
  518|      0|				  hash) < 0 ||
  519|      0|		    os_memcmp(conn->cred->srv_cert_hash, hash,
  ------------------
  |  |  532|      0|#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
  ------------------
  |  Branch (519:7): [True: 0, False: 0]
  ------------------
  520|      0|			      SHA256_MAC_LEN) != 0) {
  521|      0|			wpa_printf(MSG_DEBUG,
  522|      0|				   "TLSv1: Server certificate hash mismatch");
  523|      0|			wpa_hexdump(MSG_MSGDUMP, "TLSv1: SHA256 hash",
  524|      0|				    hash, SHA256_MAC_LEN);
  ------------------
  |  |   12|      0|#define SHA256_MAC_LEN 32
  ------------------
  525|      0|			if (conn->event_cb) {
  ------------------
  |  Branch (525:8): [True: 0, False: 0]
  ------------------
  526|      0|				union tls_event_data ev;
  527|       |
  528|      0|				os_memset(&ev, 0, sizeof(ev));
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  529|      0|				ev.cert_fail.reason = TLS_FAIL_UNSPECIFIED;
  530|      0|				ev.cert_fail.reason_txt =
  531|      0|					"Server certificate mismatch";
  532|      0|				ev.cert_fail.subject = buf;
  533|      0|				conn->event_cb(conn->cb_ctx,
  534|      0|					       TLS_CERT_CHAIN_FAILURE, &ev);
  535|      0|			}
  536|      0|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  537|      0|				  TLS_ALERT_BAD_CERTIFICATE);
  ------------------
  |  |  138|      0|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  538|      0|			x509_certificate_chain_free(chain);
  539|      0|			return -1;
  540|      0|		}
  541|    823|	} else if (conn->cred && conn->cred->cert_probe) {
  ------------------
  |  Branch (541:13): [True: 0, False: 823]
  |  Branch (541:27): [True: 0, False: 0]
  ------------------
  542|      0|		wpa_printf(MSG_DEBUG,
  543|      0|			   "TLSv1: Reject server certificate on probe-only run");
  544|      0|		if (conn->event_cb) {
  ------------------
  |  Branch (544:7): [True: 0, False: 0]
  ------------------
  545|      0|			union tls_event_data ev;
  546|      0|			char buf[128];
  547|       |
  548|      0|			os_memset(&ev, 0, sizeof(ev));
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  549|      0|			ev.cert_fail.reason = TLS_FAIL_SERVER_CHAIN_PROBE;
  550|      0|			ev.cert_fail.reason_txt =
  551|      0|				"Server certificate chain probe";
  552|      0|			if (chain) {
  ------------------
  |  Branch (552:8): [True: 0, False: 0]
  ------------------
  553|      0|				x509_name_string(&chain->subject, buf,
  554|      0|						 sizeof(buf));
  555|      0|				ev.cert_fail.subject = buf;
  556|      0|			}
  557|      0|			conn->event_cb(conn->cb_ctx, TLS_CERT_CHAIN_FAILURE,
  558|      0|				       &ev);
  559|      0|		}
  560|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  561|      0|			  TLS_ALERT_BAD_CERTIFICATE);
  ------------------
  |  |  138|      0|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  562|      0|		x509_certificate_chain_free(chain);
  563|      0|		return -1;
  564|    823|	} else if (conn->cred && conn->cred->ca_cert_verify &&
  ------------------
  |  Branch (564:13): [True: 0, False: 823]
  |  Branch (564:27): [True: 0, False: 0]
  ------------------
  565|      0|		   x509_certificate_chain_validate(
  ------------------
  |  Branch (565:6): [True: 0, False: 0]
  ------------------
  566|      0|			   conn->cred->trusted_certs, chain, &reason,
  567|      0|			   !!(conn->flags & TLS_CONN_DISABLE_TIME_CHECKS))
  ------------------
  |  |  105|      0|#define TLS_CONN_DISABLE_TIME_CHECKS BIT(1)
  |  |  ------------------
  |  |  |  |  458|      0|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  568|      0|		   < 0) {
  569|      0|		int tls_reason;
  570|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain "
  571|      0|			   "validation failed (reason=%d)", reason);
  572|      0|		switch (reason) {
  573|      0|		case X509_VALIDATE_BAD_CERTIFICATE:
  ------------------
  |  Branch (573:3): [True: 0, False: 0]
  ------------------
  574|      0|			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
  ------------------
  |  |  138|      0|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  575|      0|			tls_cert_chain_failure_event(
  576|      0|				conn, 0, chain, TLS_FAIL_BAD_CERTIFICATE,
  577|      0|				"bad certificate");
  578|      0|			break;
  579|      0|		case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
  ------------------
  |  Branch (579:3): [True: 0, False: 0]
  ------------------
  580|      0|			tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
  ------------------
  |  |  139|      0|#define TLS_ALERT_UNSUPPORTED_CERTIFICATE	43
  ------------------
  581|      0|			break;
  582|      0|		case X509_VALIDATE_CERTIFICATE_REVOKED:
  ------------------
  |  Branch (582:3): [True: 0, False: 0]
  ------------------
  583|      0|			tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
  ------------------
  |  |  140|      0|#define TLS_ALERT_CERTIFICATE_REVOKED		44
  ------------------
  584|      0|			tls_cert_chain_failure_event(
  585|      0|				conn, 0, chain, TLS_FAIL_REVOKED,
  586|      0|				"certificate revoked");
  587|      0|			break;
  588|      0|		case X509_VALIDATE_CERTIFICATE_EXPIRED:
  ------------------
  |  Branch (588:3): [True: 0, False: 0]
  ------------------
  589|      0|			tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
  ------------------
  |  |  141|      0|#define TLS_ALERT_CERTIFICATE_EXPIRED		45
  ------------------
  590|      0|			tls_cert_chain_failure_event(
  591|      0|				conn, 0, chain, TLS_FAIL_EXPIRED,
  592|      0|				"certificate has expired or is not yet valid");
  593|      0|			break;
  594|      0|		case X509_VALIDATE_CERTIFICATE_UNKNOWN:
  ------------------
  |  Branch (594:3): [True: 0, False: 0]
  ------------------
  595|      0|			tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
  ------------------
  |  |  142|      0|#define TLS_ALERT_CERTIFICATE_UNKNOWN		46
  ------------------
  596|      0|			break;
  597|      0|		case X509_VALIDATE_UNKNOWN_CA:
  ------------------
  |  Branch (597:3): [True: 0, False: 0]
  ------------------
  598|      0|			tls_reason = TLS_ALERT_UNKNOWN_CA;
  ------------------
  |  |  144|      0|#define TLS_ALERT_UNKNOWN_CA			48
  ------------------
  599|      0|			tls_cert_chain_failure_event(
  600|      0|				conn, 0, chain, TLS_FAIL_UNTRUSTED,
  601|      0|				"unknown CA");
  602|      0|			break;
  603|      0|		default:
  ------------------
  |  Branch (603:3): [True: 0, False: 0]
  ------------------
  604|      0|			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
  ------------------
  |  |  138|      0|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  605|      0|			break;
  606|      0|		}
  607|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  608|      0|		x509_certificate_chain_free(chain);
  609|      0|		return -1;
  610|      0|	}
  611|       |
  612|    823|	if (conn->cred && !conn->cred->server_cert_only && chain &&
  ------------------
  |  Branch (612:6): [True: 0, False: 823]
  |  Branch (612:20): [True: 0, False: 0]
  |  Branch (612:53): [True: 0, False: 0]
  ------------------
  613|      0|	    (chain->extensions_present & X509_EXT_EXT_KEY_USAGE) &&
  ------------------
  |  |   76|      0|#define X509_EXT_EXT_KEY_USAGE			(1 << 5)
  ------------------
  |  Branch (613:6): [True: 0, False: 0]
  ------------------
  614|      0|	    !(chain->ext_key_usage &
  ------------------
  |  Branch (614:6): [True: 0, False: 0]
  ------------------
  615|      0|	      (X509_EXT_KEY_USAGE_ANY | X509_EXT_KEY_USAGE_SERVER_AUTH))) {
  ------------------
  |  |   97|      0|#define X509_EXT_KEY_USAGE_ANY			(1 << 0)
  ------------------
              	      (X509_EXT_KEY_USAGE_ANY | X509_EXT_KEY_USAGE_SERVER_AUTH))) {
  ------------------
  |  |   98|      0|#define X509_EXT_KEY_USAGE_SERVER_AUTH		(1 << 1)
  ------------------
  616|      0|		tls_cert_chain_failure_event(
  617|      0|			conn, 0, chain, TLS_FAIL_BAD_CERTIFICATE,
  618|      0|			"certificate not allowed for server authentication");
  619|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  620|      0|			  TLS_ALERT_BAD_CERTIFICATE);
  ------------------
  |  |  138|      0|#define TLS_ALERT_BAD_CERTIFICATE		42
  ------------------
  621|      0|		x509_certificate_chain_free(chain);
  622|      0|		return -1;
  623|      0|	}
  624|       |
  625|    823|	if (conn->flags & TLS_CONN_REQUEST_OCSP) {
  ------------------
  |  |  107|    823|#define TLS_CONN_REQUEST_OCSP BIT(3)
  |  |  ------------------
  |  |  |  |  458|    823|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (625:6): [True: 0, False: 823]
  ------------------
  626|      0|		x509_certificate_chain_free(conn->server_cert);
  627|      0|		conn->server_cert = chain;
  628|    823|	} else {
  629|    823|		x509_certificate_chain_free(chain);
  630|    823|	}
  631|       |
  632|    823|	*in_len = end - in_data;
  633|       |
  634|    823|	conn->state = SERVER_KEY_EXCHANGE;
  635|       |
  636|    823|	return 0;
  637|    823|}
tlsv1_client_read.c:tls_peer_cert_event:
  281|  1.59k|{
  282|  1.59k|	union tls_event_data ev;
  283|  1.59k|	struct wpabuf *cert_buf = NULL;
  284|       |#ifdef CONFIG_SHA256
  285|       |	u8 hash[32];
  286|       |#endif /* CONFIG_SHA256 */
  287|  1.59k|	char subject[128];
  288|       |
  289|  1.59k|	if (!conn->event_cb)
  ------------------
  |  Branch (289:6): [True: 1.59k, False: 0]
  ------------------
  290|  1.59k|		return;
  291|       |
  292|      0|	os_memset(&ev, 0, sizeof(ev));
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  293|      0|	if ((conn->cred && conn->cred->cert_probe) || conn->cert_in_cb) {
  ------------------
  |  Branch (293:7): [True: 0, False: 0]
  |  Branch (293:21): [True: 0, False: 0]
  |  Branch (293:48): [True: 0, False: 0]
  ------------------
  294|      0|		cert_buf = wpabuf_alloc_copy(cert->cert_start,
  295|      0|					     cert->cert_len);
  296|      0|		ev.peer_cert.cert = cert_buf;
  297|      0|	}
  298|       |#ifdef CONFIG_SHA256
  299|       |	if (cert_buf) {
  300|       |		const u8 *addr[1];
  301|       |		size_t len[1];
  302|       |		addr[0] = wpabuf_head(cert_buf);
  303|       |		len[0] = wpabuf_len(cert_buf);
  304|       |		if (sha256_vector(1, addr, len, hash) == 0) {
  305|       |			ev.peer_cert.hash = hash;
  306|       |			ev.peer_cert.hash_len = sizeof(hash);
  307|       |		}
  308|       |	}
  309|       |#endif /* CONFIG_SHA256 */
  310|       |
  311|      0|	ev.peer_cert.depth = depth;
  312|      0|	x509_name_string(&cert->subject, subject, sizeof(subject));
  313|      0|	ev.peer_cert.subject = subject;
  314|       |
  315|      0|	if (cert->extensions_present & X509_EXT_CERTIFICATE_POLICY) {
  ------------------
  |  |   77|      0|#define X509_EXT_CERTIFICATE_POLICY		(1 << 6)
  ------------------
  |  Branch (315:6): [True: 0, False: 0]
  ------------------
  316|      0|		if (cert->certificate_policy & X509_EXT_CERT_POLICY_TOD_STRICT)
  ------------------
  |  |  105|      0|#define X509_EXT_CERT_POLICY_TOD_STRICT		(1 << 1)
  ------------------
  |  Branch (316:7): [True: 0, False: 0]
  ------------------
  317|      0|			ev.peer_cert.tod = 1;
  318|      0|		else if (cert->certificate_policy &
  ------------------
  |  Branch (318:12): [True: 0, False: 0]
  ------------------
  319|      0|			 X509_EXT_CERT_POLICY_TOD_TOFU)
  ------------------
  |  |  106|      0|#define X509_EXT_CERT_POLICY_TOD_TOFU		(1 << 2)
  ------------------
  320|      0|			ev.peer_cert.tod = 2;
  321|      0|	}
  322|       |
  323|      0|	conn->event_cb(conn->cb_ctx, TLS_PEER_CERTIFICATE, &ev);
  324|      0|	wpabuf_free(cert_buf);
  325|      0|}
tlsv1_client_read.c:tls_process_server_key_exchange:
 1024|  1.01k|{
 1025|  1.01k|	const u8 *pos, *end;
 1026|  1.01k|	size_t left, len;
 1027|  1.01k|	u8 type;
 1028|  1.01k|	const struct tls_cipher_suite *suite;
 1029|       |
 1030|  1.01k|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
  ------------------
  |  Branch (1030:6): [True: 2, False: 1.01k]
  ------------------
 1031|      2|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
 1032|      2|			   "received content type 0x%x", ct);
 1033|      2|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1034|      2|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      2|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1035|      2|		return -1;
 1036|      2|	}
 1037|       |
 1038|  1.01k|	pos = in_data;
 1039|  1.01k|	left = *in_len;
 1040|       |
 1041|  1.01k|	if (left < 4) {
  ------------------
  |  Branch (1041:6): [True: 2, False: 1.01k]
  ------------------
 1042|      2|		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
 1043|      2|			   "(Left=%lu)", (unsigned long) left);
 1044|      2|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      2|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1045|      2|		return -1;
 1046|      2|	}
 1047|       |
 1048|  1.01k|	type = *pos++;
 1049|  1.01k|	len = WPA_GET_BE24(pos);
 1050|  1.01k|	pos += 3;
 1051|  1.01k|	left -= 4;
 1052|       |
 1053|  1.01k|	if (len > left) {
  ------------------
  |  Branch (1053:6): [True: 19, False: 993]
  ------------------
 1054|     19|		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
 1055|     19|			   "length (len=%lu != left=%lu)",
 1056|     19|			   (unsigned long) len, (unsigned long) left);
 1057|     19|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|     19|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|     19|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1058|     19|		return -1;
 1059|     19|	}
 1060|       |
 1061|    993|	end = pos + len;
 1062|       |
 1063|    993|	if ((conn->flags & TLS_CONN_REQUEST_OCSP) &&
  ------------------
  |  |  107|    993|#define TLS_CONN_REQUEST_OCSP BIT(3)
  |  |  ------------------
  |  |  |  |  458|    993|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (1063:6): [True: 0, False: 993]
  ------------------
 1064|      0|	    type == TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS)
  ------------------
  |  Branch (1064:6): [True: 0, False: 0]
  ------------------
 1065|      0|		return tls_process_certificate_status(conn, ct, in_data,
 1066|      0|						      in_len);
 1067|    993|	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
  ------------------
  |  Branch (1067:6): [True: 75, False: 918]
  ------------------
 1068|     75|		return tls_process_certificate_request(conn, ct, in_data,
 1069|     75|						       in_len);
 1070|    918|	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
  ------------------
  |  Branch (1070:6): [True: 350, False: 568]
  ------------------
 1071|    350|		return tls_process_server_hello_done(conn, ct, in_data,
 1072|    350|						     in_len);
 1073|    568|	if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
  ------------------
  |  Branch (1073:6): [True: 11, False: 557]
  ------------------
 1074|     11|		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
 1075|     11|			   "message %d (expected ServerKeyExchange/"
 1076|     11|			   "CertificateRequest/ServerHelloDone%s)", type,
 1077|     11|			   (conn->flags & TLS_CONN_REQUEST_OCSP) ?
  ------------------
  |  |  107|     11|#define TLS_CONN_REQUEST_OCSP BIT(3)
  |  |  ------------------
  |  |  |  |  458|     11|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (1077:7): [True: 0, False: 11]
  ------------------
 1078|     11|			   "/CertificateStatus" : "");
 1079|     11|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     11|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1080|     11|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|     11|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1081|     11|		return -1;
 1082|     11|	}
 1083|       |
 1084|    557|	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
 1085|       |
 1086|    557|	if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
  ------------------
  |  Branch (1086:6): [True: 7, False: 550]
  ------------------
 1087|      7|		wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
 1088|      7|			   "with the selected cipher suite");
 1089|      7|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      7|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1090|      7|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      7|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1091|      7|		return -1;
 1092|      7|	}
 1093|       |
 1094|    550|	wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
 1095|    550|	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
 1096|    550|	if (suite && (suite->key_exchange == TLS_KEY_X_DH_anon ||
  ------------------
  |  Branch (1096:6): [True: 550, False: 0]
  |  Branch (1096:16): [True: 0, False: 550]
  ------------------
 1097|    550|		      suite->key_exchange == TLS_KEY_X_DHE_RSA)) {
  ------------------
  |  Branch (1097:9): [True: 550, False: 0]
  ------------------
 1098|    550|		if (tlsv1_process_diffie_hellman(conn, pos, len,
  ------------------
  |  Branch (1098:7): [True: 494, False: 56]
  ------------------
 1099|    550|						 suite->key_exchange) < 0) {
 1100|    494|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|    494|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1101|    494|				  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|    494|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1102|    494|			return -1;
 1103|    494|		}
 1104|    550|	} else {
 1105|      0|		wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
 1106|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1107|      0|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      0|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1108|      0|		return -1;
 1109|      0|	}
 1110|       |
 1111|     56|	*in_len = end - in_data;
 1112|       |
 1113|     56|	conn->state = SERVER_CERTIFICATE_REQUEST;
 1114|       |
 1115|     56|	return 0;
 1116|    550|}
tlsv1_client_read.c:tlsv1_process_diffie_hellman:
  667|    550|{
  668|    550|	const u8 *pos, *end, *server_params, *server_params_end;
  669|    550|	u8 alert;
  670|    550|	unsigned int bits;
  671|    550|	u16 val;
  672|       |
  673|    550|	tlsv1_client_free_dh(conn);
  674|       |
  675|    550|	pos = buf;
  676|    550|	end = buf + len;
  677|       |
  678|    550|	if (end - pos < 3)
  ------------------
  |  Branch (678:6): [True: 9, False: 541]
  ------------------
  679|      9|		goto fail;
  680|    541|	server_params = pos;
  681|    541|	val = WPA_GET_BE16(pos);
  682|    541|	pos += 2;
  683|    541|	if (val == 0 || val > (size_t) (end - pos)) {
  ------------------
  |  Branch (683:6): [True: 2, False: 539]
  |  Branch (683:18): [True: 18, False: 521]
  ------------------
  684|     20|		wpa_printf(MSG_DEBUG, "TLSv1: Invalid dh_p length %u", val);
  685|     20|		goto fail;
  686|     20|	}
  687|    521|	conn->dh_p_len = val;
  688|    521|	bits = count_bits(pos, conn->dh_p_len);
  689|    521|	if (bits < 768) {
  ------------------
  |  Branch (689:6): [True: 27, False: 494]
  ------------------
  690|     27|		wpa_printf(MSG_INFO, "TLSv1: Reject under 768-bit DH prime (insecure; only %u bits)",
  691|     27|			   bits);
  692|     27|		wpa_hexdump(MSG_DEBUG, "TLSv1: Rejected DH prime",
  693|     27|			    pos, conn->dh_p_len);
  694|     27|		goto fail;
  695|     27|	}
  696|    494|	conn->dh_p = os_memdup(pos, conn->dh_p_len);
  697|    494|	if (conn->dh_p == NULL)
  ------------------
  |  Branch (697:6): [True: 0, False: 494]
  ------------------
  698|      0|		goto fail;
  699|    494|	pos += conn->dh_p_len;
  700|    494|	wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
  701|    494|		    conn->dh_p, conn->dh_p_len);
  702|       |
  703|    494|	if (end - pos < 3)
  ------------------
  |  Branch (703:6): [True: 1, False: 493]
  ------------------
  704|      1|		goto fail;
  705|    493|	val = WPA_GET_BE16(pos);
  706|    493|	pos += 2;
  707|    493|	if (val == 0 || val > (size_t) (end - pos))
  ------------------
  |  Branch (707:6): [True: 1, False: 492]
  |  Branch (707:18): [True: 14, False: 478]
  ------------------
  708|     15|		goto fail;
  709|    478|	conn->dh_g_len = val;
  710|    478|	conn->dh_g = os_memdup(pos, conn->dh_g_len);
  711|    478|	if (conn->dh_g == NULL)
  ------------------
  |  Branch (711:6): [True: 0, False: 478]
  ------------------
  712|      0|		goto fail;
  713|    478|	pos += conn->dh_g_len;
  714|    478|	wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
  715|    478|		    conn->dh_g, conn->dh_g_len);
  716|    478|	if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
  ------------------
  |  Branch (716:6): [True: 275, False: 203]
  |  Branch (716:29): [True: 2, False: 273]
  ------------------
  717|      2|		goto fail;
  718|       |
  719|    476|	if (end - pos < 3)
  ------------------
  |  Branch (719:6): [True: 4, False: 472]
  ------------------
  720|      4|		goto fail;
  721|    472|	val = WPA_GET_BE16(pos);
  722|    472|	pos += 2;
  723|    472|	if (val == 0 || val > (size_t) (end - pos))
  ------------------
  |  Branch (723:6): [True: 3, False: 469]
  |  Branch (723:18): [True: 17, False: 452]
  ------------------
  724|     20|		goto fail;
  725|    452|	conn->dh_ys_len = val;
  726|    452|	conn->dh_ys = os_memdup(pos, conn->dh_ys_len);
  727|    452|	if (conn->dh_ys == NULL)
  ------------------
  |  Branch (727:6): [True: 0, False: 452]
  ------------------
  728|      0|		goto fail;
  729|    452|	pos += conn->dh_ys_len;
  730|    452|	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
  731|    452|		    conn->dh_ys, conn->dh_ys_len);
  732|    452|	server_params_end = pos;
  733|       |
  734|    452|	if (key_exchange == TLS_KEY_X_DHE_RSA) {
  ------------------
  |  Branch (734:6): [True: 452, False: 0]
  ------------------
  735|    452|		u8 hash[64];
  736|    452|		int hlen;
  737|       |
  738|    452|		if (conn->rl.tls_version == TLS_VERSION_1_2) {
  ------------------
  |  |   16|    452|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (738:7): [True: 323, False: 129]
  ------------------
  739|    323|#ifdef CONFIG_TLSV12
  740|       |			/*
  741|       |			 * RFC 5246, 4.7:
  742|       |			 * TLS v1.2 adds explicit indication of the used
  743|       |			 * signature and hash algorithms.
  744|       |			 *
  745|       |			 * struct {
  746|       |			 *   HashAlgorithm hash;
  747|       |			 *   SignatureAlgorithm signature;
  748|       |			 * } SignatureAndHashAlgorithm;
  749|       |			 */
  750|    323|			if (end - pos < 2)
  ------------------
  |  Branch (750:8): [True: 3, False: 320]
  ------------------
  751|      3|				goto fail;
  752|    320|			if ((pos[0] != TLS_HASH_ALG_SHA256 &&
  ------------------
  |  Branch (752:9): [True: 171, False: 149]
  ------------------
  753|    171|			     pos[0] != TLS_HASH_ALG_SHA384 &&
  ------------------
  |  Branch (753:9): [True: 24, False: 147]
  ------------------
  754|     24|			     pos[0] != TLS_HASH_ALG_SHA512) ||
  ------------------
  |  Branch (754:9): [True: 21, False: 3]
  ------------------
  755|    299|			    pos[1] != TLS_SIGN_ALG_RSA) {
  ------------------
  |  Branch (755:8): [True: 7, False: 292]
  ------------------
  756|     28|				wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/signature(%u) algorithm",
  757|     28|					   pos[0], pos[1]);
  758|     28|				goto fail;
  759|     28|			}
  760|       |
  761|    292|			hlen = tlsv12_key_x_server_params_hash(
  762|    292|				conn->rl.tls_version, pos[0],
  763|    292|				conn->client_random,
  764|    292|				conn->server_random, server_params,
  765|    292|				server_params_end - server_params, hash);
  766|    292|			pos += 2;
  767|       |#else /* CONFIG_TLSV12 */
  768|       |			goto fail;
  769|       |#endif /* CONFIG_TLSV12 */
  770|    292|		} else {
  771|    129|			hlen = tls_key_x_server_params_hash(
  772|    129|				conn->rl.tls_version, conn->client_random,
  773|    129|				conn->server_random, server_params,
  774|    129|				server_params_end - server_params, hash,
  775|    129|				sizeof(hash));
  776|    129|		}
  777|       |
  778|    421|		if (hlen < 0)
  ------------------
  |  Branch (778:7): [True: 1, False: 420]
  ------------------
  779|      1|			goto fail;
  780|    420|		wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerKeyExchange hash",
  781|    420|			    hash, hlen);
  782|       |
  783|    420|		if (tls_verify_signature(conn->rl.tls_version,
  ------------------
  |  Branch (783:7): [True: 364, False: 56]
  ------------------
  784|    420|					 conn->server_rsa_key,
  785|    420|					 hash, hlen, pos, end - pos,
  786|    420|					 &alert) < 0)
  787|    364|			goto fail;
  788|    420|	}
  789|       |
  790|     56|	return 0;
  791|       |
  792|    494|fail:
  793|    494|	wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed");
  794|    494|	tlsv1_client_free_dh(conn);
  795|    494|	return -1;
  796|    452|}
tlsv1_client_read.c:count_bits:
  641|    521|{
  642|    521|	size_t i;
  643|    521|	unsigned int bits;
  644|    521|	u8 tmp;
  645|       |
  646|  1.34k|	for (i = 0; i < len; i++) {
  ------------------
  |  Branch (646:14): [True: 1.34k, False: 4]
  ------------------
  647|  1.34k|		if (val[i])
  ------------------
  |  Branch (647:7): [True: 517, False: 826]
  ------------------
  648|    517|			break;
  649|  1.34k|	}
  650|    521|	if (i == len)
  ------------------
  |  Branch (650:6): [True: 4, False: 517]
  ------------------
  651|      4|		return 0;
  652|       |
  653|    517|	bits = (len - i - 1) * 8;
  654|    517|	tmp = val[i];
  655|  3.85k|	while (tmp) {
  ------------------
  |  Branch (655:9): [True: 3.33k, False: 517]
  ------------------
  656|  3.33k|		bits++;
  657|  3.33k|		tmp >>= 1;
  658|  3.33k|	}
  659|       |
  660|    517|	return bits;
  661|    521|}
tlsv1_client_read.c:tls_process_certificate_request:
 1121|    183|{
 1122|    183|	const u8 *pos, *end;
 1123|    183|	size_t left, len;
 1124|    183|	u8 type;
 1125|       |
 1126|    183|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
  ------------------
  |  Branch (1126:6): [True: 1, False: 182]
  ------------------
 1127|      1|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
 1128|      1|			   "received content type 0x%x", ct);
 1129|      1|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      1|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1130|      1|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      1|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1131|      1|		return -1;
 1132|      1|	}
 1133|       |
 1134|    182|	pos = in_data;
 1135|    182|	left = *in_len;
 1136|       |
 1137|    182|	if (left < 4) {
  ------------------
  |  Branch (1137:6): [True: 1, False: 181]
  ------------------
 1138|      1|		wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
 1139|      1|			   "(left=%lu)", (unsigned long) left);
 1140|      1|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      1|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      1|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1141|      1|		return -1;
 1142|      1|	}
 1143|       |
 1144|    181|	type = *pos++;
 1145|    181|	len = WPA_GET_BE24(pos);
 1146|    181|	pos += 3;
 1147|    181|	left -= 4;
 1148|       |
 1149|    181|	if (len > left) {
  ------------------
  |  Branch (1149:6): [True: 1, False: 180]
  ------------------
 1150|      1|		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
 1151|      1|			   "length (len=%lu != left=%lu)",
 1152|      1|			   (unsigned long) len, (unsigned long) left);
 1153|      1|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      1|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      1|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1154|      1|		return -1;
 1155|      1|	}
 1156|       |
 1157|    180|	end = pos + len;
 1158|       |
 1159|    180|	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
  ------------------
  |  Branch (1159:6): [True: 51, False: 129]
  ------------------
 1160|     51|		return tls_process_server_hello_done(conn, ct, in_data,
 1161|     51|						     in_len);
 1162|    129|	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
  ------------------
  |  Branch (1162:6): [True: 2, False: 127]
  ------------------
 1163|      2|		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
 1164|      2|			   "message %d (expected CertificateRequest/"
 1165|      2|			   "ServerHelloDone)", type);
 1166|      2|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1167|      2|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      2|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1168|      2|		return -1;
 1169|      2|	}
 1170|       |
 1171|    127|	wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
 1172|       |
 1173|    127|	conn->certificate_requested = 1;
 1174|       |
 1175|    127|	*in_len = end - in_data;
 1176|       |
 1177|    127|	conn->state = SERVER_HELLO_DONE;
 1178|       |
 1179|    127|	return 0;
 1180|    129|}
tlsv1_client_read.c:tls_process_server_hello_done:
 1185|    534|{
 1186|    534|	const u8 *pos, *end;
 1187|    534|	size_t left, len;
 1188|    534|	u8 type;
 1189|       |
 1190|    534|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
  ------------------
  |  Branch (1190:6): [True: 2, False: 532]
  ------------------
 1191|      2|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
 1192|      2|			   "received content type 0x%x", ct);
 1193|      2|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      2|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1194|      2|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      2|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1195|      2|		return -1;
 1196|      2|	}
 1197|       |
 1198|    532|	pos = in_data;
 1199|    532|	left = *in_len;
 1200|       |
 1201|    532|	if (left < 4) {
  ------------------
  |  Branch (1201:6): [True: 6, False: 526]
  ------------------
 1202|      6|		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
 1203|      6|			   "(left=%lu)", (unsigned long) left);
 1204|      6|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      6|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      6|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1205|      6|		return -1;
 1206|      6|	}
 1207|       |
 1208|    526|	type = *pos++;
 1209|    526|	len = WPA_GET_BE24(pos);
 1210|    526|	pos += 3;
 1211|    526|	left -= 4;
 1212|       |
 1213|    526|	if (len > left) {
  ------------------
  |  Branch (1213:6): [True: 29, False: 497]
  ------------------
 1214|     29|		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
 1215|     29|			   "length (len=%lu != left=%lu)",
 1216|     29|			   (unsigned long) len, (unsigned long) left);
 1217|     29|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|     29|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|     29|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1218|     29|		return -1;
 1219|     29|	}
 1220|    497|	end = pos + len;
 1221|       |
 1222|    497|	if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
  ------------------
  |  Branch (1222:6): [True: 10, False: 487]
  ------------------
 1223|     10|		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
 1224|     10|			   "message %d (expected ServerHelloDone)", type);
 1225|     10|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     10|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1226|     10|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|     10|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1227|     10|		return -1;
 1228|     10|	}
 1229|       |
 1230|    487|	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
 1231|       |
 1232|    487|	if ((conn->flags & TLS_CONN_REQUIRE_OCSP) &&
  ------------------
  |  |  108|    487|#define TLS_CONN_REQUIRE_OCSP BIT(4)
  |  |  ------------------
  |  |  |  |  458|    487|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (1232:6): [True: 0, False: 487]
  ------------------
 1233|      0|	    !conn->ocsp_resp_received) {
  ------------------
  |  Branch (1233:6): [True: 0, False: 0]
  ------------------
 1234|      0|		wpa_printf(MSG_INFO,
 1235|      0|			   "TLSv1: No OCSP response received - reject handshake");
 1236|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1237|      0|			  TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
  ------------------
  |  |  157|      0|#define TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE	113 /* RFC 4366 */
  ------------------
 1238|      0|		return -1;
 1239|      0|	}
 1240|       |
 1241|    487|	*in_len = end - in_data;
 1242|       |
 1243|    487|	conn->state = CLIENT_KEY_EXCHANGE;
 1244|       |
 1245|    487|	return 0;
 1246|    487|}
tlsv1_client_read.c:tls_process_server_change_cipher_spec:
 1252|    407|{
 1253|    407|	const u8 *pos;
 1254|    407|	size_t left;
 1255|       |
 1256|    407|	if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
  ------------------
  |  Branch (1256:6): [True: 1, False: 406]
  ------------------
 1257|      1|		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
 1258|      1|			   "received content type 0x%x", ct);
 1259|      1|		if (conn->use_session_ticket) {
  ------------------
  |  Branch (1259:7): [True: 0, False: 1]
  ------------------
 1260|      0|			int res;
 1261|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Server may have "
 1262|      0|				   "rejected SessionTicket");
 1263|      0|			conn->use_session_ticket = 0;
 1264|       |
 1265|       |			/* Notify upper layers that SessionTicket failed */
 1266|      0|			res = conn->session_ticket_cb(
 1267|      0|				conn->session_ticket_cb_ctx, NULL, 0, NULL,
 1268|      0|				NULL, NULL);
 1269|      0|			if (res < 0) {
  ------------------
  |  Branch (1269:8): [True: 0, False: 0]
  ------------------
 1270|      0|				wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "
 1271|      0|					   "callback indicated failure");
 1272|      0|				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1273|      0|					  TLS_ALERT_HANDSHAKE_FAILURE);
  ------------------
  |  |  137|      0|#define TLS_ALERT_HANDSHAKE_FAILURE		40
  ------------------
 1274|      0|				return -1;
 1275|      0|			}
 1276|       |
 1277|      0|			conn->state = SERVER_CERTIFICATE;
 1278|      0|			return tls_process_certificate(conn, ct, in_data,
 1279|      0|						       in_len);
 1280|      0|		}
 1281|      1|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      1|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1282|      1|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      1|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1283|      1|		return -1;
 1284|      1|	}
 1285|       |
 1286|    406|	pos = in_data;
 1287|    406|	left = *in_len;
 1288|       |
 1289|    406|	if (left < 1) {
  ------------------
  |  Branch (1289:6): [True: 0, False: 406]
  ------------------
 1290|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
 1291|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
              		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      0|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1292|      0|		return -1;
 1293|      0|	}
 1294|       |
 1295|    406|	if (*pos != TLS_CHANGE_CIPHER_SPEC) {
  ------------------
  |  Branch (1295:6): [True: 8, False: 398]
  ------------------
 1296|      8|		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
 1297|      8|			   "received data 0x%x", *pos);
 1298|      8|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      8|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1299|      8|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      8|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1300|      8|		return -1;
 1301|      8|	}
 1302|       |
 1303|    398|	wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
 1304|    398|	if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
  ------------------
  |  Branch (1304:6): [True: 0, False: 398]
  ------------------
 1305|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
 1306|      0|			   "for record layer");
 1307|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1308|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
 1309|      0|		return -1;
 1310|      0|	}
 1311|       |
 1312|    398|	*in_len = pos + 1 - in_data;
 1313|       |
 1314|    398|	conn->state = SERVER_FINISHED;
 1315|       |
 1316|    398|	return 0;
 1317|    398|}
tlsv1_client_read.c:tls_process_server_finished:
 1322|     65|{
 1323|     65|	const u8 *pos, *end;
 1324|     65|	size_t left, len, hlen;
 1325|     65|	u8 verify_data[TLS_VERIFY_DATA_LEN];
 1326|     65|	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
 1327|       |
 1328|     65|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
  ------------------
  |  Branch (1328:6): [True: 36, False: 29]
  ------------------
 1329|     36|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
 1330|     36|			   "received content type 0x%x", ct);
 1331|     36|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|     36|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1332|     36|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|     36|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1333|     36|		return -1;
 1334|     36|	}
 1335|       |
 1336|     29|	pos = in_data;
 1337|     29|	left = *in_len;
 1338|       |
 1339|     29|	if (left < 4) {
  ------------------
  |  Branch (1339:6): [True: 0, False: 29]
  ------------------
 1340|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
 1341|      0|			   "Finished",
 1342|      0|			   (unsigned long) left);
 1343|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1344|      0|			  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      0|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1345|      0|		return -1;
 1346|      0|	}
 1347|       |
 1348|     29|	if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
  ------------------
  |  Branch (1348:6): [True: 0, False: 29]
  ------------------
 1349|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
 1350|      0|			   "type 0x%x", pos[0]);
 1351|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1352|      0|			  TLS_ALERT_UNEXPECTED_MESSAGE);
  ------------------
  |  |  132|      0|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
 1353|      0|		return -1;
 1354|      0|	}
 1355|       |
 1356|     29|	len = WPA_GET_BE24(pos + 1);
 1357|       |
 1358|     29|	pos += 4;
 1359|     29|	left -= 4;
 1360|       |
 1361|     29|	if (len > left) {
  ------------------
  |  Branch (1361:6): [True: 0, False: 29]
  ------------------
 1362|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
 1363|      0|			   "(len=%lu > left=%lu)",
 1364|      0|			   (unsigned long) len, (unsigned long) left);
 1365|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1366|      0|			  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      0|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1367|      0|		return -1;
 1368|      0|	}
 1369|     29|	end = pos + len;
 1370|     29|	if (len != TLS_VERIFY_DATA_LEN) {
  ------------------
  |  |   30|     29|#define TLS_VERIFY_DATA_LEN 12
  ------------------
  |  Branch (1370:6): [True: 0, False: 29]
  ------------------
 1371|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
 1372|      0|			   "in Finished: %lu (expected %d)",
 1373|      0|			   (unsigned long) len, TLS_VERIFY_DATA_LEN);
  ------------------
  |  |   30|      0|#define TLS_VERIFY_DATA_LEN 12
  ------------------
 1374|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1375|      0|			  TLS_ALERT_DECODE_ERROR);
  ------------------
  |  |  146|      0|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
 1376|      0|		return -1;
 1377|      0|	}
 1378|     29|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
 1379|     29|		    pos, TLS_VERIFY_DATA_LEN);
  ------------------
  |  |   30|     29|#define TLS_VERIFY_DATA_LEN 12
  ------------------
 1380|       |
 1381|     29|#ifdef CONFIG_TLSV12
 1382|     29|	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
  ------------------
  |  |   16|     29|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (1382:6): [True: 29, False: 0]
  ------------------
 1383|     29|		hlen = SHA256_MAC_LEN;
  ------------------
  |  |   12|     29|#define SHA256_MAC_LEN 32
  ------------------
 1384|     29|		if (conn->verify.sha256_server == NULL ||
  ------------------
  |  Branch (1384:7): [True: 0, False: 29]
  ------------------
 1385|     29|		    crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
  ------------------
  |  Branch (1385:7): [True: 0, False: 29]
  ------------------
 1386|     29|		    < 0) {
 1387|      0|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1388|      0|				  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
 1389|      0|			conn->verify.sha256_server = NULL;
 1390|      0|			return -1;
 1391|      0|		}
 1392|     29|		conn->verify.sha256_server = NULL;
 1393|     29|	} else {
 1394|      0|#endif /* CONFIG_TLSV12 */
 1395|       |
 1396|      0|	hlen = MD5_MAC_LEN;
  ------------------
  |  |   12|      0|#define MD5_MAC_LEN 16
  ------------------
 1397|      0|	if (conn->verify.md5_server == NULL ||
  ------------------
  |  Branch (1397:6): [True: 0, False: 0]
  ------------------
 1398|      0|	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
  ------------------
  |  Branch (1398:6): [True: 0, False: 0]
  ------------------
 1399|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1400|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
 1401|      0|		conn->verify.md5_server = NULL;
 1402|      0|		crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
 1403|      0|		conn->verify.sha1_server = NULL;
 1404|      0|		return -1;
 1405|      0|	}
 1406|      0|	conn->verify.md5_server = NULL;
 1407|      0|	hlen = SHA1_MAC_LEN;
  ------------------
  |  |   12|      0|#define SHA1_MAC_LEN 20
  ------------------
 1408|      0|	if (conn->verify.sha1_server == NULL ||
  ------------------
  |  Branch (1408:6): [True: 0, False: 0]
  ------------------
 1409|      0|	    crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
  ------------------
  |  |   12|      0|#define MD5_MAC_LEN 16
  ------------------
  |  Branch (1409:6): [True: 0, False: 0]
  ------------------
 1410|      0|			       &hlen) < 0) {
 1411|      0|		conn->verify.sha1_server = NULL;
 1412|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1413|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
 1414|      0|		return -1;
 1415|      0|	}
 1416|      0|	conn->verify.sha1_server = NULL;
 1417|      0|	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
  ------------------
  |  |   12|      0|#define MD5_MAC_LEN 16
  ------------------
              	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
  ------------------
  |  |   12|      0|#define SHA1_MAC_LEN 20
  ------------------
 1418|       |
 1419|      0|#ifdef CONFIG_TLSV12
 1420|      0|	}
 1421|     29|#endif /* CONFIG_TLSV12 */
 1422|       |
 1423|     29|	if (tls_prf(conn->rl.tls_version,
  ------------------
  |  Branch (1423:6): [True: 0, False: 29]
  ------------------
 1424|     29|		    conn->master_secret, TLS_MASTER_SECRET_LEN,
  ------------------
  |  |   28|     29|#define TLS_MASTER_SECRET_LEN 48
  ------------------
 1425|     29|		    "server finished", hash, hlen,
 1426|     29|		    verify_data, TLS_VERIFY_DATA_LEN)) {
  ------------------
  |  |   30|     29|#define TLS_VERIFY_DATA_LEN 12
  ------------------
 1427|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
 1428|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1429|      0|			  TLS_ALERT_DECRYPT_ERROR);
  ------------------
  |  |  147|      0|#define TLS_ALERT_DECRYPT_ERROR			51
  ------------------
 1430|      0|		return -1;
 1431|      0|	}
 1432|     29|	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
 1433|     29|			verify_data, TLS_VERIFY_DATA_LEN);
  ------------------
  |  |   30|     29|#define TLS_VERIFY_DATA_LEN 12
  ------------------
 1434|       |
 1435|     29|	if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
  ------------------
  |  |   30|     29|#define TLS_VERIFY_DATA_LEN 12
  ------------------
  |  Branch (1435:6): [True: 5, False: 24]
  ------------------
 1436|      5|		wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
 1437|      5|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      5|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
 1438|      5|			  TLS_ALERT_DECRYPT_ERROR);
  ------------------
  |  |  147|      5|#define TLS_ALERT_DECRYPT_ERROR			51
  ------------------
 1439|      5|		return -1;
 1440|      5|	}
 1441|       |
 1442|     24|	wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
 1443|       |
 1444|     24|	*in_len = end - in_data;
 1445|       |
 1446|     24|	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
  ------------------
  |  Branch (1446:17): [True: 0, False: 24]
  |  Branch (1446:42): [True: 0, False: 24]
  ------------------
 1447|     24|		CHANGE_CIPHER_SPEC : ACK_FINISHED;
 1448|       |
 1449|     24|	return 0;
 1450|     29|}

tls_send_client_hello:
   46|  3.10k|{
   47|  3.10k|	u8 *hello, *end, *pos, *hs_length, *hs_start, *rhdr;
   48|  3.10k|	struct os_time now;
   49|  3.10k|	size_t len, i;
   50|  3.10k|	u8 *ext_start;
   51|  3.10k|	u16 tls_version = tls_client_highest_ver(conn);
   52|       |
   53|  3.10k|	if (!tls_version) {
  ------------------
  |  Branch (53:6): [True: 0, False: 3.10k]
  ------------------
   54|      0|		wpa_printf(MSG_INFO, "TLSv1: No TLS version allowed");
   55|      0|		return NULL;
   56|      0|	}
   57|       |
   58|  3.10k|	wpa_printf(MSG_DEBUG, "TLSv1: Send ClientHello (ver %s)",
   59|  3.10k|		   tls_version_str(tls_version));
   60|  3.10k|	*out_len = 0;
   61|       |
   62|  3.10k|	os_get_time(&now);
   63|  3.10k|#ifdef TEST_FUZZ
   64|  3.10k|	now.sec = 0xfffefdfc;
   65|  3.10k|#endif /* TEST_FUZZ */
   66|  3.10k|	WPA_PUT_BE32(conn->client_random, now.sec);
   67|  3.10k|	if (random_get_bytes(conn->client_random + 4, TLS_RANDOM_LEN - 4)) {
  ------------------
  |  |   16|  3.10k|#define random_get_bytes(b, l) os_get_random((b), (l))
  |  |  ------------------
  |  |  |  Branch (16:32): [True: 0, False: 3.10k]
  |  |  ------------------
  ------------------
   68|      0|		wpa_printf(MSG_ERROR, "TLSv1: Could not generate "
   69|      0|			   "client_random");
   70|      0|		return NULL;
   71|      0|	}
   72|  3.10k|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: client_random",
   73|  3.10k|		    conn->client_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|  3.10k|#define TLS_RANDOM_LEN 32
  ------------------
   74|       |
   75|  3.10k|	len = 150 + conn->num_cipher_suites * 2 + conn->client_hello_ext_len;
   76|  3.10k|	hello = os_malloc(len);
  ------------------
  |  |  505|  3.10k|#define os_malloc(s) malloc((s))
  ------------------
   77|  3.10k|	if (hello == NULL)
  ------------------
  |  Branch (77:6): [True: 0, False: 3.10k]
  ------------------
   78|      0|		return NULL;
   79|  3.10k|	end = hello + len;
   80|       |
   81|  3.10k|	rhdr = hello;
   82|  3.10k|	pos = rhdr + TLS_RECORD_HEADER_LEN;
  ------------------
  |  |   21|  3.10k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
   83|       |
   84|       |	/* opaque fragment[TLSPlaintext.length] */
   85|       |
   86|       |	/* Handshake */
   87|  3.10k|	hs_start = pos;
   88|       |	/* HandshakeType msg_type */
   89|  3.10k|	*pos++ = TLS_HANDSHAKE_TYPE_CLIENT_HELLO;
   90|       |	/* uint24 length (to be filled) */
   91|  3.10k|	hs_length = pos;
   92|  3.10k|	pos += 3;
   93|       |	/* body - ClientHello */
   94|       |	/* ProtocolVersion client_version */
   95|  3.10k|	WPA_PUT_BE16(pos, tls_version);
   96|  3.10k|	pos += 2;
   97|       |	/* Random random: uint32 gmt_unix_time, opaque random_bytes */
   98|  3.10k|	os_memcpy(pos, conn->client_random, TLS_RANDOM_LEN);
  ------------------
  |  |  523|  3.10k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
   99|  3.10k|	pos += TLS_RANDOM_LEN;
  ------------------
  |  |   26|  3.10k|#define TLS_RANDOM_LEN 32
  ------------------
  100|       |	/* SessionID session_id */
  101|  3.10k|	*pos++ = conn->session_id_len;
  102|  3.10k|	os_memcpy(pos, conn->session_id, conn->session_id_len);
  ------------------
  |  |  523|  3.10k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  103|  3.10k|	pos += conn->session_id_len;
  104|       |	/* CipherSuite cipher_suites<2..2^16-1> */
  105|  3.10k|	WPA_PUT_BE16(pos, 2 * conn->num_cipher_suites);
  106|  3.10k|	pos += 2;
  107|  40.3k|	for (i = 0; i < conn->num_cipher_suites; i++) {
  ------------------
  |  Branch (107:14): [True: 37.2k, False: 3.10k]
  ------------------
  108|  37.2k|		WPA_PUT_BE16(pos, conn->cipher_suites[i]);
  109|  37.2k|		pos += 2;
  110|  37.2k|	}
  111|       |	/* CompressionMethod compression_methods<1..2^8-1> */
  112|  3.10k|	*pos++ = 1;
  113|  3.10k|	*pos++ = TLS_COMPRESSION_NULL;
  ------------------
  |  |  105|  3.10k|#define TLS_COMPRESSION_NULL 0
  ------------------
  114|       |
  115|       |	/* Extension */
  116|  3.10k|	ext_start = pos;
  117|  3.10k|	pos += 2;
  118|       |
  119|  3.10k|#ifdef CONFIG_TLSV12
  120|  3.10k|	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
  ------------------
  |  |   16|  3.10k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (120:6): [True: 3.10k, False: 0]
  ------------------
  121|       |		/*
  122|       |		 * Add signature_algorithms extension since we support only
  123|       |		 * SHA256 (and not the default SHA1) with TLSv1.2.
  124|       |		 */
  125|       |		/* ExtensionsType extension_type = signature_algorithms(13) */
  126|  3.10k|		WPA_PUT_BE16(pos, TLS_EXT_SIGNATURE_ALGORITHMS);
  ------------------
  |  |  172|  3.10k|#define TLS_EXT_SIGNATURE_ALGORITHMS		13 /* RFC 5246 */
  ------------------
  127|  3.10k|		pos += 2;
  128|       |		/* opaque extension_data<0..2^16-1> length */
  129|  3.10k|		WPA_PUT_BE16(pos, 8);
  130|  3.10k|		pos += 2;
  131|       |		/* supported_signature_algorithms<2..2^16-2> length */
  132|  3.10k|		WPA_PUT_BE16(pos, 6);
  133|  3.10k|		pos += 2;
  134|       |		/* supported_signature_algorithms */
  135|  3.10k|		*pos++ = TLS_HASH_ALG_SHA512;
  136|  3.10k|		*pos++ = TLS_SIGN_ALG_RSA;
  137|  3.10k|		*pos++ = TLS_HASH_ALG_SHA384;
  138|  3.10k|		*pos++ = TLS_SIGN_ALG_RSA;
  139|  3.10k|		*pos++ = TLS_HASH_ALG_SHA256;
  140|  3.10k|		*pos++ = TLS_SIGN_ALG_RSA;
  141|  3.10k|	}
  142|  3.10k|#endif /* CONFIG_TLSV12 */
  143|       |
  144|  3.10k|	if (conn->client_hello_ext) {
  ------------------
  |  Branch (144:6): [True: 0, False: 3.10k]
  ------------------
  145|      0|		os_memcpy(pos, conn->client_hello_ext,
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  146|      0|			  conn->client_hello_ext_len);
  147|      0|		pos += conn->client_hello_ext_len;
  148|      0|	}
  149|       |
  150|  3.10k|	if (conn->flags & TLS_CONN_REQUEST_OCSP) {
  ------------------
  |  |  107|  3.10k|#define TLS_CONN_REQUEST_OCSP BIT(3)
  |  |  ------------------
  |  |  |  |  458|  3.10k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (150:6): [True: 0, False: 3.10k]
  ------------------
  151|      0|		wpa_printf(MSG_DEBUG,
  152|      0|			   "TLSv1: Add status_request extension for OCSP stapling");
  153|       |		/* ExtensionsType extension_type = status_request(5) */
  154|      0|		WPA_PUT_BE16(pos, TLS_EXT_STATUS_REQUEST);
  ------------------
  |  |  171|      0|#define TLS_EXT_STATUS_REQUEST			5 /* RFC 4366 */
  ------------------
  155|      0|		pos += 2;
  156|       |		/* opaque extension_data<0..2^16-1> length */
  157|      0|		WPA_PUT_BE16(pos, 5);
  158|      0|		pos += 2;
  159|       |
  160|       |		/*
  161|       |		 * RFC 6066, 8:
  162|       |		 * struct {
  163|       |		 *     CertificateStatusType status_type;
  164|       |		 *     select (status_type) {
  165|       |		 *         case ocsp: OCSPStatusRequest;
  166|       |		 *     } request;
  167|       |		 * } CertificateStatusRequest;
  168|       |		 *
  169|       |		 * enum { ocsp(1), (255) } CertificateStatusType;
  170|       |		 */
  171|      0|		*pos++ = 1; /* status_type = ocsp(1) */
  172|       |
  173|       |		/*
  174|       |		 * struct {
  175|       |		 *     ResponderID responder_id_list<0..2^16-1>;
  176|       |		 *     Extensions  request_extensions;
  177|       |		 * } OCSPStatusRequest;
  178|       |		 *
  179|       |		 * opaque ResponderID<1..2^16-1>;
  180|       |		 * opaque Extensions<0..2^16-1>;
  181|       |		 */
  182|      0|		WPA_PUT_BE16(pos, 0); /* responder_id_list(empty) */
  183|      0|		pos += 2;
  184|      0|		WPA_PUT_BE16(pos, 0); /* request_extensions(empty) */
  185|      0|		pos += 2;
  186|       |
  187|      0|		wpa_printf(MSG_DEBUG,
  188|      0|			   "TLSv1: Add status_request_v2 extension for OCSP stapling");
  189|       |		/* ExtensionsType extension_type = status_request_v2(17) */
  190|      0|		WPA_PUT_BE16(pos, TLS_EXT_STATUS_REQUEST_V2);
  ------------------
  |  |  173|      0|#define TLS_EXT_STATUS_REQUEST_V2		17 /* RFC 6961 */
  ------------------
  191|      0|		pos += 2;
  192|       |		/* opaque extension_data<0..2^16-1> length */
  193|      0|		WPA_PUT_BE16(pos, 7);
  194|      0|		pos += 2;
  195|       |
  196|       |		/*
  197|       |		 * RFC 6961, 2.2:
  198|       |		 * struct {
  199|       |		 *     CertificateStatusType status_type;
  200|       |		 *     uint16 request_length;
  201|       |		 *     select (status_type) {
  202|       |		 *         case ocsp: OCSPStatusRequest;
  203|       |		 *         case ocsp_multi: OCSPStatusRequest;
  204|       |		 *     } request;
  205|       |		 * } CertificateStatusRequestItemV2;
  206|       |		 *
  207|       |		 * enum { ocsp(1), ocsp_multi(2), (255) } CertificateStatusType;
  208|       |		 *
  209|       |		 * struct {
  210|       |		 * CertificateStatusRequestItemV2
  211|       |		 *     certificate_status_req_list<1..2^16-1>;
  212|       |		 * } CertificateStatusRequestListV2;
  213|       |		 */
  214|       |
  215|       |		/* certificate_status_req_list<1..2^16-1> */
  216|      0|		WPA_PUT_BE16(pos, 5);
  217|      0|		pos += 2;
  218|       |
  219|       |		/* CertificateStatusRequestItemV2 */
  220|      0|		*pos++ = 2; /* status_type = ocsp_multi(2) */
  221|       |		/* OCSPStatusRequest as shown above for v1 */
  222|      0|		WPA_PUT_BE16(pos, 0); /* responder_id_list(empty) */
  223|      0|		pos += 2;
  224|      0|		WPA_PUT_BE16(pos, 0); /* request_extensions(empty) */
  225|      0|		pos += 2;
  226|      0|	}
  227|       |
  228|  3.10k|	if (pos == ext_start + 2)
  ------------------
  |  Branch (228:6): [True: 0, False: 3.10k]
  ------------------
  229|      0|		pos -= 2; /* no extensions */
  230|  3.10k|	else
  231|  3.10k|		WPA_PUT_BE16(ext_start, pos - ext_start - 2);
  232|       |
  233|  3.10k|	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
  234|  3.10k|	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
  235|       |
  236|  3.10k|	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
  ------------------
  |  Branch (236:6): [True: 0, False: 3.10k]
  ------------------
  237|  3.10k|			      rhdr, end - rhdr, hs_start, pos - hs_start,
  238|  3.10k|			      out_len) < 0) {
  239|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create TLS record");
  240|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  241|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  242|      0|		os_free(hello);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  243|      0|		return NULL;
  244|      0|	}
  245|       |
  246|  3.10k|	conn->state = SERVER_HELLO;
  247|       |
  248|  3.10k|	return hello;
  249|  3.10k|}
tlsv1_client_handshake_write:
  937|  18.4k|{
  938|  18.4k|	switch (conn->state) {
  939|    480|	case CLIENT_KEY_EXCHANGE:
  ------------------
  |  Branch (939:2): [True: 480, False: 17.9k]
  ------------------
  940|    480|		return tls_send_client_key_exchange(conn, out_len);
  941|      0|	case CHANGE_CIPHER_SPEC:
  ------------------
  |  Branch (941:2): [True: 0, False: 18.4k]
  ------------------
  942|      0|		return tls_send_change_cipher_spec(conn, out_len);
  943|     24|	case ACK_FINISHED:
  ------------------
  |  Branch (943:2): [True: 24, False: 18.4k]
  ------------------
  944|     24|		wpa_printf(MSG_DEBUG, "TLSv1: Handshake completed "
  945|     24|			   "successfully");
  946|     24|		conn->state = ESTABLISHED;
  947|     24|		*out_len = 0;
  948|     24|		if (no_appl_data) {
  ------------------
  |  Branch (948:7): [True: 24, False: 0]
  ------------------
  949|       |			/* Need to return something to get final TLS ACK. */
  950|     24|			return os_malloc(1);
  ------------------
  |  |  505|     24|#define os_malloc(s) malloc((s))
  ------------------
  951|     24|		}
  952|      0|		return NULL;
  953|  17.9k|	default:
  ------------------
  |  Branch (953:2): [True: 17.9k, False: 504]
  ------------------
  954|  17.9k|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d while "
  955|  17.9k|			   "generating reply", conn->state);
  956|       |		return NULL;
  957|  18.4k|	}
  958|  18.4k|}
tlsv1_client_send_alert:
  963|  56.2k|{
  964|  56.2k|	u8 *alert, *pos, *length;
  965|       |
  966|  56.2k|	wpa_printf(MSG_DEBUG, "TLSv1: Send Alert(%d:%d)", level, description);
  967|  56.2k|	*out_len = 0;
  968|       |
  969|  56.2k|	alert = os_malloc(10);
  ------------------
  |  |  505|  56.2k|#define os_malloc(s) malloc((s))
  ------------------
  970|  56.2k|	if (alert == NULL)
  ------------------
  |  Branch (970:6): [True: 0, False: 56.2k]
  ------------------
  971|      0|		return NULL;
  972|       |
  973|  56.2k|	pos = alert;
  974|       |
  975|       |	/* TLSPlaintext */
  976|       |	/* ContentType type */
  977|  56.2k|	*pos++ = TLS_CONTENT_TYPE_ALERT;
  978|       |	/* ProtocolVersion version */
  979|  56.2k|	WPA_PUT_BE16(pos, conn->rl.tls_version ? conn->rl.tls_version :
  ------------------
  |  Branch (979:20): [True: 56.2k, False: 0]
  ------------------
  980|  56.2k|		     TLS_VERSION);
  ------------------
  |  |   18|      0|#define TLS_VERSION TLS_VERSION_1_2
  |  |  ------------------
  |  |  |  |   16|  56.2k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  |  |  ------------------
  ------------------
  981|  56.2k|	pos += 2;
  982|       |	/* uint16 length (to be filled) */
  983|  56.2k|	length = pos;
  984|  56.2k|	pos += 2;
  985|       |	/* opaque fragment[TLSPlaintext.length] */
  986|       |
  987|       |	/* Alert */
  988|       |	/* AlertLevel level */
  989|  56.2k|	*pos++ = level;
  990|       |	/* AlertDescription description */
  991|  56.2k|	*pos++ = description;
  992|       |
  993|  56.2k|	WPA_PUT_BE16(length, pos - length - 2);
  994|  56.2k|	*out_len = pos - alert;
  995|       |
  996|  56.2k|	return alert;
  997|  56.2k|}
tlsv1_client_write.c:tls_send_client_key_exchange:
  862|    480|{
  863|    480|	u8 *msg, *end, *pos;
  864|    480|	size_t msglen;
  865|       |
  866|    480|	*out_len = 0;
  867|       |
  868|    480|	msglen = 2000;
  869|    480|	if (conn->certificate_requested)
  ------------------
  |  Branch (869:6): [True: 75, False: 405]
  ------------------
  870|     75|		msglen += tls_client_cert_chain_der_len(conn);
  871|       |
  872|    480|	msg = os_malloc(msglen);
  ------------------
  |  |  505|    480|#define os_malloc(s) malloc((s))
  ------------------
  873|    480|	if (msg == NULL)
  ------------------
  |  Branch (873:6): [True: 0, False: 480]
  ------------------
  874|      0|		return NULL;
  875|       |
  876|    480|	pos = msg;
  877|    480|	end = msg + msglen;
  878|       |
  879|    480|	if (conn->certificate_requested) {
  ------------------
  |  Branch (879:6): [True: 75, False: 405]
  ------------------
  880|     75|		if (tls_write_client_certificate(conn, &pos, end) < 0) {
  ------------------
  |  Branch (880:7): [True: 0, False: 75]
  ------------------
  881|      0|			os_free(msg);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  882|      0|			return NULL;
  883|      0|		}
  884|     75|	}
  885|       |
  886|    480|	if (tls_write_client_key_exchange(conn, &pos, end) < 0 ||
  ------------------
  |  Branch (886:6): [True: 18, False: 462]
  ------------------
  887|    462|	    (conn->certificate_requested && conn->cred && conn->cred->key &&
  ------------------
  |  Branch (887:7): [True: 72, False: 390]
  |  Branch (887:38): [True: 0, False: 72]
  |  Branch (887:52): [True: 0, False: 0]
  ------------------
  888|      0|	     tls_write_client_certificate_verify(conn, &pos, end) < 0) ||
  ------------------
  |  Branch (888:7): [True: 0, False: 0]
  ------------------
  889|    462|	    tls_write_client_change_cipher_spec(conn, &pos, end) < 0 ||
  ------------------
  |  Branch (889:6): [True: 0, False: 462]
  ------------------
  890|    462|	    tls_write_client_finished(conn, &pos, end) < 0) {
  ------------------
  |  Branch (890:6): [True: 0, False: 462]
  ------------------
  891|     18|		os_free(msg);
  ------------------
  |  |  511|     18|#define os_free(p) free((p))
  ------------------
  892|     18|		return NULL;
  893|     18|	}
  894|       |
  895|    462|	*out_len = pos - msg;
  896|       |
  897|    462|	conn->state = SERVER_CHANGE_CIPHER_SPEC;
  898|       |
  899|    462|	return msg;
  900|    480|}
tlsv1_client_write.c:tls_client_cert_chain_der_len:
   25|     75|{
   26|     75|	size_t len = 0;
   27|     75|	struct x509_certificate *cert;
   28|       |
   29|     75|	if (conn->cred == NULL)
  ------------------
  |  Branch (29:6): [True: 75, False: 0]
  ------------------
   30|     75|		return 0;
   31|       |
   32|      0|	cert = conn->cred->cert;
   33|      0|	while (cert) {
  ------------------
  |  Branch (33:9): [True: 0, False: 0]
  ------------------
   34|      0|		len += 3 + cert->cert_len;
   35|      0|		if (x509_certificate_self_signed(cert))
  ------------------
  |  Branch (35:7): [True: 0, False: 0]
  ------------------
   36|      0|			break;
   37|      0|		cert = x509_certificate_get_subject(conn->cred->trusted_certs,
   38|      0|						    &cert->issuer);
   39|      0|	}
   40|       |
   41|      0|	return len;
   42|     75|}
tlsv1_client_write.c:tls_write_client_certificate:
  254|     75|{
  255|     75|	u8 *pos, *rhdr, *hs_start, *hs_length, *cert_start;
  256|     75|	size_t rlen;
  257|     75|	struct x509_certificate *cert;
  258|       |
  259|     75|	pos = *msgpos;
  260|     75|	if (TLS_RECORD_HEADER_LEN + 1 + 3 + 3 > end - pos) {
  ------------------
  |  |   21|     75|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  |  Branch (260:6): [True: 0, False: 75]
  ------------------
  261|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  262|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  263|      0|		return -1;
  264|      0|	}
  265|       |
  266|     75|	wpa_printf(MSG_DEBUG, "TLSv1: Send Certificate");
  267|     75|	rhdr = pos;
  268|     75|	pos += TLS_RECORD_HEADER_LEN;
  ------------------
  |  |   21|     75|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  269|       |
  270|       |	/* opaque fragment[TLSPlaintext.length] */
  271|       |
  272|       |	/* Handshake */
  273|     75|	hs_start = pos;
  274|       |	/* HandshakeType msg_type */
  275|     75|	*pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE;
  276|       |	/* uint24 length (to be filled) */
  277|     75|	hs_length = pos;
  278|     75|	pos += 3;
  279|       |	/* body - Certificate */
  280|       |	/* uint24 length (to be filled) */
  281|     75|	cert_start = pos;
  282|     75|	pos += 3;
  283|     75|	cert = conn->cred ? conn->cred->cert : NULL;
  ------------------
  |  Branch (283:9): [True: 0, False: 75]
  ------------------
  284|     75|	while (cert) {
  ------------------
  |  Branch (284:9): [True: 0, False: 75]
  ------------------
  285|      0|		if (3 + cert->cert_len > (size_t) (end - pos)) {
  ------------------
  |  Branch (285:7): [True: 0, False: 0]
  ------------------
  286|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space "
  287|      0|				   "for Certificate (cert_len=%lu left=%lu)",
  288|      0|				   (unsigned long) cert->cert_len,
  289|      0|				   (unsigned long) (end - pos));
  290|      0|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  291|      0|				  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  292|      0|			return -1;
  293|      0|		}
  294|      0|		WPA_PUT_BE24(pos, cert->cert_len);
  295|      0|		pos += 3;
  296|      0|		os_memcpy(pos, cert->cert_start, cert->cert_len);
  ------------------
  |  |  523|      0|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  297|      0|		pos += cert->cert_len;
  298|       |
  299|      0|		if (x509_certificate_self_signed(cert))
  ------------------
  |  Branch (299:7): [True: 0, False: 0]
  ------------------
  300|      0|			break;
  301|      0|		cert = x509_certificate_get_subject(conn->cred->trusted_certs,
  302|      0|						    &cert->issuer);
  303|      0|	}
  304|     75|	if (conn->cred == NULL || cert == conn->cred->cert || cert == NULL) {
  ------------------
  |  Branch (304:6): [True: 75, False: 0]
  |  Branch (304:28): [True: 0, False: 0]
  |  Branch (304:56): [True: 0, False: 0]
  ------------------
  305|       |		/*
  306|       |		 * Client was not configured with all the needed certificates
  307|       |		 * to form a full certificate chain. The server may fail to
  308|       |		 * validate the chain unless it is configured with all the
  309|       |		 * missing CA certificates.
  310|       |		 */
  311|     75|		wpa_printf(MSG_DEBUG, "TLSv1: Full client certificate chain "
  312|     75|			   "not configured - validation may fail");
  313|     75|	}
  314|     75|	WPA_PUT_BE24(cert_start, pos - cert_start - 3);
  315|       |
  316|     75|	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
  317|       |
  318|     75|	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
  ------------------
  |  Branch (318:6): [True: 0, False: 75]
  ------------------
  319|     75|			      rhdr, end - rhdr, hs_start, pos - hs_start,
  320|     75|			      &rlen) < 0) {
  321|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
  322|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  323|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  324|      0|		return -1;
  325|      0|	}
  326|     75|	pos = rhdr + rlen;
  327|       |
  328|     75|	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
  329|       |
  330|     75|	*msgpos = pos;
  331|       |
  332|     75|	return 0;
  333|     75|}
tlsv1_client_write.c:tls_write_client_key_exchange:
  508|    480|{
  509|    480|	u8 *pos, *rhdr, *hs_start, *hs_length;
  510|    480|	size_t rlen;
  511|    480|	tls_key_exchange keyx;
  512|    480|	const struct tls_cipher_suite *suite;
  513|       |
  514|    480|	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
  515|    480|	if (suite == NULL)
  ------------------
  |  Branch (515:6): [True: 0, False: 480]
  ------------------
  516|      0|		keyx = TLS_KEY_X_NULL;
  517|    480|	else
  518|    480|		keyx = suite->key_exchange;
  519|       |
  520|    480|	pos = *msgpos;
  521|       |
  522|    480|	wpa_printf(MSG_DEBUG, "TLSv1: Send ClientKeyExchange");
  523|       |
  524|    480|	rhdr = pos;
  525|    480|	pos += TLS_RECORD_HEADER_LEN;
  ------------------
  |  |   21|    480|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  526|       |
  527|       |	/* opaque fragment[TLSPlaintext.length] */
  528|       |
  529|       |	/* Handshake */
  530|    480|	hs_start = pos;
  531|       |	/* HandshakeType msg_type */
  532|    480|	*pos++ = TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE;
  533|       |	/* uint24 length (to be filled) */
  534|    480|	hs_length = pos;
  535|    480|	pos += 3;
  536|       |	/* body - ClientKeyExchange */
  537|    480|	if (keyx == TLS_KEY_X_DH_anon || keyx == TLS_KEY_X_DHE_RSA) {
  ------------------
  |  Branch (537:6): [True: 0, False: 480]
  |  Branch (537:35): [True: 54, False: 426]
  ------------------
  538|     54|		if (tlsv1_key_x_dh(conn, &pos, end) < 0)
  ------------------
  |  Branch (538:7): [True: 3, False: 51]
  ------------------
  539|      3|			return -1;
  540|    426|	} else {
  541|    426|		if (tlsv1_key_x_rsa(conn, &pos, end) < 0)
  ------------------
  |  Branch (541:7): [True: 15, False: 411]
  ------------------
  542|     15|			return -1;
  543|    426|	}
  544|       |
  545|    462|	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
  546|       |
  547|    462|	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
  ------------------
  |  Branch (547:6): [True: 0, False: 462]
  ------------------
  548|    462|			      rhdr, end - rhdr, hs_start, pos - hs_start,
  549|    462|			      &rlen) < 0) {
  550|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
  551|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  552|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  553|      0|		return -1;
  554|      0|	}
  555|    462|	pos = rhdr + rlen;
  556|    462|	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
  557|       |
  558|    462|	*msgpos = pos;
  559|       |
  560|    462|	return 0;
  561|    462|}
tlsv1_client_write.c:tlsv1_key_x_dh:
  337|     54|{
  338|       |	/* ClientDiffieHellmanPublic */
  339|     54|	u8 *csecret, *csecret_start, *dh_yc, *shared;
  340|     54|	size_t csecret_len, dh_yc_len, shared_len;
  341|       |
  342|     54|	csecret_len = conn->dh_p_len;
  343|     54|	csecret = os_malloc(csecret_len);
  ------------------
  |  |  505|     54|#define os_malloc(s) malloc((s))
  ------------------
  344|     54|	if (csecret == NULL) {
  ------------------
  |  Branch (344:6): [True: 0, False: 54]
  ------------------
  345|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
  346|      0|			   "memory for Yc (Diffie-Hellman)");
  347|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  348|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  349|      0|		return -1;
  350|      0|	}
  351|     54|	if (random_get_bytes(csecret, csecret_len)) {
  ------------------
  |  |   16|     54|#define random_get_bytes(b, l) os_get_random((b), (l))
  |  |  ------------------
  |  |  |  Branch (16:32): [True: 0, False: 54]
  |  |  ------------------
  ------------------
  352|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random "
  353|      0|			   "data for Diffie-Hellman");
  354|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  355|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  356|      0|		os_free(csecret);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  357|      0|		return -1;
  358|      0|	}
  359|       |
  360|     54|	if (os_memcmp(csecret, conn->dh_p, csecret_len) > 0)
  ------------------
  |  |  532|     54|#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
  ------------------
  |  Branch (360:6): [True: 0, False: 54]
  ------------------
  361|      0|		csecret[0] = 0; /* make sure Yc < p */
  362|       |
  363|     54|	csecret_start = csecret;
  364|    105|	while (csecret_len > 1 && *csecret_start == 0) {
  ------------------
  |  Branch (364:9): [True: 102, False: 3]
  |  Branch (364:28): [True: 51, False: 51]
  ------------------
  365|     51|		csecret_start++;
  366|     51|		csecret_len--;
  367|     51|	}
  368|     54|	wpa_hexdump_key(MSG_DEBUG, "TLSv1: DH client's secret value",
  369|     54|			csecret_start, csecret_len);
  370|       |
  371|       |	/* Yc = g^csecret mod p */
  372|     54|	dh_yc_len = conn->dh_p_len;
  373|     54|	dh_yc = os_malloc(dh_yc_len);
  ------------------
  |  |  505|     54|#define os_malloc(s) malloc((s))
  ------------------
  374|     54|	if (dh_yc == NULL) {
  ------------------
  |  Branch (374:6): [True: 0, False: 54]
  ------------------
  375|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
  376|      0|			   "memory for Diffie-Hellman");
  377|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  378|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  379|      0|		os_free(csecret);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  380|      0|		return -1;
  381|      0|	}
  382|     54|	if (crypto_mod_exp(conn->dh_g, conn->dh_g_len,
  ------------------
  |  Branch (382:6): [True: 3, False: 51]
  ------------------
  383|     54|			   csecret_start, csecret_len,
  384|     54|			   conn->dh_p, conn->dh_p_len,
  385|     54|			   dh_yc, &dh_yc_len)) {
  386|      3|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      3|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  387|      3|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      3|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  388|      3|		os_free(csecret);
  ------------------
  |  |  511|      3|#define os_free(p) free((p))
  ------------------
  389|      3|		os_free(dh_yc);
  ------------------
  |  |  511|      3|#define os_free(p) free((p))
  ------------------
  390|      3|		return -1;
  391|      3|	}
  392|       |
  393|     51|	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Yc (client's public value)",
  394|     51|		    dh_yc, dh_yc_len);
  395|       |
  396|     51|	if (end - *pos < 2) {
  ------------------
  |  Branch (396:6): [True: 0, False: 51]
  ------------------
  397|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  398|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  399|      0|		os_free(csecret);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  400|      0|		os_free(dh_yc);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  401|      0|		return -1;
  402|      0|	}
  403|     51|	WPA_PUT_BE16(*pos, dh_yc_len);
  404|     51|	*pos += 2;
  405|     51|	if (dh_yc_len > (size_t) (end - *pos)) {
  ------------------
  |  Branch (405:6): [True: 0, False: 51]
  ------------------
  406|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Not enough room in the "
  407|      0|			   "message buffer for Yc");
  408|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  409|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  410|      0|		os_free(csecret);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  411|      0|		os_free(dh_yc);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  412|      0|		return -1;
  413|      0|	}
  414|     51|	os_memcpy(*pos, dh_yc, dh_yc_len);
  ------------------
  |  |  523|     51|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  415|     51|	*pos += dh_yc_len;
  416|     51|	os_free(dh_yc);
  ------------------
  |  |  511|     51|#define os_free(p) free((p))
  ------------------
  417|       |
  418|     51|	shared_len = conn->dh_p_len;
  419|     51|	shared = os_malloc(shared_len);
  ------------------
  |  |  505|     51|#define os_malloc(s) malloc((s))
  ------------------
  420|     51|	if (shared == NULL) {
  ------------------
  |  Branch (420:6): [True: 0, False: 51]
  ------------------
  421|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Could not allocate memory for "
  422|      0|			   "DH");
  423|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  424|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  425|      0|		os_free(csecret);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  426|      0|		return -1;
  427|      0|	}
  428|       |
  429|       |	/* shared = Ys^csecret mod p */
  430|     51|	if (crypto_mod_exp(conn->dh_ys, conn->dh_ys_len,
  ------------------
  |  Branch (430:6): [True: 0, False: 51]
  ------------------
  431|     51|			   csecret_start, csecret_len,
  432|     51|			   conn->dh_p, conn->dh_p_len,
  433|     51|			   shared, &shared_len)) {
  434|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  435|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  436|      0|		os_free(csecret);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  437|      0|		os_free(shared);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  438|      0|		return -1;
  439|      0|	}
  440|     51|	wpa_hexdump_key(MSG_DEBUG, "TLSv1: Shared secret from DH key exchange",
  441|     51|			shared, shared_len);
  442|       |
  443|     51|	os_memset(csecret_start, 0, csecret_len);
  ------------------
  |  |  529|     51|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  444|     51|	os_free(csecret);
  ------------------
  |  |  511|     51|#define os_free(p) free((p))
  ------------------
  445|     51|	if (tls_derive_keys(conn, shared, shared_len)) {
  ------------------
  |  Branch (445:6): [True: 0, False: 51]
  ------------------
  446|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
  447|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  448|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  449|      0|		os_free(shared);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
  450|      0|		return -1;
  451|      0|	}
  452|     51|	os_memset(shared, 0, shared_len);
  ------------------
  |  |  529|     51|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  453|     51|	os_free(shared);
  ------------------
  |  |  511|     51|#define os_free(p) free((p))
  ------------------
  454|     51|	tlsv1_client_free_dh(conn);
  455|     51|	return 0;
  456|     51|}
tlsv1_client_write.c:tlsv1_key_x_rsa:
  460|    426|{
  461|    426|	u8 pre_master_secret[TLS_PRE_MASTER_SECRET_LEN];
  462|    426|	size_t clen;
  463|    426|	int res;
  464|       |
  465|    426|	if (tls_derive_pre_master_secret(conn, pre_master_secret) < 0 ||
  ------------------
  |  Branch (465:6): [True: 0, False: 426]
  ------------------
  466|    426|	    tls_derive_keys(conn, pre_master_secret,
  ------------------
  |  Branch (466:6): [True: 0, False: 426]
  ------------------
  467|    426|			    TLS_PRE_MASTER_SECRET_LEN)) {
  ------------------
  |  |   27|    426|#define TLS_PRE_MASTER_SECRET_LEN 48
  ------------------
  468|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
  469|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  470|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  471|      0|		return -1;
  472|      0|	}
  473|       |
  474|       |	/* EncryptedPreMasterSecret */
  475|    426|	if (conn->server_rsa_key == NULL) {
  ------------------
  |  Branch (475:6): [True: 7, False: 419]
  ------------------
  476|      7|		wpa_printf(MSG_DEBUG, "TLSv1: No server RSA key to "
  477|      7|			   "use for encrypting pre-master secret");
  478|      7|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      7|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  479|      7|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      7|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  480|      7|		return -1;
  481|      7|	}
  482|       |
  483|       |	/* RSA encrypted value is encoded with PKCS #1 v1.5 block type 2. */
  484|    419|	*pos += 2;
  485|    419|	clen = end - *pos;
  486|    419|	res = crypto_public_key_encrypt_pkcs1_v15(
  487|    419|		conn->server_rsa_key,
  488|    419|		pre_master_secret, TLS_PRE_MASTER_SECRET_LEN,
  ------------------
  |  |   27|    419|#define TLS_PRE_MASTER_SECRET_LEN 48
  ------------------
  489|    419|		*pos, &clen);
  490|    419|	os_memset(pre_master_secret, 0, TLS_PRE_MASTER_SECRET_LEN);
  ------------------
  |  |  529|    419|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  491|    419|	if (res < 0) {
  ------------------
  |  Branch (491:6): [True: 8, False: 411]
  ------------------
  492|      8|		wpa_printf(MSG_DEBUG, "TLSv1: RSA encryption failed");
  493|      8|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      8|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  494|      8|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      8|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  495|      8|		return -1;
  496|      8|	}
  497|    411|	WPA_PUT_BE16(*pos - 2, clen);
  498|    411|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Encrypted pre_master_secret",
  499|    411|		    *pos, clen);
  500|    411|	*pos += clen;
  501|       |
  502|    411|	return 0;
  503|    419|}
tlsv1_client_write.c:tls_write_client_change_cipher_spec:
  738|    462|{
  739|    462|	size_t rlen;
  740|    462|	u8 payload[1];
  741|       |
  742|    462|	wpa_printf(MSG_DEBUG, "TLSv1: Send ChangeCipherSpec");
  743|       |
  744|    462|	payload[0] = TLS_CHANGE_CIPHER_SPEC;
  745|       |
  746|    462|	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC,
  ------------------
  |  Branch (746:6): [True: 0, False: 462]
  ------------------
  747|    462|			      *msgpos, end - *msgpos, payload, sizeof(payload),
  748|    462|			      &rlen) < 0) {
  749|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
  750|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  751|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  752|      0|		return -1;
  753|      0|	}
  754|       |
  755|    462|	if (tlsv1_record_change_write_cipher(&conn->rl) < 0) {
  ------------------
  |  Branch (755:6): [True: 0, False: 462]
  ------------------
  756|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for "
  757|      0|			   "record layer");
  758|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  759|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  760|      0|		return -1;
  761|      0|	}
  762|       |
  763|    462|	*msgpos += rlen;
  764|       |
  765|    462|	return 0;
  766|    462|}
tlsv1_client_write.c:tls_write_client_finished:
  771|    462|{
  772|    462|	u8 *pos, *hs_start;
  773|    462|	size_t rlen, hlen;
  774|    462|	u8 verify_data[1 + 3 + TLS_VERIFY_DATA_LEN];
  775|    462|	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
  776|       |
  777|    462|	wpa_printf(MSG_DEBUG, "TLSv1: Send Finished");
  778|       |
  779|       |	/* Encrypted Handshake Message: Finished */
  780|       |
  781|    462|#ifdef CONFIG_TLSV12
  782|    462|	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
  ------------------
  |  |   16|    462|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (782:6): [True: 171, False: 291]
  ------------------
  783|    171|		hlen = SHA256_MAC_LEN;
  ------------------
  |  |   12|    171|#define SHA256_MAC_LEN 32
  ------------------
  784|    171|		if (conn->verify.sha256_client == NULL ||
  ------------------
  |  Branch (784:7): [True: 0, False: 171]
  ------------------
  785|    171|		    crypto_hash_finish(conn->verify.sha256_client, hash, &hlen)
  ------------------
  |  Branch (785:7): [True: 0, False: 171]
  ------------------
  786|    171|		    < 0) {
  787|      0|			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  788|      0|				  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  789|      0|			conn->verify.sha256_client = NULL;
  790|      0|			return -1;
  791|      0|		}
  792|    171|		conn->verify.sha256_client = NULL;
  793|    291|	} else {
  794|    291|#endif /* CONFIG_TLSV12 */
  795|       |
  796|    291|	hlen = MD5_MAC_LEN;
  ------------------
  |  |   12|    291|#define MD5_MAC_LEN 16
  ------------------
  797|    291|	if (conn->verify.md5_client == NULL ||
  ------------------
  |  Branch (797:6): [True: 0, False: 291]
  ------------------
  798|    291|	    crypto_hash_finish(conn->verify.md5_client, hash, &hlen) < 0) {
  ------------------
  |  Branch (798:6): [True: 0, False: 291]
  ------------------
  799|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  800|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  801|      0|		conn->verify.md5_client = NULL;
  802|      0|		crypto_hash_finish(conn->verify.sha1_client, NULL, NULL);
  803|      0|		conn->verify.sha1_client = NULL;
  804|      0|		return -1;
  805|      0|	}
  806|    291|	conn->verify.md5_client = NULL;
  807|    291|	hlen = SHA1_MAC_LEN;
  ------------------
  |  |   12|    291|#define SHA1_MAC_LEN 20
  ------------------
  808|    291|	if (conn->verify.sha1_client == NULL ||
  ------------------
  |  Branch (808:6): [True: 0, False: 291]
  ------------------
  809|    291|	    crypto_hash_finish(conn->verify.sha1_client, hash + MD5_MAC_LEN,
  ------------------
  |  |   12|    291|#define MD5_MAC_LEN 16
  ------------------
  |  Branch (809:6): [True: 0, False: 291]
  ------------------
  810|    291|			       &hlen) < 0) {
  811|      0|		conn->verify.sha1_client = NULL;
  812|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  813|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  814|      0|		return -1;
  815|      0|	}
  816|    291|	conn->verify.sha1_client = NULL;
  817|    291|	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
  ------------------
  |  |   12|    291|#define MD5_MAC_LEN 16
  ------------------
              	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
  ------------------
  |  |   12|    291|#define SHA1_MAC_LEN 20
  ------------------
  818|       |
  819|    291|#ifdef CONFIG_TLSV12
  820|    291|	}
  821|    462|#endif /* CONFIG_TLSV12 */
  822|       |
  823|    462|	if (tls_prf(conn->rl.tls_version,
  ------------------
  |  Branch (823:6): [True: 0, False: 462]
  ------------------
  824|    462|		    conn->master_secret, TLS_MASTER_SECRET_LEN,
  ------------------
  |  |   28|    462|#define TLS_MASTER_SECRET_LEN 48
  ------------------
  825|    462|		    "client finished", hash, hlen,
  826|    462|		    verify_data + 1 + 3, TLS_VERIFY_DATA_LEN)) {
  ------------------
  |  |   30|    462|#define TLS_VERIFY_DATA_LEN 12
  ------------------
  827|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate verify_data");
  828|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  829|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  830|      0|		return -1;
  831|      0|	}
  832|    462|	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (client)",
  833|    462|			verify_data + 1 + 3, TLS_VERIFY_DATA_LEN);
  ------------------
  |  |   30|    462|#define TLS_VERIFY_DATA_LEN 12
  ------------------
  834|       |
  835|       |	/* Handshake */
  836|    462|	pos = hs_start = verify_data;
  837|       |	/* HandshakeType msg_type */
  838|    462|	*pos++ = TLS_HANDSHAKE_TYPE_FINISHED;
  839|       |	/* uint24 length */
  840|    462|	WPA_PUT_BE24(pos, TLS_VERIFY_DATA_LEN);
  ------------------
  |  |   30|    462|#define TLS_VERIFY_DATA_LEN 12
  ------------------
  841|    462|	pos += 3;
  842|    462|	pos += TLS_VERIFY_DATA_LEN; /* verify_data already in place */
  ------------------
  |  |   30|    462|#define TLS_VERIFY_DATA_LEN 12
  ------------------
  843|    462|	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
  844|       |
  845|    462|	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
  ------------------
  |  Branch (845:6): [True: 0, False: 462]
  ------------------
  846|    462|			      *msgpos, end - *msgpos, hs_start, pos - hs_start,
  847|    462|			      &rlen) < 0) {
  848|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
  849|      0|		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
  ------------------
  |  |  128|      0|#define TLS_ALERT_LEVEL_FATAL 2
  ------------------
  850|      0|			  TLS_ALERT_INTERNAL_ERROR);
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  851|      0|		return -1;
  852|      0|	}
  853|       |
  854|    462|	*msgpos += rlen;
  855|       |
  856|    462|	return 0;
  857|    462|}

tls_get_cipher_suite:
  100|  7.36k|{
  101|  7.36k|	size_t i;
  102|  63.4k|	for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
  ------------------
  |  |   73|  63.4k|#define NUM_TLS_CIPHER_SUITES ARRAY_SIZE(tls_cipher_suites)
  |  |  ------------------
  |  |  |  |  607|  63.4k|#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
  |  |  ------------------
  ------------------
  |  Branch (102:14): [True: 63.4k, False: 0]
  ------------------
  103|  63.4k|		if (tls_cipher_suites[i].suite == suite)
  ------------------
  |  Branch (103:7): [True: 7.36k, False: 56.1k]
  ------------------
  104|  7.36k|			return &tls_cipher_suites[i];
  105|      0|	return NULL;
  106|  7.36k|}
tls_get_cipher_data:
  110|  5.77k|{
  111|  5.77k|	size_t i;
  112|  16.9k|	for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
  ------------------
  |  |   91|  16.9k|#define NUM_TLS_CIPHER_DATA ARRAY_SIZE(tls_ciphers)
  |  |  ------------------
  |  |  |  |  607|  16.9k|#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
  |  |  ------------------
  ------------------
  |  Branch (112:14): [True: 16.9k, False: 0]
  ------------------
  113|  16.9k|		if (tls_ciphers[i].cipher == cipher)
  ------------------
  |  Branch (113:7): [True: 5.77k, False: 11.2k]
  ------------------
  114|  5.77k|			return &tls_ciphers[i];
  115|      0|	return NULL;
  116|  5.77k|}
tls_server_key_exchange_allowed:
  120|    557|{
  121|    557|	const struct tls_cipher_suite *suite;
  122|       |
  123|       |	/* RFC 2246, Section 7.4.3 */
  124|    557|	suite = tls_get_cipher_suite(cipher);
  125|    557|	if (suite == NULL)
  ------------------
  |  Branch (125:6): [True: 0, False: 557]
  ------------------
  126|      0|		return 0;
  127|       |
  128|    557|	switch (suite->key_exchange) {
  129|      0|	case TLS_KEY_X_DHE_DSS:
  ------------------
  |  Branch (129:2): [True: 0, False: 557]
  ------------------
  130|      0|	case TLS_KEY_X_DHE_DSS_EXPORT:
  ------------------
  |  Branch (130:2): [True: 0, False: 557]
  ------------------
  131|    550|	case TLS_KEY_X_DHE_RSA:
  ------------------
  |  Branch (131:2): [True: 550, False: 7]
  ------------------
  132|    550|	case TLS_KEY_X_DHE_RSA_EXPORT:
  ------------------
  |  Branch (132:2): [True: 0, False: 557]
  ------------------
  133|    550|	case TLS_KEY_X_DH_anon_EXPORT:
  ------------------
  |  Branch (133:2): [True: 0, False: 557]
  ------------------
  134|    550|	case TLS_KEY_X_DH_anon:
  ------------------
  |  Branch (134:2): [True: 0, False: 557]
  ------------------
  135|    550|		return 1;
  136|      0|	case TLS_KEY_X_RSA_EXPORT:
  ------------------
  |  Branch (136:2): [True: 0, False: 557]
  ------------------
  137|      0|		return 1 /* FIX: public key len > 512 bits */;
  138|      7|	default:
  ------------------
  |  Branch (138:2): [True: 7, False: 550]
  ------------------
  139|      7|		return 0;
  140|    557|	}
  141|    557|}
tls_parse_cert:
  156|  2.21k|{
  157|  2.21k|	struct x509_certificate *cert;
  158|       |
  159|  2.21k|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
  160|  2.21k|		    buf, len);
  161|       |
  162|  2.21k|	*pk = crypto_public_key_from_cert(buf, len);
  163|  2.21k|	if (*pk)
  ------------------
  |  Branch (163:6): [True: 0, False: 2.21k]
  ------------------
  164|      0|		return 0;
  165|       |
  166|  2.21k|	cert = x509_certificate_parse(buf, len);
  167|  2.21k|	if (cert == NULL) {
  ------------------
  |  Branch (167:6): [True: 1.28k, False: 931]
  ------------------
  168|  1.28k|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
  169|  1.28k|			   "certificate");
  170|  1.28k|		return -1;
  171|  1.28k|	}
  172|       |
  173|       |	/* TODO
  174|       |	 * verify key usage (must allow encryption)
  175|       |	 *
  176|       |	 * All certificate profiles, key and cryptographic formats are
  177|       |	 * defined by the IETF PKIX working group [PKIX]. When a key
  178|       |	 * usage extension is present, the digitalSignature bit must be
  179|       |	 * set for the key to be eligible for signing, as described
  180|       |	 * above, and the keyEncipherment bit must be present to allow
  181|       |	 * encryption, as described above. The keyAgreement bit must be
  182|       |	 * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
  183|       |	 */
  184|       |
  185|    931|	*pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
  186|    931|	x509_certificate_free(cert);
  187|       |
  188|    931|	if (*pk == NULL) {
  ------------------
  |  Branch (188:6): [True: 43, False: 888]
  ------------------
  189|     43|		wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
  190|     43|			   "server public key");
  191|     43|		return -1;
  192|     43|	}
  193|       |
  194|    888|	return 0;
  195|    931|}
tls_verify_hash_init:
  199|  3.10k|{
  200|  3.10k|	tls_verify_hash_free(verify);
  201|  3.10k|	verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  202|  3.10k|	verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  203|  3.10k|	verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  204|  3.10k|	verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  205|  3.10k|	verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  206|  3.10k|	verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  207|  3.10k|	if (verify->md5_client == NULL || verify->md5_server == NULL ||
  ------------------
  |  Branch (207:6): [True: 0, False: 3.10k]
  |  Branch (207:36): [True: 0, False: 3.10k]
  ------------------
  208|  3.10k|	    verify->md5_cert == NULL || verify->sha1_client == NULL ||
  ------------------
  |  Branch (208:6): [True: 0, False: 3.10k]
  |  Branch (208:34): [True: 0, False: 3.10k]
  ------------------
  209|  3.10k|	    verify->sha1_server == NULL || verify->sha1_cert == NULL) {
  ------------------
  |  Branch (209:6): [True: 0, False: 3.10k]
  |  Branch (209:37): [True: 0, False: 3.10k]
  ------------------
  210|      0|		tls_verify_hash_free(verify);
  211|      0|		return -1;
  212|      0|	}
  213|  3.10k|#ifdef CONFIG_TLSV12
  214|  3.10k|	verify->sha256_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  215|  3.10k|						 0);
  216|  3.10k|	verify->sha256_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  217|  3.10k|						 0);
  218|  3.10k|	verify->sha256_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  219|  3.10k|					       0);
  220|  3.10k|	if (verify->sha256_client == NULL || verify->sha256_server == NULL ||
  ------------------
  |  Branch (220:6): [True: 0, False: 3.10k]
  |  Branch (220:39): [True: 0, False: 3.10k]
  ------------------
  221|  3.10k|	    verify->sha256_cert == NULL) {
  ------------------
  |  Branch (221:6): [True: 0, False: 3.10k]
  ------------------
  222|      0|		tls_verify_hash_free(verify);
  223|      0|		return -1;
  224|      0|	}
  225|  3.10k|#endif /* CONFIG_TLSV12 */
  226|  3.10k|	return 0;
  227|  3.10k|}
tls_verify_hash_add:
  232|  8.22k|{
  233|  8.22k|	if (verify->md5_client && verify->sha1_client) {
  ------------------
  |  Branch (233:6): [True: 7.93k, False: 291]
  |  Branch (233:28): [True: 7.93k, False: 0]
  ------------------
  234|  7.93k|		crypto_hash_update(verify->md5_client, buf, len);
  235|  7.93k|		crypto_hash_update(verify->sha1_client, buf, len);
  236|  7.93k|	}
  237|  8.22k|	if (verify->md5_server && verify->sha1_server) {
  ------------------
  |  Branch (237:6): [True: 8.22k, False: 0]
  |  Branch (237:28): [True: 8.22k, False: 0]
  ------------------
  238|  8.22k|		crypto_hash_update(verify->md5_server, buf, len);
  239|  8.22k|		crypto_hash_update(verify->sha1_server, buf, len);
  240|  8.22k|	}
  241|  8.22k|	if (verify->md5_cert && verify->sha1_cert) {
  ------------------
  |  Branch (241:6): [True: 8.22k, False: 0]
  |  Branch (241:26): [True: 8.22k, False: 0]
  ------------------
  242|  8.22k|		crypto_hash_update(verify->md5_cert, buf, len);
  243|  8.22k|		crypto_hash_update(verify->sha1_cert, buf, len);
  244|  8.22k|	}
  245|  8.22k|#ifdef CONFIG_TLSV12
  246|  8.22k|	if (verify->sha256_client)
  ------------------
  |  Branch (246:6): [True: 8.03k, False: 195]
  ------------------
  247|  8.03k|		crypto_hash_update(verify->sha256_client, buf, len);
  248|  8.22k|	if (verify->sha256_server)
  ------------------
  |  Branch (248:6): [True: 8.20k, False: 24]
  ------------------
  249|  8.20k|		crypto_hash_update(verify->sha256_server, buf, len);
  250|  8.22k|	if (verify->sha256_cert)
  ------------------
  |  Branch (250:6): [True: 8.22k, False: 0]
  ------------------
  251|  8.22k|		crypto_hash_update(verify->sha256_cert, buf, len);
  252|  8.22k|#endif /* CONFIG_TLSV12 */
  253|  8.22k|}
tls_verify_hash_free:
  257|  6.20k|{
  258|  6.20k|	crypto_hash_finish(verify->md5_client, NULL, NULL);
  259|  6.20k|	crypto_hash_finish(verify->md5_server, NULL, NULL);
  260|  6.20k|	crypto_hash_finish(verify->md5_cert, NULL, NULL);
  261|  6.20k|	crypto_hash_finish(verify->sha1_client, NULL, NULL);
  262|  6.20k|	crypto_hash_finish(verify->sha1_server, NULL, NULL);
  263|  6.20k|	crypto_hash_finish(verify->sha1_cert, NULL, NULL);
  264|  6.20k|	verify->md5_client = NULL;
  265|  6.20k|	verify->md5_server = NULL;
  266|  6.20k|	verify->md5_cert = NULL;
  267|  6.20k|	verify->sha1_client = NULL;
  268|  6.20k|	verify->sha1_server = NULL;
  269|  6.20k|	verify->sha1_cert = NULL;
  270|  6.20k|#ifdef CONFIG_TLSV12
  271|  6.20k|	crypto_hash_finish(verify->sha256_client, NULL, NULL);
  272|  6.20k|	crypto_hash_finish(verify->sha256_server, NULL, NULL);
  273|  6.20k|	crypto_hash_finish(verify->sha256_cert, NULL, NULL);
  274|  6.20k|	verify->sha256_client = NULL;
  275|  6.20k|	verify->sha256_server = NULL;
  276|       |	verify->sha256_cert = NULL;
  277|  6.20k|#endif /* CONFIG_TLSV12 */
  278|  6.20k|}
tls_version_ok:
  282|  2.75k|{
  283|  2.75k|	if (ver == TLS_VERSION_1)
  ------------------
  |  |   14|  2.75k|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
  |  Branch (283:6): [True: 698, False: 2.05k]
  ------------------
  284|    698|		return 1;
  285|  2.05k|#ifdef CONFIG_TLSV11
  286|  2.05k|	if (ver == TLS_VERSION_1_1)
  ------------------
  |  |   15|  2.05k|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
  |  Branch (286:6): [True: 571, False: 1.48k]
  ------------------
  287|    571|		return 1;
  288|  1.48k|#endif /* CONFIG_TLSV11 */
  289|  1.48k|#ifdef CONFIG_TLSV12
  290|  1.48k|	if (ver == TLS_VERSION_1_2)
  ------------------
  |  |   16|  1.48k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (290:6): [True: 1.45k, False: 27]
  ------------------
  291|  1.45k|		return 1;
  292|     27|#endif /* CONFIG_TLSV12 */
  293|       |
  294|     27|	return 0;
  295|  1.48k|}
tls_version_str:
  299|  5.82k|{
  300|  5.82k|	switch (ver) {
  ------------------
  |  Branch (300:10): [True: 5.82k, False: 0]
  ------------------
  301|    698|	case TLS_VERSION_1:
  ------------------
  |  |   14|    698|#define TLS_VERSION_1 0x0301 /* TLSv1 */
  ------------------
  |  Branch (301:2): [True: 698, False: 5.13k]
  ------------------
  302|    698|		return "1.0";
  303|    571|	case TLS_VERSION_1_1:
  ------------------
  |  |   15|    571|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
  |  Branch (303:2): [True: 571, False: 5.25k]
  ------------------
  304|    571|		return "1.1";
  305|  4.55k|	case TLS_VERSION_1_2:
  ------------------
  |  |   16|  4.55k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (305:2): [True: 4.55k, False: 1.26k]
  ------------------
  306|  4.55k|		return "1.2";
  307|  5.82k|	}
  308|       |
  309|      0|	return "?";
  310|  5.82k|}
tls_prf:
  315|  1.44k|{
  316|  1.44k|#ifdef CONFIG_TLSV12
  317|  1.44k|	if (ver >= TLS_VERSION_1_2) {
  ------------------
  |  |   16|  1.44k|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (317:6): [True: 554, False: 891]
  ------------------
  318|    554|		tls_prf_sha256(secret, secret_len, label, seed, seed_len,
  319|    554|			       out, outlen);
  320|    554|		return 0;
  321|    554|	}
  322|    891|#endif /* CONFIG_TLSV12 */
  323|       |
  324|    891|	return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
  325|    891|				outlen);
  326|  1.44k|}
tlsv12_key_x_server_params_hash:
  335|    292|{
  336|    292|	size_t hlen;
  337|    292|	struct crypto_hash *ctx;
  338|    292|	enum crypto_hash_alg alg;
  339|       |
  340|    292|	switch (hash_alg) {
  341|    147|	case TLS_HASH_ALG_SHA256:
  ------------------
  |  Branch (341:2): [True: 147, False: 145]
  ------------------
  342|    147|		alg = CRYPTO_HASH_ALG_SHA256;
  343|    147|		hlen = SHA256_MAC_LEN;
  ------------------
  |  |   12|    147|#define SHA256_MAC_LEN 32
  ------------------
  344|    147|		break;
  345|    144|	case TLS_HASH_ALG_SHA384:
  ------------------
  |  Branch (345:2): [True: 144, False: 148]
  ------------------
  346|    144|		alg = CRYPTO_HASH_ALG_SHA384;
  347|    144|		hlen = 48;
  348|    144|		break;
  349|      1|	case TLS_HASH_ALG_SHA512:
  ------------------
  |  Branch (349:2): [True: 1, False: 291]
  ------------------
  350|      1|		alg = CRYPTO_HASH_ALG_SHA512;
  351|      1|		hlen = 64;
  352|      1|		break;
  353|      0|	default:
  ------------------
  |  Branch (353:2): [True: 0, False: 292]
  ------------------
  354|      0|		return -1;
  355|    292|	}
  356|    292|	ctx = crypto_hash_init(alg, NULL, 0);
  357|    292|	if (ctx == NULL)
  ------------------
  |  Branch (357:6): [True: 1, False: 291]
  ------------------
  358|      1|		return -1;
  359|    291|	crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|    291|#define TLS_RANDOM_LEN 32
  ------------------
  360|    291|	crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|    291|#define TLS_RANDOM_LEN 32
  ------------------
  361|    291|	crypto_hash_update(ctx, server_params, server_params_len);
  362|    291|	if (crypto_hash_finish(ctx, hash, &hlen) < 0)
  ------------------
  |  Branch (362:6): [True: 0, False: 291]
  ------------------
  363|      0|		return -1;
  364|       |
  365|    291|	return hlen;
  366|    291|}
tls_key_x_server_params_hash:
  374|    129|{
  375|    129|	u8 *hpos;
  376|    129|	size_t hlen;
  377|    129|	struct crypto_hash *ctx;
  378|       |
  379|    129|	hpos = hash;
  380|       |
  381|    129|	ctx = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  382|    129|	if (ctx == NULL)
  ------------------
  |  Branch (382:6): [True: 0, False: 129]
  ------------------
  383|      0|		return -1;
  384|    129|	crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|    129|#define TLS_RANDOM_LEN 32
  ------------------
  385|    129|	crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|    129|#define TLS_RANDOM_LEN 32
  ------------------
  386|    129|	crypto_hash_update(ctx, server_params, server_params_len);
  387|    129|	hlen = MD5_MAC_LEN;
  ------------------
  |  |   12|    129|#define MD5_MAC_LEN 16
  ------------------
  388|    129|	if (hsz < hlen)
  ------------------
  |  Branch (388:6): [True: 0, False: 129]
  ------------------
  389|      0|		return -1;
  390|    129|	if (crypto_hash_finish(ctx, hash, &hlen) < 0)
  ------------------
  |  Branch (390:6): [True: 0, False: 129]
  ------------------
  391|      0|		return -1;
  392|    129|	hpos += hlen;
  393|       |
  394|    129|	ctx = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  395|    129|	if (ctx == NULL)
  ------------------
  |  Branch (395:6): [True: 0, False: 129]
  ------------------
  396|      0|		return -1;
  397|    129|	crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|    129|#define TLS_RANDOM_LEN 32
  ------------------
  398|    129|	crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  ------------------
  |  |   26|    129|#define TLS_RANDOM_LEN 32
  ------------------
  399|    129|	crypto_hash_update(ctx, server_params, server_params_len);
  400|    129|	hlen = hsz - hlen;
  401|    129|	if (crypto_hash_finish(ctx, hpos, &hlen) < 0)
  ------------------
  |  Branch (401:6): [True: 0, False: 129]
  ------------------
  402|      0|		return -1;
  403|    129|	hpos += hlen;
  404|    129|	return hpos - hash;
  405|    129|}
tls_verify_signature:
  411|    420|{
  412|    420|	u8 *buf;
  413|    420|	const u8 *end = pos + len;
  414|    420|	const u8 *decrypted;
  415|    420|	u16 slen;
  416|    420|	size_t buflen;
  417|       |
  418|    420|	if (end - pos < 2) {
  ------------------
  |  Branch (418:6): [True: 6, False: 414]
  ------------------
  419|      6|		*alert = TLS_ALERT_DECODE_ERROR;
  ------------------
  |  |  146|      6|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  420|      6|		return -1;
  421|      6|	}
  422|    414|	slen = WPA_GET_BE16(pos);
  423|    414|	pos += 2;
  424|    414|	if (end - pos < slen) {
  ------------------
  |  Branch (424:6): [True: 40, False: 374]
  ------------------
  425|     40|		*alert = TLS_ALERT_DECODE_ERROR;
  ------------------
  |  |  146|     40|#define TLS_ALERT_DECODE_ERROR			50
  ------------------
  426|     40|		return -1;
  427|     40|	}
  428|    374|	if (end - pos > slen) {
  ------------------
  |  Branch (428:6): [True: 209, False: 165]
  ------------------
  429|    209|		wpa_hexdump(MSG_MSGDUMP, "Additional data after Signature",
  430|    209|			    pos + slen, end - pos - slen);
  431|    209|		end = pos + slen;
  432|    209|	}
  433|       |
  434|    374|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Signature", pos, end - pos);
  435|    374|	if (pk == NULL) {
  ------------------
  |  Branch (435:6): [True: 18, False: 356]
  ------------------
  436|     18|		wpa_printf(MSG_DEBUG, "TLSv1: No public key to verify signature");
  437|     18|		*alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|     18|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  438|     18|		return -1;
  439|     18|	}
  440|       |
  441|    356|	buflen = end - pos;
  442|    356|	buf = os_malloc(end - pos);
  ------------------
  |  |  505|    356|#define os_malloc(s) malloc((s))
  ------------------
  443|    356|	if (buf == NULL) {
  ------------------
  |  Branch (443:6): [True: 0, False: 356]
  ------------------
  444|      0|		*alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  445|      0|		return -1;
  446|      0|	}
  447|    356|	if (crypto_public_key_decrypt_pkcs1(pk, pos, end - pos, buf, &buflen) <
  ------------------
  |  Branch (447:6): [True: 241, False: 115]
  ------------------
  448|    356|	    0) {
  449|    241|		wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt signature");
  450|    241|		os_free(buf);
  ------------------
  |  |  511|    241|#define os_free(p) free((p))
  ------------------
  451|    241|		*alert = TLS_ALERT_DECRYPT_ERROR;
  ------------------
  |  |  147|    241|#define TLS_ALERT_DECRYPT_ERROR			51
  ------------------
  452|    241|		return -1;
  453|    241|	}
  454|    115|	decrypted = buf;
  455|       |
  456|    115|	wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Decrypted Signature",
  457|    115|			decrypted, buflen);
  458|       |
  459|    115|#ifdef CONFIG_TLSV12
  460|    115|	if (tls_version >= TLS_VERSION_1_2) {
  ------------------
  |  |   16|    115|#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */
  ------------------
  |  Branch (460:6): [True: 106, False: 9]
  ------------------
  461|       |		/*
  462|       |		 * RFC 3447, A.2.4 RSASSA-PKCS1-v1_5
  463|       |		 *
  464|       |		 * DigestInfo ::= SEQUENCE {
  465|       |		 *   digestAlgorithm DigestAlgorithm,
  466|       |		 *   digest OCTET STRING
  467|       |		 * }
  468|       |		 *
  469|       |		 * SHA-256 OID: sha256WithRSAEncryption ::= {pkcs-1 11}
  470|       |		 *
  471|       |		 * DER encoded DigestInfo for SHA256 per RFC 3447:
  472|       |		 * 30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 ||
  473|       |		 * H
  474|       |		 */
  475|    106|		if (buflen >= 19 + 32 &&
  ------------------
  |  Branch (475:7): [True: 100, False: 6]
  ------------------
  476|    100|		    os_memcmp(buf, "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01"
  ------------------
  |  |  532|    100|#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
  ------------------
  |  Branch (476:7): [True: 57, False: 43]
  ------------------
  477|    100|			      "\x65\x03\x04\x02\x01\x05\x00\x04\x20", 19) == 0)
  478|     57|		{
  479|     57|			wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-256");
  480|     57|			decrypted = buf + 19;
  481|     57|			buflen -= 19;
  482|     57|		} else if (buflen >= 19 + 48 &&
  ------------------
  |  Branch (482:14): [True: 42, False: 7]
  ------------------
  483|     42|		    os_memcmp(buf, "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01"
  ------------------
  |  |  532|     42|#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
  ------------------
  |  Branch (483:7): [True: 2, False: 40]
  ------------------
  484|     42|			      "\x65\x03\x04\x02\x02\x05\x00\x04\x30", 19) == 0)
  485|      2|		{
  486|      2|			wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-384");
  487|      2|			decrypted = buf + 19;
  488|      2|			buflen -= 19;
  489|     47|		} else if (buflen >= 19 + 64 &&
  ------------------
  |  Branch (489:14): [True: 37, False: 10]
  ------------------
  490|     37|		    os_memcmp(buf, "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01"
  ------------------
  |  |  532|     37|#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
  ------------------
  |  Branch (490:7): [True: 2, False: 35]
  ------------------
  491|     37|			      "\x65\x03\x04\x02\x03\x05\x00\x04\x40", 19) == 0)
  492|      2|		{
  493|      2|			wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-512");
  494|      2|			decrypted = buf + 19;
  495|      2|			buflen -= 19;
  496|       |
  497|     45|		} else {
  498|     45|			wpa_printf(MSG_DEBUG, "TLSv1.2: Unrecognized DigestInfo");
  499|     45|			os_free(buf);
  ------------------
  |  |  511|     45|#define os_free(p) free((p))
  ------------------
  500|     45|			*alert = TLS_ALERT_DECRYPT_ERROR;
  ------------------
  |  |  147|     45|#define TLS_ALERT_DECRYPT_ERROR			51
  ------------------
  501|     45|			return -1;
  502|     45|		}
  503|    106|	}
  504|     70|#endif /* CONFIG_TLSV12 */
  505|       |
  506|     70|	if (buflen != data_len ||
  ------------------
  |  Branch (506:6): [True: 12, False: 58]
  ------------------
  507|     58|	    os_memcmp_const(decrypted, data, data_len) != 0) {
  ------------------
  |  Branch (507:6): [True: 2, False: 56]
  ------------------
  508|     14|		wpa_printf(MSG_DEBUG, "TLSv1: Invalid Signature in CertificateVerify - did not match calculated hash");
  509|     14|		os_free(buf);
  ------------------
  |  |  511|     14|#define os_free(p) free((p))
  ------------------
  510|     14|		*alert = TLS_ALERT_DECRYPT_ERROR;
  ------------------
  |  |  147|     14|#define TLS_ALERT_DECRYPT_ERROR			51
  ------------------
  511|     14|		return -1;
  512|     14|	}
  513|       |
  514|     56|	os_free(buf);
  ------------------
  |  |  511|     56|#define os_free(p) free((p))
  ------------------
  515|       |
  516|     56|	return 0;
  517|     70|}

tlsv1_cred_free:
   30|  6.20k|{
   31|  6.20k|	if (cred == NULL)
  ------------------
  |  Branch (31:6): [True: 6.20k, False: 0]
  ------------------
   32|  6.20k|		return;
   33|       |
   34|      0|	x509_certificate_chain_free(cred->trusted_certs);
   35|      0|	x509_certificate_chain_free(cred->cert);
   36|      0|	crypto_private_key_free(cred->key);
   37|      0|	os_free(cred->dh_p);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   38|      0|	os_free(cred->dh_g);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   39|      0|	os_free(cred->ocsp_stapling_response);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   40|      0|	os_free(cred->ocsp_stapling_response_multi);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   41|      0|	os_free(cred);
  ------------------
  |  |  511|      0|#define os_free(p) free((p))
  ------------------
   42|      0|}

tlsv1_record_set_cipher_suite:
   32|  5.77k|{
   33|  5.77k|	const struct tls_cipher_suite *suite;
   34|  5.77k|	const struct tls_cipher_data *data;
   35|       |
   36|  5.77k|	wpa_printf(MSG_DEBUG, "TLSv1: Selected cipher suite: 0x%04x",
   37|  5.77k|		   cipher_suite);
   38|  5.77k|	rl->cipher_suite = cipher_suite;
   39|       |
   40|  5.77k|	suite = tls_get_cipher_suite(cipher_suite);
   41|  5.77k|	if (suite == NULL)
  ------------------
  |  Branch (41:6): [True: 0, False: 5.77k]
  ------------------
   42|      0|		return -1;
   43|       |
   44|  5.77k|	if (suite->hash == TLS_HASH_MD5) {
  ------------------
  |  Branch (44:6): [True: 184, False: 5.58k]
  ------------------
   45|    184|		rl->hash_alg = CRYPTO_HASH_ALG_HMAC_MD5;
   46|    184|		rl->hash_size = MD5_MAC_LEN;
  ------------------
  |  |   12|    184|#define MD5_MAC_LEN 16
  ------------------
   47|  5.58k|	} else if (suite->hash == TLS_HASH_SHA) {
  ------------------
  |  Branch (47:13): [True: 1.32k, False: 4.26k]
  ------------------
   48|  1.32k|		rl->hash_alg = CRYPTO_HASH_ALG_HMAC_SHA1;
   49|  1.32k|		rl->hash_size = SHA1_MAC_LEN;
  ------------------
  |  |   12|  1.32k|#define SHA1_MAC_LEN 20
  ------------------
   50|  4.26k|	} else if (suite->hash == TLS_HASH_SHA256) {
  ------------------
  |  Branch (50:13): [True: 1.15k, False: 3.10k]
  ------------------
   51|  1.15k|		rl->hash_alg = CRYPTO_HASH_ALG_HMAC_SHA256;
   52|  1.15k|		rl->hash_size = SHA256_MAC_LEN;
  ------------------
  |  |   12|  1.15k|#define SHA256_MAC_LEN 32
  ------------------
   53|  1.15k|	}
   54|       |
   55|  5.77k|	data = tls_get_cipher_data(suite->cipher);
   56|  5.77k|	if (data == NULL)
  ------------------
  |  Branch (56:6): [True: 0, False: 5.77k]
  ------------------
   57|      0|		return -1;
   58|       |
   59|  5.77k|	rl->key_material_len = data->key_material;
   60|  5.77k|	rl->iv_size = data->block_size;
   61|  5.77k|	rl->cipher_alg = data->alg;
   62|       |
   63|  5.77k|	return 0;
   64|  5.77k|}
tlsv1_record_change_write_cipher:
   76|  3.56k|{
   77|  3.56k|	wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - New write cipher suite "
   78|  3.56k|		   "0x%04x", rl->cipher_suite);
   79|  3.56k|	rl->write_cipher_suite = rl->cipher_suite;
   80|  3.56k|	os_memset(rl->write_seq_num, 0, TLS_SEQ_NUM_LEN);
  ------------------
  |  |  529|  3.56k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   81|       |
   82|  3.56k|	if (rl->write_cbc) {
  ------------------
  |  Branch (82:6): [True: 462, False: 3.10k]
  ------------------
   83|    462|		crypto_cipher_deinit(rl->write_cbc);
   84|    462|		rl->write_cbc = NULL;
   85|    462|	}
   86|  3.56k|	if (rl->cipher_alg != CRYPTO_CIPHER_NULL) {
  ------------------
  |  Branch (86:6): [True: 462, False: 3.10k]
  ------------------
   87|    462|		rl->write_cbc = crypto_cipher_init(rl->cipher_alg,
   88|    462|						   rl->write_iv, rl->write_key,
   89|    462|						   rl->key_material_len);
   90|    462|		if (rl->write_cbc == NULL) {
  ------------------
  |  Branch (90:7): [True: 0, False: 462]
  ------------------
   91|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to initialize "
   92|      0|				   "cipher");
   93|      0|			return -1;
   94|      0|		}
   95|    462|	}
   96|       |
   97|  3.56k|	return 0;
   98|  3.56k|}
tlsv1_record_change_read_cipher:
  110|  3.50k|{
  111|  3.50k|	wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - New read cipher suite "
  112|  3.50k|		   "0x%04x", rl->cipher_suite);
  113|  3.50k|	rl->read_cipher_suite = rl->cipher_suite;
  114|  3.50k|	os_memset(rl->read_seq_num, 0, TLS_SEQ_NUM_LEN);
  ------------------
  |  |  529|  3.50k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  115|       |
  116|  3.50k|	if (rl->read_cbc) {
  ------------------
  |  Branch (116:6): [True: 398, False: 3.10k]
  ------------------
  117|    398|		crypto_cipher_deinit(rl->read_cbc);
  118|    398|		rl->read_cbc = NULL;
  119|    398|	}
  120|  3.50k|	if (rl->cipher_alg != CRYPTO_CIPHER_NULL) {
  ------------------
  |  Branch (120:6): [True: 398, False: 3.10k]
  ------------------
  121|    398|		rl->read_cbc = crypto_cipher_init(rl->cipher_alg,
  122|    398|						  rl->read_iv, rl->read_key,
  123|    398|						  rl->key_material_len);
  124|    398|		if (rl->read_cbc == NULL) {
  ------------------
  |  Branch (124:7): [True: 0, False: 398]
  ------------------
  125|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Failed to initialize "
  126|      0|				   "cipher");
  127|      0|			return -1;
  128|      0|		}
  129|    398|	}
  130|       |
  131|  3.50k|	return 0;
  132|  3.50k|}
tlsv1_record_send:
  153|  4.58k|{
  154|  4.58k|	u8 *pos, *ct_start, *length, *cpayload;
  155|  4.58k|	struct crypto_hash *hmac;
  156|  4.58k|	size_t clen;
  157|  4.58k|	int explicit_iv;
  158|       |
  159|  4.58k|	pos = buf;
  160|  4.58k|	if (pos + TLS_RECORD_HEADER_LEN > buf + buf_size)
  ------------------
  |  |   21|  4.58k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  |  Branch (160:6): [True: 0, False: 4.58k]
  ------------------
  161|      0|		return -1;
  162|       |
  163|       |	/* ContentType type */
  164|  4.58k|	ct_start = pos;
  165|  4.58k|	*pos++ = content_type;
  166|       |	/* ProtocolVersion version */
  167|  4.58k|	WPA_PUT_BE16(pos, rl->tls_version);
  168|  4.58k|	pos += 2;
  169|       |	/* uint16 length */
  170|  4.58k|	length = pos;
  171|  4.58k|	WPA_PUT_BE16(length, payload_len);
  172|  4.58k|	pos += 2;
  173|       |
  174|  4.58k|	cpayload = pos;
  175|  4.58k|	explicit_iv = rl->write_cipher_suite != TLS_NULL_WITH_NULL_NULL &&
  ------------------
  |  |   50|  9.17k|#define TLS_NULL_WITH_NULL_NULL			0x0000 /* RFC 2246 */
  ------------------
  |  Branch (175:16): [True: 486, False: 4.10k]
  ------------------
  176|    486|		rl->iv_size && rl->tls_version >= TLS_VERSION_1_1;
  ------------------
  |  |   15|  4.92k|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
  |  Branch (176:3): [True: 336, False: 150]
  |  Branch (176:18): [True: 155, False: 181]
  ------------------
  177|  4.58k|	if (explicit_iv) {
  ------------------
  |  Branch (177:6): [True: 155, False: 4.43k]
  ------------------
  178|       |		/* opaque IV[Cipherspec.block_length] */
  179|    155|		if (pos + rl->iv_size > buf + buf_size)
  ------------------
  |  Branch (179:7): [True: 0, False: 155]
  ------------------
  180|      0|			return -1;
  181|       |
  182|       |		/*
  183|       |		 * Use random number R per the RFC 4346, 6.2.3.2 CBC Block
  184|       |		 * Cipher option 2a.
  185|       |		 */
  186|       |
  187|    155|		if (os_get_random(pos, rl->iv_size))
  ------------------
  |  Branch (187:7): [True: 0, False: 155]
  ------------------
  188|      0|			return -1;
  189|    155|		pos += rl->iv_size;
  190|    155|	}
  191|       |
  192|       |	/*
  193|       |	 * opaque fragment[TLSPlaintext.length]
  194|       |	 * (opaque content[TLSCompressed.length] in GenericBlockCipher)
  195|       |	 */
  196|  4.58k|	if (pos + payload_len > buf + buf_size)
  ------------------
  |  Branch (196:6): [True: 0, False: 4.58k]
  ------------------
  197|      0|		return -1;
  198|  4.58k|	os_memmove(pos, payload, payload_len);
  ------------------
  |  |  526|  4.58k|#define os_memmove(d, s, n) memmove((d), (s), (n))
  ------------------
  199|  4.58k|	pos += payload_len;
  200|       |
  201|  4.58k|	if (rl->write_cipher_suite != TLS_NULL_WITH_NULL_NULL) {
  ------------------
  |  |   50|  4.58k|#define TLS_NULL_WITH_NULL_NULL			0x0000 /* RFC 2246 */
  ------------------
  |  Branch (201:6): [True: 486, False: 4.10k]
  ------------------
  202|       |		/*
  203|       |		 * MAC calculated over seq_num + TLSCompressed.type +
  204|       |		 * TLSCompressed.version + TLSCompressed.length +
  205|       |		 * TLSCompressed.fragment
  206|       |		 */
  207|    486|		hmac = crypto_hash_init(rl->hash_alg, rl->write_mac_secret,
  208|    486|					rl->hash_size);
  209|    486|		if (hmac == NULL) {
  ------------------
  |  Branch (209:7): [True: 0, False: 486]
  ------------------
  210|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - Failed "
  211|      0|				   "to initialize HMAC");
  212|      0|			return -1;
  213|      0|		}
  214|    486|		crypto_hash_update(hmac, rl->write_seq_num, TLS_SEQ_NUM_LEN);
  ------------------
  |  |   20|    486|#define TLS_SEQ_NUM_LEN 8
  ------------------
  215|       |		/* type + version + length + fragment */
  216|    486|		crypto_hash_update(hmac, ct_start, TLS_RECORD_HEADER_LEN);
  ------------------
  |  |   21|    486|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  217|    486|		crypto_hash_update(hmac, payload, payload_len);
  218|    486|		clen = buf + buf_size - pos;
  219|    486|		if (clen < rl->hash_size) {
  ------------------
  |  Branch (219:7): [True: 0, False: 486]
  ------------------
  220|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - Not "
  221|      0|				   "enough room for MAC");
  222|      0|			crypto_hash_finish(hmac, NULL, NULL);
  223|      0|			return -1;
  224|      0|		}
  225|       |
  226|    486|		if (crypto_hash_finish(hmac, pos, &clen) < 0) {
  ------------------
  |  Branch (226:7): [True: 0, False: 486]
  ------------------
  227|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - Failed "
  228|      0|				   "to calculate HMAC");
  229|      0|			return -1;
  230|      0|		}
  231|    486|		wpa_hexdump(MSG_MSGDUMP, "TLSv1: Record Layer - Write HMAC",
  232|    486|			    pos, clen);
  233|    486|		pos += clen;
  234|    486|		if (rl->iv_size) {
  ------------------
  |  Branch (234:7): [True: 336, False: 150]
  ------------------
  235|    336|			size_t len = pos - cpayload;
  236|    336|			size_t pad;
  237|    336|			pad = (len + 1) % rl->iv_size;
  238|    336|			if (pad)
  ------------------
  |  Branch (238:8): [True: 336, False: 0]
  ------------------
  239|    336|				pad = rl->iv_size - pad;
  240|    336|			if (pos + pad + 1 > buf + buf_size) {
  ------------------
  |  Branch (240:8): [True: 0, False: 336]
  ------------------
  241|      0|				wpa_printf(MSG_DEBUG, "TLSv1: No room for "
  242|      0|					   "block cipher padding");
  243|      0|				return -1;
  244|      0|			}
  245|    336|			os_memset(pos, pad, pad + 1);
  ------------------
  |  |  529|    336|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
  246|    336|			pos += pad + 1;
  247|    336|		}
  248|       |
  249|    486|		if (crypto_cipher_encrypt(rl->write_cbc, cpayload,
  ------------------
  |  Branch (249:7): [True: 0, False: 486]
  ------------------
  250|    486|					  cpayload, pos - cpayload) < 0)
  251|      0|			return -1;
  252|    486|	}
  253|       |
  254|  4.58k|	WPA_PUT_BE16(length, pos - length - 2);
  255|  4.58k|	inc_byte_array(rl->write_seq_num, TLS_SEQ_NUM_LEN);
  ------------------
  |  |   20|  4.58k|#define TLS_SEQ_NUM_LEN 8
  ------------------
  256|       |
  257|  4.58k|	*out_len = pos - buf;
  258|       |
  259|  4.58k|	return 0;
  260|  4.58k|}
tlsv1_record_receive:
  281|   100k|{
  282|   100k|	size_t i, rlen, hlen;
  283|   100k|	u8 padlen;
  284|   100k|	struct crypto_hash *hmac;
  285|   100k|	u8 len[2], hash[100];
  286|   100k|	int force_mac_error = 0;
  287|   100k|	u8 ct;
  288|       |
  289|   100k|	if (in_len < TLS_RECORD_HEADER_LEN) {
  ------------------
  |  |   21|   100k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  |  Branch (289:6): [True: 55, False: 100k]
  ------------------
  290|     55|		wpa_printf(MSG_DEBUG, "TLSv1: Too short record (in_len=%lu) - "
  291|     55|			   "need more data",
  292|     55|			   (unsigned long) in_len);
  293|     55|		wpa_hexdump(MSG_MSGDUMP, "TLSv1: Record Layer - Received",
  294|     55|			    in_data, in_len);
  295|     55|		return 0;
  296|     55|	}
  297|       |
  298|   100k|	ct = in_data[0];
  299|   100k|	rlen = WPA_GET_BE16(in_data + 3);
  300|   100k|	wpa_printf(MSG_DEBUG, "TLSv1: Received content type %d version %d.%d "
  301|   100k|		   "length %d", ct, in_data[1], in_data[2], (int) rlen);
  302|       |
  303|       |	/*
  304|       |	 * TLS v1.0 and v1.1 RFCs were not exactly clear on the use of the
  305|       |	 * protocol version in record layer. As such, accept any {03,xx} value
  306|       |	 * to remain compatible with existing implementations.
  307|       |	 */
  308|   100k|	if (in_data[1] != 0x03) {
  ------------------
  |  Branch (308:6): [True: 958, False: 99.6k]
  ------------------
  309|    958|		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version "
  310|    958|			   "%u.%u", in_data[1], in_data[2]);
  311|    958|		*alert = TLS_ALERT_PROTOCOL_VERSION;
  ------------------
  |  |  149|    958|#define TLS_ALERT_PROTOCOL_VERSION		70
  ------------------
  312|    958|		return -1;
  313|    958|	}
  314|       |
  315|       |	/* TLSCiphertext must not be more than 2^14+2048 bytes */
  316|  99.6k|	if (TLS_RECORD_HEADER_LEN + rlen > 18432) {
  ------------------
  |  |   21|  99.6k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  |  Branch (316:6): [True: 403, False: 99.2k]
  ------------------
  317|    403|		wpa_printf(MSG_DEBUG, "TLSv1: Record overflow (len=%lu)",
  318|    403|			   (unsigned long) (TLS_RECORD_HEADER_LEN + rlen));
  ------------------
  |  |   21|    403|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  319|    403|		*alert = TLS_ALERT_RECORD_OVERFLOW;
  ------------------
  |  |  135|    403|#define TLS_ALERT_RECORD_OVERFLOW		22
  ------------------
  320|    403|		return -1;
  321|    403|	}
  322|       |
  323|  99.2k|	in_data += TLS_RECORD_HEADER_LEN;
  ------------------
  |  |   21|  99.2k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  324|  99.2k|	in_len -= TLS_RECORD_HEADER_LEN;
  ------------------
  |  |   21|  99.2k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  325|       |
  326|  99.2k|	if (rlen > in_len) {
  ------------------
  |  Branch (326:6): [True: 60, False: 99.1k]
  ------------------
  327|     60|		wpa_printf(MSG_DEBUG, "TLSv1: Not all record data included "
  328|     60|			   "(rlen=%lu > in_len=%lu)",
  329|     60|			   (unsigned long) rlen, (unsigned long) in_len);
  330|     60|		return 0;
  331|     60|	}
  332|       |
  333|  99.1k|	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Record Layer - Received",
  334|  99.1k|		    in_data, rlen);
  335|       |
  336|  99.1k|	if (ct != TLS_CONTENT_TYPE_HANDSHAKE &&
  ------------------
  |  Branch (336:6): [True: 65.2k, False: 33.8k]
  ------------------
  337|  65.2k|	    ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC &&
  ------------------
  |  Branch (337:6): [True: 62.3k, False: 2.89k]
  ------------------
  338|  62.3k|	    ct != TLS_CONTENT_TYPE_ALERT &&
  ------------------
  |  Branch (338:6): [True: 7.59k, False: 54.7k]
  ------------------
  339|  7.59k|	    ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
  ------------------
  |  Branch (339:6): [True: 563, False: 7.03k]
  ------------------
  340|    563|		wpa_printf(MSG_DEBUG, "TLSv1: Ignore record with unknown "
  341|    563|			   "content type 0x%x", ct);
  342|    563|		*alert = TLS_ALERT_UNEXPECTED_MESSAGE;
  ------------------
  |  |  132|    563|#define TLS_ALERT_UNEXPECTED_MESSAGE		10
  ------------------
  343|    563|		return -1;
  344|    563|	}
  345|       |
  346|  98.5k|	in_len = rlen;
  347|       |
  348|  98.5k|	if (*out_len < in_len) {
  ------------------
  |  Branch (348:6): [True: 0, False: 98.5k]
  ------------------
  349|      0|		wpa_printf(MSG_DEBUG, "TLSv1: Not enough output buffer for "
  350|      0|			   "processing received record");
  351|      0|		*alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  352|      0|		return -1;
  353|      0|	}
  354|       |
  355|  98.5k|	if (rl->read_cipher_suite != TLS_NULL_WITH_NULL_NULL) {
  ------------------
  |  |   50|  98.5k|#define TLS_NULL_WITH_NULL_NULL			0x0000 /* RFC 2246 */
  ------------------
  |  Branch (355:6): [True: 38.6k, False: 59.9k]
  ------------------
  356|  38.6k|		size_t plen;
  357|  38.6k|		if (crypto_cipher_decrypt(rl->read_cbc, in_data,
  ------------------
  |  Branch (357:7): [True: 741, False: 37.8k]
  ------------------
  358|  38.6k|					  out_data, in_len) < 0) {
  359|    741|			*alert = TLS_ALERT_DECRYPTION_FAILED;
  ------------------
  |  |  134|    741|#define TLS_ALERT_DECRYPTION_FAILED		21
  ------------------
  360|    741|			return -1;
  361|    741|		}
  362|  37.8k|		plen = in_len;
  363|  37.8k|		wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Record Layer - Decrypted "
  364|  37.8k|				"data", out_data, plen);
  365|       |
  366|  37.8k|		if (rl->iv_size) {
  ------------------
  |  Branch (366:7): [True: 9.16k, False: 28.7k]
  ------------------
  367|       |			/*
  368|       |			 * TLS v1.0 defines different alert values for various
  369|       |			 * failures. That may information to aid in attacks, so
  370|       |			 * use the same bad_record_mac alert regardless of the
  371|       |			 * issues.
  372|       |			 *
  373|       |			 * In addition, instead of returning immediately on
  374|       |			 * error, run through the MAC check to make timing
  375|       |			 * attacks more difficult.
  376|       |			 */
  377|       |
  378|  9.16k|			if (rl->tls_version >= TLS_VERSION_1_1) {
  ------------------
  |  |   15|  9.16k|#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */
  ------------------
  |  Branch (378:8): [True: 1.66k, False: 7.49k]
  ------------------
  379|       |				/* Remove opaque IV[Cipherspec.block_length] */
  380|  1.66k|				if (plen < rl->iv_size) {
  ------------------
  |  Branch (380:9): [True: 308, False: 1.36k]
  ------------------
  381|    308|					wpa_printf(MSG_DEBUG, "TLSv1.1: Not "
  382|    308|						   "enough room for IV");
  383|    308|					force_mac_error = 1;
  384|    308|					goto check_mac;
  385|    308|				}
  386|  1.36k|				os_memmove(out_data, out_data + rl->iv_size,
  ------------------
  |  |  526|  1.36k|#define os_memmove(d, s, n) memmove((d), (s), (n))
  ------------------
  387|  1.36k|					   plen - rl->iv_size);
  388|  1.36k|				plen -= rl->iv_size;
  389|  1.36k|			}
  390|       |
  391|       |			/* Verify and remove padding */
  392|  8.85k|			if (plen == 0) {
  ------------------
  |  Branch (392:8): [True: 457, False: 8.39k]
  ------------------
  393|    457|				wpa_printf(MSG_DEBUG, "TLSv1: Too short record"
  394|    457|					   " (no pad)");
  395|    457|				force_mac_error = 1;
  396|    457|				goto check_mac;
  397|    457|			}
  398|  8.39k|			padlen = out_data[plen - 1];
  399|  8.39k|			if (padlen >= plen) {
  ------------------
  |  Branch (399:8): [True: 4.97k, False: 3.42k]
  ------------------
  400|  4.97k|				wpa_printf(MSG_DEBUG, "TLSv1: Incorrect pad "
  401|  4.97k|					   "length (%u, plen=%lu) in "
  402|  4.97k|					   "received record",
  403|  4.97k|					   padlen, (unsigned long) plen);
  404|  4.97k|				force_mac_error = 1;
  405|  4.97k|				goto check_mac;
  406|  4.97k|			}
  407|  4.66k|			for (i = plen - padlen - 1; i < plen - 1; i++) {
  ------------------
  |  Branch (407:32): [True: 3.32k, False: 1.34k]
  ------------------
  408|  3.32k|				if (out_data[i] != padlen) {
  ------------------
  |  Branch (408:9): [True: 2.08k, False: 1.24k]
  ------------------
  409|  2.08k|					wpa_hexdump(MSG_DEBUG,
  410|  2.08k|						    "TLSv1: Invalid pad in "
  411|  2.08k|						    "received record",
  412|  2.08k|						    out_data + plen - padlen -
  413|  2.08k|						    1, padlen + 1);
  414|  2.08k|					force_mac_error = 1;
  415|  2.08k|					goto check_mac;
  416|  2.08k|				}
  417|  3.32k|			}
  418|       |
  419|  1.34k|			plen -= padlen + 1;
  420|       |
  421|  1.34k|			wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Record Layer - "
  422|  1.34k|					"Decrypted data with IV and padding "
  423|  1.34k|					"removed", out_data, plen);
  424|  1.34k|		}
  425|       |
  426|  37.8k|	check_mac:
  427|  37.8k|		if (plen < rl->hash_size) {
  ------------------
  |  Branch (427:7): [True: 4.09k, False: 33.7k]
  ------------------
  428|  4.09k|			wpa_printf(MSG_DEBUG, "TLSv1: Too short record; no "
  429|  4.09k|				   "hash value");
  430|  4.09k|			*alert = TLS_ALERT_BAD_RECORD_MAC;
  ------------------
  |  |  133|  4.09k|#define TLS_ALERT_BAD_RECORD_MAC		20
  ------------------
  431|  4.09k|			return -1;
  432|  4.09k|		}
  433|       |
  434|  33.7k|		plen -= rl->hash_size;
  435|       |
  436|  33.7k|		hmac = crypto_hash_init(rl->hash_alg, rl->read_mac_secret,
  437|  33.7k|					rl->hash_size);
  438|  33.7k|		if (hmac == NULL) {
  ------------------
  |  Branch (438:7): [True: 0, False: 33.7k]
  ------------------
  439|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - Failed "
  440|      0|				   "to initialize HMAC");
  441|      0|			*alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  442|      0|			return -1;
  443|      0|		}
  444|       |
  445|  33.7k|		crypto_hash_update(hmac, rl->read_seq_num, TLS_SEQ_NUM_LEN);
  ------------------
  |  |   20|  33.7k|#define TLS_SEQ_NUM_LEN 8
  ------------------
  446|       |		/* type + version + length + fragment */
  447|  33.7k|		crypto_hash_update(hmac, in_data - TLS_RECORD_HEADER_LEN, 3);
  ------------------
  |  |   21|  33.7k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  448|  33.7k|		WPA_PUT_BE16(len, plen);
  449|  33.7k|		crypto_hash_update(hmac, len, 2);
  450|  33.7k|		crypto_hash_update(hmac, out_data, plen);
  451|  33.7k|		hlen = sizeof(hash);
  452|  33.7k|		if (crypto_hash_finish(hmac, hash, &hlen) < 0) {
  ------------------
  |  Branch (452:7): [True: 0, False: 33.7k]
  ------------------
  453|      0|			wpa_printf(MSG_DEBUG, "TLSv1: Record Layer - Failed "
  454|      0|				   "to calculate HMAC");
  455|      0|			*alert = TLS_ALERT_INTERNAL_ERROR;
  ------------------
  |  |  151|      0|#define TLS_ALERT_INTERNAL_ERROR		80
  ------------------
  456|      0|			return -1;
  457|      0|		}
  458|  33.7k|		if (hlen != rl->hash_size ||
  ------------------
  |  Branch (458:7): [True: 0, False: 33.7k]
  ------------------
  459|  33.7k|		    os_memcmp_const(hash, out_data + plen, hlen) != 0 ||
  ------------------
  |  Branch (459:7): [True: 33.7k, False: 32]
  ------------------
  460|  33.7k|		    force_mac_error) {
  ------------------
  |  Branch (460:7): [True: 0, False: 32]
  ------------------
  461|  33.7k|			wpa_printf(MSG_DEBUG, "TLSv1: Invalid HMAC value in "
  462|  33.7k|				   "received message (force_mac_error=%d)",
  463|  33.7k|				   force_mac_error);
  464|  33.7k|			*alert = TLS_ALERT_BAD_RECORD_MAC;
  ------------------
  |  |  133|  33.7k|#define TLS_ALERT_BAD_RECORD_MAC		20
  ------------------
  465|  33.7k|			return -1;
  466|  33.7k|		}
  467|       |
  468|     32|		*out_len = plen;
  469|  59.9k|	} else {
  470|  59.9k|		os_memcpy(out_data, in_data, in_len);
  ------------------
  |  |  523|  59.9k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  471|  59.9k|		*out_len = in_len;
  472|  59.9k|	}
  473|       |
  474|       |	/* TLSCompressed must not be more than 2^14+1024 bytes */
  475|  59.9k|	if (TLS_RECORD_HEADER_LEN + *out_len > 17408) {
  ------------------
  |  |   21|  59.9k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  |  Branch (475:6): [True: 6, False: 59.9k]
  ------------------
  476|      6|		wpa_printf(MSG_DEBUG, "TLSv1: Record overflow (len=%lu)",
  477|      6|			   (unsigned long) (TLS_RECORD_HEADER_LEN + *out_len));
  ------------------
  |  |   21|      6|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  478|      6|		*alert = TLS_ALERT_RECORD_OVERFLOW;
  ------------------
  |  |  135|      6|#define TLS_ALERT_RECORD_OVERFLOW		22
  ------------------
  479|      6|		return -1;
  480|      6|	}
  481|       |
  482|  59.9k|	inc_byte_array(rl->read_seq_num, TLS_SEQ_NUM_LEN);
  ------------------
  |  |   20|  59.9k|#define TLS_SEQ_NUM_LEN 8
  ------------------
  483|       |
  484|  59.9k|	return TLS_RECORD_HEADER_LEN + rlen;
  ------------------
  |  |   21|  59.9k|#define TLS_RECORD_HEADER_LEN 5
  ------------------
  485|  59.9k|}

tlsv1_server_global_init:
  354|  3.10k|{
  355|  3.10k|	return crypto_global_init();
  356|  3.10k|}
tlsv1_server_global_deinit:
  367|  3.10k|{
  368|  3.10k|	crypto_global_deinit();
  369|  3.10k|}

x509_free_name:
   18|  8.01k|{
   19|  8.01k|	size_t i;
   20|       |
   21|  12.0k|	for (i = 0; i < name->num_attr; i++) {
  ------------------
  |  Branch (21:14): [True: 4.03k, False: 8.01k]
  ------------------
   22|  4.03k|		os_free(name->attr[i].value);
  ------------------
  |  |  511|  4.03k|#define os_free(p) free((p))
  ------------------
   23|  4.03k|		name->attr[i].value = NULL;
   24|  4.03k|		name->attr[i].type = X509_NAME_ATTR_NOT_USED;
   25|  4.03k|	}
   26|  8.01k|	name->num_attr = 0;
   27|  8.01k|	os_free(name->email);
  ------------------
  |  |  511|  8.01k|#define os_free(p) free((p))
  ------------------
   28|  8.01k|	name->email = NULL;
   29|       |
   30|  8.01k|	os_free(name->alt_email);
  ------------------
  |  |  511|  8.01k|#define os_free(p) free((p))
  ------------------
   31|  8.01k|	os_free(name->dns);
  ------------------
  |  |  511|  8.01k|#define os_free(p) free((p))
  ------------------
   32|  8.01k|	os_free(name->uri);
  ------------------
  |  |  511|  8.01k|#define os_free(p) free((p))
  ------------------
   33|  8.01k|	os_free(name->ip);
  ------------------
  |  |  511|  8.01k|#define os_free(p) free((p))
  ------------------
   34|  8.01k|	name->alt_email = name->dns = name->uri = NULL;
   35|  8.01k|	name->ip = NULL;
   36|  8.01k|	name->ip_len = 0;
   37|  8.01k|	os_memset(&name->rid, 0, sizeof(name->rid));
  ------------------
  |  |  529|  8.01k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   38|  8.01k|}
x509_certificate_free:
   46|  3.87k|{
   47|  3.87k|	if (cert == NULL)
  ------------------
  |  Branch (47:6): [True: 0, False: 3.87k]
  ------------------
   48|      0|		return;
   49|  3.87k|	if (cert->next) {
  ------------------
  |  Branch (49:6): [True: 0, False: 3.87k]
  ------------------
   50|      0|		wpa_printf(MSG_DEBUG, "X509: x509_certificate_free: cer=%p "
   51|      0|			   "was still on a list (next=%p)\n",
   52|      0|			   cert, cert->next);
   53|      0|	}
   54|  3.87k|	x509_free_name(&cert->issuer);
   55|  3.87k|	x509_free_name(&cert->subject);
   56|  3.87k|	os_free(cert->public_key);
  ------------------
  |  |  511|  3.87k|#define os_free(p) free((p))
  ------------------
   57|  3.87k|	os_free(cert->sign_value);
  ------------------
  |  |  511|  3.87k|#define os_free(p) free((p))
  ------------------
   58|  3.87k|	os_free(cert->subject_dn);
  ------------------
  |  |  511|  3.87k|#define os_free(p) free((p))
  ------------------
   59|  3.87k|	os_free(cert);
  ------------------
  |  |  511|  3.87k|#define os_free(p) free((p))
  ------------------
   60|  3.87k|}
x509_certificate_chain_free:
   68|  5.36k|{
   69|  5.36k|	struct x509_certificate *next;
   70|       |
   71|  6.96k|	while (cert) {
  ------------------
  |  Branch (71:9): [True: 1.59k, False: 5.36k]
  ------------------
   72|  1.59k|		next = cert->next;
   73|       |		cert->next = NULL;
   74|  1.59k|		x509_certificate_free(cert);
   75|  1.59k|		cert = next;
   76|  1.59k|	}
   77|  5.36k|}
x509_parse_algorithm_identifier:
  184|  9.26k|{
  185|  9.26k|	struct asn1_hdr hdr;
  186|  9.26k|	const u8 *pos, *end;
  187|       |
  188|       |	/*
  189|       |	 * AlgorithmIdentifier ::= SEQUENCE {
  190|       |	 *     algorithm            OBJECT IDENTIFIER,
  191|       |	 *     parameters           ANY DEFINED BY algorithm OPTIONAL
  192|       |	 * }
  193|       |	 */
  194|       |
  195|  9.26k|	if (asn1_get_next(buf, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (195:6): [True: 30, False: 9.23k]
  |  Branch (195:43): [True: 42, False: 9.19k]
  ------------------
  196|     72|		asn1_unexpected(&hdr,
  197|     72|				"X509: Expected SEQUENCE (AlgorithmIdentifier)");
  198|     72|		return -1;
  199|     72|	}
  200|  9.19k|	if (hdr.length > buf + len - hdr.payload)
  ------------------
  |  Branch (200:6): [True: 0, False: 9.19k]
  ------------------
  201|      0|		return -1;
  202|  9.19k|	pos = hdr.payload;
  203|  9.19k|	end = pos + hdr.length;
  204|       |
  205|  9.19k|	*next = end;
  206|       |
  207|  9.19k|	if (asn1_get_oid(pos, end - pos, &id->oid, &pos))
  ------------------
  |  Branch (207:6): [True: 52, False: 9.13k]
  ------------------
  208|     52|		return -1;
  209|       |
  210|       |	/* TODO: optional parameters */
  211|       |
  212|  9.13k|	return 0;
  213|  9.19k|}
x509_parse_name:
  287|  6.61k|{
  288|  6.61k|	struct asn1_hdr hdr;
  289|  6.61k|	const u8 *pos, *end, *set_pos, *set_end, *seq_pos, *seq_end;
  290|  6.61k|	struct asn1_oid oid;
  291|  6.61k|	char *val;
  292|       |
  293|       |	/*
  294|       |	 * Name ::= CHOICE { RDNSequence }
  295|       |	 * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
  296|       |	 * RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
  297|       |	 * AttributeTypeAndValue ::= SEQUENCE {
  298|       |	 *     type     AttributeType,
  299|       |	 *     value    AttributeValue
  300|       |	 * }
  301|       |	 * AttributeType ::= OBJECT IDENTIFIER
  302|       |	 * AttributeValue ::= ANY DEFINED BY AttributeType
  303|       |	 */
  304|       |
  305|  6.61k|	if (asn1_get_next(buf, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (305:6): [True: 33, False: 6.58k]
  |  Branch (305:43): [True: 25, False: 6.56k]
  ------------------
  306|     58|		asn1_unexpected(&hdr,
  307|     58|				"X509: Expected SEQUENCE (Name / RDNSequencer)");
  308|     58|		return -1;
  309|     58|	}
  310|  6.56k|	pos = hdr.payload;
  311|       |
  312|  6.56k|	if (hdr.length > buf + len - pos)
  ------------------
  |  Branch (312:6): [True: 0, False: 6.56k]
  ------------------
  313|      0|		return -1;
  314|       |
  315|  6.56k|	end = *next = pos + hdr.length;
  316|       |
  317|  23.5k|	while (pos < end) {
  ------------------
  |  Branch (317:9): [True: 17.2k, False: 6.30k]
  ------------------
  318|  17.2k|		enum x509_name_attr_type type;
  319|       |
  320|  17.2k|		if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (320:7): [True: 120, False: 17.1k]
  ------------------
  321|  17.1k|		    !asn1_is_set(&hdr)) {
  ------------------
  |  Branch (321:7): [True: 68, False: 17.0k]
  ------------------
  322|    188|			asn1_unexpected(&hdr,
  323|    188|					"X509: Expected SET (RelativeDistinguishedName)");
  324|    188|			x509_free_name(name);
  325|    188|			return -1;
  326|    188|		}
  327|       |
  328|  17.0k|		set_pos = hdr.payload;
  329|  17.0k|		pos = set_end = hdr.payload + hdr.length;
  330|       |
  331|  17.0k|		if (asn1_get_next(set_pos, set_end - set_pos, &hdr) < 0 ||
  ------------------
  |  Branch (331:7): [True: 17, False: 17.0k]
  ------------------
  332|  17.0k|		    !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (332:7): [True: 17, False: 17.0k]
  ------------------
  333|     34|			asn1_unexpected(&hdr,
  334|     34|					"X509: Expected SEQUENCE (AttributeTypeAndValue)");
  335|     34|			x509_free_name(name);
  336|     34|			return -1;
  337|     34|		}
  338|       |
  339|  17.0k|		seq_pos = hdr.payload;
  340|  17.0k|		seq_end = hdr.payload + hdr.length;
  341|       |
  342|  17.0k|		if (asn1_get_oid(seq_pos, seq_end - seq_pos, &oid, &seq_pos)) {
  ------------------
  |  Branch (342:7): [True: 16, False: 16.9k]
  ------------------
  343|     16|			x509_free_name(name);
  344|     16|			return -1;
  345|     16|		}
  346|       |
  347|  16.9k|		if (asn1_get_next(seq_pos, seq_end - seq_pos, &hdr) < 0 ||
  ------------------
  |  Branch (347:7): [True: 16, False: 16.9k]
  ------------------
  348|  16.9k|		    hdr.class != ASN1_CLASS_UNIVERSAL) {
  ------------------
  |  |   43|  16.9k|#define ASN1_CLASS_UNIVERSAL		0
  ------------------
  |  Branch (348:7): [True: 2, False: 16.9k]
  ------------------
  349|     18|			wpa_printf(MSG_DEBUG, "X509: Failed to parse "
  350|     18|				   "AttributeValue");
  351|     18|			x509_free_name(name);
  352|     18|			return -1;
  353|     18|		}
  354|       |
  355|  16.9k|		if (!asn1_is_string_type(&hdr)) {
  ------------------
  |  Branch (355:7): [True: 3.86k, False: 13.1k]
  ------------------
  356|  3.86k|			wpa_printf(MSG_DEBUG,
  357|  3.86k|				   "X509: Ignore non-string type attribute (tag 0x%x)",
  358|  3.86k|				   hdr.tag);
  359|  3.86k|			continue;
  360|  3.86k|		}
  361|       |
  362|       |		/* RFC 3280:
  363|       |		 * MUST: country, organization, organizational-unit,
  364|       |		 * distinguished name qualifier, state or province name,
  365|       |		 * common name, serial number.
  366|       |		 * SHOULD: locality, title, surname, given name, initials,
  367|       |		 * pseudonym, generation qualifier.
  368|       |		 * MUST: domainComponent (RFC 2247).
  369|       |		 */
  370|  13.1k|		type = X509_NAME_ATTR_NOT_USED;
  371|  13.1k|		if (oid.len == 4 &&
  ------------------
  |  Branch (371:7): [True: 10.4k, False: 2.61k]
  ------------------
  372|  10.4k|		    oid.oid[0] == 2 && oid.oid[1] == 5 && oid.oid[2] == 4) {
  ------------------
  |  Branch (372:7): [True: 7.85k, False: 2.64k]
  |  Branch (372:26): [True: 6.00k, False: 1.85k]
  |  Branch (372:45): [True: 4.97k, False: 1.03k]
  ------------------
  373|       |			/* id-at ::= 2.5.4 */
  374|  4.97k|			switch (oid.oid[3]) {
  ------------------
  |  Branch (374:12): [True: 4.03k, False: 937]
  ------------------
  375|  1.15k|			case 3:
  ------------------
  |  Branch (375:4): [True: 1.15k, False: 3.81k]
  ------------------
  376|       |				/* commonName */
  377|  1.15k|				type = X509_NAME_ATTR_CN;
  378|  1.15k|				break;
  379|  1.31k|			case 6:
  ------------------
  |  Branch (379:4): [True: 1.31k, False: 3.65k]
  ------------------
  380|       |				/*  countryName */
  381|  1.31k|				type = X509_NAME_ATTR_C;
  382|  1.31k|				break;
  383|     71|			case 7:
  ------------------
  |  Branch (383:4): [True: 71, False: 4.90k]
  ------------------
  384|       |				/* localityName */
  385|     71|				type = X509_NAME_ATTR_L;
  386|     71|				break;
  387|     29|			case 8:
  ------------------
  |  Branch (387:4): [True: 29, False: 4.94k]
  ------------------
  388|       |				/* stateOrProvinceName */
  389|     29|				type = X509_NAME_ATTR_ST;
  390|     29|				break;
  391|  1.26k|			case 10:
  ------------------
  |  Branch (391:4): [True: 1.26k, False: 3.70k]
  ------------------
  392|       |				/* organizationName */
  393|  1.26k|				type = X509_NAME_ATTR_O;
  394|  1.26k|				break;
  395|    193|			case 11:
  ------------------
  |  Branch (395:4): [True: 193, False: 4.77k]
  ------------------
  396|       |				/* organizationalUnitName */
  397|    193|				type = X509_NAME_ATTR_OU;
  398|    193|				break;
  399|  4.97k|			}
  400|  8.13k|		} else if (oid.len == 7 &&
  ------------------
  |  Branch (400:14): [True: 355, False: 7.78k]
  ------------------
  401|    355|			   oid.oid[0] == 1 && oid.oid[1] == 2 &&
  ------------------
  |  Branch (401:7): [True: 184, False: 171]
  |  Branch (401:26): [True: 168, False: 16]
  ------------------
  402|    168|			   oid.oid[2] == 840 && oid.oid[3] == 113549 &&
  ------------------
  |  Branch (402:7): [True: 127, False: 41]
  |  Branch (402:28): [True: 94, False: 33]
  ------------------
  403|     94|			   oid.oid[4] == 1 && oid.oid[5] == 9 &&
  ------------------
  |  Branch (403:7): [True: 61, False: 33]
  |  Branch (403:26): [True: 37, False: 24]
  ------------------
  404|     37|			   oid.oid[6] == 1) {
  ------------------
  |  Branch (404:7): [True: 12, False: 25]
  ------------------
  405|       |			/* 1.2.840.113549.1.9.1 - e-mailAddress */
  406|     12|			os_free(name->email);
  ------------------
  |  |  511|     12|#define os_free(p) free((p))
  ------------------
  407|     12|			name->email = os_malloc(hdr.length + 1);
  ------------------
  |  |  505|     12|#define os_malloc(s) malloc((s))
  ------------------
  408|     12|			if (name->email == NULL) {
  ------------------
  |  Branch (408:8): [True: 0, False: 12]
  ------------------
  409|      0|				x509_free_name(name);
  410|      0|				return -1;
  411|      0|			}
  412|     12|			os_memcpy(name->email, hdr.payload, hdr.length);
  ------------------
  |  |  523|     12|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  413|     12|			name->email[hdr.length] = '\0';
  414|     12|			continue;
  415|  8.12k|		} else if (oid.len == 7 &&
  ------------------
  |  Branch (415:14): [True: 343, False: 7.78k]
  ------------------
  416|    343|			   oid.oid[0] == 0 && oid.oid[1] == 9 &&
  ------------------
  |  Branch (416:7): [True: 168, False: 175]
  |  Branch (416:26): [True: 142, False: 26]
  ------------------
  417|    142|			   oid.oid[2] == 2342 && oid.oid[3] == 19200300 &&
  ------------------
  |  Branch (417:7): [True: 94, False: 48]
  |  Branch (417:29): [True: 64, False: 30]
  ------------------
  418|     64|			   oid.oid[4] == 100 && oid.oid[5] == 1 &&
  ------------------
  |  Branch (418:7): [True: 42, False: 22]
  |  Branch (418:28): [True: 24, False: 18]
  ------------------
  419|     24|			   oid.oid[6] == 25) {
  ------------------
  |  Branch (419:7): [True: 3, False: 21]
  ------------------
  420|       |			/* 0.9.2342.19200300.100.1.25 - domainComponent */
  421|      3|			type = X509_NAME_ATTR_DC;
  422|      3|		}
  423|       |
  424|  13.0k|		if (type == X509_NAME_ATTR_NOT_USED) {
  ------------------
  |  Branch (424:7): [True: 9.06k, False: 4.03k]
  ------------------
  425|  9.06k|			wpa_hexdump(MSG_DEBUG, "X509: Unrecognized OID",
  426|  9.06k|				    (u8 *) oid.oid,
  427|  9.06k|				    oid.len * sizeof(oid.oid[0]));
  428|  9.06k|			wpa_hexdump_ascii(MSG_MSGDUMP, "X509: Attribute Data",
  429|  9.06k|					  hdr.payload, hdr.length);
  430|  9.06k|			continue;
  431|  9.06k|		}
  432|       |
  433|  4.03k|		if (name->num_attr == X509_MAX_NAME_ATTRIBUTES) {
  ------------------
  |  |   32|  4.03k|#define X509_MAX_NAME_ATTRIBUTES 20
  ------------------
  |  Branch (433:7): [True: 0, False: 4.03k]
  ------------------
  434|      0|			wpa_printf(MSG_INFO, "X509: Too many Name attributes");
  435|      0|			x509_free_name(name);
  436|      0|			return -1;
  437|      0|		}
  438|       |
  439|  4.03k|		val = dup_binstr(hdr.payload, hdr.length);
  440|  4.03k|		if (val == NULL) {
  ------------------
  |  Branch (440:7): [True: 0, False: 4.03k]
  ------------------
  441|      0|			x509_free_name(name);
  442|      0|			return -1;
  443|      0|		}
  444|  4.03k|		if (os_strlen(val) != hdr.length) {
  ------------------
  |  |  536|  4.03k|#define os_strlen(s) strlen(s)
  ------------------
  |  Branch (444:7): [True: 5, False: 4.03k]
  ------------------
  445|      5|			wpa_printf(MSG_INFO, "X509: Reject certificate with "
  446|      5|				   "embedded NUL byte in a string (%s[NUL])",
  447|      5|				   val);
  448|      5|			os_free(val);
  ------------------
  |  |  511|      5|#define os_free(p) free((p))
  ------------------
  449|      5|			x509_free_name(name);
  450|      5|			return -1;
  451|      5|		}
  452|       |
  453|  4.03k|		name->attr[name->num_attr].type = type;
  454|  4.03k|		name->attr[name->num_attr].value = val;
  455|  4.03k|		name->num_attr++;
  456|  4.03k|	}
  457|       |
  458|  6.30k|	return 0;
  459|  6.56k|}
x509_name_string:
  493|  6.30k|{
  494|  6.30k|	char *pos, *end;
  495|  6.30k|	int ret;
  496|  6.30k|	size_t i;
  497|       |
  498|  6.30k|	if (len == 0)
  ------------------
  |  Branch (498:6): [True: 0, False: 6.30k]
  ------------------
  499|      0|		return;
  500|       |
  501|  6.30k|	pos = buf;
  502|  6.30k|	end = buf + len;
  503|       |
  504|  10.2k|	for (i = 0; i < name->num_attr; i++) {
  ------------------
  |  Branch (504:14): [True: 3.96k, False: 6.30k]
  ------------------
  505|  3.96k|		ret = os_snprintf(pos, end - pos, "%s=%s, ",
  ------------------
  |  |  572|  3.96k|#define os_snprintf snprintf
  ------------------
  506|  3.96k|				  x509_name_attr_str(name->attr[i].type),
  507|  3.96k|				  name->attr[i].value);
  508|  3.96k|		if (os_snprintf_error(end - pos, ret))
  ------------------
  |  Branch (508:7): [True: 0, False: 3.96k]
  ------------------
  509|      0|			goto done;
  510|  3.96k|		pos += ret;
  511|  3.96k|	}
  512|       |
  513|  6.30k|	if (pos > buf + 1 && pos[-1] == ' ' && pos[-2] == ',') {
  ------------------
  |  Branch (513:6): [True: 2.45k, False: 3.84k]
  |  Branch (513:23): [True: 2.45k, False: 0]
  |  Branch (513:41): [True: 2.45k, False: 0]
  ------------------
  514|  2.45k|		pos--;
  515|  2.45k|		*pos = '\0';
  516|  2.45k|		pos--;
  517|  2.45k|		*pos = '\0';
  518|  2.45k|	}
  519|       |
  520|  6.30k|	if (name->email) {
  ------------------
  |  Branch (520:6): [True: 9, False: 6.29k]
  ------------------
  521|      9|		ret = os_snprintf(pos, end - pos, "/emailAddress=%s",
  ------------------
  |  |  572|      9|#define os_snprintf snprintf
  ------------------
  522|      9|				  name->email);
  523|      9|		if (os_snprintf_error(end - pos, ret))
  ------------------
  |  Branch (523:7): [True: 0, False: 9]
  ------------------
  524|      0|			goto done;
  525|      9|		pos += ret;
  526|      9|	}
  527|       |
  528|  6.30k|done:
  529|  6.30k|	if (pos < end)
  ------------------
  |  Branch (529:6): [True: 6.30k, False: 0]
  ------------------
  530|  6.30k|		*pos = '\0';
  531|  6.30k|	end[-1] = '\0';
  532|  6.30k|}
x509_parse_time:
  570|  6.25k|{
  571|  6.25k|	const char *pos, *end;
  572|  6.25k|	int year, month, day, hour, min, sec;
  573|       |
  574|       |	/*
  575|       |	 * Time ::= CHOICE {
  576|       |	 *     utcTime        UTCTime,
  577|       |	 *     generalTime    GeneralizedTime
  578|       |	 * }
  579|       |	 *
  580|       |	 * UTCTime: YYMMDDHHMMSSZ
  581|       |	 * GeneralizedTime: YYYYMMDDHHMMSSZ
  582|       |	 */
  583|       |
  584|  6.25k|	pos = (const char *) buf;
  585|  6.25k|	end = pos + len;
  586|       |
  587|  6.25k|	switch (asn1_tag) {
  588|  6.19k|	case ASN1_TAG_UTCTIME:
  ------------------
  |  |   34|  6.19k|#define ASN1_TAG_UTCTIME	0x17
  ------------------
  |  Branch (588:2): [True: 6.19k, False: 59]
  ------------------
  589|  6.19k|		if (len != 13 || buf[12] != 'Z') {
  ------------------
  |  Branch (589:7): [True: 4, False: 6.19k]
  |  Branch (589:20): [True: 6, False: 6.18k]
  ------------------
  590|     10|			wpa_hexdump_ascii(MSG_DEBUG, "X509: Unrecognized "
  591|     10|					  "UTCTime format", buf, len);
  592|     10|			return -1;
  593|     10|		}
  594|  6.18k|		year = parse_uint2(pos, end - pos);
  595|  6.18k|		if (year < 0) {
  ------------------
  |  Branch (595:7): [True: 5, False: 6.17k]
  ------------------
  596|      5|			wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse "
  597|      5|					  "UTCTime year", buf, len);
  598|      5|			return -1;
  599|      5|		}
  600|  6.17k|		if (year < 50)
  ------------------
  |  Branch (600:7): [True: 5.11k, False: 1.06k]
  ------------------
  601|  5.11k|			year += 2000;
  602|  1.06k|		else
  603|  1.06k|			year += 1900;
  604|  6.17k|		pos += 2;
  605|  6.17k|		break;
  606|     59|	case ASN1_TAG_GENERALIZEDTIME:
  ------------------
  |  |   35|     59|#define ASN1_TAG_GENERALIZEDTIME	0x18 /* not yet parsed */
  ------------------
  |  Branch (606:2): [True: 59, False: 6.19k]
  ------------------
  607|     59|		if (len != 15 || buf[14] != 'Z') {
  ------------------
  |  Branch (607:7): [True: 1, False: 58]
  |  Branch (607:20): [True: 5, False: 53]
  ------------------
  608|      6|			wpa_hexdump_ascii(MSG_DEBUG, "X509: Unrecognized "
  609|      6|					  "GeneralizedTime format", buf, len);
  610|      6|			return -1;
  611|      6|		}
  612|     53|		year = parse_uint4(pos, end - pos);
  613|     53|		if (year < 0) {
  ------------------
  |  Branch (613:7): [True: 11, False: 42]
  ------------------
  614|     11|			wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse "
  615|     11|					  "GeneralizedTime year", buf, len);
  616|     11|			return -1;
  617|     11|		}
  618|     42|		pos += 4;
  619|     42|		break;
  620|      0|	default:
  ------------------
  |  Branch (620:2): [True: 0, False: 6.25k]
  ------------------
  621|      0|		wpa_printf(MSG_DEBUG, "X509: Expected UTCTime or "
  622|      0|			   "GeneralizedTime - found tag 0x%x", asn1_tag);
  623|      0|		return -1;
  624|  6.25k|	}
  625|       |
  626|  6.22k|	month = parse_uint2(pos, end - pos);
  627|  6.22k|	if (month < 0) {
  ------------------
  |  Branch (627:6): [True: 5, False: 6.21k]
  ------------------
  628|      5|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse Time "
  629|      5|				  "(month)", buf, len);
  630|      5|		return -1;
  631|      5|	}
  632|  6.21k|	pos += 2;
  633|       |
  634|  6.21k|	day = parse_uint2(pos, end - pos);
  635|  6.21k|	if (day < 0) {
  ------------------
  |  Branch (635:6): [True: 5, False: 6.21k]
  ------------------
  636|      5|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse Time "
  637|      5|				  "(day)", buf, len);
  638|      5|		return -1;
  639|      5|	}
  640|  6.21k|	pos += 2;
  641|       |
  642|  6.21k|	hour = parse_uint2(pos, end - pos);
  643|  6.21k|	if (hour < 0) {
  ------------------
  |  Branch (643:6): [True: 3, False: 6.20k]
  ------------------
  644|      3|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse Time "
  645|      3|				  "(hour)", buf, len);
  646|      3|		return -1;
  647|      3|	}
  648|  6.20k|	pos += 2;
  649|       |
  650|  6.20k|	min = parse_uint2(pos, end - pos);
  651|  6.20k|	if (min < 0) {
  ------------------
  |  Branch (651:6): [True: 5, False: 6.20k]
  ------------------
  652|      5|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse Time "
  653|      5|				  "(min)", buf, len);
  654|      5|		return -1;
  655|      5|	}
  656|  6.20k|	pos += 2;
  657|       |
  658|  6.20k|	sec = parse_uint2(pos, end - pos);
  659|  6.20k|	if (sec < 0) {
  ------------------
  |  Branch (659:6): [True: 6, False: 6.19k]
  ------------------
  660|      6|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse Time "
  661|      6|				  "(sec)", buf, len);
  662|      6|		return -1;
  663|      6|	}
  664|       |
  665|  6.19k|	if (os_mktime(year, month, day, hour, min, sec, val) < 0) {
  ------------------
  |  Branch (665:6): [True: 778, False: 5.41k]
  ------------------
  666|    778|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to convert Time",
  667|    778|				  buf, len);
  668|    778|		if (year < 1970) {
  ------------------
  |  Branch (668:7): [True: 764, False: 14]
  ------------------
  669|       |			/*
  670|       |			 * At least some test certificates have been configured
  671|       |			 * to use dates prior to 1970. Set the date to
  672|       |			 * beginning of 1970 to handle these case.
  673|       |			 */
  674|    764|			wpa_printf(MSG_DEBUG, "X509: Year=%d before epoch - "
  675|    764|				   "assume epoch as the time", year);
  676|    764|			*val = 0;
  677|    764|			return 0;
  678|    764|		}
  679|     14|		return -1;
  680|    778|	}
  681|       |
  682|  5.41k|	return 0;
  683|  6.19k|}
x509_certificate_parse:
 1728|  3.87k|{
 1729|  3.87k|	struct asn1_hdr hdr;
 1730|  3.87k|	const u8 *pos, *end, *hash_start;
 1731|  3.87k|	struct x509_certificate *cert;
 1732|       |
 1733|  3.87k|	cert = os_zalloc(sizeof(*cert) + len);
 1734|  3.87k|	if (cert == NULL)
  ------------------
  |  Branch (1734:6): [True: 0, False: 3.87k]
  ------------------
 1735|      0|		return NULL;
 1736|  3.87k|	os_memcpy(cert + 1, buf, len);
  ------------------
  |  |  523|  3.87k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
 1737|  3.87k|	cert->cert_start = (u8 *) (cert + 1);
 1738|  3.87k|	cert->cert_len = len;
 1739|       |
 1740|  3.87k|	pos = buf;
 1741|  3.87k|	end = buf + len;
 1742|       |
 1743|       |	/* RFC 3280 - X.509 v3 certificate / ASN.1 DER */
 1744|       |
 1745|       |	/* Certificate ::= SEQUENCE */
 1746|  3.87k|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1746:6): [True: 92, False: 3.78k]
  |  Branch (1746:43): [True: 30, False: 3.75k]
  ------------------
 1747|    122|		asn1_unexpected(&hdr,
 1748|    122|				"X509: Certificate did not start with a valid SEQUENCE");
 1749|    122|		x509_certificate_free(cert);
 1750|    122|		return NULL;
 1751|    122|	}
 1752|  3.75k|	pos = hdr.payload;
 1753|       |
 1754|  3.75k|	if (hdr.length > end - pos) {
  ------------------
  |  Branch (1754:6): [True: 0, False: 3.75k]
  ------------------
 1755|      0|		x509_certificate_free(cert);
 1756|      0|		return NULL;
 1757|      0|	}
 1758|       |
 1759|  3.75k|	if (hdr.length < end - pos) {
  ------------------
  |  Branch (1759:6): [True: 1.59k, False: 2.15k]
  ------------------
 1760|  1.59k|		wpa_hexdump(MSG_MSGDUMP, "X509: Ignoring extra data after DER "
 1761|  1.59k|			    "encoded certificate",
 1762|  1.59k|			    pos + hdr.length, end - (pos + hdr.length));
 1763|  1.59k|		end = pos + hdr.length;
 1764|  1.59k|	}
 1765|       |
 1766|  3.75k|	hash_start = pos;
 1767|  3.75k|	cert->tbs_cert_start = cert->cert_start + (hash_start - buf);
 1768|  3.75k|	if (x509_parse_tbs_certificate(pos, end - pos, cert, &pos)) {
  ------------------
  |  Branch (1768:6): [True: 1.16k, False: 2.59k]
  ------------------
 1769|  1.16k|		x509_certificate_free(cert);
 1770|  1.16k|		return NULL;
 1771|  1.16k|	}
 1772|  2.59k|	cert->tbs_cert_len = pos - hash_start;
 1773|       |
 1774|       |	/* signatureAlgorithm AlgorithmIdentifier */
 1775|  2.59k|	if (x509_parse_algorithm_identifier(pos, end - pos,
  ------------------
  |  Branch (1775:6): [True: 37, False: 2.55k]
  ------------------
 1776|  2.59k|					    &cert->signature_alg, &pos)) {
 1777|     37|		x509_certificate_free(cert);
 1778|     37|		return NULL;
 1779|     37|	}
 1780|       |
 1781|       |	/* signatureValue BIT STRING */
 1782|  2.55k|	if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1782:6): [True: 6, False: 2.55k]
  ------------------
 1783|  2.55k|	    !asn1_is_bitstring(&hdr)) {
  ------------------
  |  Branch (1783:6): [True: 12, False: 2.53k]
  ------------------
 1784|     18|		asn1_unexpected(&hdr,
 1785|     18|				"X509: Expected BITSTRING (signatureValue)");
 1786|     18|		x509_certificate_free(cert);
 1787|     18|		return NULL;
 1788|     18|	}
 1789|  2.53k|	if (hdr.length < 1) {
  ------------------
  |  Branch (1789:6): [True: 1, False: 2.53k]
  ------------------
 1790|      1|		x509_certificate_free(cert);
 1791|      1|		return NULL;
 1792|      1|	}
 1793|  2.53k|	pos = hdr.payload;
 1794|  2.53k|	if (*pos) {
  ------------------
  |  Branch (1794:6): [True: 9, False: 2.52k]
  ------------------
 1795|      9|		wpa_printf(MSG_DEBUG,
 1796|      9|			   "X509: BITSTRING (signatureValue) - %d unused bits",
 1797|      9|			   *pos);
 1798|       |		/* PKCS #1 v1.5 10.2.1:
 1799|       |		 * It is an error if the length in bits of the signature S is
 1800|       |		 * not a multiple of eight.
 1801|       |		 */
 1802|      9|		x509_certificate_free(cert);
 1803|      9|		return NULL;
 1804|      9|	}
 1805|  2.52k|	os_free(cert->sign_value);
  ------------------
  |  |  511|  2.52k|#define os_free(p) free((p))
  ------------------
 1806|  2.52k|	cert->sign_value = os_memdup(pos + 1, hdr.length - 1);
 1807|  2.52k|	if (cert->sign_value == NULL) {
  ------------------
  |  Branch (1807:6): [True: 0, False: 2.52k]
  ------------------
 1808|      0|		wpa_printf(MSG_DEBUG, "X509: Failed to allocate memory for "
 1809|      0|			   "signatureValue");
 1810|      0|		x509_certificate_free(cert);
 1811|      0|		return NULL;
 1812|      0|	}
 1813|  2.52k|	cert->sign_value_len = hdr.length - 1;
 1814|  2.52k|	wpa_hexdump(MSG_MSGDUMP, "X509: signature",
 1815|  2.52k|		    cert->sign_value, cert->sign_value_len);
 1816|       |
 1817|  2.52k|	return cert;
 1818|  2.52k|}
x509v3.c:x509_name_attr_str:
  463|  3.96k|{
  464|  3.96k|	switch (type) {
  ------------------
  |  Branch (464:10): [True: 3.96k, False: 0]
  ------------------
  465|      0|	case X509_NAME_ATTR_NOT_USED:
  ------------------
  |  Branch (465:2): [True: 0, False: 3.96k]
  ------------------
  466|      0|		return "[N/A]";
  467|      0|	case X509_NAME_ATTR_DC:
  ------------------
  |  Branch (467:2): [True: 0, False: 3.96k]
  ------------------
  468|      0|		return "DC";
  469|  1.15k|	case X509_NAME_ATTR_CN:
  ------------------
  |  Branch (469:2): [True: 1.15k, False: 2.81k]
  ------------------
  470|  1.15k|		return "CN";
  471|  1.28k|	case X509_NAME_ATTR_C:
  ------------------
  |  Branch (471:2): [True: 1.28k, False: 2.67k]
  ------------------
  472|  1.28k|		return "C";
  473|     57|	case X509_NAME_ATTR_L:
  ------------------
  |  Branch (473:2): [True: 57, False: 3.90k]
  ------------------
  474|     57|		return "L";
  475|     26|	case X509_NAME_ATTR_ST:
  ------------------
  |  Branch (475:2): [True: 26, False: 3.93k]
  ------------------
  476|     26|		return "ST";
  477|  1.26k|	case X509_NAME_ATTR_O:
  ------------------
  |  Branch (477:2): [True: 1.26k, False: 2.70k]
  ------------------
  478|  1.26k|		return "O";
  479|    183|	case X509_NAME_ATTR_OU:
  ------------------
  |  Branch (479:2): [True: 183, False: 3.77k]
  ------------------
  480|    183|		return "OU";
  481|  3.96k|	}
  482|      0|	return "?";
  483|  3.96k|}
x509v3.c:parse_uint2:
  536|  37.2k|{
  537|  37.2k|	char buf[3];
  538|  37.2k|	int ret;
  539|       |
  540|  37.2k|	if (len < 2)
  ------------------
  |  Branch (540:6): [True: 0, False: 37.2k]
  ------------------
  541|      0|		return -1;
  542|  37.2k|	buf[0] = pos[0];
  543|  37.2k|	buf[1] = pos[1];
  544|  37.2k|	buf[2] = 0x00;
  545|  37.2k|	if (sscanf(buf, "%2d", &ret) != 1)
  ------------------
  |  Branch (545:6): [True: 13, False: 37.2k]
  ------------------
  546|     13|		return -1;
  547|  37.2k|	return ret;
  548|  37.2k|}
x509v3.c:parse_uint4:
  552|     53|{
  553|     53|	char buf[5];
  554|     53|	int ret;
  555|       |
  556|     53|	if (len < 4)
  ------------------
  |  Branch (556:6): [True: 0, False: 53]
  ------------------
  557|      0|		return -1;
  558|     53|	buf[0] = pos[0];
  559|     53|	buf[1] = pos[1];
  560|     53|	buf[2] = pos[2];
  561|     53|	buf[3] = pos[3];
  562|     53|	buf[4] = 0x00;
  563|     53|	if (sscanf(buf, "%4d", &ret) != 1)
  ------------------
  |  Branch (563:6): [True: 2, False: 51]
  ------------------
  564|      2|		return -1;
  565|     51|	return ret;
  566|     53|}
x509v3.c:x509_parse_tbs_certificate:
 1458|  3.75k|{
 1459|  3.75k|	struct asn1_hdr hdr;
 1460|  3.75k|	const u8 *pos, *end;
 1461|  3.75k|	size_t left;
 1462|  3.75k|	char sbuf[128];
 1463|  3.75k|	unsigned long value;
 1464|  3.75k|	const u8 *subject_dn;
 1465|       |
 1466|       |	/* tbsCertificate TBSCertificate ::= SEQUENCE */
 1467|  3.75k|	if (asn1_get_next(buf, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1467:6): [True: 29, False: 3.72k]
  |  Branch (1467:43): [True: 15, False: 3.71k]
  ------------------
 1468|     44|		asn1_unexpected(&hdr,
 1469|     44|				"X509: tbsCertificate did not start with a valid SEQUENCE");
 1470|     44|		return -1;
 1471|     44|	}
 1472|  3.71k|	pos = hdr.payload;
 1473|  3.71k|	end = *next = pos + hdr.length;
 1474|       |
 1475|       |	/*
 1476|       |	 * version [0]  EXPLICIT Version DEFAULT v1
 1477|       |	 * Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }
 1478|       |	 */
 1479|  3.71k|	if (asn1_get_next(pos, end - pos, &hdr) < 0)
  ------------------
  |  Branch (1479:6): [True: 16, False: 3.69k]
  ------------------
 1480|     16|		return -1;
 1481|  3.69k|	pos = hdr.payload;
 1482|       |
 1483|  3.69k|	if (asn1_is_cs_tag(&hdr, 0) && hdr.constructed) {
  ------------------
  |  Branch (1483:6): [True: 2.85k, False: 835]
  |  Branch (1483:33): [True: 2.85k, False: 1]
  ------------------
 1484|  2.85k|		if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1484:7): [True: 8, False: 2.85k]
  ------------------
 1485|  2.85k|		    !asn1_is_integer(&hdr)) {
  ------------------
  |  Branch (1485:7): [True: 12, False: 2.83k]
  ------------------
 1486|     20|			asn1_unexpected(&hdr,
 1487|     20|					"X509: No INTEGER tag found for version field");
 1488|     20|			return -1;
 1489|     20|		}
 1490|  2.83k|		if (hdr.length != 1) {
  ------------------
  |  Branch (1490:7): [True: 1, False: 2.83k]
  ------------------
 1491|      1|			wpa_printf(MSG_DEBUG, "X509: Unexpected version field "
 1492|      1|				   "length %u (expected 1)", hdr.length);
 1493|      1|			return -1;
 1494|      1|		}
 1495|  2.83k|		pos = hdr.payload;
 1496|  2.83k|		left = hdr.length;
 1497|  2.83k|		value = 0;
 1498|  5.67k|		while (left) {
  ------------------
  |  Branch (1498:10): [True: 2.83k, False: 2.83k]
  ------------------
 1499|  2.83k|			value <<= 8;
 1500|  2.83k|			value |= *pos++;
 1501|  2.83k|			left--;
 1502|  2.83k|		}
 1503|       |
 1504|  2.83k|		cert->version = value;
 1505|  2.83k|		if (cert->version != X509_CERT_V1 &&
  ------------------
  |  Branch (1505:7): [True: 1.80k, False: 1.03k]
  ------------------
 1506|  1.80k|		    cert->version != X509_CERT_V2 &&
  ------------------
  |  Branch (1506:7): [True: 1.77k, False: 36]
  ------------------
 1507|  1.77k|		    cert->version != X509_CERT_V3) {
  ------------------
  |  Branch (1507:7): [True: 10, False: 1.76k]
  ------------------
 1508|     10|			wpa_printf(MSG_DEBUG, "X509: Unsupported version %d",
 1509|     10|				   cert->version + 1);
 1510|     10|			return -1;
 1511|     10|		}
 1512|       |
 1513|  2.82k|		if (asn1_get_next(pos, end - pos, &hdr) < 0)
  ------------------
  |  Branch (1513:7): [True: 3, False: 2.82k]
  ------------------
 1514|      3|			return -1;
 1515|  2.82k|	} else
 1516|    836|		cert->version = X509_CERT_V1;
 1517|  3.66k|	wpa_printf(MSG_MSGDUMP, "X509: Version X.509v%d", cert->version + 1);
 1518|       |
 1519|       |	/* serialNumber CertificateSerialNumber ::= INTEGER */
 1520|  3.66k|	if (!asn1_is_integer(&hdr) ||
  ------------------
  |  Branch (1520:6): [True: 29, False: 3.63k]
  ------------------
 1521|  3.63k|	    hdr.length < 1 || hdr.length > X509_MAX_SERIAL_NUM_LEN) {
  ------------------
  |  |   48|  3.63k|#define X509_MAX_SERIAL_NUM_LEN 20
  ------------------
  |  Branch (1521:6): [True: 1, False: 3.63k]
  |  Branch (1521:24): [True: 3, False: 3.62k]
  ------------------
 1522|     33|		asn1_unexpected(&hdr,
 1523|     33|				"X509: No INTEGER tag found for serialNumber");
 1524|     33|		return -1;
 1525|     33|	}
 1526|       |
 1527|  3.62k|	pos = hdr.payload + hdr.length;
 1528|  7.46k|	while (hdr.length > 0 && hdr.payload[0] == 0) {
  ------------------
  |  Branch (1528:9): [True: 7.38k, False: 81]
  |  Branch (1528:27): [True: 3.84k, False: 3.54k]
  ------------------
 1529|  3.84k|		hdr.payload++;
 1530|  3.84k|		hdr.length--;
 1531|  3.84k|	}
 1532|  3.62k|	os_memcpy(cert->serial_number, hdr.payload, hdr.length);
  ------------------
  |  |  523|  3.62k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
 1533|  3.62k|	cert->serial_number_len = hdr.length;
 1534|  3.62k|	wpa_hexdump(MSG_MSGDUMP, "X509: serialNumber", cert->serial_number,
 1535|  3.62k|		    cert->serial_number_len);
 1536|       |
 1537|       |	/* signature AlgorithmIdentifier */
 1538|  3.62k|	if (x509_parse_algorithm_identifier(pos, end - pos, &cert->signature,
  ------------------
  |  Branch (1538:6): [True: 74, False: 3.55k]
  ------------------
 1539|  3.62k|					    &pos))
 1540|     74|		return -1;
 1541|       |
 1542|       |	/* issuer Name */
 1543|  3.55k|	if (x509_parse_name(pos, end - pos, &cert->issuer, &pos))
  ------------------
  |  Branch (1543:6): [True: 308, False: 3.24k]
  ------------------
 1544|    308|		return -1;
 1545|  3.24k|	x509_name_string(&cert->issuer, sbuf, sizeof(sbuf));
 1546|  3.24k|	wpa_printf(MSG_MSGDUMP, "X509: issuer %s", sbuf);
 1547|       |
 1548|       |	/* validity Validity */
 1549|  3.24k|	if (x509_parse_validity(pos, end - pos, cert, &pos))
  ------------------
  |  Branch (1549:6): [True: 179, False: 3.06k]
  ------------------
 1550|    179|		return -1;
 1551|       |
 1552|       |	/* subject Name */
 1553|  3.06k|	subject_dn = pos;
 1554|  3.06k|	if (x509_parse_name(pos, end - pos, &cert->subject, &pos))
  ------------------
  |  Branch (1554:6): [True: 11, False: 3.05k]
  ------------------
 1555|     11|		return -1;
 1556|  3.05k|	cert->subject_dn = os_malloc(pos - subject_dn);
  ------------------
  |  |  505|  3.05k|#define os_malloc(s) malloc((s))
  ------------------
 1557|  3.05k|	if (!cert->subject_dn)
  ------------------
  |  Branch (1557:6): [True: 0, False: 3.05k]
  ------------------
 1558|      0|		return -1;
 1559|  3.05k|	cert->subject_dn_len = pos - subject_dn;
 1560|  3.05k|	os_memcpy(cert->subject_dn, subject_dn, cert->subject_dn_len);
  ------------------
  |  |  523|  3.05k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
 1561|  3.05k|	x509_name_string(&cert->subject, sbuf, sizeof(sbuf));
 1562|  3.05k|	wpa_printf(MSG_MSGDUMP, "X509: subject %s", sbuf);
 1563|       |
 1564|       |	/* subjectPublicKeyInfo SubjectPublicKeyInfo */
 1565|  3.05k|	if (x509_parse_public_key(pos, end - pos, cert, &pos))
  ------------------
  |  Branch (1565:6): [True: 36, False: 3.01k]
  ------------------
 1566|     36|		return -1;
 1567|       |
 1568|  3.01k|	if (pos == end)
  ------------------
  |  Branch (1568:6): [True: 275, False: 2.74k]
  ------------------
 1569|    275|		return 0;
 1570|       |
 1571|  2.74k|	if (cert->version == X509_CERT_V1)
  ------------------
  |  Branch (1571:6): [True: 1.01k, False: 1.72k]
  ------------------
 1572|  1.01k|		return 0;
 1573|       |
 1574|  1.72k|	if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1574:6): [True: 5, False: 1.72k]
  ------------------
 1575|  1.72k|	    hdr.class != ASN1_CLASS_CONTEXT_SPECIFIC) {
  ------------------
  |  |   45|  1.72k|#define ASN1_CLASS_CONTEXT_SPECIFIC	2
  ------------------
  |  Branch (1575:6): [True: 5, False: 1.71k]
  ------------------
 1576|     10|		asn1_unexpected(&hdr,
 1577|     10|				"X509: Expected Context-Specific tag to parse optional tbsCertificate field(s)");
 1578|     10|		return -1;
 1579|     10|	}
 1580|       |
 1581|  1.71k|	if (hdr.tag == 1) {
  ------------------
  |  Branch (1581:6): [True: 55, False: 1.66k]
  ------------------
 1582|       |		/* issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL */
 1583|     55|		wpa_printf(MSG_DEBUG, "X509: issuerUniqueID");
 1584|       |		/* TODO: parse UniqueIdentifier ::= BIT STRING */
 1585|       |
 1586|     55|		pos = hdr.payload + hdr.length;
 1587|     55|		if (pos == end)
  ------------------
  |  Branch (1587:7): [True: 38, False: 17]
  ------------------
 1588|     38|			return 0;
 1589|       |
 1590|     17|		if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1590:7): [True: 1, False: 16]
  ------------------
 1591|     16|		    hdr.class != ASN1_CLASS_CONTEXT_SPECIFIC) {
  ------------------
  |  |   45|     16|#define ASN1_CLASS_CONTEXT_SPECIFIC	2
  ------------------
  |  Branch (1591:7): [True: 2, False: 14]
  ------------------
 1592|      3|			asn1_unexpected(&hdr,
 1593|      3|					"X509: Expected Context-Specific tag to parse optional tbsCertificate field(s)");
 1594|      3|			return -1;
 1595|      3|		}
 1596|     17|	}
 1597|       |
 1598|  1.67k|	if (hdr.tag == 2) {
  ------------------
  |  Branch (1598:6): [True: 207, False: 1.46k]
  ------------------
 1599|       |		/* subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL */
 1600|    207|		wpa_printf(MSG_DEBUG, "X509: subjectUniqueID");
 1601|       |		/* TODO: parse UniqueIdentifier ::= BIT STRING */
 1602|       |
 1603|    207|		pos = hdr.payload + hdr.length;
 1604|    207|		if (pos == end)
  ------------------
  |  Branch (1604:7): [True: 48, False: 159]
  ------------------
 1605|     48|			return 0;
 1606|       |
 1607|    159|		if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1607:7): [True: 1, False: 158]
  ------------------
 1608|    158|		    hdr.class != ASN1_CLASS_CONTEXT_SPECIFIC) {
  ------------------
  |  |   45|    158|#define ASN1_CLASS_CONTEXT_SPECIFIC	2
  ------------------
  |  Branch (1608:7): [True: 3, False: 155]
  ------------------
 1609|      4|			asn1_unexpected(&hdr,
 1610|      4|					"X509: Expected Context-Specific tag to parse optional tbsCertificate field(s)");
 1611|      4|			return -1;
 1612|      4|		}
 1613|    159|	}
 1614|       |
 1615|  1.62k|	if (hdr.tag != 3) {
  ------------------
  |  Branch (1615:6): [True: 617, False: 1.00k]
  ------------------
 1616|    617|		wpa_printf(MSG_DEBUG,
 1617|    617|			   "X509: Ignored unexpected Context-Specific constructed %d tag %d in optional tbsCertificate fields",
 1618|    617|			   hdr.constructed, hdr.tag);
 1619|    617|		return 0;
 1620|    617|	}
 1621|       |
 1622|       |	/* extensions      [3]  EXPLICIT Extensions OPTIONAL */
 1623|       |
 1624|  1.00k|	if (cert->version != X509_CERT_V3) {
  ------------------
  |  Branch (1624:6): [True: 2, False: 1.00k]
  ------------------
 1625|      2|		wpa_printf(MSG_DEBUG, "X509: X.509%d certificate and "
 1626|      2|			   "Extensions data which are only allowed for "
 1627|      2|			   "version 3", cert->version + 1);
 1628|      2|		return -1;
 1629|      2|	}
 1630|       |
 1631|  1.00k|	if (x509_parse_extensions(cert, hdr.payload, hdr.length) < 0)
  ------------------
  |  Branch (1631:6): [True: 407, False: 597]
  ------------------
 1632|    407|		return -1;
 1633|       |
 1634|    597|	pos = hdr.payload + hdr.length;
 1635|    597|	if (pos < end) {
  ------------------
  |  Branch (1635:6): [True: 19, False: 578]
  ------------------
 1636|     19|		wpa_hexdump(MSG_DEBUG,
 1637|     19|			    "X509: Ignored extra tbsCertificate data",
 1638|     19|			    pos, end - pos);
 1639|     19|	}
 1640|       |
 1641|    597|	return 0;
 1642|  1.00k|}
x509v3.c:x509_parse_validity:
  688|  3.24k|{
  689|  3.24k|	struct asn1_hdr hdr;
  690|  3.24k|	const u8 *pos;
  691|  3.24k|	size_t plen;
  692|       |
  693|       |	/*
  694|       |	 * Validity ::= SEQUENCE {
  695|       |	 *     notBefore      Time,
  696|       |	 *     notAfter       Time
  697|       |	 * }
  698|       |	 *
  699|       |	 * RFC 3280, 4.1.2.5:
  700|       |	 * CAs conforming to this profile MUST always encode certificate
  701|       |	 * validity dates through the year 2049 as UTCTime; certificate
  702|       |	 * validity dates in 2050 or later MUST be encoded as GeneralizedTime.
  703|       |	 */
  704|       |
  705|  3.24k|	if (asn1_get_next(buf, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (705:6): [True: 42, False: 3.20k]
  |  Branch (705:43): [True: 21, False: 3.18k]
  ------------------
  706|     63|		asn1_unexpected(&hdr, "X509: Expected SEQUENCE (Validity)");
  707|     63|		return -1;
  708|     63|	}
  709|  3.18k|	pos = hdr.payload;
  710|  3.18k|	plen = hdr.length;
  711|       |
  712|  3.18k|	if (plen > (size_t) (buf + len - pos))
  ------------------
  |  Branch (712:6): [True: 0, False: 3.18k]
  ------------------
  713|      0|		return -1;
  714|       |
  715|  3.18k|	*next = pos + plen;
  716|       |
  717|  3.18k|	if (asn1_get_next(pos, plen, &hdr) < 0 ||
  ------------------
  |  Branch (717:6): [True: 8, False: 3.17k]
  ------------------
  718|  3.17k|	    (!asn1_is_utctime(&hdr) && !asn1_is_generalizedtime(&hdr)) ||
  ------------------
  |  Branch (718:7): [True: 58, False: 3.11k]
  |  Branch (718:33): [True: 22, False: 36]
  ------------------
  719|  3.15k|	    x509_parse_time(hdr.payload, hdr.length, hdr.tag,
  ------------------
  |  Branch (719:6): [True: 35, False: 3.11k]
  ------------------
  720|  3.15k|			    &cert->not_before) < 0) {
  721|     65|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse notBefore "
  722|     65|				  "Time", hdr.payload, hdr.length);
  723|     65|		return -1;
  724|     65|	}
  725|       |
  726|  3.11k|	pos = hdr.payload + hdr.length;
  727|  3.11k|	plen = *next - pos;
  728|       |
  729|  3.11k|	if (asn1_get_next(pos, plen, &hdr) < 0 ||
  ------------------
  |  Branch (729:6): [True: 1, False: 3.11k]
  ------------------
  730|  3.11k|	    (!asn1_is_utctime(&hdr) && !asn1_is_generalizedtime(&hdr)) ||
  ------------------
  |  Branch (730:7): [True: 38, False: 3.07k]
  |  Branch (730:33): [True: 15, False: 23]
  ------------------
  731|  3.10k|	    x509_parse_time(hdr.payload, hdr.length, hdr.tag,
  ------------------
  |  Branch (731:6): [True: 35, False: 3.06k]
  ------------------
  732|  3.10k|			    &cert->not_after) < 0) {
  733|     51|		wpa_hexdump_ascii(MSG_DEBUG, "X509: Failed to parse notAfter "
  734|     51|				  "Time", hdr.payload, hdr.length);
  735|     51|		return -1;
  736|     51|	}
  737|       |
  738|  3.06k|	wpa_printf(MSG_MSGDUMP, "X509: Validity: notBefore: %lu notAfter: %lu",
  739|  3.06k|		   (unsigned long) cert->not_before,
  740|  3.06k|		   (unsigned long) cert->not_after);
  741|       |
  742|  3.06k|	return 0;
  743|  3.11k|}
x509v3.c:x509_parse_public_key:
  219|  3.05k|{
  220|  3.05k|	struct asn1_hdr hdr;
  221|  3.05k|	const u8 *pos, *end;
  222|       |
  223|       |	/*
  224|       |	 * SubjectPublicKeyInfo ::= SEQUENCE {
  225|       |	 *     algorithm            AlgorithmIdentifier,
  226|       |	 *     subjectPublicKey     BIT STRING
  227|       |	 * }
  228|       |	 */
  229|       |
  230|  3.05k|	pos = buf;
  231|  3.05k|	end = buf + len;
  232|       |
  233|  3.05k|	if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (233:6): [True: 2, False: 3.05k]
  ------------------
  234|  3.05k|	    !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (234:6): [True: 11, False: 3.04k]
  ------------------
  235|     13|		asn1_unexpected(&hdr,
  236|     13|				"X509: Expected SEQUENCE (SubjectPublicKeyInfo)");
  237|     13|		return -1;
  238|     13|	}
  239|  3.04k|	pos = hdr.payload;
  240|       |
  241|  3.04k|	if (hdr.length > end - pos)
  ------------------
  |  Branch (241:6): [True: 0, False: 3.04k]
  ------------------
  242|      0|		return -1;
  243|  3.04k|	end = pos + hdr.length;
  244|  3.04k|	*next = end;
  245|       |
  246|  3.04k|	if (x509_parse_algorithm_identifier(pos, end - pos,
  ------------------
  |  Branch (246:6): [True: 13, False: 3.02k]
  ------------------
  247|  3.04k|					    &cert->public_key_alg, &pos))
  248|     13|		return -1;
  249|       |
  250|  3.02k|	if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (250:6): [True: 3, False: 3.02k]
  ------------------
  251|  3.02k|	    !asn1_is_bitstring(&hdr)) {
  ------------------
  |  Branch (251:6): [True: 6, False: 3.02k]
  ------------------
  252|      9|		asn1_unexpected(&hdr,
  253|      9|				"X509: Expected BITSTRING (subjectPublicKey)");
  254|      9|		return -1;
  255|      9|	}
  256|  3.02k|	if (hdr.length < 1)
  ------------------
  |  Branch (256:6): [True: 1, False: 3.01k]
  ------------------
  257|      1|		return -1;
  258|  3.01k|	pos = hdr.payload;
  259|  3.01k|	if (*pos) {
  ------------------
  |  Branch (259:6): [True: 1.24k, False: 1.77k]
  ------------------
  260|  1.24k|		wpa_printf(MSG_DEBUG,
  261|  1.24k|			   "X509: BITSTRING (subjectPublicKey) - %d unused bits",
  262|  1.24k|			   *pos);
  263|       |		/*
  264|       |		 * TODO: should this be rejected? X.509 certificates are
  265|       |		 * unlikely to use such a construction. Now we would end up
  266|       |		 * including the extra bits in the buffer which may also be
  267|       |		 * ok.
  268|       |		 */
  269|  1.24k|	}
  270|  3.01k|	os_free(cert->public_key);
  ------------------
  |  |  511|  3.01k|#define os_free(p) free((p))
  ------------------
  271|  3.01k|	cert->public_key = os_memdup(pos + 1, hdr.length - 1);
  272|  3.01k|	if (cert->public_key == NULL) {
  ------------------
  |  Branch (272:6): [True: 0, False: 3.01k]
  ------------------
  273|      0|		wpa_printf(MSG_DEBUG, "X509: Failed to allocate memory for "
  274|      0|			   "public key");
  275|      0|		return -1;
  276|      0|	}
  277|  3.01k|	cert->public_key_len = hdr.length - 1;
  278|  3.01k|	wpa_hexdump(MSG_MSGDUMP, "X509: subjectPublicKey",
  279|  3.01k|		    cert->public_key, cert->public_key_len);
  280|       |
  281|  3.01k|	return 0;
  282|  3.01k|}
x509v3.c:x509_parse_extensions:
 1431|  1.00k|{
 1432|  1.00k|	const u8 *end;
 1433|  1.00k|	struct asn1_hdr hdr;
 1434|       |
 1435|       |	/* Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension */
 1436|       |
 1437|  1.00k|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1437:6): [True: 1, False: 1.00k]
  |  Branch (1437:43): [True: 10, False: 993]
  ------------------
 1438|     11|		asn1_unexpected(&hdr, "X509: Expected SEQUENCE for Extensions");
 1439|     11|		return -1;
 1440|     11|	}
 1441|       |
 1442|    993|	pos = hdr.payload;
 1443|    993|	end = pos + hdr.length;
 1444|       |
 1445|  4.69k|	while (pos < end) {
  ------------------
  |  Branch (1445:9): [True: 4.09k, False: 597]
  ------------------
 1446|  4.09k|		if (x509_parse_extension(cert, pos, end - pos, &pos)
  ------------------
  |  Branch (1446:7): [True: 396, False: 3.70k]
  ------------------
 1447|  4.09k|		    < 0)
 1448|    396|			return -1;
 1449|  4.09k|	}
 1450|       |
 1451|    597|	return 0;
 1452|    993|}
x509v3.c:x509_parse_extension:
 1357|  4.09k|{
 1358|  4.09k|	const u8 *end;
 1359|  4.09k|	struct asn1_hdr hdr;
 1360|  4.09k|	struct asn1_oid oid;
 1361|  4.09k|	int critical_ext = 0, res;
 1362|  4.09k|	char buf[80];
 1363|       |
 1364|       |	/*
 1365|       |	 * Extension  ::=  SEQUENCE  {
 1366|       |	 *     extnID      OBJECT IDENTIFIER,
 1367|       |	 *     critical    BOOLEAN DEFAULT FALSE,
 1368|       |	 *     extnValue   OCTET STRING
 1369|       |	 * }
 1370|       |	 */
 1371|       |
 1372|  4.09k|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1372:6): [True: 36, False: 4.06k]
  |  Branch (1372:43): [True: 26, False: 4.03k]
  ------------------
 1373|     62|		asn1_unexpected(&hdr, "X509: Expected SEQUENCE in Extensions");
 1374|     62|		return -1;
 1375|     62|	}
 1376|  4.03k|	pos = hdr.payload;
 1377|  4.03k|	*next = end = pos + hdr.length;
 1378|       |
 1379|  4.03k|	if (asn1_get_oid(pos, end - pos, &oid, &pos) < 0) {
  ------------------
  |  Branch (1379:6): [True: 9, False: 4.02k]
  ------------------
 1380|      9|		wpa_printf(MSG_DEBUG, "X509: Unexpected ASN.1 data for "
 1381|      9|			   "Extension (expected OID)");
 1382|      9|		return -1;
 1383|      9|	}
 1384|       |
 1385|  4.02k|	if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1385:6): [True: 6, False: 4.02k]
  ------------------
 1386|  4.02k|	    (!asn1_is_boolean(&hdr) && !asn1_is_octetstring(&hdr))) {
  ------------------
  |  Branch (1386:7): [True: 3.98k, False: 38]
  |  Branch (1386:33): [True: 12, False: 3.97k]
  ------------------
 1387|     18|		asn1_unexpected(&hdr,
 1388|     18|				"X509: Expected BOOLEAN or OCTETSTRING in Extensions");
 1389|     18|		return -1;
 1390|     18|	}
 1391|       |
 1392|  4.00k|	if (hdr.tag == ASN1_TAG_BOOLEAN) {
  ------------------
  |  |   13|  4.00k|#define ASN1_TAG_BOOLEAN	0x01
  ------------------
  |  Branch (1392:6): [True: 38, False: 3.97k]
  ------------------
 1393|     38|		critical_ext = hdr.payload[0];
 1394|     38|		pos = hdr.payload;
 1395|       |		/*
 1396|       |		 * Number of CA certificates seem to be using Private class in
 1397|       |		 * one of the X.509v3 extensions, so let's accept that instead
 1398|       |		 * of rejecting the certificate. asn1_is_octetstring() covers
 1399|       |		 * the more common case.
 1400|       |		 */
 1401|     38|		if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1401:7): [True: 2, False: 36]
  ------------------
 1402|     36|		    (!asn1_is_octetstring(&hdr) &&
  ------------------
  |  Branch (1402:8): [True: 36, False: 0]
  ------------------
 1403|     36|		     !(hdr.class == ASN1_CLASS_PRIVATE &&
  ------------------
  |  |   46|     72|#define ASN1_CLASS_PRIVATE		3
  ------------------
  |  Branch (1403:10): [True: 34, False: 2]
  ------------------
 1404|     34|		       hdr.tag == ASN1_TAG_OCTETSTRING))) {
  ------------------
  |  |   16|     34|#define ASN1_TAG_OCTETSTRING	0x04
  ------------------
  |  Branch (1404:10): [True: 30, False: 4]
  ------------------
 1405|      8|			asn1_unexpected(&hdr,
 1406|      8|					"X509: Expected OCTETSTRING in Extensions");
 1407|      8|			return -1;
 1408|      8|		}
 1409|     38|	}
 1410|       |
 1411|  4.00k|	asn1_oid_to_str(&oid, buf, sizeof(buf));
 1412|  4.00k|	wpa_printf(MSG_DEBUG, "X509: Extension: extnID=%s critical=%d",
 1413|  4.00k|		   buf, critical_ext);
 1414|  4.00k|	wpa_hexdump(MSG_MSGDUMP, "X509: extnValue", hdr.payload, hdr.length);
 1415|       |
 1416|  4.00k|	res = x509_parse_extension_data(cert, &oid, hdr.payload, hdr.length);
 1417|  4.00k|	if (res < 0)
  ------------------
  |  Branch (1417:6): [True: 298, False: 3.70k]
  ------------------
 1418|    298|		return res;
 1419|  3.70k|	if (res == 1 && critical_ext) {
  ------------------
  |  Branch (1419:6): [True: 2.36k, False: 1.34k]
  |  Branch (1419:18): [True: 1, False: 2.35k]
  ------------------
 1420|      1|		wpa_printf(MSG_INFO, "X509: Unknown critical extension %s",
 1421|      1|			   buf);
 1422|      1|		return -1;
 1423|      1|	}
 1424|       |
 1425|  3.70k|	return 0;
 1426|  3.70k|}
x509v3.c:x509_parse_extension_data:
 1327|  4.00k|{
 1328|  4.00k|	if (!x509_id_ce_oid(oid))
  ------------------
  |  Branch (1328:6): [True: 1.54k, False: 2.45k]
  ------------------
 1329|  1.54k|		return 1;
 1330|       |
 1331|       |	/* TODO: add other extensions required by RFC 3280, Ch 4.2:
 1332|       |	 * name constraints (section 4.2.1.11)
 1333|       |	 * policy constraints (section 4.2.1.12)
 1334|       |	 * inhibit any-policy (section 4.2.1.15)
 1335|       |	 */
 1336|  2.45k|	switch (oid->oid[3]) {
 1337|     79|	case 15: /* id-ce-keyUsage */
  ------------------
  |  Branch (1337:2): [True: 79, False: 2.37k]
  ------------------
 1338|     79|		return x509_parse_ext_key_usage(cert, pos, len);
 1339|    283|	case 17: /* id-ce-subjectAltName */
  ------------------
  |  Branch (1339:2): [True: 283, False: 2.16k]
  ------------------
 1340|    283|		return x509_parse_ext_subject_alt_name(cert, pos, len);
 1341|    120|	case 18: /* id-ce-issuerAltName */
  ------------------
  |  Branch (1341:2): [True: 120, False: 2.33k]
  ------------------
 1342|    120|		return x509_parse_ext_issuer_alt_name(cert, pos, len);
 1343|    395|	case 19: /* id-ce-basicConstraints */
  ------------------
  |  Branch (1343:2): [True: 395, False: 2.05k]
  ------------------
 1344|    395|		return x509_parse_ext_basic_constraints(cert, pos, len);
 1345|    387|	case 32: /* id-ce-certificatePolicies */
  ------------------
  |  Branch (1345:2): [True: 387, False: 2.06k]
  ------------------
 1346|    387|		return x509_parse_ext_certificate_policies(cert, pos, len);
 1347|    377|	case 37: /* id-ce-extKeyUsage */
  ------------------
  |  Branch (1347:2): [True: 377, False: 2.07k]
  ------------------
 1348|    377|		return x509_parse_ext_ext_key_usage(cert, pos, len);
 1349|    811|	default:
  ------------------
  |  Branch (1349:2): [True: 811, False: 1.64k]
  ------------------
 1350|    811|		return 1;
 1351|  2.45k|	}
 1352|  2.45k|}
x509v3.c:x509_id_ce_oid:
  747|  4.28k|{
  748|       |	/* id-ce arc from X.509 for standard X.509v3 extensions */
  749|  4.28k|	return oid->len >= 4 &&
  ------------------
  |  Branch (749:9): [True: 3.90k, False: 383]
  ------------------
  750|  3.90k|		oid->oid[0] == 2 /* joint-iso-ccitt */ &&
  ------------------
  |  Branch (750:3): [True: 3.30k, False: 601]
  ------------------
  751|  3.30k|		oid->oid[1] == 5 /* ds */ &&
  ------------------
  |  Branch (751:3): [True: 2.79k, False: 510]
  ------------------
  752|  2.79k|		oid->oid[2] == 29 /* id-ce */;
  ------------------
  |  Branch (752:3): [True: 2.50k, False: 286]
  ------------------
  753|  4.28k|}
x509v3.c:x509_parse_ext_key_usage:
  767|     79|{
  768|     79|	struct asn1_hdr hdr;
  769|       |
  770|       |	/*
  771|       |	 * KeyUsage ::= BIT STRING {
  772|       |	 *     digitalSignature        (0),
  773|       |	 *     nonRepudiation          (1),
  774|       |	 *     keyEncipherment         (2),
  775|       |	 *     dataEncipherment        (3),
  776|       |	 *     keyAgreement            (4),
  777|       |	 *     keyCertSign             (5),
  778|       |	 *     cRLSign                 (6),
  779|       |	 *     encipherOnly            (7),
  780|       |	 *     decipherOnly            (8) }
  781|       |	 */
  782|       |
  783|     79|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_bitstring(&hdr) ||
  ------------------
  |  Branch (783:6): [True: 3, False: 76]
  |  Branch (783:43): [True: 10, False: 66]
  ------------------
  784|     66|	    hdr.length < 1) {
  ------------------
  |  Branch (784:6): [True: 1, False: 65]
  ------------------
  785|     14|		asn1_unexpected(&hdr, "X509: Expected BIT STRING in KeyUsage");
  786|     14|		return -1;
  787|     14|	}
  788|       |
  789|     65|	cert->extensions_present |= X509_EXT_KEY_USAGE;
  ------------------
  |  |   73|     65|#define X509_EXT_KEY_USAGE			(1 << 2)
  ------------------
  790|     65|	cert->key_usage = asn1_bit_string_to_long(hdr.payload, hdr.length);
  791|       |
  792|     65|	wpa_printf(MSG_DEBUG, "X509: KeyUsage 0x%lx", cert->key_usage);
  793|       |
  794|     65|	return 0;
  795|     79|}
x509v3.c:x509_parse_ext_subject_alt_name:
 1051|    283|{
 1052|    283|	struct asn1_hdr hdr;
 1053|       |
 1054|       |	/* SubjectAltName ::= GeneralNames */
 1055|       |
 1056|    283|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1056:6): [True: 3, False: 280]
  |  Branch (1056:43): [True: 6, False: 274]
  ------------------
 1057|      9|		asn1_unexpected(&hdr,
 1058|      9|				"X509: Expected SEQUENCE in SubjectAltName");
 1059|      9|		return -1;
 1060|      9|	}
 1061|       |
 1062|    274|	wpa_printf(MSG_DEBUG, "X509: SubjectAltName");
 1063|    274|	cert->extensions_present |= X509_EXT_SUBJECT_ALT_NAME;
  ------------------
  |  |   74|    274|#define X509_EXT_SUBJECT_ALT_NAME		(1 << 3)
  ------------------
 1064|       |
 1065|    274|	if (hdr.length == 0)
  ------------------
  |  Branch (1065:6): [True: 25, False: 249]
  ------------------
 1066|     25|		return 0;
 1067|       |
 1068|    249|	return x509_parse_ext_alt_name(&cert->subject, hdr.payload,
 1069|    249|				       hdr.length);
 1070|    274|}
x509v3.c:x509_parse_ext_alt_name:
  973|    307|{
  974|    307|	struct asn1_hdr hdr;
  975|    307|	const u8 *p, *end;
  976|       |
  977|       |	/*
  978|       |	 * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
  979|       |	 *
  980|       |	 * GeneralName ::= CHOICE {
  981|       |	 *     otherName                       [0]     OtherName,
  982|       |	 *     rfc822Name                      [1]     IA5String,
  983|       |	 *     dNSName                         [2]     IA5String,
  984|       |	 *     x400Address                     [3]     ORAddress,
  985|       |	 *     directoryName                   [4]     Name,
  986|       |	 *     ediPartyName                    [5]     EDIPartyName,
  987|       |	 *     uniformResourceIdentifier       [6]     IA5String,
  988|       |	 *     iPAddress                       [7]     OCTET STRING,
  989|       |	 *     registeredID                    [8]     OBJECT IDENTIFIER }
  990|       |	 *
  991|       |	 * OtherName ::= SEQUENCE {
  992|       |	 *     type-id    OBJECT IDENTIFIER,
  993|       |	 *     value      [0] EXPLICIT ANY DEFINED BY type-id }
  994|       |	 *
  995|       |	 * EDIPartyName ::= SEQUENCE {
  996|       |	 *     nameAssigner            [0]     DirectoryString OPTIONAL,
  997|       |	 *     partyName               [1]     DirectoryString }
  998|       |	 */
  999|       |
 1000|  1.12k|	for (p = pos, end = pos + len; p < end; p = hdr.payload + hdr.length) {
  ------------------
  |  Branch (1000:33): [True: 874, False: 255]
  ------------------
 1001|    874|		int res;
 1002|       |
 1003|    874|		if (asn1_get_next(p, end - p, &hdr) < 0) {
  ------------------
  |  Branch (1003:7): [True: 18, False: 856]
  ------------------
 1004|     18|			wpa_printf(MSG_DEBUG, "X509: Failed to parse "
 1005|     18|				   "SubjectAltName item");
 1006|     18|			return -1;
 1007|     18|		}
 1008|       |
 1009|    856|		if (hdr.class != ASN1_CLASS_CONTEXT_SPECIFIC)
  ------------------
  |  |   45|    856|#define ASN1_CLASS_CONTEXT_SPECIFIC	2
  ------------------
  |  Branch (1009:7): [True: 235, False: 621]
  ------------------
 1010|    235|			continue;
 1011|       |
 1012|    621|		switch (hdr.tag) {
 1013|     39|		case 1:
  ------------------
  |  Branch (1013:3): [True: 39, False: 582]
  ------------------
 1014|     39|			res = x509_parse_alt_name_rfc8222(name, hdr.payload,
 1015|     39|							  hdr.length);
 1016|     39|			break;
 1017|    176|		case 2:
  ------------------
  |  Branch (1017:3): [True: 176, False: 445]
  ------------------
 1018|    176|			res = x509_parse_alt_name_dns(name, hdr.payload,
 1019|    176|						      hdr.length);
 1020|    176|			break;
 1021|     47|		case 6:
  ------------------
  |  Branch (1021:3): [True: 47, False: 574]
  ------------------
 1022|     47|			res = x509_parse_alt_name_uri(name, hdr.payload,
 1023|     47|						      hdr.length);
 1024|     47|			break;
 1025|     43|		case 7:
  ------------------
  |  Branch (1025:3): [True: 43, False: 578]
  ------------------
 1026|     43|			res = x509_parse_alt_name_ip(name, hdr.payload,
 1027|     43|						     hdr.length);
 1028|     43|			break;
 1029|    203|		case 8:
  ------------------
  |  Branch (1029:3): [True: 203, False: 418]
  ------------------
 1030|    203|			res = x509_parse_alt_name_rid(name, hdr.payload,
 1031|    203|						      hdr.length);
 1032|    203|			break;
 1033|     52|		case 0: /* TODO: otherName */
  ------------------
  |  Branch (1033:3): [True: 52, False: 569]
  ------------------
 1034|     52|		case 3: /* TODO: x500Address */
  ------------------
  |  Branch (1034:3): [True: 0, False: 621]
  ------------------
 1035|     52|		case 4: /* TODO: directoryName */
  ------------------
  |  Branch (1035:3): [True: 0, False: 621]
  ------------------
 1036|     55|		case 5: /* TODO: ediPartyName */
  ------------------
  |  Branch (1036:3): [True: 3, False: 618]
  ------------------
 1037|    113|		default:
  ------------------
  |  Branch (1037:3): [True: 58, False: 563]
  ------------------
 1038|    113|			res = 0;
 1039|    113|			break;
 1040|    621|		}
 1041|    621|		if (res < 0)
  ------------------
  |  Branch (1041:7): [True: 34, False: 587]
  ------------------
 1042|     34|			return res;
 1043|    621|	}
 1044|       |
 1045|    255|	return 0;
 1046|    307|}
x509v3.c:x509_parse_alt_name_rfc8222:
  875|     39|{
  876|       |	/* rfc822Name IA5String */
  877|     39|	wpa_hexdump_ascii(MSG_MSGDUMP, "X509: altName - rfc822Name", pos, len);
  878|     39|	os_free(name->alt_email);
  ------------------
  |  |  511|     39|#define os_free(p) free((p))
  ------------------
  879|     39|	name->alt_email = os_zalloc(len + 1);
  880|     39|	if (name->alt_email == NULL)
  ------------------
  |  Branch (880:6): [True: 0, False: 39]
  ------------------
  881|      0|		return -1;
  882|     39|	os_memcpy(name->alt_email, pos, len);
  ------------------
  |  |  523|     39|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  883|     39|	if (os_strlen(name->alt_email) != len) {
  ------------------
  |  |  536|     39|#define os_strlen(s) strlen(s)
  ------------------
  |  Branch (883:6): [True: 5, False: 34]
  ------------------
  884|      5|		wpa_printf(MSG_INFO, "X509: Reject certificate with "
  885|      5|			   "embedded NUL byte in rfc822Name (%s[NUL])",
  886|      5|			   name->alt_email);
  887|      5|		os_free(name->alt_email);
  ------------------
  |  |  511|      5|#define os_free(p) free((p))
  ------------------
  888|      5|		name->alt_email = NULL;
  889|      5|		return -1;
  890|      5|	}
  891|     34|	return 0;
  892|     39|}
x509v3.c:x509_parse_alt_name_dns:
  897|    176|{
  898|       |	/* dNSName IA5String */
  899|    176|	wpa_hexdump_ascii(MSG_MSGDUMP, "X509: altName - dNSName", pos, len);
  900|    176|	os_free(name->dns);
  ------------------
  |  |  511|    176|#define os_free(p) free((p))
  ------------------
  901|    176|	name->dns = os_zalloc(len + 1);
  902|    176|	if (name->dns == NULL)
  ------------------
  |  Branch (902:6): [True: 0, False: 176]
  ------------------
  903|      0|		return -1;
  904|    176|	os_memcpy(name->dns, pos, len);
  ------------------
  |  |  523|    176|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  905|    176|	if (os_strlen(name->dns) != len) {
  ------------------
  |  |  536|    176|#define os_strlen(s) strlen(s)
  ------------------
  |  Branch (905:6): [True: 1, False: 175]
  ------------------
  906|      1|		wpa_printf(MSG_INFO, "X509: Reject certificate with "
  907|      1|			   "embedded NUL byte in dNSName (%s[NUL])",
  908|      1|			   name->dns);
  909|      1|		os_free(name->dns);
  ------------------
  |  |  511|      1|#define os_free(p) free((p))
  ------------------
  910|      1|		name->dns = NULL;
  911|      1|		return -1;
  912|      1|	}
  913|    175|	return 0;
  914|    176|}
x509v3.c:x509_parse_alt_name_uri:
  919|     47|{
  920|       |	/* uniformResourceIdentifier IA5String */
  921|     47|	wpa_hexdump_ascii(MSG_MSGDUMP,
  922|     47|			  "X509: altName - uniformResourceIdentifier",
  923|     47|			  pos, len);
  924|     47|	os_free(name->uri);
  ------------------
  |  |  511|     47|#define os_free(p) free((p))
  ------------------
  925|     47|	name->uri = os_zalloc(len + 1);
  926|     47|	if (name->uri == NULL)
  ------------------
  |  Branch (926:6): [True: 0, False: 47]
  ------------------
  927|      0|		return -1;
  928|     47|	os_memcpy(name->uri, pos, len);
  ------------------
  |  |  523|     47|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  929|     47|	if (os_strlen(name->uri) != len) {
  ------------------
  |  |  536|     47|#define os_strlen(s) strlen(s)
  ------------------
  |  Branch (929:6): [True: 1, False: 46]
  ------------------
  930|      1|		wpa_printf(MSG_INFO, "X509: Reject certificate with "
  931|      1|			   "embedded NUL byte in uniformResourceIdentifier "
  932|      1|			   "(%s[NUL])", name->uri);
  933|      1|		os_free(name->uri);
  ------------------
  |  |  511|      1|#define os_free(p) free((p))
  ------------------
  934|      1|		name->uri = NULL;
  935|      1|		return -1;
  936|      1|	}
  937|     46|	return 0;
  938|     47|}
x509v3.c:x509_parse_alt_name_ip:
  943|     43|{
  944|       |	/* iPAddress OCTET STRING */
  945|     43|	wpa_hexdump(MSG_MSGDUMP, "X509: altName - iPAddress", pos, len);
  946|     43|	os_free(name->ip);
  ------------------
  |  |  511|     43|#define os_free(p) free((p))
  ------------------
  947|     43|	name->ip = os_memdup(pos, len);
  948|     43|	if (name->ip == NULL)
  ------------------
  |  Branch (948:6): [True: 0, False: 43]
  ------------------
  949|      0|		return -1;
  950|     43|	name->ip_len = len;
  951|     43|	return 0;
  952|     43|}
x509v3.c:x509_parse_alt_name_rid:
  957|    203|{
  958|    203|	char buf[80];
  959|       |
  960|       |	/* registeredID OBJECT IDENTIFIER */
  961|    203|	if (asn1_parse_oid(pos, len, &name->rid) < 0)
  ------------------
  |  Branch (961:6): [True: 27, False: 176]
  ------------------
  962|     27|		return -1;
  963|       |
  964|    176|	asn1_oid_to_str(&name->rid, buf, sizeof(buf));
  965|    176|	wpa_printf(MSG_MSGDUMP, "X509: altName - registeredID: %s", buf);
  966|       |
  967|    176|	return 0;
  968|    203|}
x509v3.c:x509_parse_ext_issuer_alt_name:
 1075|    120|{
 1076|    120|	struct asn1_hdr hdr;
 1077|       |
 1078|       |	/* IssuerAltName ::= GeneralNames */
 1079|       |
 1080|    120|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1080:6): [True: 1, False: 119]
  |  Branch (1080:43): [True: 9, False: 110]
  ------------------
 1081|     10|		asn1_unexpected(&hdr,
 1082|     10|				"X509: Expected SEQUENCE in IssuerAltName");
 1083|     10|		return -1;
 1084|     10|	}
 1085|       |
 1086|    110|	wpa_printf(MSG_DEBUG, "X509: IssuerAltName");
 1087|    110|	cert->extensions_present |= X509_EXT_ISSUER_ALT_NAME;
  ------------------
  |  |   75|    110|#define X509_EXT_ISSUER_ALT_NAME		(1 << 4)
  ------------------
 1088|       |
 1089|    110|	if (hdr.length == 0)
  ------------------
  |  Branch (1089:6): [True: 52, False: 58]
  ------------------
 1090|     52|		return 0;
 1091|       |
 1092|     58|	return x509_parse_ext_alt_name(&cert->issuer, hdr.payload,
 1093|     58|				       hdr.length);
 1094|    110|}
x509v3.c:x509_parse_ext_basic_constraints:
  800|    395|{
  801|    395|	struct asn1_hdr hdr;
  802|    395|	unsigned long value;
  803|    395|	size_t left;
  804|    395|	const u8 *end_seq;
  805|       |
  806|       |	/*
  807|       |	 * BasicConstraints ::= SEQUENCE {
  808|       |	 * cA                      BOOLEAN DEFAULT FALSE,
  809|       |	 * pathLenConstraint       INTEGER (0..MAX) OPTIONAL }
  810|       |	 */
  811|       |
  812|    395|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (812:6): [True: 3, False: 392]
  |  Branch (812:43): [True: 13, False: 379]
  ------------------
  813|     16|		asn1_unexpected(&hdr,
  814|     16|				"X509: Expected SEQUENCE in BasicConstraints");
  815|     16|		return -1;
  816|     16|	}
  817|       |
  818|    379|	cert->extensions_present |= X509_EXT_BASIC_CONSTRAINTS;
  ------------------
  |  |   71|    379|#define X509_EXT_BASIC_CONSTRAINTS		(1 << 0)
  ------------------
  819|       |
  820|    379|	if (hdr.length == 0)
  ------------------
  |  Branch (820:6): [True: 187, False: 192]
  ------------------
  821|    187|		return 0;
  822|       |
  823|    192|	end_seq = hdr.payload + hdr.length;
  824|    192|	if (asn1_get_next(hdr.payload, hdr.length, &hdr) < 0) {
  ------------------
  |  Branch (824:6): [True: 1, False: 191]
  ------------------
  825|      1|		wpa_printf(MSG_DEBUG, "X509: Failed to parse "
  826|      1|			   "BasicConstraints");
  827|      1|		return -1;
  828|      1|	}
  829|       |
  830|    191|	if (asn1_is_boolean(&hdr)) {
  ------------------
  |  Branch (830:6): [True: 166, False: 25]
  ------------------
  831|    166|		cert->ca = hdr.payload[0];
  832|       |
  833|    166|		pos = hdr.payload + hdr.length;
  834|    166|		if (pos >= end_seq) {
  ------------------
  |  Branch (834:7): [True: 151, False: 15]
  ------------------
  835|       |			/* No optional pathLenConstraint */
  836|    151|			wpa_printf(MSG_DEBUG, "X509: BasicConstraints - cA=%d",
  837|    151|				   cert->ca);
  838|    151|			return 0;
  839|    151|		}
  840|     15|		if (asn1_get_next(pos, end_seq - pos, &hdr) < 0) {
  ------------------
  |  Branch (840:7): [True: 1, False: 14]
  ------------------
  841|      1|			wpa_printf(MSG_DEBUG, "X509: Failed to parse "
  842|      1|				   "BasicConstraints");
  843|      1|			return -1;
  844|      1|		}
  845|     15|	}
  846|       |
  847|     39|	if (!asn1_is_integer(&hdr)) {
  ------------------
  |  Branch (847:6): [True: 4, False: 35]
  ------------------
  848|      4|		asn1_unexpected(&hdr,
  849|      4|				"X509: Expected INTEGER in BasicConstraints");
  850|      4|		return -1;
  851|      4|	}
  852|       |
  853|     35|	pos = hdr.payload;
  854|     35|	left = hdr.length;
  855|     35|	value = 0;
  856|     92|	while (left) {
  ------------------
  |  Branch (856:9): [True: 57, False: 35]
  ------------------
  857|     57|		value <<= 8;
  858|     57|		value |= *pos++;
  859|     57|		left--;
  860|     57|	}
  861|       |
  862|     35|	cert->path_len_constraint = value;
  863|     35|	cert->extensions_present |= X509_EXT_PATH_LEN_CONSTRAINT;
  ------------------
  |  |   72|     35|#define X509_EXT_PATH_LEN_CONSTRAINT		(1 << 1)
  ------------------
  864|       |
  865|     35|	wpa_printf(MSG_DEBUG, "X509: BasicConstraints - cA=%d "
  866|     35|		   "pathLenConstraint=%lu",
  867|     35|		   cert->ca, cert->path_len_constraint);
  868|       |
  869|     35|	return 0;
  870|     39|}
x509v3.c:x509_parse_ext_certificate_policies:
 1148|    387|{
 1149|    387|	struct asn1_hdr hdr;
 1150|    387|	const u8 *end;
 1151|       |
 1152|       |	/*
 1153|       |	 * certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
 1154|       |	 *
 1155|       |	 * PolicyInformation ::= SEQUENCE {
 1156|       |	 *      policyIdentifier   CertPolicyId,
 1157|       |	 *      policyQualifiers   SEQUENCE SIZE (1..MAX) OF
 1158|       |	 *                              PolicyQualifierInfo OPTIONAL }
 1159|       |	 *
 1160|       |	 * CertPolicyId ::= OBJECT IDENTIFIER
 1161|       |	 */
 1162|       |
 1163|    387|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1163:6): [True: 5, False: 382]
  |  Branch (1163:43): [True: 10, False: 372]
  ------------------
 1164|     15|		asn1_unexpected(&hdr,
 1165|     15|				"X509: Expected SEQUENCE (certificatePolicies)");
 1166|     15|		return -1;
 1167|     15|	}
 1168|    372|	if (hdr.length > pos + len - hdr.payload)
  ------------------
  |  Branch (1168:6): [True: 0, False: 372]
  ------------------
 1169|      0|		return -1;
 1170|    372|	pos = hdr.payload;
 1171|    372|	end = pos + hdr.length;
 1172|       |
 1173|    372|	wpa_hexdump(MSG_MSGDUMP, "X509: certificatePolicies", pos, end - pos);
 1174|       |
 1175|    839|	while (pos < end) {
  ------------------
  |  Branch (1175:9): [True: 529, False: 310]
  ------------------
 1176|    529|		const u8 *pol_end;
 1177|    529|		struct asn1_oid oid;
 1178|    529|		char buf[80];
 1179|       |
 1180|    529|		if (asn1_get_next(pos, end - pos, &hdr) < 0 ||
  ------------------
  |  Branch (1180:7): [True: 33, False: 496]
  ------------------
 1181|    496|		    !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1181:7): [True: 23, False: 473]
  ------------------
 1182|     56|			asn1_unexpected(&hdr,
 1183|     56|					"X509: Expected SEQUENCE (PolicyInformation)");
 1184|     56|			return -1;
 1185|     56|		}
 1186|    473|		if (hdr.length > end - hdr.payload)
  ------------------
  |  Branch (1186:7): [True: 0, False: 473]
  ------------------
 1187|      0|			return -1;
 1188|    473|		pos = hdr.payload;
 1189|    473|		pol_end = pos + hdr.length;
 1190|    473|		wpa_hexdump(MSG_MSGDUMP, "X509: PolicyInformation",
 1191|    473|			    pos, pol_end - pos);
 1192|       |
 1193|    473|		if (asn1_get_oid(pos, pol_end - pos, &oid, &pos))
  ------------------
  |  Branch (1193:7): [True: 6, False: 467]
  ------------------
 1194|      6|			return -1;
 1195|    467|		if (x509_id_cert_policy_any_oid(&oid)) {
  ------------------
  |  Branch (1195:7): [True: 14, False: 453]
  ------------------
 1196|     14|			os_strlcpy(buf, "anyPolicy-STRICT", sizeof(buf));
 1197|     14|			cert->certificate_policy |=
 1198|     14|				X509_EXT_CERT_POLICY_ANY;
  ------------------
  |  |  104|     14|#define X509_EXT_CERT_POLICY_ANY		(1 << 0)
  ------------------
 1199|    453|		} else if (x509_id_wfa_tod_strict_oid(&oid)) {
  ------------------
  |  Branch (1199:14): [True: 9, False: 444]
  ------------------
 1200|      9|			os_strlcpy(buf, "TOD-STRICT", sizeof(buf));
 1201|      9|			cert->certificate_policy |=
 1202|      9|				X509_EXT_CERT_POLICY_TOD_STRICT;
  ------------------
  |  |  105|      9|#define X509_EXT_CERT_POLICY_TOD_STRICT		(1 << 1)
  ------------------
 1203|    444|		} else if (x509_id_wfa_tod_tofu_oid(&oid)) {
  ------------------
  |  Branch (1203:14): [True: 14, False: 430]
  ------------------
 1204|     14|			os_strlcpy(buf, "TOD-TOFU", sizeof(buf));
 1205|     14|			cert->certificate_policy |=
 1206|     14|				X509_EXT_CERT_POLICY_TOD_TOFU;
  ------------------
  |  |  106|     14|#define X509_EXT_CERT_POLICY_TOD_TOFU		(1 << 2)
  ------------------
 1207|    430|		} else {
 1208|    430|			asn1_oid_to_str(&oid, buf, sizeof(buf));
 1209|    430|		}
 1210|    467|		wpa_printf(MSG_DEBUG, "policyIdentifier: %s", buf);
 1211|       |
 1212|    467|		pos = pol_end;
 1213|    467|	}
 1214|       |
 1215|    310|	cert->extensions_present |= X509_EXT_CERTIFICATE_POLICY;
  ------------------
  |  |   77|    310|#define X509_EXT_CERTIFICATE_POLICY		(1 << 6)
  ------------------
 1216|       |
 1217|    310|	return 0;
 1218|    372|}
x509v3.c:x509_id_cert_policy_any_oid:
 1098|    467|{
 1099|    467|	return oid->len == 5 &&
  ------------------
  |  Branch (1099:9): [True: 175, False: 292]
  ------------------
 1100|    175|		oid->oid[0] == 2 /* iso/itu-t */ &&
  ------------------
  |  Branch (1100:3): [True: 133, False: 42]
  ------------------
 1101|    133|		oid->oid[1] == 5 /* X.500 Directory Services */ &&
  ------------------
  |  Branch (1101:3): [True: 87, False: 46]
  ------------------
 1102|     87|		oid->oid[2] == 29 /* id-ce */ &&
  ------------------
  |  Branch (1102:3): [True: 52, False: 35]
  ------------------
 1103|     52|		oid->oid[3] == 32 /* id-ce-certificate-policies */ &&
  ------------------
  |  Branch (1103:3): [True: 28, False: 24]
  ------------------
 1104|     28|		oid->oid[4] == 0 /* anyPolicy */;
  ------------------
  |  Branch (1104:3): [True: 14, False: 14]
  ------------------
 1105|    467|}
x509v3.c:x509_id_wfa_tod_strict_oid:
 1131|    453|{
 1132|    453|	return oid->len == 10 &&
  ------------------
  |  Branch (1132:9): [True: 272, False: 181]
  ------------------
 1133|    272|		x509_id_wfa_tod_oid(oid) &&
  ------------------
  |  Branch (1133:3): [True: 33, False: 239]
  ------------------
 1134|     33|		oid->oid[9] == 1;
  ------------------
  |  Branch (1134:3): [True: 9, False: 24]
  ------------------
 1135|    453|}
x509v3.c:x509_id_wfa_tod_oid:
 1122|    535|{
 1123|    535|	return oid->len >= 9 &&
  ------------------
  |  Branch (1123:9): [True: 535, False: 0]
  ------------------
 1124|    535|		x509_id_wfa_oid(oid) &&
  ------------------
  |  Branch (1124:3): [True: 125, False: 410]
  ------------------
 1125|    125|		oid->oid[7] == 1 &&
  ------------------
  |  Branch (1125:3): [True: 73, False: 52]
  ------------------
 1126|     73|		oid->oid[8] == 3;
  ------------------
  |  Branch (1126:3): [True: 57, False: 16]
  ------------------
 1127|    535|}
x509v3.c:x509_id_wfa_oid:
 1109|    535|{
 1110|    535|	return oid->len >= 7 &&
  ------------------
  |  Branch (1110:9): [True: 535, False: 0]
  ------------------
 1111|    535|		oid->oid[0] == 1 /* iso */ &&
  ------------------
  |  Branch (1111:3): [True: 463, False: 72]
  ------------------
 1112|    463|		oid->oid[1] == 3 /* identified-organization */ &&
  ------------------
  |  Branch (1112:3): [True: 397, False: 66]
  ------------------
 1113|    397|		oid->oid[2] == 6 /* dod */ &&
  ------------------
  |  Branch (1113:3): [True: 345, False: 52]
  ------------------
 1114|    345|		oid->oid[3] == 1 /* internet */ &&
  ------------------
  |  Branch (1114:3): [True: 293, False: 52]
  ------------------
 1115|    293|		oid->oid[4] == 4 /* private */ &&
  ------------------
  |  Branch (1115:3): [True: 237, False: 56]
  ------------------
 1116|    237|		oid->oid[5] == 1 /* enterprise */ &&
  ------------------
  |  Branch (1116:3): [True: 179, False: 58]
  ------------------
 1117|    179|		oid->oid[6] == 40808 /* WFA */;
  ------------------
  |  Branch (1117:3): [True: 125, False: 54]
  ------------------
 1118|    535|}
x509v3.c:x509_id_wfa_tod_tofu_oid:
 1139|    444|{
 1140|    444|	return oid->len == 10 &&
  ------------------
  |  Branch (1140:9): [True: 263, False: 181]
  ------------------
 1141|    263|		x509_id_wfa_tod_oid(oid) &&
  ------------------
  |  Branch (1141:3): [True: 24, False: 239]
  ------------------
 1142|     24|		oid->oid[9] == 2;
  ------------------
  |  Branch (1142:3): [True: 14, False: 10]
  ------------------
 1143|    444|}
x509v3.c:x509_parse_ext_ext_key_usage:
 1272|    377|{
 1273|    377|	struct asn1_hdr hdr;
 1274|    377|	const u8 *end;
 1275|    377|	struct asn1_oid oid;
 1276|       |
 1277|       |	/*
 1278|       |	 * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
 1279|       |	 *
 1280|       |	 * KeyPurposeId ::= OBJECT IDENTIFIER
 1281|       |	 */
 1282|       |
 1283|    377|	if (asn1_get_next(pos, len, &hdr) < 0 || !asn1_is_sequence(&hdr)) {
  ------------------
  |  Branch (1283:6): [True: 4, False: 373]
  |  Branch (1283:43): [True: 13, False: 360]
  ------------------
 1284|     17|		asn1_unexpected(&hdr,
 1285|     17|				"X509: Expected SEQUENCE (ExtKeyUsageSyntax)");
 1286|     17|		return -1;
 1287|     17|	}
 1288|    360|	if (hdr.length > pos + len - hdr.payload)
  ------------------
  |  Branch (1288:6): [True: 0, False: 360]
  ------------------
 1289|      0|		return -1;
 1290|    360|	pos = hdr.payload;
 1291|    360|	end = pos + hdr.length;
 1292|       |
 1293|    360|	wpa_hexdump(MSG_MSGDUMP, "X509: ExtKeyUsageSyntax", pos, end - pos);
 1294|       |
 1295|  1.15k|	while (pos < end) {
  ------------------
  |  Branch (1295:9): [True: 895, False: 263]
  ------------------
 1296|    895|		char buf[80];
 1297|       |
 1298|    895|		if (asn1_get_oid(pos, end - pos, &oid, &pos))
  ------------------
  |  Branch (1298:7): [True: 97, False: 798]
  ------------------
 1299|     97|			return -1;
 1300|    798|		if (x509_any_ext_key_usage_oid(&oid)) {
  ------------------
  |  Branch (1300:7): [True: 12, False: 786]
  ------------------
 1301|     12|			os_strlcpy(buf, "anyExtendedKeyUsage", sizeof(buf));
 1302|     12|			cert->ext_key_usage |= X509_EXT_KEY_USAGE_ANY;
  ------------------
  |  |   97|     12|#define X509_EXT_KEY_USAGE_ANY			(1 << 0)
  ------------------
 1303|    786|		} else if (x509_id_kp_server_auth_oid(&oid)) {
  ------------------
  |  Branch (1303:14): [True: 123, False: 663]
  ------------------
 1304|    123|			os_strlcpy(buf, "id-kp-serverAuth", sizeof(buf));
 1305|    123|			cert->ext_key_usage |= X509_EXT_KEY_USAGE_SERVER_AUTH;
  ------------------
  |  |   98|    123|#define X509_EXT_KEY_USAGE_SERVER_AUTH		(1 << 1)
  ------------------
 1306|    663|		} else if (x509_id_kp_client_auth_oid(&oid)) {
  ------------------
  |  Branch (1306:14): [True: 18, False: 645]
  ------------------
 1307|     18|			os_strlcpy(buf, "id-kp-clientAuth", sizeof(buf));
 1308|     18|			cert->ext_key_usage |= X509_EXT_KEY_USAGE_CLIENT_AUTH;
  ------------------
  |  |   99|     18|#define X509_EXT_KEY_USAGE_CLIENT_AUTH		(1 << 2)
  ------------------
 1309|    645|		} else if (x509_id_kp_ocsp_oid(&oid)) {
  ------------------
  |  Branch (1309:14): [True: 10, False: 635]
  ------------------
 1310|     10|			os_strlcpy(buf, "id-kp-OCSPSigning", sizeof(buf));
 1311|     10|			cert->ext_key_usage |= X509_EXT_KEY_USAGE_OCSP;
  ------------------
  |  |  100|     10|#define X509_EXT_KEY_USAGE_OCSP			(1 << 3)
  ------------------
 1312|    635|		} else {
 1313|    635|			asn1_oid_to_str(&oid, buf, sizeof(buf));
 1314|    635|		}
 1315|    798|		wpa_printf(MSG_DEBUG, "ExtKeyUsage KeyPurposeId: %s", buf);
 1316|    798|	}
 1317|       |
 1318|    263|	cert->extensions_present |= X509_EXT_EXT_KEY_USAGE;
  ------------------
  |  |   76|    263|#define X509_EXT_EXT_KEY_USAGE			(1 << 5)
  ------------------
 1319|       |
 1320|    263|	return 0;
 1321|    360|}
x509v3.c:x509_any_ext_key_usage_oid:
  757|    798|{
  758|    798|	return oid->len == 6 &&
  ------------------
  |  Branch (758:9): [True: 288, False: 510]
  ------------------
  759|    288|		x509_id_ce_oid(oid) &&
  ------------------
  |  Branch (759:3): [True: 57, False: 231]
  ------------------
  760|     57|		oid->oid[3] == 37 /* extKeyUsage */ &&
  ------------------
  |  Branch (760:3): [True: 26, False: 31]
  ------------------
  761|     26|		oid->oid[4] == 0 /* anyExtendedKeyUsage */;
  ------------------
  |  Branch (761:3): [True: 12, False: 14]
  ------------------
  762|    798|}
x509v3.c:x509_id_kp_server_auth_oid:
 1244|    786|{
 1245|       |	/* id-kp */
 1246|    786|	return oid->len == 9 &&
  ------------------
  |  Branch (1246:9): [True: 386, False: 400]
  ------------------
 1247|    386|		x509_id_kp_oid(oid) &&
  ------------------
  |  Branch (1247:3): [True: 175, False: 211]
  ------------------
 1248|    175|		oid->oid[8] == 1 /* id-kp-serverAuth */;
  ------------------
  |  Branch (1248:3): [True: 123, False: 52]
  ------------------
 1249|    786|}
x509v3.c:x509_id_kp_oid:
 1235|    894|{
 1236|       |	/* id-kp */
 1237|    894|	return oid->len >= 8 &&
  ------------------
  |  Branch (1237:9): [True: 894, False: 0]
  ------------------
 1238|    894|		x509_id_pkix_oid(oid) &&
  ------------------
  |  Branch (1238:3): [True: 324, False: 570]
  ------------------
 1239|    324|		oid->oid[7] == 3 /* id-kp */;
  ------------------
  |  Branch (1239:3): [True: 261, False: 63]
  ------------------
 1240|    894|}
x509v3.c:x509_id_pkix_oid:
 1222|    894|{
 1223|    894|	return oid->len >= 7 &&
  ------------------
  |  Branch (1223:9): [True: 894, False: 0]
  ------------------
 1224|    894|		oid->oid[0] == 1 /* iso */ &&
  ------------------
  |  Branch (1224:3): [True: 825, False: 69]
  ------------------
 1225|    825|		oid->oid[1] == 3 /* identified-organization */ &&
  ------------------
  |  Branch (1225:3): [True: 762, False: 63]
  ------------------
 1226|    762|		oid->oid[2] == 6 /* dod */ &&
  ------------------
  |  Branch (1226:3): [True: 630, False: 132]
  ------------------
 1227|    630|		oid->oid[3] == 1 /* internet */ &&
  ------------------
  |  Branch (1227:3): [True: 543, False: 87]
  ------------------
 1228|    543|		oid->oid[4] == 5 /* security */ &&
  ------------------
  |  Branch (1228:3): [True: 438, False: 105]
  ------------------
 1229|    438|		oid->oid[5] == 5 /* mechanisms */ &&
  ------------------
  |  Branch (1229:3): [True: 372, False: 66]
  ------------------
 1230|    372|		oid->oid[6] == 7 /* id-pkix */;
  ------------------
  |  Branch (1230:3): [True: 324, False: 48]
  ------------------
 1231|    894|}
x509v3.c:x509_id_kp_client_auth_oid:
 1253|    663|{
 1254|       |	/* id-kp */
 1255|    663|	return oid->len == 9 &&
  ------------------
  |  Branch (1255:9): [True: 263, False: 400]
  ------------------
 1256|    263|		x509_id_kp_oid(oid) &&
  ------------------
  |  Branch (1256:3): [True: 52, False: 211]
  ------------------
 1257|     52|		oid->oid[8] == 2 /* id-kp-clientAuth */;
  ------------------
  |  Branch (1257:3): [True: 18, False: 34]
  ------------------
 1258|    663|}
x509v3.c:x509_id_kp_ocsp_oid:
 1262|    645|{
 1263|       |	/* id-kp */
 1264|    645|	return oid->len == 9 &&
  ------------------
  |  Branch (1264:9): [True: 245, False: 400]
  ------------------
 1265|    245|		x509_id_kp_oid(oid) &&
  ------------------
  |  Branch (1265:3): [True: 34, False: 211]
  ------------------
 1266|     34|		oid->oid[8] == 9 /* id-kp-OCSPSigning */;
  ------------------
  |  Branch (1266:3): [True: 10, False: 24]
  ------------------
 1267|    645|}

inc_byte_array:
  223|  64.5k|{
  224|  64.5k|	int pos = len - 1;
  225|  64.7k|	while (pos >= 0) {
  ------------------
  |  Branch (225:9): [True: 64.7k, False: 0]
  ------------------
  226|  64.7k|		counter[pos]++;
  227|  64.7k|		if (counter[pos] != 0)
  ------------------
  |  Branch (227:7): [True: 64.5k, False: 198]
  ------------------
  228|  64.5k|			break;
  229|    198|		pos--;
  230|    198|	}
  231|  64.5k|}
__hide_aliasing_typecast:
  637|   137k|{
  638|   137k|	return foo;
  639|   137k|}
dup_binstr:
  767|  4.03k|{
  768|  4.03k|	char *res;
  769|       |
  770|  4.03k|	if (src == NULL)
  ------------------
  |  Branch (770:6): [True: 0, False: 4.03k]
  ------------------
  771|      0|		return NULL;
  772|  4.03k|	res = os_malloc(len + 1);
  ------------------
  |  |  505|  4.03k|#define os_malloc(s) malloc((s))
  ------------------
  773|  4.03k|	if (res == NULL)
  ------------------
  |  Branch (773:6): [True: 0, False: 4.03k]
  ------------------
  774|      0|		return NULL;
  775|  4.03k|	os_memcpy(res, src, len);
  ------------------
  |  |  523|  4.03k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  776|  4.03k|	res[len] = '\0';
  777|       |
  778|  4.03k|	return res;
  779|  4.03k|}
forced_memzero:
 1343|   161k|{
 1344|   161k|	memset_func(ptr, 0, len);
 1345|   161k|	if (len)
  ------------------
  |  Branch (1345:6): [True: 161k, False: 0]
  ------------------
 1346|   161k|		forced_memzero_val = ((u8 *) ptr)[0];
 1347|   161k|}

tls-client.c:WPA_GET_BE16:
  214|  64.1k|{
  215|  64.1k|	return (a[0] << 8) | a[1];
  216|  64.1k|}
tlsv1_client.c:WPA_PUT_BE16:
  219|    426|{
  220|    426|	a[0] = val >> 8;
  221|    426|	a[1] = val & 0xff;
  222|    426|}
tlsv1_client_read.c:WPA_GET_BE24:
  236|  14.9k|{
  237|  14.9k|	return (a[0] << 16) | (a[1] << 8) | a[2];
  238|  14.9k|}
tlsv1_client_read.c:WPA_GET_BE16:
  214|  7.85k|{
  215|  7.85k|	return (a[0] << 8) | a[1];
  216|  7.85k|}
tlsv1_client_write.c:WPA_PUT_BE32:
  265|  3.10k|{
  266|  3.10k|	a[0] = (val >> 24) & 0xff;
  267|  3.10k|	a[1] = (val >> 16) & 0xff;
  268|  3.10k|	a[2] = (val >> 8) & 0xff;
  269|  3.10k|	a[3] = val & 0xff;
  270|  3.10k|}
tlsv1_client_write.c:WPA_PUT_BE16:
  219|   168k|{
  220|   168k|	a[0] = val >> 8;
  221|   168k|	a[1] = val & 0xff;
  222|   168k|}
tlsv1_client_write.c:WPA_PUT_BE24:
  241|  4.17k|{
  242|  4.17k|	a[0] = (val >> 16) & 0xff;
  243|  4.17k|	a[1] = (val >> 8) & 0xff;
  244|  4.17k|	a[2] = val & 0xff;
  245|  4.17k|}
tlsv1_common.c:WPA_GET_BE16:
  214|    414|{
  215|    414|	return (a[0] << 8) | a[1];
  216|    414|}
tlsv1_record.c:WPA_PUT_BE16:
  219|  47.5k|{
  220|  47.5k|	a[0] = val >> 8;
  221|  47.5k|	a[1] = val & 0xff;
  222|  47.5k|}
tlsv1_record.c:WPA_GET_BE16:
  214|   100k|{
  215|   100k|	return (a[0] << 8) | a[1];
  216|   100k|}
sha256-internal.c:WPA_GET_BE32:
  260|  1.58M|{
  261|  1.58M|	return ((u32) a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
  262|  1.58M|}
sha256-internal.c:WPA_PUT_BE64:
  311|  13.8k|{
  312|  13.8k|	a[0] = val >> 56;
  313|  13.8k|	a[1] = val >> 48;
  314|  13.8k|	a[2] = val >> 40;
  315|  13.8k|	a[3] = val >> 32;
  316|  13.8k|	a[4] = val >> 24;
  317|  13.8k|	a[5] = val >> 16;
  318|  13.8k|	a[6] = val >> 8;
  319|  13.8k|	a[7] = val & 0xff;
  320|  13.8k|}
sha256-internal.c:WPA_PUT_BE32:
  265|   110k|{
  266|   110k|	a[0] = (val >> 24) & 0xff;
  267|   110k|	a[1] = (val >> 16) & 0xff;
  268|   110k|	a[2] = (val >> 8) & 0xff;
  269|   110k|	a[3] = val & 0xff;
  270|   110k|}
sha512-internal.c:WPA_GET_BE64:
  303|  10.6k|{
  304|  10.6k|	return (((u64) a[0]) << 56) | (((u64) a[1]) << 48) |
  305|  10.6k|		(((u64) a[2]) << 40) | (((u64) a[3]) << 32) |
  306|  10.6k|		(((u64) a[4]) << 24) | (((u64) a[5]) << 16) |
  307|  10.6k|		(((u64) a[6]) << 8) | ((u64) a[7]);
  308|  10.6k|}
sha512-internal.c:WPA_PUT_BE64:
  311|  1.29k|{
  312|  1.29k|	a[0] = val >> 56;
  313|  1.29k|	a[1] = val >> 48;
  314|  1.29k|	a[2] = val >> 40;
  315|  1.29k|	a[3] = val >> 32;
  316|  1.29k|	a[4] = val >> 24;
  317|  1.29k|	a[5] = val >> 16;
  318|  1.29k|	a[6] = val >> 8;
  319|  1.29k|	a[7] = val & 0xff;
  320|  1.29k|}
des-internal.c:WPA_GET_BE32:
  260|  36.1k|{
  261|  36.1k|	return ((u32) a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
  262|  36.1k|}
des-internal.c:WPA_PUT_BE32:
  265|  36.1k|{
  266|  36.1k|	a[0] = (val >> 24) & 0xff;
  267|  36.1k|	a[1] = (val >> 16) & 0xff;
  268|  36.1k|	a[2] = (val >> 8) & 0xff;
  269|  36.1k|	a[3] = val & 0xff;
  270|  36.1k|}

x509v3.c:os_snprintf_error:
  580|  3.97k|{
  581|  3.97k|	return res < 0 || (unsigned int) res >= size;
  ------------------
  |  Branch (581:9): [True: 0, False: 3.97k]
  |  Branch (581:20): [True: 0, False: 3.97k]
  ------------------
  582|  3.97k|}
asn1.c:os_snprintf_error:
  580|  25.6k|{
  581|  25.6k|	return res < 0 || (unsigned int) res >= size;
  ------------------
  |  Branch (581:9): [True: 0, False: 25.6k]
  |  Branch (581:20): [True: 65, False: 25.6k]
  ------------------
  582|  25.6k|}
md5-internal.c:testing_test_fail:
  697|  14.8k|{
  698|  14.8k|	return 0;
  699|  14.8k|}
sha1-internal.c:testing_test_fail:
  697|  13.6k|{
  698|  13.6k|	return 0;
  699|  13.6k|}
sha256-internal.c:testing_test_fail:
  697|  5.85k|{
  698|  5.85k|	return 0;
  699|  5.85k|}
crypto_internal.c:testing_test_fail:
  697|  35.6k|{
  698|  35.6k|	return 0;
  699|  35.6k|}
aes-internal-enc.c:testing_test_fail:
  697|    334|{
  698|    334|	return 0;
  699|    334|}

os_get_time:
   66|  3.10k|{
   67|  3.10k|	int res;
   68|  3.10k|	struct timeval tv;
   69|       |	res = gettimeofday(&tv, NULL);
   70|  3.10k|	t->sec = tv.tv_sec;
   71|  3.10k|	t->usec = tv.tv_usec;
   72|  3.10k|	return res;
   73|  3.10k|}
os_mktime:
  158|  6.19k|{
  159|  6.19k|	struct tm tm, *tm1;
  160|  6.19k|	time_t t_local, t1, t2;
  161|  6.19k|	os_time_t tz_offset;
  162|       |
  163|  6.19k|	if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
  ------------------
  |  Branch (163:6): [True: 764, False: 5.43k]
  |  Branch (163:21): [True: 1, False: 5.43k]
  |  Branch (163:34): [True: 5, False: 5.42k]
  |  Branch (163:48): [True: 1, False: 5.42k]
  |  Branch (163:59): [True: 2, False: 5.42k]
  ------------------
  164|  5.42k|	    hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
  ------------------
  |  Branch (164:6): [True: 0, False: 5.42k]
  |  Branch (164:18): [True: 2, False: 5.42k]
  |  Branch (164:31): [True: 0, False: 5.42k]
  |  Branch (164:42): [True: 2, False: 5.42k]
  |  Branch (164:54): [True: 0, False: 5.42k]
  ------------------
  165|  5.42k|	    sec > 60)
  ------------------
  |  Branch (165:6): [True: 1, False: 5.41k]
  ------------------
  166|    778|		return -1;
  167|       |
  168|  5.41k|	memset(&tm, 0, sizeof(tm));
  169|  5.41k|	tm.tm_year = year - 1900;
  170|  5.41k|	tm.tm_mon = month - 1;
  171|  5.41k|	tm.tm_mday = day;
  172|  5.41k|	tm.tm_hour = hour;
  173|  5.41k|	tm.tm_min = min;
  174|  5.41k|	tm.tm_sec = sec;
  175|       |
  176|  5.41k|	t_local = mktime(&tm);
  177|       |
  178|       |	/* figure out offset to UTC */
  179|  5.41k|	tm1 = localtime(&t_local);
  180|  5.41k|	if (tm1) {
  ------------------
  |  Branch (180:6): [True: 5.41k, False: 0]
  ------------------
  181|  5.41k|		t1 = mktime(tm1);
  182|  5.41k|		tm1 = gmtime(&t_local);
  183|  5.41k|		if (tm1) {
  ------------------
  |  Branch (183:7): [True: 5.41k, False: 0]
  ------------------
  184|  5.41k|			t2 = mktime(tm1);
  185|  5.41k|			tz_offset = t2 - t1;
  186|  5.41k|		} else
  187|      0|			tz_offset = 0;
  188|  5.41k|	} else
  189|      0|		tz_offset = 0;
  190|       |
  191|  5.41k|	*t = (os_time_t) t_local - tz_offset;
  192|  5.41k|	return 0;
  193|  6.19k|}
os_get_random:
  280|  4.15k|{
  281|  4.15k|#ifdef TEST_FUZZ
  282|  4.15k|	size_t i;
  283|       |
  284|   148k|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (284:14): [True: 144k, False: 4.15k]
  ------------------
  285|   144k|		buf[i] = i & 0xff;
  286|  4.15k|	return 0;
  287|       |#else /* TEST_FUZZ */
  288|       |	FILE *f;
  289|       |	size_t rc;
  290|       |
  291|       |	if (TEST_FAIL())
  292|       |		return -1;
  293|       |
  294|       |	f = fopen("/dev/urandom", "rb");
  295|       |	if (f == NULL) {
  296|       |		printf("Could not open /dev/urandom.\n");
  297|       |		return -1;
  298|       |	}
  299|       |
  300|       |	rc = fread(buf, 1, len, f);
  301|       |	fclose(f);
  302|       |
  303|       |	return rc != len ? -1 : 0;
  304|       |#endif /* TEST_FUZZ */
  305|  4.15k|}
os_zalloc:
  507|   218k|{
  508|   218k|	return calloc(1, size);
  509|   218k|}
os_strlcpy:
  514|    200|{
  515|    200|	const char *s = src;
  516|    200|	size_t left = siz;
  517|       |
  518|    200|	if (left) {
  ------------------
  |  Branch (518:6): [True: 200, False: 0]
  ------------------
  519|       |		/* Copy string up to the maximum size of the dest buffer */
  520|  3.28k|		while (--left != 0) {
  ------------------
  |  Branch (520:10): [True: 3.28k, False: 0]
  ------------------
  521|  3.28k|			if ((*dest++ = *s++) == '\0')
  ------------------
  |  Branch (521:8): [True: 200, False: 3.08k]
  ------------------
  522|    200|				break;
  523|  3.28k|		}
  524|    200|	}
  525|       |
  526|    200|	if (left == 0) {
  ------------------
  |  Branch (526:6): [True: 0, False: 200]
  ------------------
  527|       |		/* Not enough room for the string; force NUL-termination */
  528|      0|		if (siz != 0)
  ------------------
  |  Branch (528:7): [True: 0, False: 0]
  ------------------
  529|      0|			*dest = '\0';
  530|      0|		while (*s++)
  ------------------
  |  Branch (530:10): [True: 0, False: 0]
  ------------------
  531|      0|			; /* determine total src string length */
  532|      0|	}
  533|       |
  534|    200|	return s - src - 1;
  535|    200|}
os_memcmp_const:
  539|  33.8k|{
  540|  33.8k|	const u8 *aa = a;
  541|  33.8k|	const u8 *bb = b;
  542|  33.8k|	size_t i;
  543|  33.8k|	u8 res;
  544|       |
  545|   649k|	for (res = 0, i = 0; i < len; i++)
  ------------------
  |  Branch (545:23): [True: 615k, False: 33.8k]
  ------------------
  546|   615k|		res |= aa[i] ^ bb[i];
  547|       |
  548|  33.8k|	return res;
  549|  33.8k|}
os_memdup:
  553|  7.01k|{
  554|  7.01k|	void *r = os_malloc(len);
  ------------------
  |  |  505|  7.01k|#define os_malloc(s) malloc((s))
  ------------------
  555|       |
  556|  7.01k|	if (r && src)
  ------------------
  |  Branch (556:6): [True: 7.01k, False: 0]
  |  Branch (556:11): [True: 7.01k, False: 0]
  ------------------
  557|  7.01k|		os_memcpy(r, src, len);
  ------------------
  |  |  523|  7.01k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  558|  7.01k|	return r;
  559|  7.01k|}

wpa_printf:
  224|   332k|{
  225|   332k|	va_list ap;
  226|       |
  227|   332k|	if (level >= wpa_debug_level) {
  ------------------
  |  Branch (227:6): [True: 0, False: 332k]
  ------------------
  228|       |#ifdef CONFIG_ANDROID_LOG
  229|       |		va_start(ap, fmt);
  230|       |		__android_log_vprint(wpa_to_android_level(level),
  231|       |				     ANDROID_LOG_NAME, fmt, ap);
  232|       |		va_end(ap);
  233|       |#else /* CONFIG_ANDROID_LOG */
  234|       |#ifdef CONFIG_DEBUG_SYSLOG
  235|       |		if (wpa_debug_syslog) {
  236|       |			va_start(ap, fmt);
  237|       |			vsyslog(syslog_priority(level), fmt, ap);
  238|       |			va_end(ap);
  239|       |		}
  240|       |#endif /* CONFIG_DEBUG_SYSLOG */
  241|      0|		wpa_debug_print_timestamp();
  242|      0|#ifdef CONFIG_DEBUG_FILE
  243|      0|		if (out_file) {
  ------------------
  |  Branch (243:7): [True: 0, False: 0]
  ------------------
  244|      0|			va_start(ap, fmt);
  245|      0|			vfprintf(out_file, fmt, ap);
  246|      0|			fprintf(out_file, "\n");
  247|      0|			va_end(ap);
  248|      0|		}
  249|      0|#endif /* CONFIG_DEBUG_FILE */
  250|      0|		if (!wpa_debug_syslog && !out_file) {
  ------------------
  |  Branch (250:7): [True: 0, False: 0]
  |  Branch (250:28): [True: 0, False: 0]
  ------------------
  251|      0|			va_start(ap, fmt);
  252|      0|			vprintf(fmt, ap);
  253|      0|			printf("\n");
  254|      0|			va_end(ap);
  255|      0|		}
  256|      0|#endif /* CONFIG_ANDROID_LOG */
  257|      0|	}
  258|       |
  259|       |#ifdef CONFIG_DEBUG_LINUX_TRACING
  260|       |	if (wpa_debug_tracing_file != NULL) {
  261|       |		va_start(ap, fmt);
  262|       |		fprintf(wpa_debug_tracing_file, WPAS_TRACE_PFX, level);
  263|       |		vfprintf(wpa_debug_tracing_file, fmt, ap);
  264|       |		fprintf(wpa_debug_tracing_file, "\n");
  265|       |		fflush(wpa_debug_tracing_file);
  266|       |		va_end(ap);
  267|       |	}
  268|       |#endif /* CONFIG_DEBUG_LINUX_TRACING */
  269|   332k|}
wpa_hexdump:
  400|   207k|{
  401|   207k|	_wpa_hexdump(level, title, buf, len, 1, 0);
  402|   207k|}
wpa_hexdump_key:
  406|  41.5k|{
  407|  41.5k|	_wpa_hexdump(level, title, buf, len, wpa_debug_show_keys, 0);
  408|  41.5k|}
wpa_hexdump_ascii:
  526|  10.2k|{
  527|  10.2k|	_wpa_hexdump_ascii(level, title, buf, len, 1);
  528|  10.2k|}
wpa_debug.c:_wpa_hexdump:
  274|   249k|{
  275|   249k|	size_t i;
  276|       |
  277|       |#ifdef CONFIG_DEBUG_LINUX_TRACING
  278|       |	if (wpa_debug_tracing_file != NULL) {
  279|       |		fprintf(wpa_debug_tracing_file,
  280|       |			WPAS_TRACE_PFX "%s - hexdump(len=%lu):",
  281|       |			level, title, (unsigned long) len);
  282|       |		if (buf == NULL) {
  283|       |			fprintf(wpa_debug_tracing_file, " [NULL]\n");
  284|       |		} else if (!show) {
  285|       |			fprintf(wpa_debug_tracing_file, " [REMOVED]\n");
  286|       |		} else {
  287|       |			for (i = 0; i < len; i++)
  288|       |				fprintf(wpa_debug_tracing_file,
  289|       |					" %02x", buf[i]);
  290|       |		}
  291|       |		fflush(wpa_debug_tracing_file);
  292|       |	}
  293|       |#endif /* CONFIG_DEBUG_LINUX_TRACING */
  294|       |
  295|   249k|	if (level < wpa_debug_level)
  ------------------
  |  Branch (295:6): [True: 249k, False: 0]
  ------------------
  296|   249k|		return;
  297|       |#ifdef CONFIG_ANDROID_LOG
  298|       |	{
  299|       |		const char *display;
  300|       |		char *strbuf = NULL;
  301|       |		size_t slen = len;
  302|       |		if (buf == NULL) {
  303|       |			display = " [NULL]";
  304|       |		} else if (len == 0) {
  305|       |			display = "";
  306|       |		} else if (show && len) {
  307|       |			/* Limit debug message length for Android log */
  308|       |			if (slen > 32)
  309|       |				slen = 32;
  310|       |			strbuf = os_malloc(1 + 3 * slen);
  311|       |			if (strbuf == NULL) {
  312|       |				wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to "
  313|       |					   "allocate message buffer");
  314|       |				return;
  315|       |			}
  316|       |
  317|       |			for (i = 0; i < slen; i++)
  318|       |				os_snprintf(&strbuf[i * 3], 4, " %02x",
  319|       |					    buf[i]);
  320|       |
  321|       |			display = strbuf;
  322|       |		} else {
  323|       |			display = " [REMOVED]";
  324|       |		}
  325|       |
  326|       |		__android_log_print(wpa_to_android_level(level),
  327|       |				    ANDROID_LOG_NAME,
  328|       |				    "%s - hexdump(len=%lu):%s%s",
  329|       |				    title, (long unsigned int) len, display,
  330|       |				    len > slen ? " ..." : "");
  331|       |		bin_clear_free(strbuf, 1 + 3 * slen);
  332|       |		return;
  333|       |	}
  334|       |#else /* CONFIG_ANDROID_LOG */
  335|       |#ifdef CONFIG_DEBUG_SYSLOG
  336|       |	if (wpa_debug_syslog) {
  337|       |		const char *display;
  338|       |		char *strbuf = NULL;
  339|       |
  340|       |		if (buf == NULL) {
  341|       |			display = " [NULL]";
  342|       |		} else if (len == 0) {
  343|       |			display = "";
  344|       |		} else if (show && len) {
  345|       |			strbuf = os_malloc(1 + 3 * len);
  346|       |			if (strbuf == NULL) {
  347|       |				wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to "
  348|       |					   "allocate message buffer");
  349|       |				return;
  350|       |			}
  351|       |
  352|       |			for (i = 0; i < len; i++)
  353|       |				os_snprintf(&strbuf[i * 3], 4, " %02x",
  354|       |					    buf[i]);
  355|       |
  356|       |			display = strbuf;
  357|       |		} else {
  358|       |			display = " [REMOVED]";
  359|       |		}
  360|       |
  361|       |		syslog(syslog_priority(level), "%s - hexdump(len=%lu):%s",
  362|       |		       title, (unsigned long) len, display);
  363|       |		bin_clear_free(strbuf, 1 + 3 * len);
  364|       |		if (only_syslog)
  365|       |			return;
  366|       |	}
  367|       |#endif /* CONFIG_DEBUG_SYSLOG */
  368|      0|	wpa_debug_print_timestamp();
  369|      0|#ifdef CONFIG_DEBUG_FILE
  370|      0|	if (out_file) {
  ------------------
  |  Branch (370:6): [True: 0, False: 0]
  ------------------
  371|      0|		fprintf(out_file, "%s - hexdump(len=%lu):",
  372|      0|			title, (unsigned long) len);
  373|      0|		if (buf == NULL) {
  ------------------
  |  Branch (373:7): [True: 0, False: 0]
  ------------------
  374|      0|			fprintf(out_file, " [NULL]");
  375|      0|		} else if (show) {
  ------------------
  |  Branch (375:14): [True: 0, False: 0]
  ------------------
  376|      0|			for (i = 0; i < len; i++)
  ------------------
  |  Branch (376:16): [True: 0, False: 0]
  ------------------
  377|      0|				fprintf(out_file, " %02x", buf[i]);
  378|      0|		} else {
  379|      0|			fprintf(out_file, " [REMOVED]");
  380|      0|		}
  381|      0|		fprintf(out_file, "\n");
  382|      0|	}
  383|      0|#endif /* CONFIG_DEBUG_FILE */
  384|      0|	if (!wpa_debug_syslog && !out_file) {
  ------------------
  |  Branch (384:6): [True: 0, False: 0]
  |  Branch (384:27): [True: 0, False: 0]
  ------------------
  385|      0|		printf("%s - hexdump(len=%lu):", title, (unsigned long) len);
  386|      0|		if (buf == NULL) {
  ------------------
  |  Branch (386:7): [True: 0, False: 0]
  ------------------
  387|      0|			printf(" [NULL]");
  388|      0|		} else if (show) {
  ------------------
  |  Branch (388:14): [True: 0, False: 0]
  ------------------
  389|      0|			for (i = 0; i < len; i++)
  ------------------
  |  Branch (389:16): [True: 0, False: 0]
  ------------------
  390|      0|				printf(" %02x", buf[i]);
  391|      0|		} else {
  392|      0|			printf(" [REMOVED]");
  393|      0|		}
  394|      0|		printf("\n");
  395|      0|	}
  396|      0|#endif /* CONFIG_ANDROID_LOG */
  397|      0|}
wpa_debug.c:_wpa_hexdump_ascii:
  413|  10.2k|{
  414|  10.2k|	size_t i, llen;
  415|  10.2k|	const u8 *pos = buf;
  416|  10.2k|	const size_t line_len = 16;
  417|       |
  418|       |#ifdef CONFIG_DEBUG_LINUX_TRACING
  419|       |	if (wpa_debug_tracing_file != NULL) {
  420|       |		fprintf(wpa_debug_tracing_file,
  421|       |			WPAS_TRACE_PFX "%s - hexdump_ascii(len=%lu):",
  422|       |			level, title, (unsigned long) len);
  423|       |		if (buf == NULL) {
  424|       |			fprintf(wpa_debug_tracing_file, " [NULL]\n");
  425|       |		} else if (!show) {
  426|       |			fprintf(wpa_debug_tracing_file, " [REMOVED]\n");
  427|       |		} else {
  428|       |			/* can do ascii processing in userspace */
  429|       |			for (i = 0; i < len; i++)
  430|       |				fprintf(wpa_debug_tracing_file,
  431|       |					" %02x", pos[i]);
  432|       |		}
  433|       |		fflush(wpa_debug_tracing_file);
  434|       |	}
  435|       |#endif /* CONFIG_DEBUG_LINUX_TRACING */
  436|       |
  437|  10.2k|	if (level < wpa_debug_level)
  ------------------
  |  Branch (437:6): [True: 10.2k, False: 0]
  ------------------
  438|  10.2k|		return;
  439|       |#ifdef CONFIG_ANDROID_LOG
  440|       |	_wpa_hexdump(level, title, buf, len, show, 0);
  441|       |#else /* CONFIG_ANDROID_LOG */
  442|       |#ifdef CONFIG_DEBUG_SYSLOG
  443|       |	if (wpa_debug_syslog)
  444|       |		_wpa_hexdump(level, title, buf, len, show, 1);
  445|       |#endif /* CONFIG_DEBUG_SYSLOG */
  446|      0|	wpa_debug_print_timestamp();
  447|      0|#ifdef CONFIG_DEBUG_FILE
  448|      0|	if (out_file) {
  ------------------
  |  Branch (448:6): [True: 0, False: 0]
  ------------------
  449|      0|		if (!show) {
  ------------------
  |  Branch (449:7): [True: 0, False: 0]
  ------------------
  450|      0|			fprintf(out_file,
  451|      0|				"%s - hexdump_ascii(len=%lu): [REMOVED]\n",
  452|      0|				title, (unsigned long) len);
  453|      0|			goto file_done;
  454|      0|		}
  455|      0|		if (buf == NULL) {
  ------------------
  |  Branch (455:7): [True: 0, False: 0]
  ------------------
  456|      0|			fprintf(out_file,
  457|      0|				"%s - hexdump_ascii(len=%lu): [NULL]\n",
  458|      0|				title, (unsigned long) len);
  459|      0|			goto file_done;
  460|      0|		}
  461|      0|		fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n",
  462|      0|			title, (unsigned long) len);
  463|      0|		while (len) {
  ------------------
  |  Branch (463:10): [True: 0, False: 0]
  ------------------
  464|      0|			llen = len > line_len ? line_len : len;
  ------------------
  |  Branch (464:11): [True: 0, False: 0]
  ------------------
  465|      0|			fprintf(out_file, "    ");
  466|      0|			for (i = 0; i < llen; i++)
  ------------------
  |  Branch (466:16): [True: 0, False: 0]
  ------------------
  467|      0|				fprintf(out_file, " %02x", pos[i]);
  468|      0|			for (i = llen; i < line_len; i++)
  ------------------
  |  Branch (468:19): [True: 0, False: 0]
  ------------------
  469|      0|				fprintf(out_file, "   ");
  470|      0|			fprintf(out_file, "   ");
  471|      0|			for (i = 0; i < llen; i++) {
  ------------------
  |  Branch (471:16): [True: 0, False: 0]
  ------------------
  472|      0|				if (isprint(pos[i]))
  ------------------
  |  Branch (472:9): [True: 0, False: 0]
  ------------------
  473|      0|					fprintf(out_file, "%c", pos[i]);
  474|      0|				else
  475|      0|					fprintf(out_file, "_");
  476|      0|			}
  477|      0|			for (i = llen; i < line_len; i++)
  ------------------
  |  Branch (477:19): [True: 0, False: 0]
  ------------------
  478|      0|				fprintf(out_file, " ");
  479|      0|			fprintf(out_file, "\n");
  480|      0|			pos += llen;
  481|      0|			len -= llen;
  482|      0|		}
  483|      0|	}
  484|      0|file_done:
  485|      0|#endif /* CONFIG_DEBUG_FILE */
  486|      0|	if (!wpa_debug_syslog && !out_file) {
  ------------------
  |  Branch (486:6): [True: 0, False: 0]
  |  Branch (486:27): [True: 0, False: 0]
  ------------------
  487|      0|		if (!show) {
  ------------------
  |  Branch (487:7): [True: 0, False: 0]
  ------------------
  488|      0|			printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n",
  489|      0|			       title, (unsigned long) len);
  490|      0|			return;
  491|      0|		}
  492|      0|		if (buf == NULL) {
  ------------------
  |  Branch (492:7): [True: 0, False: 0]
  ------------------
  493|      0|			printf("%s - hexdump_ascii(len=%lu): [NULL]\n",
  494|      0|			       title, (unsigned long) len);
  495|      0|			return;
  496|      0|		}
  497|      0|		printf("%s - hexdump_ascii(len=%lu):\n", title,
  498|      0|		       (unsigned long) len);
  499|      0|		while (len) {
  ------------------
  |  Branch (499:10): [True: 0, False: 0]
  ------------------
  500|      0|			llen = len > line_len ? line_len : len;
  ------------------
  |  Branch (500:11): [True: 0, False: 0]
  ------------------
  501|      0|			printf("    ");
  502|      0|			for (i = 0; i < llen; i++)
  ------------------
  |  Branch (502:16): [True: 0, False: 0]
  ------------------
  503|      0|				printf(" %02x", pos[i]);
  504|      0|			for (i = llen; i < line_len; i++)
  ------------------
  |  Branch (504:19): [True: 0, False: 0]
  ------------------
  505|      0|				printf("   ");
  506|      0|			printf("   ");
  507|      0|			for (i = 0; i < llen; i++) {
  ------------------
  |  Branch (507:16): [True: 0, False: 0]
  ------------------
  508|      0|				if (isprint(pos[i]))
  ------------------
  |  Branch (508:9): [True: 0, False: 0]
  ------------------
  509|      0|					printf("%c", pos[i]);
  510|      0|				else
  511|      0|					printf("_");
  512|      0|			}
  513|      0|			for (i = llen; i < line_len; i++)
  ------------------
  |  Branch (513:19): [True: 0, False: 0]
  ------------------
  514|      0|				printf(" ");
  515|      0|			printf("\n");
  516|      0|			pos += llen;
  517|      0|			len -= llen;
  518|      0|		}
  519|      0|	}
  520|      0|#endif /* CONFIG_ANDROID_LOG */
  521|      0|}

tls-client.c:wpa_hexdump_buf:
  122|  63.5k|{
  123|  63.5k|	wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL,
  ------------------
  |  Branch (123:28): [True: 63.5k, False: 0]
  ------------------
  124|  63.5k|		    buf ? wpabuf_len(buf) : 0);
  ------------------
  |  Branch (124:7): [True: 63.5k, False: 0]
  ------------------
  125|  63.5k|}

wpabuf_resize:
   48|     23|{
   49|     23|	struct wpabuf *buf = *_buf;
   50|       |#ifdef WPA_TRACE
   51|       |	struct wpabuf_trace *trace;
   52|       |#endif /* WPA_TRACE */
   53|       |
   54|     23|	if (buf == NULL) {
  ------------------
  |  Branch (54:6): [True: 22, False: 1]
  ------------------
   55|     22|		*_buf = wpabuf_alloc(add_len);
   56|     22|		return *_buf == NULL ? -1 : 0;
  ------------------
  |  Branch (56:10): [True: 0, False: 22]
  ------------------
   57|     22|	}
   58|       |
   59|       |#ifdef WPA_TRACE
   60|       |	trace = wpabuf_get_trace(buf);
   61|       |	if (trace->magic != WPABUF_MAGIC) {
   62|       |		wpa_printf(MSG_ERROR, "wpabuf: invalid magic %x",
   63|       |			   trace->magic);
   64|       |		wpa_trace_show("wpabuf_resize invalid magic");
   65|       |		abort();
   66|       |	}
   67|       |#endif /* WPA_TRACE */
   68|       |
   69|      1|	if (buf->used + add_len > buf->size) {
  ------------------
  |  Branch (69:6): [True: 0, False: 1]
  ------------------
   70|      0|		unsigned char *nbuf;
   71|      0|		if (buf->flags & WPABUF_FLAG_EXT_DATA) {
  ------------------
  |  |   13|      0|#define WPABUF_FLAG_EXT_DATA BIT(0)
  |  |  ------------------
  |  |  |  |  458|      0|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (71:7): [True: 0, False: 0]
  ------------------
   72|      0|			nbuf = os_realloc(buf->buf, buf->used + add_len);
  ------------------
  |  |  508|      0|#define os_realloc(p, s) realloc((p), (s))
  ------------------
   73|      0|			if (nbuf == NULL)
  ------------------
  |  Branch (73:8): [True: 0, False: 0]
  ------------------
   74|      0|				return -1;
   75|      0|			os_memset(nbuf + buf->used, 0, add_len);
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   76|      0|			buf->buf = nbuf;
   77|      0|		} else {
   78|       |#ifdef WPA_TRACE
   79|       |			nbuf = os_realloc(trace, sizeof(struct wpabuf_trace) +
   80|       |					  sizeof(struct wpabuf) +
   81|       |					  buf->used + add_len);
   82|       |			if (nbuf == NULL)
   83|       |				return -1;
   84|       |			trace = (struct wpabuf_trace *) nbuf;
   85|       |			buf = (struct wpabuf *) (trace + 1);
   86|       |			os_memset(nbuf + sizeof(struct wpabuf_trace) +
   87|       |				  sizeof(struct wpabuf) + buf->used, 0,
   88|       |				  add_len);
   89|       |#else /* WPA_TRACE */
   90|      0|			nbuf = os_realloc(buf, sizeof(struct wpabuf) +
  ------------------
  |  |  508|      0|#define os_realloc(p, s) realloc((p), (s))
  ------------------
   91|      0|					  buf->used + add_len);
   92|      0|			if (nbuf == NULL)
  ------------------
  |  Branch (92:8): [True: 0, False: 0]
  ------------------
   93|      0|				return -1;
   94|      0|			buf = (struct wpabuf *) nbuf;
   95|      0|			os_memset(nbuf + sizeof(struct wpabuf) + buf->used, 0,
  ------------------
  |  |  529|      0|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   96|      0|				  add_len);
   97|      0|#endif /* WPA_TRACE */
   98|      0|			buf->buf = (u8 *) (buf + 1);
   99|      0|			*_buf = buf;
  100|      0|		}
  101|      0|		buf->size = buf->used + add_len;
  102|      0|	}
  103|       |
  104|      1|	return 0;
  105|      1|}
wpabuf_alloc:
  114|  64.3k|{
  115|       |#ifdef WPA_TRACE
  116|       |	struct wpabuf_trace *trace = os_zalloc(sizeof(struct wpabuf_trace) +
  117|       |					       sizeof(struct wpabuf) + len);
  118|       |	struct wpabuf *buf;
  119|       |	if (trace == NULL)
  120|       |		return NULL;
  121|       |	trace->magic = WPABUF_MAGIC;
  122|       |	buf = (struct wpabuf *) (trace + 1);
  123|       |#else /* WPA_TRACE */
  124|  64.3k|	struct wpabuf *buf = os_zalloc(sizeof(struct wpabuf) + len);
  125|  64.3k|	if (buf == NULL)
  ------------------
  |  Branch (125:6): [True: 0, False: 64.3k]
  ------------------
  126|      0|		return NULL;
  127|  64.3k|#endif /* WPA_TRACE */
  128|       |
  129|  64.3k|	buf->size = len;
  130|  64.3k|	buf->buf = (u8 *) (buf + 1);
  131|  64.3k|	return buf;
  132|  64.3k|}
wpabuf_alloc_ext_data:
  136|  66.3k|{
  137|       |#ifdef WPA_TRACE
  138|       |	struct wpabuf_trace *trace = os_zalloc(sizeof(struct wpabuf_trace) +
  139|       |					       sizeof(struct wpabuf));
  140|       |	struct wpabuf *buf;
  141|       |	if (trace == NULL)
  142|       |		return NULL;
  143|       |	trace->magic = WPABUF_MAGIC;
  144|       |	buf = (struct wpabuf *) (trace + 1);
  145|       |#else /* WPA_TRACE */
  146|  66.3k|	struct wpabuf *buf = os_zalloc(sizeof(struct wpabuf));
  147|  66.3k|	if (buf == NULL)
  ------------------
  |  Branch (147:6): [True: 0, False: 66.3k]
  ------------------
  148|      0|		return NULL;
  149|  66.3k|#endif /* WPA_TRACE */
  150|       |
  151|  66.3k|	buf->size = len;
  152|  66.3k|	buf->used = len;
  153|  66.3k|	buf->buf = data;
  154|  66.3k|	buf->flags |= WPABUF_FLAG_EXT_DATA;
  ------------------
  |  |   13|  66.3k|#define WPABUF_FLAG_EXT_DATA BIT(0)
  |  |  ------------------
  |  |  |  |  458|  66.3k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  155|       |
  156|  66.3k|	return buf;
  157|  66.3k|}
wpabuf_alloc_copy:
  161|    115|{
  162|    115|	struct wpabuf *buf = wpabuf_alloc(len);
  163|    115|	if (buf)
  ------------------
  |  Branch (163:6): [True: 115, False: 0]
  ------------------
  164|    115|		wpabuf_put_data(buf, data, len);
  165|    115|	return buf;
  166|    115|}
wpabuf_free:
  187|   262k|{
  188|       |#ifdef WPA_TRACE
  189|       |	struct wpabuf_trace *trace;
  190|       |	if (buf == NULL)
  191|       |		return;
  192|       |	trace = wpabuf_get_trace(buf);
  193|       |	if (trace->magic != WPABUF_MAGIC) {
  194|       |		wpa_printf(MSG_ERROR, "wpabuf_free: invalid magic %x",
  195|       |			   trace->magic);
  196|       |		wpa_trace_show("wpabuf_free magic mismatch");
  197|       |		abort();
  198|       |	}
  199|       |	if (buf->flags & WPABUF_FLAG_EXT_DATA)
  200|       |		os_free(buf->buf);
  201|       |	os_free(trace);
  202|       |#else /* WPA_TRACE */
  203|   262k|	if (buf == NULL)
  ------------------
  |  Branch (203:6): [True: 131k, False: 130k]
  ------------------
  204|   131k|		return;
  205|   130k|	if (buf->flags & WPABUF_FLAG_EXT_DATA)
  ------------------
  |  |   13|   130k|#define WPABUF_FLAG_EXT_DATA BIT(0)
  |  |  ------------------
  |  |  |  |  458|   130k|#define BIT(x) (1U << (x))
  |  |  ------------------
  ------------------
  |  Branch (205:6): [True: 66.3k, False: 64.3k]
  ------------------
  206|  66.3k|		os_free(buf->buf);
  ------------------
  |  |  511|  66.3k|#define os_free(p) free((p))
  ------------------
  207|   130k|	os_free(buf);
  ------------------
  |  |  511|   130k|#define os_free(p) free((p))
  ------------------
  208|   130k|#endif /* WPA_TRACE */
  209|   130k|}
wpabuf_put:
  222|  63.7k|{
  223|  63.7k|	void *tmp = wpabuf_mhead_u8(buf) + wpabuf_len(buf);
  224|  63.7k|	buf->used += len;
  225|  63.7k|	if (buf->used > buf->size) {
  ------------------
  |  Branch (225:6): [True: 0, False: 63.7k]
  ------------------
  226|      0|		wpabuf_overflow(buf, len);
  227|      0|	}
  228|  63.7k|	return tmp;
  229|  63.7k|}

tls-client.c:wpabuf_put_data:
  174|  63.5k|{
  175|  63.5k|	if (data)
  ------------------
  |  Branch (175:6): [True: 63.5k, False: 0]
  ------------------
  176|  63.5k|		os_memcpy(wpabuf_put(buf, len), data, len);
  ------------------
  |  |  523|  63.5k|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  177|  63.5k|}
tls-client.c:wpabuf_put_str:
  193|     48|{
  194|     48|	wpabuf_put_data(dst, str, os_strlen(str));
  ------------------
  |  |  536|     48|#define os_strlen(s) strlen(s)
  ------------------
  195|     48|}
tls-client.c:wpabuf_head:
   94|  63.5k|{
   95|  63.5k|	return buf->buf;
   96|  63.5k|}
tls-client.c:wpabuf_len:
   59|  63.5k|{
   60|  63.5k|	return buf->used;
   61|  63.5k|}
tls_internal.c:wpabuf_head:
   94|  63.5k|{
   95|  63.5k|	return buf->buf;
   96|  63.5k|}
tls_internal.c:wpabuf_len:
   59|  63.5k|{
   60|  63.5k|	return buf->used;
   61|  63.5k|}
tls_internal.c:wpabuf_mhead:
  109|     24|{
  110|     24|	return buf->buf;
  111|     24|}
tls_internal.c:wpabuf_size:
   49|     24|{
   50|     24|	return buf->size;
   51|     24|}
tlsv1_client.c:wpabuf_tailroom:
   69|     23|{
   70|     23|	return buf->size - buf->used;
   71|     23|}
wpabuf.c:wpabuf_put_data:
  174|    115|{
  175|    115|	if (data)
  ------------------
  |  Branch (175:6): [True: 115, False: 0]
  ------------------
  176|    115|		os_memcpy(wpabuf_put(buf, len), data, len);
  ------------------
  |  |  523|    115|#define os_memcpy(d, s, n) memcpy((d), (s), (n))
  ------------------
  177|    115|}
wpabuf.c:wpabuf_len:
   59|  63.7k|{
   60|  63.7k|	return buf->used;
   61|  63.7k|}
wpabuf.c:wpabuf_mhead:
  109|  63.7k|{
  110|  63.7k|	return buf->buf;
  111|  63.7k|}
wpabuf.c:wpabuf_mhead_u8:
  114|  63.7k|{
  115|  63.7k|	return (u8 *) wpabuf_mhead(buf);
  116|  63.7k|}

wpa_fuzzer_set_debug_level:
   15|  3.10k|{
   16|  3.10k|	static int first = 1;
   17|       |
   18|  3.10k|	if (first) {
  ------------------
  |  Branch (18:6): [True: 1, False: 3.10k]
  ------------------
   19|      1|		char *env;
   20|       |
   21|      1|		first = 0;
   22|      1|		env = getenv("WPADEBUG");
   23|      1|		if (env)
  ------------------
  |  Branch (23:7): [True: 0, False: 1]
  ------------------
   24|      0|			wpa_debug_level = atoi(env);
   25|      1|		else
   26|      1|			wpa_debug_level = MSG_ERROR + 1;
   27|       |
   28|      1|		wpa_debug_show_keys = 1;
   29|      1|	}
   30|  3.10k|}

LLVMFuzzerTestOneInput:
   56|  3.10k|{
   57|  3.10k|	struct context ctx;
   58|  3.10k|	struct tls_config conf;
   59|  3.10k|	void *tls_client;
   60|  3.10k|	struct tls_connection_params params;
   61|  3.10k|	struct tls_connection *conn_client = NULL;
   62|  3.10k|	int ret = -1;
   63|  3.10k|	struct wpabuf *in = NULL, *out = NULL, *appl;
   64|       |
   65|  3.10k|	wpa_fuzzer_set_debug_level();
   66|       |
   67|  3.10k|	os_memset(&ctx, 0, sizeof(ctx));
  ------------------
  |  |  529|  3.10k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   68|  3.10k|	ctx.data = data;
   69|  3.10k|	ctx.data_len = size;
   70|       |
   71|  3.10k|	os_memset(&conf, 0, sizeof(conf));
  ------------------
  |  |  529|  3.10k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   72|  3.10k|	tls_client = tls_init(&conf);
   73|  3.10k|	if (!tls_client)
  ------------------
  |  Branch (73:6): [True: 0, False: 3.10k]
  ------------------
   74|      0|		goto fail;
   75|       |
   76|  3.10k|	os_memset(&params, 0, sizeof(params));
  ------------------
  |  |  529|  3.10k|#define os_memset(s, c, n) memset(s, c, n)
  ------------------
   77|  3.10k|	params.ca_cert = CERTDIR "ca.pem";
  ------------------
  |  |   16|  3.10k|#define CERTDIR "../../hwsim/auth_serv/"
  ------------------
   78|  3.10k|	params.client_cert = CERTDIR "server.pem";
  ------------------
  |  |   16|  3.10k|#define CERTDIR "../../hwsim/auth_serv/"
  ------------------
   79|  3.10k|	params.private_key = CERTDIR "server.key";
  ------------------
  |  |   16|  3.10k|#define CERTDIR "../../hwsim/auth_serv/"
  ------------------
   80|       |
   81|  3.10k|	conn_client = tls_connection_init(tls_client);
   82|  3.10k|	if (!conn_client)
  ------------------
  |  Branch (82:6): [True: 0, False: 3.10k]
  ------------------
   83|      0|		goto fail;
   84|       |
   85|  3.10k|	in = NULL;
   86|  66.6k|	for (;;) {
   87|  66.6k|		appl = NULL;
   88|  66.6k|		out = tls_connection_handshake(tls_client, conn_client, in,
   89|  66.6k|					       &appl);
   90|  66.6k|		wpabuf_free(in);
   91|  66.6k|		in = NULL;
   92|  66.6k|		if (!out)
  ------------------
  |  Branch (92:7): [True: 217, False: 66.3k]
  ------------------
   93|    217|			goto fail;
   94|  66.3k|		if (tls_connection_get_failed(tls_client, conn_client)) {
  ------------------
  |  Branch (94:7): [True: 0, False: 66.3k]
  ------------------
   95|      0|			wpa_printf(MSG_ERROR, "TLS handshake failed");
   96|      0|			goto fail;
   97|      0|		}
   98|  66.3k|		if (tls_connection_established(tls_client, conn_client))
  ------------------
  |  Branch (98:7): [True: 24, False: 66.3k]
  ------------------
   99|     24|			break;
  100|       |
  101|  66.3k|		appl = NULL;
  102|  66.3k|		in = read_msg(&ctx);
  103|  66.3k|		wpabuf_free(out);
  104|  66.3k|		out = NULL;
  105|  66.3k|		if (!in)
  ------------------
  |  Branch (105:7): [True: 2.86k, False: 63.5k]
  ------------------
  106|  2.86k|			goto fail;
  107|  63.5k|		if (tls_connection_established(tls_client, conn_client))
  ------------------
  |  Branch (107:7): [True: 0, False: 63.5k]
  ------------------
  108|      0|			break;
  109|  63.5k|	}
  110|       |
  111|     24|	wpabuf_free(in);
  112|     24|	in = wpabuf_alloc(100);
  113|     24|	if (!in)
  ------------------
  |  Branch (113:6): [True: 0, False: 24]
  ------------------
  114|      0|		goto fail;
  115|     24|	wpabuf_put_str(in, "PING");
  116|     24|	wpabuf_free(out);
  117|     24|	out = tls_connection_encrypt(tls_client, conn_client, in);
  118|     24|	wpabuf_free(in);
  119|     24|	in = NULL;
  120|     24|	if (!out)
  ------------------
  |  Branch (120:6): [True: 0, False: 24]
  ------------------
  121|      0|		goto fail;
  122|       |
  123|     24|	wpabuf_free(in);
  124|     24|	in = wpabuf_alloc(100);
  125|     24|	if (!in)
  ------------------
  |  Branch (125:6): [True: 0, False: 24]
  ------------------
  126|      0|		goto fail;
  127|     24|	wpabuf_put_str(in, "PONG");
  128|     24|	wpabuf_free(out);
  129|     24|	out = read_msg(&ctx);
  130|     24|	wpabuf_free(in);
  131|     24|	in = NULL;
  132|     24|	if (!out)
  ------------------
  |  Branch (132:6): [True: 1, False: 23]
  ------------------
  133|      1|		goto fail;
  134|       |
  135|     23|	in = tls_connection_decrypt(tls_client, conn_client, out);
  136|     23|	wpabuf_free(out);
  137|     23|	out = NULL;
  138|     23|	if (!in)
  ------------------
  |  Branch (138:6): [True: 3, False: 20]
  ------------------
  139|      3|		goto fail;
  140|     20|	wpa_hexdump_buf(MSG_DEBUG, "Client decrypted ApplData", in);
  141|       |
  142|     20|	ret = 0;
  143|  3.10k|fail:
  144|  3.10k|	if (tls_client) {
  ------------------
  |  Branch (144:6): [True: 3.10k, False: 0]
  ------------------
  145|  3.10k|		if (conn_client)
  ------------------
  |  Branch (145:7): [True: 3.10k, False: 0]
  ------------------
  146|  3.10k|			tls_connection_deinit(tls_client, conn_client);
  147|  3.10k|		tls_deinit(tls_client);
  148|  3.10k|	}
  149|  3.10k|	wpabuf_free(in);
  150|  3.10k|	wpabuf_free(out);
  151|       |
  152|  3.10k|	return ret;
  153|     20|}
tls-client.c:read_msg:
   27|  66.3k|{
   28|  66.3k|	u16 msg_len;
   29|  66.3k|	struct wpabuf *msg;
   30|       |
   31|  66.3k|	if (ctx->data_len - ctx->data_offset < 2) {
  ------------------
  |  Branch (31:6): [True: 2.22k, False: 64.1k]
  ------------------
   32|  2.22k|		wpa_printf(MSG_ERROR, "TEST-ERROR: Could not read msg len");
   33|  2.22k|		return NULL;
   34|  2.22k|	}
   35|  64.1k|	msg_len = WPA_GET_BE16(&ctx->data[ctx->data_offset]);
   36|  64.1k|	ctx->data_offset += 2;
   37|       |
   38|  64.1k|	msg = wpabuf_alloc(msg_len);
   39|  64.1k|	if (!msg)
  ------------------
  |  Branch (39:6): [True: 0, False: 64.1k]
  ------------------
   40|      0|		return NULL;
   41|  64.1k|	if (msg_len > 0 && ctx->data_len - ctx->data_offset < msg_len) {
  ------------------
  |  Branch (41:6): [True: 64.0k, False: 122]
  |  Branch (41:21): [True: 638, False: 63.4k]
  ------------------
   42|    638|		wpa_printf(MSG_ERROR, "TEST-ERROR: Truncated msg (msg_len=%u)",
   43|    638|			   msg_len);
   44|    638|		wpabuf_free(msg);
   45|    638|		return NULL;
   46|    638|	}
   47|  63.5k|	wpabuf_put_data(msg, &ctx->data[ctx->data_offset], msg_len);
   48|  63.5k|	ctx->data_offset += msg_len;
   49|  63.5k|	wpa_hexdump_buf(MSG_DEBUG, "TEST: Read message from file", msg);
   50|       |
   51|  63.5k|	return msg;
   52|  64.1k|}

