Index: libsrtp/test/lfsr.c |
=================================================================== |
--- libsrtp/test/lfsr.c (revision 0) |
+++ libsrtp/test/lfsr.c (revision 0) |
@@ -0,0 +1,310 @@ |
+/* |
+ * lfsr.c |
+ * |
+ */ |
+ |
+ |
+#include <stdio.h> |
+#include "datatypes.h" |
+ |
+uint32_t |
+parity(uint32_t x) { |
+ |
+ x ^= (x >> 16); |
+ x ^= (x >> 8); |
+ x ^= (x >> 4); |
+ x ^= (x >> 2); |
+ x ^= (x >> 1); |
+ |
+ return x & 1; |
+} |
+ |
+ |
+/* typedef struct { */ |
+/* uint32_t register[8]; */ |
+/* } lfsr_t; */ |
+ |
+void |
+compute_period(uint32_t feedback_polynomial) { |
+ int i; |
+ v32_t lfsr; |
+ v32_t mask; |
+ |
+ mask.value = feedback_polynomial; |
+ lfsr.value = 1; |
+ |
+ printf("polynomial: %s\t", v32_bit_string(mask)); |
+ |
+ for (i=0; i < 256; i++) { |
+/* printf("%s\n", v32_bit_string(lfsr)); */ |
+ if (parity(mask.value & lfsr.value)) |
+ lfsr.value = ((lfsr.value << 1) | 1) & 0xff; |
+ else |
+ lfsr.value = (lfsr.value << 1) & 0xff; |
+ |
+ /* now halt if we're back at the initial state */ |
+ if (lfsr.value == 1) { |
+ printf("period: %d\n", i); |
+ break; |
+ } |
+ } |
+} |
+ |
+uint32_t poly0 = 223; |
+ |
+ |
+uint32_t polynomials[39] = { |
+31, |
+47, |
+55, |
+59, |
+61, |
+79, |
+87, |
+91, |
+103, |
+107, |
+109, |
+115, |
+117, |
+121, |
+143, |
+151, |
+157, |
+167, |
+171, |
+173, |
+179, |
+181, |
+185, |
+199, |
+203, |
+205, |
+211, |
+213, |
+227, |
+229, |
+233, |
+241, |
+127, |
+191, |
+223, |
+239, |
+247, |
+251, |
+253 |
+}; |
+ |
+char binary_string[32]; |
+ |
+char * |
+u32_bit_string(uint32_t x, unsigned int length) { |
+ unsigned int mask; |
+ int index; |
+ |
+ mask = 1 << length; |
+ index = 0; |
+ for (; mask > 0; mask >>= 1) |
+ if ((x & mask) == 0) |
+ binary_string[index++] = '0'; |
+ else |
+ binary_string[index++] = '1'; |
+ |
+ binary_string[index++] = 0; /* NULL terminate string */ |
+ return binary_string; |
+} |
+ |
+extern int octet_weight[256]; |
+ |
+unsigned int |
+weight(uint32_t poly) { |
+ int wt = 0; |
+ |
+ /* note: endian-ness makes no difference */ |
+ wt += octet_weight[poly & 0xff]; |
+ wt += octet_weight[(poly >> 8) & 0xff]; |
+ wt += octet_weight[(poly >> 16) & 0xff]; |
+ wt += octet_weight[(poly >> 24)]; |
+ |
+ return wt; |
+} |
+ |
+#define MAX_PERIOD 65535 |
+ |
+#define debug_print 0 |
+ |
+int |
+period(uint32_t poly) { |
+ int i; |
+ uint32_t x; |
+ |
+ |
+ /* set lfsr to 1 */ |
+ x = 1; |
+#if debug_print |
+ printf("%d:\t%s\n", 0, u32_bit_string(x,8)); |
+#endif |
+ for (i=1; i < MAX_PERIOD; i++) { |
+ if (x & 1) |
+ x = (x >> 1) ^ poly; |
+ else |
+ x = (x >> 1); |
+ |
+#if debug_print |
+ /* print for a sanity check */ |
+ printf("%d:\t%s\n", i, u32_bit_string(x,8)); |
+#endif |
+ |
+ /* check for return to original value */ |
+ if (x == 1) |
+ return i; |
+ } |
+ return i; |
+} |
+ |
+/* |
+ * weight distribution computes the weight distribution of the |
+ * code generated by the polynomial poly |
+ */ |
+ |
+#define MAX_LEN 8 |
+#define MAX_WEIGHT (1 << MAX_LEN) |
+ |
+int A[MAX_WEIGHT+1]; |
+ |
+void |
+weight_distribution2(uint32_t poly, int *A) { |
+ int i; |
+ uint32_t x; |
+ |
+ /* zeroize array */ |
+ for (i=0; i < MAX_WEIGHT+1; i++) |
+ A[i] = 0; |
+ |
+ /* loop over all input sequences */ |
+ |
+ |
+ /* set lfsr to 1 */ |
+ x = 1; |
+#if debug_print |
+ printf("%d:\t%s\n", 0, u32_bit_string(x,8)); |
+#endif |
+ for (i=1; i < MAX_PERIOD; i++) { |
+ if (x & 1) |
+ x = (x >> 1) ^ poly; |
+ else |
+ x = (x >> 1); |
+ |
+#if debug_print |
+ /* print for a sanity check */ |
+ printf("%d:\t%s\n", i, u32_bit_string(x,8)); |
+#endif |
+ |
+ /* increment weight */ |
+ wt += (x & 1); |
+ |
+ /* check for return to original value */ |
+ if (x == 1) |
+ break; |
+ } |
+ |
+ /* set zero */ |
+ A[0] = 0; |
+} |
+ |
+ |
+void |
+weight_distribution(uint32_t poly, int *A) { |
+ int i; |
+ uint32_t x; |
+ |
+ /* zeroize array */ |
+ for (i=0; i < MAX_WEIGHT+1; i++) |
+ A[i] = 0; |
+ |
+ /* set lfsr to 1 */ |
+ x = 1; |
+#if debug_print |
+ printf("%d:\t%s\n", 0, u32_bit_string(x,8)); |
+#endif |
+ for (i=1; i < MAX_PERIOD; i++) { |
+ if (x & 1) |
+ x = (x >> 1) ^ poly; |
+ else |
+ x = (x >> 1); |
+ |
+#if debug_print |
+ /* print for a sanity check */ |
+ printf("%d:\t%s\n", i, u32_bit_string(x,8)); |
+#endif |
+ |
+ /* compute weight, increment proper element */ |
+ A[weight(x)]++; |
+ |
+ /* check for return to original value */ |
+ if (x == 1) |
+ break; |
+ } |
+ |
+ /* set zero */ |
+ A[0] = 0; |
+} |
+ |
+ |
+ |
+ |
+int |
+main () { |
+ |
+ int i,j; |
+ v32_t x; |
+ v32_t p; |
+ |
+ /* originally 0xaf */ |
+ p.value = 0x9; |
+ |
+ printf("polynomial: %s\tperiod: %d\n", |
+ u32_bit_string(p.value,8), period(p.value)); |
+ |
+ /* compute weight distribution */ |
+ weight_distribution(p.value, A); |
+ |
+ /* print weight distribution */ |
+ for (i=0; i <= 8; i++) { |
+ printf("A[%d]: %d\n", i, A[i]); |
+ } |
+ |
+#if 0 |
+ for (i=0; i < 39; i++) { |
+ printf("polynomial: %s\tperiod: %d\n", |
+ u32_bit_string(polynomials[i],8), period(polynomials[i])); |
+ |
+ /* compute weight distribution */ |
+ weight_distribution(p.value, A); |
+ |
+ /* print weight distribution */ |
+ for (j=0; j <= 8; j++) { |
+ printf("A[%d]: %d\n", j, A[j]); |
+ } |
+ } |
+#endif |
+ |
+ { |
+ int bits = 8; |
+ uint32_t y; |
+ for (y=0; y < (1 << bits); y++) { |
+ printf("polynomial: %s\tweight: %d\tperiod: %d\n", |
+ u32_bit_string(y,bits), weight(y), period(y)); |
+ |
+ /* compute weight distribution */ |
+ weight_distribution(y, A); |
+ |
+ /* print weight distribution */ |
+ for (j=0; j <= 8; j++) { |
+ printf("A[%d]: %d\n", j, A[j]); |
+ } |
+ } |
+ } |
+ |
+ return 0; |
+} |
Property changes on: libsrtp/test/lfsr.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |