chemelli74

Untitled

Nov 9th, 2025
111
0
13 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. sjcl.mode.ccm = {
  2.     name: "ccm",
  3.     encrypt: function(a, b, c, d, e) {
  4.         var f, g = b.slice(0), h = sjcl.bitArray, l = h.bitLength(c) / 8, k = h.bitLength(g) / 8;
  5.         e = e || 64;
  6.         d = d || [];
  7.         7 > l && q(new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"));
  8.         for (f = 2; 4 > f && k >>> 8 * f; f++)
  9.             ;
  10.         f < 15 - l && (f = 15 - l);
  11.         c = h.clamp(c, 8 * (15 - f));
  12.         b = sjcl.mode.ccm.K(a, b, c, d, e, f);
  13.         g = sjcl.mode.ccm.n(a, g, c, b, e, f);
  14.         return h.concat(g.data, g.tag)
  15.     },
  16.     decrypt: function(a, b, c, d, e) {
  17.         e = e || 64;
  18.         d = d || [];
  19.         var f = sjcl.bitArray
  20.           , g = f.bitLength(c) / 8
  21.           , h = f.bitLength(b)
  22.           , l = f.clamp(b, h - e)
  23.           , k = f.bitSlice(b, h - e)
  24.           , h = (h - e) / 8;
  25.         7 > g && q(new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"));
  26.         for (b = 2; 4 > b && h >>> 8 * b; b++)
  27.             ;
  28.         b < 15 - g && (b = 15 - g);
  29.         c = f.clamp(c, 8 * (15 - b));
  30.         l = sjcl.mode.ccm.n(a, l, c, k, e, b);
  31.         a = sjcl.mode.ccm.K(a, l.data, c, d, e, b);
  32.         f.equal(l.tag, a) || q(new sjcl.exception.corrupt("ccm: tag doesn't match"));
  33.         return l.data
  34.     },
  35.     K: function(a, b, c, d, e, f) {
  36.         var g = []
  37.           , h = sjcl.bitArray
  38.           , l = h.k;
  39.         e /= 8;
  40.         (e % 2 || 4 > e || 16 < e) && q(new sjcl.exception.invalid("ccm: invalid tag length"));
  41.         (0xffffffff < d.length || 0xffffffff < b.length) && q(new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"));
  42.         f = [h.partial(8, (d.length ? 64 : 0) | e - 2 << 2 | f - 1)];
  43.         f = h.concat(f, c);
  44.         f[3] |= h.bitLength(b) / 8;
  45.         f = a.encrypt(f);
  46.         if (d.length) {
  47.             c = h.bitLength(d) / 8;
  48.             65279 >= c ? g = [h.partial(16, c)] : 0xffffffff >= c && (g = h.concat([h.partial(16, 65534)], [c]));
  49.             g = h.concat(g, d);
  50.             for (d = 0; d < g.length; d += 4)
  51.                 f = a.encrypt(l(f, g.slice(d, d + 4).concat([0, 0, 0])))
  52.         }
  53.         for (d = 0; d < b.length; d += 4)
  54.             f = a.encrypt(l(f, b.slice(d, d + 4).concat([0, 0, 0])));
  55.         return h.clamp(f, 8 * e)
  56.     },
  57.     n: function(a, b, c, d, e, f) {
  58.         var g, h = sjcl.bitArray;
  59.         g = h.k;
  60.         var l = b.length
  61.           , k = h.bitLength(b);
  62.         c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4);
  63.         d = h.bitSlice(g(d, a.encrypt(c)), 0, e);
  64.         if (!l)
  65.             return {
  66.                 tag: d,
  67.                 data: []
  68.             };
  69.         for (g = 0; g < l; g += 4)
  70.             c[3]++,
  71.             e = a.encrypt(c),
  72.             b[g] ^= e[0],
  73.             b[g + 1] ^= e[1],
  74.             b[g + 2] ^= e[2],
  75.             b[g + 3] ^= e[3];
  76.         return {
  77.             tag: d,
  78.             data: h.clamp(b, k)
  79.         }
  80.     }
  81. };
Advertisement
Add Comment
Please, Sign In to add comment