114 lines
2.6 KiB
C
114 lines
2.6 KiB
C
|
/*****************************
|
||
|
* Copyright Henry Minsky (hqm@alum.mit.edu) 1991-2009
|
||
|
*
|
||
|
* This software library is licensed under terms of the GNU GENERAL
|
||
|
* PUBLIC LICENSE
|
||
|
*
|
||
|
* RSCODE is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation, either version 3 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
* RSCODE is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with Rscode. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
* Commercial licensing is available under a separate license, please
|
||
|
* contact author for details.
|
||
|
*
|
||
|
* Source code is available at http://rscode.sourceforge.net
|
||
|
*
|
||
|
*
|
||
|
* Multiplication and Arithmetic on Galois Field GF(256)
|
||
|
*
|
||
|
* From Mee, Daniel, "Magnetic Recording, Volume III", Ch. 5 by Patel.
|
||
|
*
|
||
|
*
|
||
|
******************************/
|
||
|
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include "ecc.h"
|
||
|
|
||
|
/* This is one of 14 irreducible polynomials
|
||
|
* of degree 8 and cycle length 255. (Ch 5, pp. 275, Magnetic Recording)
|
||
|
* The high order 1 bit is implicit */
|
||
|
/* x^8 + x^4 + x^3 + x^2 + 1 */
|
||
|
#define PPOLY 0x1D
|
||
|
|
||
|
|
||
|
int gexp[512];
|
||
|
int glog[256];
|
||
|
|
||
|
|
||
|
static void init_exp_table (void);
|
||
|
|
||
|
|
||
|
void
|
||
|
init_galois_tables (void)
|
||
|
{
|
||
|
/* initialize the table of powers of alpha */
|
||
|
init_exp_table();
|
||
|
}
|
||
|
|
||
|
|
||
|
static void
|
||
|
init_exp_table (void)
|
||
|
{
|
||
|
int i, z;
|
||
|
int pinit,p1,p2,p3,p4,p5,p6,p7,p8;
|
||
|
|
||
|
pinit = p2 = p3 = p4 = p5 = p6 = p7 = p8 = 0;
|
||
|
p1 = 1;
|
||
|
|
||
|
gexp[0] = 1;
|
||
|
gexp[255] = gexp[0];
|
||
|
glog[0] = 0; /* shouldn't log[0] be an error? */
|
||
|
|
||
|
// Private pp8() As Integer = {1, 0, 1, 1, 1, 0, 0, 0, 1} 'specify irreducible polynomial coeffts */
|
||
|
|
||
|
for (i = 1; i < 256; i++) {
|
||
|
pinit = p8;
|
||
|
p8 = p7;
|
||
|
p7 = p6;
|
||
|
p6 = p5;
|
||
|
p5 = p4 ^ pinit;
|
||
|
p4 = p3 ^ pinit;
|
||
|
p3 = p2 ^ pinit;
|
||
|
p2 = p1;
|
||
|
p1 = pinit;
|
||
|
gexp[i] = p1 + p2*2 + p3*4 + p4*8 + p5*16 + p6*32 + p7*64 + p8*128;
|
||
|
gexp[i+255] = gexp[i];
|
||
|
}
|
||
|
|
||
|
for (i = 1; i < 256; i++) {
|
||
|
for (z = 0; z < 256; z++) {
|
||
|
if (gexp[z] == i) {
|
||
|
glog[i] = z;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* multiplication using logarithms */
|
||
|
int gmult(int a, int b)
|
||
|
{
|
||
|
int i,j;
|
||
|
if (a==0 || b == 0) return (0);
|
||
|
i = glog[a];
|
||
|
j = glog[b];
|
||
|
return (gexp[i+j]);
|
||
|
}
|
||
|
|
||
|
|
||
|
int ginv (int elt)
|
||
|
{
|
||
|
return (gexp[255-glog[elt]]);
|
||
|
}
|
||
|
|