Commit a92b4a54 authored by bol-van's avatar bol-van
Browse files

nfqws: backport QUICDefragCrypto

parent 24e3b531
Loading
Loading
Loading
Loading
+35 −16
Original line number Diff line number Diff line
@@ -866,7 +866,7 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
	uint64_t offset,sz,szmax=0,zeropos=0,pos=0;
	bool found=false;
	struct range64 ranges[MAX_DEFRAG_PIECES];
	int i,range=0;
	int i,j,range=0;

	while(pos<clean_len)
	{
@@ -893,42 +893,59 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
				memset(defrag_data+zeropos,0,offset-zeropos);
			if ((offset+sz) > zeropos)
				zeropos=offset+sz;

			memcpy(defrag_data+offset,clean+pos,sz);
			if ((offset+sz) > szmax) szmax = offset+sz;

			found=true;
			pos+=sz;

			// remove exact duplicates early to save cpu
			for(i=0;i<range;i++)
				if (ranges[i].offset==offset && ranges[i].len==sz)
					goto endloop;

			ranges[range].offset = offset;
			ranges[range].len = sz;
			range++;
		}
endloop:
	}
	if (found)
	{
		defrag[0] = 6;
		defrag[1] = 0; // offset
		// 2..9 - length 64 bit
		// +10 - data start
		phton64(defrag+2,szmax);
		defrag[2] |= 0xC0; // 64 bit value
		*defrag_len = (size_t)(szmax+10);

		qsort(ranges, range, sizeof(*ranges), cmp_range64);

//		for(i=0 ; i<range ; i++)
		//	printf("RANGE %zu len %zu\n",ranges[i].offset,ranges[i].len);
//			printf("range1 %llu-%llu\n",ranges[i].offset,ranges[i].offset+ranges[i].len);

		for(i=0,offset=0,*bFull=true ; i<range ; i++)
		if (range>0)
		{
			if (ranges[i].offset!=offset)
			for (j=0,i=1; i < range; i++)
			{
				*bFull = false;
				break;
				uint64_t current_end = ranges[j].offset + ranges[j].len;
				uint64_t next_start = ranges[i].offset;
				uint64_t next_end = ranges[i].offset + ranges[i].len;

				if (next_start <= current_end)
					ranges[j].len = MAX(next_end,current_end) - ranges[j].offset;
				else
					ranges[++j] = ranges[i];
			}
			offset += ranges[i].len;
			range = j+1;
		}

//		for(i=0 ; i<range ; i++)
//			printf("range2 %llu-%llu\n",ranges[i].offset,ranges[i].offset+ranges[i].len);

		defrag[0] = 6;
		defrag[1] = 0; // offset
		// 2..9 - length 64 bit
		// +10 - data start
		phton64(defrag+2,szmax);
		defrag[2] |= 0xC0; // 64 bit value
		*defrag_len = (size_t)(szmax+10);

		*bFull = range==1 && !ranges[0].offset;
		//printf("bFull=%u\n",*bFull);
	}
	return found;
@@ -975,6 +992,8 @@ bool IsQUICInitial(const uint8_t *data, size_t len)
	if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
	offset += 1 + data[offset];

	if (offset>=len) return false;

	// SCID
	if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
	offset += 1 + data[offset];