This source file includes following definitions.
- gf128mul_x8_lle
 
- gf128mul_x8_bbe
 
- gf128mul_x8_ble
 
- gf128mul_lle
 
- gf128mul_bbe
 
- gf128mul_init_64k_bbe
 
- gf128mul_free_64k
 
- gf128mul_64k_bbe
 
- gf128mul_init_4k_lle
 
- gf128mul_init_4k_bbe
 
- gf128mul_4k_lle
 
- gf128mul_4k_bbe
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 #include <crypto/gf128mul.h>
  52 #include <linux/kernel.h>
  53 #include <linux/module.h>
  54 #include <linux/slab.h>
  55 
  56 #define gf128mul_dat(q) { \
  57         q(0x00), q(0x01), q(0x02), q(0x03), q(0x04), q(0x05), q(0x06), q(0x07),\
  58         q(0x08), q(0x09), q(0x0a), q(0x0b), q(0x0c), q(0x0d), q(0x0e), q(0x0f),\
  59         q(0x10), q(0x11), q(0x12), q(0x13), q(0x14), q(0x15), q(0x16), q(0x17),\
  60         q(0x18), q(0x19), q(0x1a), q(0x1b), q(0x1c), q(0x1d), q(0x1e), q(0x1f),\
  61         q(0x20), q(0x21), q(0x22), q(0x23), q(0x24), q(0x25), q(0x26), q(0x27),\
  62         q(0x28), q(0x29), q(0x2a), q(0x2b), q(0x2c), q(0x2d), q(0x2e), q(0x2f),\
  63         q(0x30), q(0x31), q(0x32), q(0x33), q(0x34), q(0x35), q(0x36), q(0x37),\
  64         q(0x38), q(0x39), q(0x3a), q(0x3b), q(0x3c), q(0x3d), q(0x3e), q(0x3f),\
  65         q(0x40), q(0x41), q(0x42), q(0x43), q(0x44), q(0x45), q(0x46), q(0x47),\
  66         q(0x48), q(0x49), q(0x4a), q(0x4b), q(0x4c), q(0x4d), q(0x4e), q(0x4f),\
  67         q(0x50), q(0x51), q(0x52), q(0x53), q(0x54), q(0x55), q(0x56), q(0x57),\
  68         q(0x58), q(0x59), q(0x5a), q(0x5b), q(0x5c), q(0x5d), q(0x5e), q(0x5f),\
  69         q(0x60), q(0x61), q(0x62), q(0x63), q(0x64), q(0x65), q(0x66), q(0x67),\
  70         q(0x68), q(0x69), q(0x6a), q(0x6b), q(0x6c), q(0x6d), q(0x6e), q(0x6f),\
  71         q(0x70), q(0x71), q(0x72), q(0x73), q(0x74), q(0x75), q(0x76), q(0x77),\
  72         q(0x78), q(0x79), q(0x7a), q(0x7b), q(0x7c), q(0x7d), q(0x7e), q(0x7f),\
  73         q(0x80), q(0x81), q(0x82), q(0x83), q(0x84), q(0x85), q(0x86), q(0x87),\
  74         q(0x88), q(0x89), q(0x8a), q(0x8b), q(0x8c), q(0x8d), q(0x8e), q(0x8f),\
  75         q(0x90), q(0x91), q(0x92), q(0x93), q(0x94), q(0x95), q(0x96), q(0x97),\
  76         q(0x98), q(0x99), q(0x9a), q(0x9b), q(0x9c), q(0x9d), q(0x9e), q(0x9f),\
  77         q(0xa0), q(0xa1), q(0xa2), q(0xa3), q(0xa4), q(0xa5), q(0xa6), q(0xa7),\
  78         q(0xa8), q(0xa9), q(0xaa), q(0xab), q(0xac), q(0xad), q(0xae), q(0xaf),\
  79         q(0xb0), q(0xb1), q(0xb2), q(0xb3), q(0xb4), q(0xb5), q(0xb6), q(0xb7),\
  80         q(0xb8), q(0xb9), q(0xba), q(0xbb), q(0xbc), q(0xbd), q(0xbe), q(0xbf),\
  81         q(0xc0), q(0xc1), q(0xc2), q(0xc3), q(0xc4), q(0xc5), q(0xc6), q(0xc7),\
  82         q(0xc8), q(0xc9), q(0xca), q(0xcb), q(0xcc), q(0xcd), q(0xce), q(0xcf),\
  83         q(0xd0), q(0xd1), q(0xd2), q(0xd3), q(0xd4), q(0xd5), q(0xd6), q(0xd7),\
  84         q(0xd8), q(0xd9), q(0xda), q(0xdb), q(0xdc), q(0xdd), q(0xde), q(0xdf),\
  85         q(0xe0), q(0xe1), q(0xe2), q(0xe3), q(0xe4), q(0xe5), q(0xe6), q(0xe7),\
  86         q(0xe8), q(0xe9), q(0xea), q(0xeb), q(0xec), q(0xed), q(0xee), q(0xef),\
  87         q(0xf0), q(0xf1), q(0xf2), q(0xf3), q(0xf4), q(0xf5), q(0xf6), q(0xf7),\
  88         q(0xf8), q(0xf9), q(0xfa), q(0xfb), q(0xfc), q(0xfd), q(0xfe), q(0xff) \
  89 }
  90 
  91 
  92 
  93 
  94 
  95 
  96 
  97 
  98 
  99 
 100 
 101 
 102 
 103 
 104 
 105 
 106 
 107 
 108 
 109 
 110 
 111 
 112 
 113 
 114 
 115 #define xda_be(i) ( \
 116         (i & 0x80 ? 0x4380 : 0) ^ (i & 0x40 ? 0x21c0 : 0) ^ \
 117         (i & 0x20 ? 0x10e0 : 0) ^ (i & 0x10 ? 0x0870 : 0) ^ \
 118         (i & 0x08 ? 0x0438 : 0) ^ (i & 0x04 ? 0x021c : 0) ^ \
 119         (i & 0x02 ? 0x010e : 0) ^ (i & 0x01 ? 0x0087 : 0) \
 120 )
 121 
 122 #define xda_le(i) ( \
 123         (i & 0x80 ? 0xe100 : 0) ^ (i & 0x40 ? 0x7080 : 0) ^ \
 124         (i & 0x20 ? 0x3840 : 0) ^ (i & 0x10 ? 0x1c20 : 0) ^ \
 125         (i & 0x08 ? 0x0e10 : 0) ^ (i & 0x04 ? 0x0708 : 0) ^ \
 126         (i & 0x02 ? 0x0384 : 0) ^ (i & 0x01 ? 0x01c2 : 0) \
 127 )
 128 
 129 static const u16 gf128mul_table_le[256] = gf128mul_dat(xda_le);
 130 static const u16 gf128mul_table_be[256] = gf128mul_dat(xda_be);
 131 
 132 
 133 
 134 
 135 
 136 
 137 
 138 
 139 static void gf128mul_x8_lle(be128 *x)
 140 {
 141         u64 a = be64_to_cpu(x->a);
 142         u64 b = be64_to_cpu(x->b);
 143         u64 _tt = gf128mul_table_le[b & 0xff];
 144 
 145         x->b = cpu_to_be64((b >> 8) | (a << 56));
 146         x->a = cpu_to_be64((a >> 8) ^ (_tt << 48));
 147 }
 148 
 149 static void gf128mul_x8_bbe(be128 *x)
 150 {
 151         u64 a = be64_to_cpu(x->a);
 152         u64 b = be64_to_cpu(x->b);
 153         u64 _tt = gf128mul_table_be[a >> 56];
 154 
 155         x->a = cpu_to_be64((a << 8) | (b >> 56));
 156         x->b = cpu_to_be64((b << 8) ^ _tt);
 157 }
 158 
 159 void gf128mul_x8_ble(le128 *r, const le128 *x)
 160 {
 161         u64 a = le64_to_cpu(x->a);
 162         u64 b = le64_to_cpu(x->b);
 163         u64 _tt = gf128mul_table_be[a >> 56];
 164 
 165         r->a = cpu_to_le64((a << 8) | (b >> 56));
 166         r->b = cpu_to_le64((b << 8) ^ _tt);
 167 }
 168 EXPORT_SYMBOL(gf128mul_x8_ble);
 169 
 170 void gf128mul_lle(be128 *r, const be128 *b)
 171 {
 172         be128 p[8];
 173         int i;
 174 
 175         p[0] = *r;
 176         for (i = 0; i < 7; ++i)
 177                 gf128mul_x_lle(&p[i + 1], &p[i]);
 178 
 179         memset(r, 0, sizeof(*r));
 180         for (i = 0;;) {
 181                 u8 ch = ((u8 *)b)[15 - i];
 182 
 183                 if (ch & 0x80)
 184                         be128_xor(r, r, &p[0]);
 185                 if (ch & 0x40)
 186                         be128_xor(r, r, &p[1]);
 187                 if (ch & 0x20)
 188                         be128_xor(r, r, &p[2]);
 189                 if (ch & 0x10)
 190                         be128_xor(r, r, &p[3]);
 191                 if (ch & 0x08)
 192                         be128_xor(r, r, &p[4]);
 193                 if (ch & 0x04)
 194                         be128_xor(r, r, &p[5]);
 195                 if (ch & 0x02)
 196                         be128_xor(r, r, &p[6]);
 197                 if (ch & 0x01)
 198                         be128_xor(r, r, &p[7]);
 199 
 200                 if (++i >= 16)
 201                         break;
 202 
 203                 gf128mul_x8_lle(r);
 204         }
 205 }
 206 EXPORT_SYMBOL(gf128mul_lle);
 207 
 208 void gf128mul_bbe(be128 *r, const be128 *b)
 209 {
 210         be128 p[8];
 211         int i;
 212 
 213         p[0] = *r;
 214         for (i = 0; i < 7; ++i)
 215                 gf128mul_x_bbe(&p[i + 1], &p[i]);
 216 
 217         memset(r, 0, sizeof(*r));
 218         for (i = 0;;) {
 219                 u8 ch = ((u8 *)b)[i];
 220 
 221                 if (ch & 0x80)
 222                         be128_xor(r, r, &p[7]);
 223                 if (ch & 0x40)
 224                         be128_xor(r, r, &p[6]);
 225                 if (ch & 0x20)
 226                         be128_xor(r, r, &p[5]);
 227                 if (ch & 0x10)
 228                         be128_xor(r, r, &p[4]);
 229                 if (ch & 0x08)
 230                         be128_xor(r, r, &p[3]);
 231                 if (ch & 0x04)
 232                         be128_xor(r, r, &p[2]);
 233                 if (ch & 0x02)
 234                         be128_xor(r, r, &p[1]);
 235                 if (ch & 0x01)
 236                         be128_xor(r, r, &p[0]);
 237 
 238                 if (++i >= 16)
 239                         break;
 240 
 241                 gf128mul_x8_bbe(r);
 242         }
 243 }
 244 EXPORT_SYMBOL(gf128mul_bbe);
 245 
 246 
 247 
 248 
 249 
 250 
 251 
 252 
 253 
 254 
 255 
 256 
 257 
 258 
 259 
 260 struct gf128mul_64k *gf128mul_init_64k_bbe(const be128 *g)
 261 {
 262         struct gf128mul_64k *t;
 263         int i, j, k;
 264 
 265         t = kzalloc(sizeof(*t), GFP_KERNEL);
 266         if (!t)
 267                 goto out;
 268 
 269         for (i = 0; i < 16; i++) {
 270                 t->t[i] = kzalloc(sizeof(*t->t[i]), GFP_KERNEL);
 271                 if (!t->t[i]) {
 272                         gf128mul_free_64k(t);
 273                         t = NULL;
 274                         goto out;
 275                 }
 276         }
 277 
 278         t->t[0]->t[1] = *g;
 279         for (j = 1; j <= 64; j <<= 1)
 280                 gf128mul_x_bbe(&t->t[0]->t[j + j], &t->t[0]->t[j]);
 281 
 282         for (i = 0;;) {
 283                 for (j = 2; j < 256; j += j)
 284                         for (k = 1; k < j; ++k)
 285                                 be128_xor(&t->t[i]->t[j + k],
 286                                           &t->t[i]->t[j], &t->t[i]->t[k]);
 287 
 288                 if (++i >= 16)
 289                         break;
 290 
 291                 for (j = 128; j > 0; j >>= 1) {
 292                         t->t[i]->t[j] = t->t[i - 1]->t[j];
 293                         gf128mul_x8_bbe(&t->t[i]->t[j]);
 294                 }
 295         }
 296 
 297 out:
 298         return t;
 299 }
 300 EXPORT_SYMBOL(gf128mul_init_64k_bbe);
 301 
 302 void gf128mul_free_64k(struct gf128mul_64k *t)
 303 {
 304         int i;
 305 
 306         for (i = 0; i < 16; i++)
 307                 kzfree(t->t[i]);
 308         kzfree(t);
 309 }
 310 EXPORT_SYMBOL(gf128mul_free_64k);
 311 
 312 void gf128mul_64k_bbe(be128 *a, const struct gf128mul_64k *t)
 313 {
 314         u8 *ap = (u8 *)a;
 315         be128 r[1];
 316         int i;
 317 
 318         *r = t->t[0]->t[ap[15]];
 319         for (i = 1; i < 16; ++i)
 320                 be128_xor(r, r, &t->t[i]->t[ap[15 - i]]);
 321         *a = *r;
 322 }
 323 EXPORT_SYMBOL(gf128mul_64k_bbe);
 324 
 325 
 326 
 327 
 328 
 329 
 330 
 331 
 332 
 333 
 334 
 335 
 336 
 337 
 338 
 339 
 340 
 341 struct gf128mul_4k *gf128mul_init_4k_lle(const be128 *g)
 342 {
 343         struct gf128mul_4k *t;
 344         int j, k;
 345 
 346         t = kzalloc(sizeof(*t), GFP_KERNEL);
 347         if (!t)
 348                 goto out;
 349 
 350         t->t[128] = *g;
 351         for (j = 64; j > 0; j >>= 1)
 352                 gf128mul_x_lle(&t->t[j], &t->t[j+j]);
 353 
 354         for (j = 2; j < 256; j += j)
 355                 for (k = 1; k < j; ++k)
 356                         be128_xor(&t->t[j + k], &t->t[j], &t->t[k]);
 357 
 358 out:
 359         return t;
 360 }
 361 EXPORT_SYMBOL(gf128mul_init_4k_lle);
 362 
 363 struct gf128mul_4k *gf128mul_init_4k_bbe(const be128 *g)
 364 {
 365         struct gf128mul_4k *t;
 366         int j, k;
 367 
 368         t = kzalloc(sizeof(*t), GFP_KERNEL);
 369         if (!t)
 370                 goto out;
 371 
 372         t->t[1] = *g;
 373         for (j = 1; j <= 64; j <<= 1)
 374                 gf128mul_x_bbe(&t->t[j + j], &t->t[j]);
 375 
 376         for (j = 2; j < 256; j += j)
 377                 for (k = 1; k < j; ++k)
 378                         be128_xor(&t->t[j + k], &t->t[j], &t->t[k]);
 379 
 380 out:
 381         return t;
 382 }
 383 EXPORT_SYMBOL(gf128mul_init_4k_bbe);
 384 
 385 void gf128mul_4k_lle(be128 *a, const struct gf128mul_4k *t)
 386 {
 387         u8 *ap = (u8 *)a;
 388         be128 r[1];
 389         int i = 15;
 390 
 391         *r = t->t[ap[15]];
 392         while (i--) {
 393                 gf128mul_x8_lle(r);
 394                 be128_xor(r, r, &t->t[ap[i]]);
 395         }
 396         *a = *r;
 397 }
 398 EXPORT_SYMBOL(gf128mul_4k_lle);
 399 
 400 void gf128mul_4k_bbe(be128 *a, const struct gf128mul_4k *t)
 401 {
 402         u8 *ap = (u8 *)a;
 403         be128 r[1];
 404         int i = 0;
 405 
 406         *r = t->t[ap[0]];
 407         while (++i < 16) {
 408                 gf128mul_x8_bbe(r);
 409                 be128_xor(r, r, &t->t[ap[i]]);
 410         }
 411         *a = *r;
 412 }
 413 EXPORT_SYMBOL(gf128mul_4k_bbe);
 414 
 415 MODULE_LICENSE("GPL");
 416 MODULE_DESCRIPTION("Functions for multiplying elements of GF(2^128)");