Advertisement
Guest User

rs_eccheck

a guest
Feb 5th, 2017
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. /* Attempt to determine RS-ECC formulation */
  2.  
  3. #include <stdio.h>
  4.  
  5. typedef short si16;
  6.  
  7. /* Irreducible polynomials to try */
  8. si16 gfpolys[] = {
  9. 0x211, 0x259, 0x331, 0x299, 0x313, 0x22d, 0x277, 0x361,
  10. 0x2db, 0x385, 0x217, 0x3e9, 0x3e3, 0x38f, 0x36b, 0x21b,
  11. 0x301, 0x26f, 0x3cd, 0x373, 0x3cb, 0x27d, 0x35b, 0x3d5,
  12. 0x295, 0x2bd, 0x2f5, 0x2cf, 0x25f, 0x265, 0x3fb, 0x349,
  13. 0x3c7, 0x315, 0x2b7, 0x2a5, 0x24b, 0x2f9, 0x3b9, 0x2af,
  14. 0x2a3, 0x37f, 0x31f, 0x34f, 0x203, 0x287, 0x2d1, 0x269,
  15. 0x3b5, 0x3a1, 0x33b, 0x3d9, 0x233, 0x323, 0x36d, 0x221 };
  16.  
  17. /* We know there are 9 bits so there are GF(2^9) = 512 elements in here */
  18. si16 gf_log[512];
  19. si16 gf_exp[512];
  20.  
  21. si16 rs_gen[9]; /* generator polynomial */
  22. si16 rsp[8] = { 0x1fe, 0x1ad, 0x13a, 0x09e, 0x003, 0x17d, 0x0a2, 0x0c5 };
  23.  
  24. void gf_init(si16 p) {
  25. int i;
  26. si16 v = 1;
  27. gf_exp[0] = 1;
  28. gf_log[0] = -1;
  29. for(i=1;i<512;i++) {
  30. v <<= 1;
  31. if(v & 0x200)
  32. v ^= p;
  33. gf_exp[i] = v;
  34. gf_log[v] = i;
  35. }
  36. }
  37.  
  38. si16 gf_mul(si16 x, si16 y) {
  39. if(!x || !y)
  40. return 0;
  41. return gf_exp[(gf_log[x]+gf_log[y]) %511];
  42. }
  43.  
  44. void rs_gen_init() {
  45. int i, j;
  46. si16 multmp[9];
  47. memset(rs_gen,0,sizeof(rs_gen));
  48. rs_gen[0] = gf_exp[1];
  49. rs_gen[1] = 1;
  50. for(i=2;i<=8;i++) {
  51. memset(multmp, 0, sizeof(multmp));
  52. for(j=0;j<8;j++) {
  53. multmp[j] ^= gf_mul(rs_gen[j], gf_exp[i]);
  54. multmp[j+1] ^= gf_mul(rs_gen[j], 1);
  55. }
  56. memcpy(rs_gen, multmp, sizeof(rs_gen));
  57. }
  58. for(i=0;i<9;i++)
  59. rs_gen[i] = multmp[8-i];
  60. }
  61.  
  62. int main(int argc, char **argv) {
  63. int i, j, k;
  64. unsigned char sect[512];
  65. si16 syms_in[511];
  66. si16 syms_out[511];
  67. si16 ecc_out[8];
  68. unsigned char ecc[9];
  69. unsigned char eccbytes_out[9];
  70. FILE *fin;
  71. if(argc<2) {
  72. fprintf(stderr,"usage: rs_eccheck in\n");
  73. return 1;
  74. }
  75. if(!(fin = fopen(argv[1],"rb"))) {
  76. fprintf(stderr,"error opening %s\n",argv[1]);
  77. return 2;
  78. }
  79. fread(sect,1,512,fin);
  80. fread(ecc,1,9,fin);
  81. fclose(fin);
  82. /* 0 := s[0]<<1 | s[1]>>7;
  83. 1 := s[1]<<2 | s[2]>>6;
  84. 2 := s[2]<<3 | s[3]>>5;
  85. ...
  86. 7 := s[7]<<8 | s[8]>>0;
  87.  
  88. 8 := s[9]<<1 | s[10]>>7;
  89. 9 := s[10]<<2 | s[11]>>6;
  90. ...
  91. 14 := s[15]<<7 | s[16]>>1;
  92. 15 := s[16]<<8 | s[17]>>0;
  93. ...
  94. */
  95. for(i=0;i<72;i++) {
  96. unsigned int yo = i*9/8;
  97. unsigned int io = i*9%8;
  98. syms_in[i] = ((sect[yo]<<(io+1)) | (sect[yo+1]>>(7-io))) & 511;
  99. }
  100. for(i=72;i<503;i++)
  101. syms_in[i] = sect[i+9];
  102. for(i=503;i<511;i++)
  103. syms_in[i] = 0;
  104. printf("ECC Bytes In are: ");
  105. for(i=0;i<9;i++)
  106. printf("%02x ",ecc[i]);
  107. printf("\n");
  108. for(i=0;i<1;i++) {
  109. printf("Trying polynomial %d (%d)... ",i,gfpolys[i]);
  110. gf_init(gfpolys[i]);
  111. /* printf("Elements of GF: ");
  112. for(j=0;j<512;j++)
  113. printf("%d ",gf_exp[j]);
  114. printf("Elements of GFlog: ");
  115. for(j=0;j<512;j++)
  116. printf("%d ",gf_log[j]); */
  117. rs_gen_init();
  118. printf("Generator polynomial: ");
  119. for(j=0;j<9;j++)
  120. printf("%03x ",rs_gen[j]);
  121. /*
  122. memset(syms_out, 0, sizeof(syms_out));
  123. memset(ecc_out, 0, sizeof(ecc_out));
  124. for(j=0;j<503;j++)
  125. syms_out[j] = syms_in[j];
  126. for(j=0;j<503;j++) {
  127. si16 v = syms_out[j];
  128. if(v)
  129. for(k=0;k<9;k++)
  130. syms_out[j+k] ^= gf_mul(rs_gen[k], v);
  131. }
  132. printf("After round: ");
  133. for(j=0;j<511;j++)
  134. printf("%d ", syms_out[j]);
  135. memcpy(ecc_out, &syms_out[503], sizeof(ecc_out)); */
  136. memcpy(ecc_out, syms_in, sizeof(ecc_out));
  137. for(j=0;j<503;j++) {
  138. si16 v = ecc_out[0];
  139. for(k=0;k<7;k++)
  140. ecc_out[k] = ecc_out[k+1] ^ gf_mul(v, rsp[k]);
  141. ecc_out[7] = syms_in[8+j] ^ gf_mul(v, rsp[7]);
  142. }
  143. printf("\nECC symbols: ");
  144. for(j=0;j<8;j++)
  145. printf("%d ", ecc_out[j]);
  146. eccbytes_out[0] = ecc_out[0]>>1;
  147. eccbytes_out[1] = (ecc_out[0]<<7) | (ecc_out[1]>>2);
  148. eccbytes_out[2] = (ecc_out[1]<<6) | (ecc_out[2]>>3);
  149. eccbytes_out[3] = (ecc_out[2]<<5) | (ecc_out[3]>>4);
  150. eccbytes_out[4] = (ecc_out[3]<<4) | (ecc_out[4]>>5);
  151. eccbytes_out[5] = (ecc_out[4]<<3) | (ecc_out[5]>>6);
  152. eccbytes_out[6] = (ecc_out[5]<<2) | (ecc_out[6]>>7);
  153. eccbytes_out[7] = (ecc_out[6]<<1) | (ecc_out[7]>>8);
  154. eccbytes_out[8] = ecc_out[7];
  155. if(!memcmp(eccbytes_out, ecc, 9)) {
  156. printf("SUCCESS! Matched values: ");
  157. for(j=0;j<9;j++)
  158. printf("%02x ",eccbytes_out[j]);
  159. printf("\n");
  160. goto done;
  161. } else {
  162. printf("No match: ");
  163. for(j=0;j<9;j++)
  164. printf("%02x ",eccbytes_out[j]);
  165. printf("\n");
  166. }
  167. }
  168. done:
  169. return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement