Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Attempt to determine RS-ECC formulation */
- #include <stdio.h>
- typedef short si16;
- /* Irreducible polynomials to try */
- si16 gfpolys[] = {
- 0x211, 0x259, 0x331, 0x299, 0x313, 0x22d, 0x277, 0x361,
- 0x2db, 0x385, 0x217, 0x3e9, 0x3e3, 0x38f, 0x36b, 0x21b,
- 0x301, 0x26f, 0x3cd, 0x373, 0x3cb, 0x27d, 0x35b, 0x3d5,
- 0x295, 0x2bd, 0x2f5, 0x2cf, 0x25f, 0x265, 0x3fb, 0x349,
- 0x3c7, 0x315, 0x2b7, 0x2a5, 0x24b, 0x2f9, 0x3b9, 0x2af,
- 0x2a3, 0x37f, 0x31f, 0x34f, 0x203, 0x287, 0x2d1, 0x269,
- 0x3b5, 0x3a1, 0x33b, 0x3d9, 0x233, 0x323, 0x36d, 0x221 };
- /* We know there are 9 bits so there are GF(2^9) = 512 elements in here */
- si16 gf_log[512];
- si16 gf_exp[512];
- si16 rs_gen[9]; /* generator polynomial */
- si16 rsp[8] = { 0x1fe, 0x1ad, 0x13a, 0x09e, 0x003, 0x17d, 0x0a2, 0x0c5 };
- void gf_init(si16 p) {
- int i;
- si16 v = 1;
- gf_exp[0] = 1;
- gf_log[0] = -1;
- for(i=1;i<512;i++) {
- v <<= 1;
- if(v & 0x200)
- v ^= p;
- gf_exp[i] = v;
- gf_log[v] = i;
- }
- }
- si16 gf_mul(si16 x, si16 y) {
- if(!x || !y)
- return 0;
- return gf_exp[(gf_log[x]+gf_log[y]) %511];
- }
- void rs_gen_init() {
- int i, j;
- si16 multmp[9];
- memset(rs_gen,0,sizeof(rs_gen));
- rs_gen[0] = gf_exp[1];
- rs_gen[1] = 1;
- for(i=2;i<=8;i++) {
- memset(multmp, 0, sizeof(multmp));
- for(j=0;j<8;j++) {
- multmp[j] ^= gf_mul(rs_gen[j], gf_exp[i]);
- multmp[j+1] ^= gf_mul(rs_gen[j], 1);
- }
- memcpy(rs_gen, multmp, sizeof(rs_gen));
- }
- for(i=0;i<9;i++)
- rs_gen[i] = multmp[8-i];
- }
- int main(int argc, char **argv) {
- int i, j, k;
- unsigned char sect[512];
- si16 syms_in[511];
- si16 syms_out[511];
- si16 ecc_out[8];
- unsigned char ecc[9];
- unsigned char eccbytes_out[9];
- FILE *fin;
- if(argc<2) {
- fprintf(stderr,"usage: rs_eccheck in\n");
- return 1;
- }
- if(!(fin = fopen(argv[1],"rb"))) {
- fprintf(stderr,"error opening %s\n",argv[1]);
- return 2;
- }
- fread(sect,1,512,fin);
- fread(ecc,1,9,fin);
- fclose(fin);
- /* 0 := s[0]<<1 | s[1]>>7;
- 1 := s[1]<<2 | s[2]>>6;
- 2 := s[2]<<3 | s[3]>>5;
- ...
- 7 := s[7]<<8 | s[8]>>0;
- 8 := s[9]<<1 | s[10]>>7;
- 9 := s[10]<<2 | s[11]>>6;
- ...
- 14 := s[15]<<7 | s[16]>>1;
- 15 := s[16]<<8 | s[17]>>0;
- ...
- */
- for(i=0;i<72;i++) {
- unsigned int yo = i*9/8;
- unsigned int io = i*9%8;
- syms_in[i] = ((sect[yo]<<(io+1)) | (sect[yo+1]>>(7-io))) & 511;
- }
- for(i=72;i<503;i++)
- syms_in[i] = sect[i+9];
- for(i=503;i<511;i++)
- syms_in[i] = 0;
- printf("ECC Bytes In are: ");
- for(i=0;i<9;i++)
- printf("%02x ",ecc[i]);
- printf("\n");
- for(i=0;i<1;i++) {
- printf("Trying polynomial %d (%d)... ",i,gfpolys[i]);
- gf_init(gfpolys[i]);
- /* printf("Elements of GF: ");
- for(j=0;j<512;j++)
- printf("%d ",gf_exp[j]);
- printf("Elements of GFlog: ");
- for(j=0;j<512;j++)
- printf("%d ",gf_log[j]); */
- rs_gen_init();
- printf("Generator polynomial: ");
- for(j=0;j<9;j++)
- printf("%03x ",rs_gen[j]);
- /*
- memset(syms_out, 0, sizeof(syms_out));
- memset(ecc_out, 0, sizeof(ecc_out));
- for(j=0;j<503;j++)
- syms_out[j] = syms_in[j];
- for(j=0;j<503;j++) {
- si16 v = syms_out[j];
- if(v)
- for(k=0;k<9;k++)
- syms_out[j+k] ^= gf_mul(rs_gen[k], v);
- }
- printf("After round: ");
- for(j=0;j<511;j++)
- printf("%d ", syms_out[j]);
- memcpy(ecc_out, &syms_out[503], sizeof(ecc_out)); */
- memcpy(ecc_out, syms_in, sizeof(ecc_out));
- for(j=0;j<503;j++) {
- si16 v = ecc_out[0];
- for(k=0;k<7;k++)
- ecc_out[k] = ecc_out[k+1] ^ gf_mul(v, rsp[k]);
- ecc_out[7] = syms_in[8+j] ^ gf_mul(v, rsp[7]);
- }
- printf("\nECC symbols: ");
- for(j=0;j<8;j++)
- printf("%d ", ecc_out[j]);
- eccbytes_out[0] = ecc_out[0]>>1;
- eccbytes_out[1] = (ecc_out[0]<<7) | (ecc_out[1]>>2);
- eccbytes_out[2] = (ecc_out[1]<<6) | (ecc_out[2]>>3);
- eccbytes_out[3] = (ecc_out[2]<<5) | (ecc_out[3]>>4);
- eccbytes_out[4] = (ecc_out[3]<<4) | (ecc_out[4]>>5);
- eccbytes_out[5] = (ecc_out[4]<<3) | (ecc_out[5]>>6);
- eccbytes_out[6] = (ecc_out[5]<<2) | (ecc_out[6]>>7);
- eccbytes_out[7] = (ecc_out[6]<<1) | (ecc_out[7]>>8);
- eccbytes_out[8] = ecc_out[7];
- if(!memcmp(eccbytes_out, ecc, 9)) {
- printf("SUCCESS! Matched values: ");
- for(j=0;j<9;j++)
- printf("%02x ",eccbytes_out[j]);
- printf("\n");
- goto done;
- } else {
- printf("No match: ");
- for(j=0;j<9;j++)
- printf("%02x ",eccbytes_out[j]);
- printf("\n");
- }
- }
- done:
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement