00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifdef HAVE_CONFIG_H
00038 # include <dtn-config.h>
00039 #endif
00040
00041 #ifdef BSP_ENABLED
00042
00043 #include "brg_types.h"
00044 #include "brg_endian.h"
00045 #include "gf128mul.h"
00046
00047 #define gf_dat(q) {\
00048 q(0x00), q(0x01), q(0x02), q(0x03), q(0x04), q(0x05), q(0x06), q(0x07),\
00049 q(0x08), q(0x09), q(0x0a), q(0x0b), q(0x0c), q(0x0d), q(0x0e), q(0x0f),\
00050 q(0x10), q(0x11), q(0x12), q(0x13), q(0x14), q(0x15), q(0x16), q(0x17),\
00051 q(0x18), q(0x19), q(0x1a), q(0x1b), q(0x1c), q(0x1d), q(0x1e), q(0x1f),\
00052 q(0x20), q(0x21), q(0x22), q(0x23), q(0x24), q(0x25), q(0x26), q(0x27),\
00053 q(0x28), q(0x29), q(0x2a), q(0x2b), q(0x2c), q(0x2d), q(0x2e), q(0x2f),\
00054 q(0x30), q(0x31), q(0x32), q(0x33), q(0x34), q(0x35), q(0x36), q(0x37),\
00055 q(0x38), q(0x39), q(0x3a), q(0x3b), q(0x3c), q(0x3d), q(0x3e), q(0x3f),\
00056 q(0x40), q(0x41), q(0x42), q(0x43), q(0x44), q(0x45), q(0x46), q(0x47),\
00057 q(0x48), q(0x49), q(0x4a), q(0x4b), q(0x4c), q(0x4d), q(0x4e), q(0x4f),\
00058 q(0x50), q(0x51), q(0x52), q(0x53), q(0x54), q(0x55), q(0x56), q(0x57),\
00059 q(0x58), q(0x59), q(0x5a), q(0x5b), q(0x5c), q(0x5d), q(0x5e), q(0x5f),\
00060 q(0x60), q(0x61), q(0x62), q(0x63), q(0x64), q(0x65), q(0x66), q(0x67),\
00061 q(0x68), q(0x69), q(0x6a), q(0x6b), q(0x6c), q(0x6d), q(0x6e), q(0x6f),\
00062 q(0x70), q(0x71), q(0x72), q(0x73), q(0x74), q(0x75), q(0x76), q(0x77),\
00063 q(0x78), q(0x79), q(0x7a), q(0x7b), q(0x7c), q(0x7d), q(0x7e), q(0x7f),\
00064 q(0x80), q(0x81), q(0x82), q(0x83), q(0x84), q(0x85), q(0x86), q(0x87),\
00065 q(0x88), q(0x89), q(0x8a), q(0x8b), q(0x8c), q(0x8d), q(0x8e), q(0x8f),\
00066 q(0x90), q(0x91), q(0x92), q(0x93), q(0x94), q(0x95), q(0x96), q(0x97),\
00067 q(0x98), q(0x99), q(0x9a), q(0x9b), q(0x9c), q(0x9d), q(0x9e), q(0x9f),\
00068 q(0xa0), q(0xa1), q(0xa2), q(0xa3), q(0xa4), q(0xa5), q(0xa6), q(0xa7),\
00069 q(0xa8), q(0xa9), q(0xaa), q(0xab), q(0xac), q(0xad), q(0xae), q(0xaf),\
00070 q(0xb0), q(0xb1), q(0xb2), q(0xb3), q(0xb4), q(0xb5), q(0xb6), q(0xb7),\
00071 q(0xb8), q(0xb9), q(0xba), q(0xbb), q(0xbc), q(0xbd), q(0xbe), q(0xbf),\
00072 q(0xc0), q(0xc1), q(0xc2), q(0xc3), q(0xc4), q(0xc5), q(0xc6), q(0xc7),\
00073 q(0xc8), q(0xc9), q(0xca), q(0xcb), q(0xcc), q(0xcd), q(0xce), q(0xcf),\
00074 q(0xd0), q(0xd1), q(0xd2), q(0xd3), q(0xd4), q(0xd5), q(0xd6), q(0xd7),\
00075 q(0xd8), q(0xd9), q(0xda), q(0xdb), q(0xdc), q(0xdd), q(0xde), q(0xdf),\
00076 q(0xe0), q(0xe1), q(0xe2), q(0xe3), q(0xe4), q(0xe5), q(0xe6), q(0xe7),\
00077 q(0xe8), q(0xe9), q(0xea), q(0xeb), q(0xec), q(0xed), q(0xee), q(0xef),\
00078 q(0xf0), q(0xf1), q(0xf2), q(0xf3), q(0xf4), q(0xf5), q(0xf6), q(0xf7),\
00079 q(0xf8), q(0xf9), q(0xfa), q(0xfb), q(0xfc), q(0xfd), q(0xfe), q(0xff) }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
00092 # define xx(p,q) 0x##q##p
00093 #else
00094 # define xx(p,q) 0x##p##q
00095 #endif
00096
00097 #define xda(i) ( \
00098 (i & 0x80 ? xx(e1,00) : 0) ^ (i & 0x40 ? xx(70,80) : 0) ^ \
00099 (i & 0x20 ? xx(38,40) : 0) ^ (i & 0x10 ? xx(1c,20) : 0) ^ \
00100 (i & 0x08 ? xx(0e,10) : 0) ^ (i & 0x04 ? xx(07,08) : 0) ^ \
00101 (i & 0x02 ? xx(03,84) : 0) ^ (i & 0x01 ? xx(01,c2) : 0) )
00102
00103 const unsigned short gf_tab[256] = gf_dat(xda);
00104
00105 void gf_mul(void *a, const void* b)
00106 { uint_32t r[GF_BYTE_LEN >> 2], p[8][GF_BYTE_LEN >> 2];
00107 int i;
00108
00109 move_block_aligned(p[0], b);
00110 for(i = 0; i < 7; ++i)
00111 mul_x(p[i + 1], p[i]);
00112
00113 memset(r, 0, GF_BYTE_LEN);
00114 for(i = 0; i < 16; ++i)
00115 { unsigned char ch = ((unsigned char*)a)[15 - i];
00116 if(i) mul_x8(r);
00117
00118 if(ch & 0x80)
00119 xor_block_aligned(r, p[0]);
00120 if(ch & 0x40)
00121 xor_block_aligned(r, p[1]);
00122 if(ch & 0x20)
00123 xor_block_aligned(r, p[2]);
00124 if(ch & 0x10)
00125 xor_block_aligned(r, p[3]);
00126 if(ch & 0x08)
00127 xor_block_aligned(r, p[4]);
00128 if(ch & 0x04)
00129 xor_block_aligned(r, p[5]);
00130 if(ch & 0x02)
00131 xor_block_aligned(r, p[6]);
00132 if(ch & 0x01)
00133 xor_block_aligned(r, p[7]);
00134 }
00135 move_block_aligned(a, r);
00136 }
00137
00138 #if defined( TABLES_64K )
00139
00140 void init_64k_table(unsigned char g[], void *t)
00141 { int i, j, k;
00142
00143 memset(t, 0, 16 * 256 * 16);
00144 for(i = 0; i < GF_BYTE_LEN; ++i)
00145 {
00146 if(!i)
00147 {
00148 memcpy(tab64k(t)[0][128], g, GF_BYTE_LEN);
00149 for(j = 64; j > 0; j >>= 1)
00150 mul_x(tab64k(t)[0][j], tab64k(t)[0][j + j]);
00151 }
00152 else
00153 for(j = 128; j > 0; j >>= 1)
00154 {
00155 memcpy(tab64k(t)[i][j], tab64k(t)[i - 1][j], GF_BYTE_LEN);
00156 mul_x8(tab64k(t)[i][j]);
00157 }
00158
00159 for(j = 2; j < 256; j += j)
00160 for(k = 1; k < j; ++k)
00161 {
00162 tab64k(t)[i][j + k][0] = tab64k(t)[i][j][0] ^ tab64k(t)[i][k][0];
00163 tab64k(t)[i][j + k][1] = tab64k(t)[i][j][1] ^ tab64k(t)[i][k][1];
00164 tab64k(t)[i][j + k][2] = tab64k(t)[i][j][2] ^ tab64k(t)[i][k][2];
00165 tab64k(t)[i][j + k][3] = tab64k(t)[i][j][3] ^ tab64k(t)[i][k][3];
00166 }
00167 }
00168 }
00169
00170 #endif
00171
00172 #if defined( TABLES_8K )
00173
00174 void init_8k_table(unsigned char g[], void *t)
00175 { int i, j, k;
00176
00177 memset(tab8k(t), 0, 32 * 16 * 16);
00178 for(i = 0; i < 2 * GF_BYTE_LEN; ++i)
00179 {
00180 if(i == 0)
00181 {
00182 memcpy(tab8k(t)[1][8], g, GF_BYTE_LEN);
00183 for(j = 4; j > 0; j >>= 1)
00184 mul_x(tab8k(t)[1][j], tab8k(t)[1][j + j]);
00185
00186 mul_x(tab8k(t)[0][8], tab8k(t)[1][1]);
00187
00188 for(j = 4; j > 0; j >>= 1)
00189 mul_x(tab8k(t)[0][j], tab8k(t)[0][j + j]);
00190 }
00191 else if(i > 1)
00192 for(j = 8; j > 0; j >>= 1)
00193 {
00194 memcpy(tab8k(t)[i][j], tab8k(t)[i - 2][j], GF_BYTE_LEN);
00195 mul_x8(tab8k(t)[i][j]);
00196 }
00197
00198 for(j = 2; j < 16; j += j)
00199 for(k = 1; k < j; ++k)
00200 {
00201 tab8k(t)[i][j + k][0] = tab8k(t)[i][j][0] ^ tab8k(t)[i][k][0];
00202 tab8k(t)[i][j + k][1] = tab8k(t)[i][j][1] ^ tab8k(t)[i][k][1];
00203 tab8k(t)[i][j + k][2] = tab8k(t)[i][j][2] ^ tab8k(t)[i][k][2];
00204 tab8k(t)[i][j + k][3] = tab8k(t)[i][j][3] ^ tab8k(t)[i][k][3];
00205 }
00206 }
00207 }
00208
00209 #endif
00210
00211 #if defined( TABLES_4K )
00212
00213 void init_4k_table(unsigned char g[], void *t)
00214 { int j, k;
00215
00216 memset(tab4k(t), 0, 256 * 16);
00217 memcpy(tab4k(t)[128], g, GF_BYTE_LEN);
00218 for(j = 64; j > 0; j >>= 1)
00219 {
00220 mul_x(tab4k(t)[j], tab4k(t)[j + j]);
00221 }
00222
00223 for(j = 2; j < 256; j += j)
00224 for(k = 1; k < j; ++k)
00225 {
00226 tab4k(t)[j + k][0] = tab4k(t)[j][0] ^ tab4k(t)[k][0];
00227 tab4k(t)[j + k][1] = tab4k(t)[j][1] ^ tab4k(t)[k][1];
00228 tab4k(t)[j + k][2] = tab4k(t)[j][2] ^ tab4k(t)[k][2];
00229 tab4k(t)[j + k][3] = tab4k(t)[j][3] ^ tab4k(t)[k][3];
00230 }
00231 }
00232
00233 #endif
00234
00235 #if defined( TABLES_256 )
00236
00237 void init_256_table(unsigned char g[], void *t)
00238 { int j, k;
00239
00240 memset(tab256(t), 0, 16 * 16);
00241 memcpy(tab256(t)[8], g, GF_BYTE_LEN);
00242 for(j = 4; j > 0; j >>= 1)
00243 {
00244 mul_x(tab256(t)[j], tab256(t)[j + j]);
00245 }
00246
00247 for(j = 2; j < 16; j += j)
00248 for(k = 1; k < j; ++k)
00249 {
00250 tab256(t)[j + k][0] = tab256(t)[j][0] ^ tab256(t)[k][0];
00251 tab256(t)[j + k][1] = tab256(t)[j][1] ^ tab256(t)[k][1];
00252 tab256(t)[j + k][2] = tab256(t)[j][2] ^ tab256(t)[k][2];
00253 tab256(t)[j + k][3] = tab256(t)[j][3] ^ tab256(t)[k][3];
00254 }
00255 }
00256
00257 #endif
00258
00259 #endif