Increase CRC size to 32-bits. This breaks backwards compatibility.
This commit is contained in:
		
							parent
							
								
									d3bc9dca2d
								
							
						
					
					
						commit
						662629e501
					
				
							
								
								
									
										43
									
								
								ssdv.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								ssdv.c
									
									
									
									
									
								
							|  | @ -153,21 +153,24 @@ static void *dtblcpy(ssdv_t *s, const void *src, size_t n) | ||||||
| 	return(r); | 	return(r); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifndef crc_xmodem_update | static uint32_t crc32(void *data, size_t length) | ||||||
| uint16_t crc_xmodem_update(uint16_t crc, uint8_t data) |  | ||||||
| { | { | ||||||
| 	int i; | 	uint32_t crc, x; | ||||||
|  | 	uint8_t i, *d; | ||||||
| 	 | 	 | ||||||
| 	crc = crc ^ ((uint16_t) data << 8); | 	for(d = data, crc = 0xFFFFFFFF; length; length--) | ||||||
| 	for(i = 0; i < 8; i++) |  | ||||||
| 	{ | 	{ | ||||||
| 		if(crc & 0x8000) crc = (crc << 1) ^ 0x1021; | 		x = (crc ^ *(d++)) & 0xFF; | ||||||
| 		else crc <<= 1; | 		for(i = 8; i > 0; i--) | ||||||
|  | 		{ | ||||||
|  | 			if(x & 1) x = (x >> 1) ^ 0xEDB88320; | ||||||
|  | 			else x >>= 1; | ||||||
|  | 		} | ||||||
|  | 		crc = (crc >> 8) ^ x; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	return(crc); | 	return(crc ^ 0xFFFFFFFF); | ||||||
| } | } | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| static uint32_t encode_callsign(char *callsign) | static uint32_t encode_callsign(char *callsign) | ||||||
| { | { | ||||||
|  | @ -920,8 +923,8 @@ char ssdv_enc_get_packet(ssdv_t *s) | ||||||
| 			if(r == SSDV_BUFFER_FULL || r == SSDV_EOI) | 			if(r == SSDV_BUFFER_FULL || r == SSDV_EOI) | ||||||
| 			{ | 			{ | ||||||
| 				uint16_t mcu_id     = s->packet_mcu_id; | 				uint16_t mcu_id     = s->packet_mcu_id; | ||||||
| 				uint8_t  mcu_offset = s->packet_mcu_offset; | 				uint8_t i, mcu_offset = s->packet_mcu_offset; | ||||||
| 				uint16_t i, x; | 				uint32_t x; | ||||||
| 				 | 				 | ||||||
| 				if(mcu_offset != 0xFF && mcu_offset >= SSDV_PKT_SIZE_PAYLOAD) | 				if(mcu_offset != 0xFF && mcu_offset >= SSDV_PKT_SIZE_PAYLOAD) | ||||||
| 				{ | 				{ | ||||||
|  | @ -958,10 +961,12 @@ char ssdv_enc_get_packet(ssdv_t *s) | ||||||
| 				if(s->out_len > 0) ssdv_memset_prng(s->outp, s->out_len); | 				if(s->out_len > 0) ssdv_memset_prng(s->outp, s->out_len); | ||||||
| 				 | 				 | ||||||
| 				/* Calculate the CRC codes */ | 				/* Calculate the CRC codes */ | ||||||
| 				for(i = 1, x = 0xFFFF; i < SSDV_PKT_SIZE - SSDV_PKT_SIZE_RSCODES - SSDV_PKT_SIZE_CRC; i++) | 				x = crc32(&s->out[1], SSDV_PKT_SIZE_CRCDATA); | ||||||
| 					x = crc_xmodem_update(x, s->out[i]); |  | ||||||
| 				 | 				 | ||||||
| 				s->out[i++] = x >> 8; | 				i = 1 + SSDV_PKT_SIZE_CRCDATA; | ||||||
|  | 				s->out[i++] = (x >> 24) & 0xFF; | ||||||
|  | 				s->out[i++] = (x >> 16) & 0xFF; | ||||||
|  | 				s->out[i++] = (x >> 8) & 0xFF; | ||||||
| 				s->out[i++] = x & 0xFF; | 				s->out[i++] = x & 0xFF; | ||||||
| 				 | 				 | ||||||
| 				/* Generate the RS codes */ | 				/* Generate the RS codes */ | ||||||
|  | @ -1259,7 +1264,7 @@ char ssdv_dec_is_packet(uint8_t *packet, int *errors) | ||||||
| { | { | ||||||
| 	uint8_t pkt[SSDV_PKT_SIZE]; | 	uint8_t pkt[SSDV_PKT_SIZE]; | ||||||
| 	ssdv_packet_info_t p; | 	ssdv_packet_info_t p; | ||||||
| 	uint16_t x; | 	uint32_t x; | ||||||
| 	int i; | 	int i; | ||||||
| 	 | 	 | ||||||
| 	/* Testing is destructive, work on a copy */ | 	/* Testing is destructive, work on a copy */ | ||||||
|  | @ -1284,10 +1289,12 @@ char ssdv_dec_is_packet(uint8_t *packet, int *errors) | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	/* Test the checksum */ | 	/* Test the checksum */ | ||||||
| 	for(i = 1, x = 0xFFFF; i < SSDV_PKT_SIZE - SSDV_PKT_SIZE_RSCODES - SSDV_PKT_SIZE_CRC; i++) | 	x = crc32(&pkt[1], SSDV_PKT_SIZE_CRCDATA); | ||||||
| 		x = crc_xmodem_update(x, pkt[i]); |  | ||||||
| 	 | 	 | ||||||
| 	if(pkt[i++] != (x >> 8)) return(-1); | 	i = 1 + SSDV_PKT_SIZE_CRCDATA; | ||||||
|  | 	if(pkt[i++] != ((x >> 24) & 0xFF)) return(-1); | ||||||
|  | 	if(pkt[i++] != ((x >> 16) & 0xFF)) return(-1); | ||||||
|  | 	if(pkt[i++] != ((x >> 8) & 0xFF)) return(-1); | ||||||
| 	if(pkt[i++] != (x & 0xFF)) return(-1); | 	if(pkt[i++] != (x & 0xFF)) return(-1); | ||||||
| 	 | 	 | ||||||
| 	/* Appears to be a valid packet! Copy it back */ | 	/* Appears to be a valid packet! Copy it back */ | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								ssdv.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								ssdv.h
									
									
									
									
									
								
							|  | @ -34,9 +34,10 @@ extern "C" { | ||||||
| /* Packet details */ | /* Packet details */ | ||||||
| #define SSDV_PKT_SIZE         (0x100) | #define SSDV_PKT_SIZE         (0x100) | ||||||
| #define SSDV_PKT_SIZE_HEADER  (0x0F) | #define SSDV_PKT_SIZE_HEADER  (0x0F) | ||||||
| #define SSDV_PKT_SIZE_CRC     (0x02) | #define SSDV_PKT_SIZE_CRC     (0x04) | ||||||
| #define SSDV_PKT_SIZE_RSCODES (0x20) | #define SSDV_PKT_SIZE_RSCODES (0x20) | ||||||
| #define SSDV_PKT_SIZE_PAYLOAD (SSDV_PKT_SIZE - SSDV_PKT_SIZE_HEADER - SSDV_PKT_SIZE_CRC - SSDV_PKT_SIZE_RSCODES) | #define SSDV_PKT_SIZE_PAYLOAD (SSDV_PKT_SIZE - SSDV_PKT_SIZE_HEADER - SSDV_PKT_SIZE_CRC - SSDV_PKT_SIZE_RSCODES) | ||||||
|  | #define SSDV_PKT_SIZE_CRCDATA (SSDV_PKT_SIZE_HEADER + SSDV_PKT_SIZE_PAYLOAD - 1) | ||||||
| 
 | 
 | ||||||
| #define TBL_LEN (546) /* Maximum size of the DQT and DHT tables */ | #define TBL_LEN (546) /* Maximum size of the DQT and DHT tables */ | ||||||
| #define HBUFF_LEN (16) /* Extra space for reading marker data */ | #define HBUFF_LEN (16) /* Extra space for reading marker data */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Philip Heron
						Philip Heron