1/* 2* jCryption JavaScript data encryption v1.1 3* http://www.jcryption.org/ 4* 5* Copyright (c) 2010 Daniel Griesser 6* Dual licensed under the MIT and GPL licenses. 7* http://www.opensource.org/licenses/mit-license.php 8* http://www.opensource.org/licenses/gpl-2.0.php 9* 10* If you need any further information about this plugin please 11* visit my homepage or contact me under [email protected] 12*/ 13(function($) { 14 $.jCryption = function(el, options) { 15 var base = this; 16 17 base.$el = $(el); 18 base.el = el; 19 20 base.$el.data("jCryption", base); 21 base.init = function() { 22 23 base.options = $.extend({},$.jCryption.defaultOptions, options); 24 25 $encryptedElement = $("<input />",{ 26 type:'hidden', 27 name:base.options.postVariable 28 }); 29 30 if (base.options.submitElement !== false) { 31 var $submitElement = base.options.submitElement; 32 } else { 33 var $submitElement = base.$el.find(":input:submit"); 34 } 35 36 $submitElement.bind(base.options.submitEvent,function() { 37 $(this).attr("disabled",true); 38 if(base.options.beforeEncryption()) { 39 $.jCryption.getKeys(base.options.getKeysURL,function(keys) { 40 $.jCryption.encrypt(base.$el.serialize(),keys,function(encrypted) { 41 $encryptedElement.val(encrypted); 42 $(base.$el).find(":input").attr("disabled",true).end().append($encryptedElement).submit(); 43 }); 44 }); 45 } 46 return false; 47 }); 48 49 }; 50 51 base.init(); 52 }; 53 54 $.jCryption.getKeys = function(url,callback) { 55 var base = this; 56 base.getKeys = function() { 57 /*$.getJSON(url,function(data){ 58 console.log(data.e+"==="+data.n+"==="+data.maxdigits); 59 keys = new base.jCryptionKeyPair(data.e,data.n,data.maxdigits); 60 if($.isFunction(callback)) { 61 callback.call(this, keys); 62 } 63 }); */ 64 $.ajax({ 65 type: 'get', 66 url: url, 67 dataType: "jsonp", 68 jsonp: "amp_jsonp_callback", 69 cache: false, 70 success: function (data) { 71 keys = new base.jCryptionKeyPair(data.e,data.n,data.maxdigits); 72 if($.isFunction(callback)) { 73 callback.call(this, keys); 74 } 75 } 76 }); 77 }; 78 79 base.jCryptionKeyPair = function(encryptionExponent, modulus, maxdigits) { 80 setMaxDigits(parseInt(maxdigits,10)); 81 this.e = biFromHex(encryptionExponent); 82 this.m = biFromHex(modulus); 83 this.chunkSize = 2 * biHighIndex(this.m); 84 this.radix = 16; 85 this.barrett = new BarrettMu(this.m); 86 }; 87 88 base.getKeys(); 89 }; 90 91 $.jCryption.encrypt = function(string,keyPair,callback) { 92 var charSum = 0; 93 for(var i = 0; i < string.length; i++){ 94 charSum += string.charCodeAt(i); 95 } 96 var tag = '0123456789abcdef'; 97 var hex = ''; 98 hex += tag.charAt((charSum & 0xF0) >> 4) + tag.charAt(charSum & 0x0F); 99 100 var taggedString = hex + string; 101 102 var encrypt = []; 103 var j = 0; 104 105 while (j < taggedString.length) { 106 encrypt[j] = taggedString.charCodeAt(j); 107 j++; 108 } 109 110 while (encrypt.length % keyPair.chunkSize !== 0) { 111 encrypt[j++] = 0; 112 } 113 114 function encryption(encryptObject) { 115 var charCounter = 0; 116 var j, block; 117 var encrypted = ""; 118 function encryptChar() { 119 block = new BigInt(); 120 j = 0; 121 for (var k = charCounter; k < charCounter+keyPair.chunkSize; ++j) { 122 block.digits[j] = encryptObject[k++]; 123 block.digits[j] += encryptObject[k++] << 8; 124 } 125 var crypt = keyPair.barrett.powMod(block, keyPair.e); 126 var text = keyPair.radix == 16 ? biToHex(crypt) : biToString(crypt, keyPair.radix); 127 encrypted += text + " "; 128 charCounter += keyPair.chunkSize; 129 if (charCounter < encryptObject.length) { 130 setTimeout(encryptChar, 1) 131 } else { 132 var encryptedString = encrypted.substring(0, encrypted.length - 1); 133 if($.isFunction(callback)) { 134 callback(encryptedString); 135 } else { 136 return encryptedString; 137 } 138 139 } 140 } 141 setTimeout(encryptChar, 1); 142 } 143 144 encryption(encrypt); 145 }; 146 147 $.jCryption.defaultOptions = { 148 submitElement:false, 149 submitEvent:"click", 150 getKeysURL:"EncryptionServlet?generateKeypair=true", 151 beforeEncryption:function(){return true}, 152 postVariable:"jCryption" 153 }; 154 155 $.fn.jCryption = function(options) { 156 return this.each(function(){ 157 (new $.jCryption(this, options)); 158 }); 159 }; 160 161})(jQuery); 162 163/* 164* BigInt, a suite of routines for performing multiple-precision arithmetic in 165* JavaScript. 166* BarrettMu, a class for performing Barrett modular reduction computations in 167* JavaScript. 168* 169* 170* Copyright 1998-2005 David Shapiro. 171* [email protected] 172* 173* changed and improved by Daniel Griesser 174* http://www.jcryption.org/ 175* Daniel Griesser <[email protected]> 176*/ 177var biRadixBase = 2; 178var biRadixBits = 16; 179var bitsPerDigit = biRadixBits;
180var biRadix = 1 << 16; 181var biHalfRadix = biRadix >>> 1; 182var biRadixSquared = biRadix * biRadix; 183var maxDigitVal = biRadix - 1; 184var maxInteger = 9999999999999998; 185var maxDigits; 186var ZERO_ARRAY; 187var bigZero, bigOne; 188var dpl10 = 15; 189var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 1900xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 1910xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF); 192 193var hexatrigesimalToChar = new Array( 194'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 195'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 196'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 197'u', 'v', 'w', 'x', 'y', 'z' 198); 199 200var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 201'a', 'b', 'c', 'd', 'e', 'f'); 202 203var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 2040x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 2050x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF); 206 207function setMaxDigits(value) { 208 maxDigits = value; 209 ZERO_ARRAY = new Array(maxDigits); 210 for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0; 211 bigZero = new BigInt(); 212 bigOne = new BigInt(); 213 bigOne.digits[0] = 1; 214} 215 216function BigInt(flag) { 217 if (typeof flag == "boolean" && flag == true) { 218 this.digits = null; 219 } 220 else { 221 this.digits = ZERO_ARRAY.slice(0); 222 } 223 this.isNeg = false; 224} 225 226function biFromDecimal(s) { 227 var isNeg = s.charAt(0) == '-'; 228 var i = isNeg ? 1 : 0; 229 var result; 230 while (i < s.length && s.charAt(i) == '0') ++i; 231 if (i == s.length) { 232 result = new BigInt(); 233 } 234 else { 235 var digitCount = s.length - i; 236 var fgl = digitCount % dpl10; 237 if (fgl == 0) fgl = dpl10; 238 result = biFromNumber(Number(s.substr(i, fgl))); 239 i += fgl; 240 while (i < s.length) { 241 result = biAdd(biMultiply(result, biFromNumber(1000000000000000)), 242 biFromNumber(Number(s.substr(i, dpl10)))); 243 i += dpl10; 244 } 245 result.isNeg = isNeg; 246 } 247 return result; 248} 249 250function biCopy(bi) { 251 var result = new BigInt(true); 252 result.digits = bi.digits.slice(0); 253 result.isNeg = bi.isNeg; 254 return result; 255} 256 257function biFromNumber(i) { 258 var result = new BigInt(); 259 result.isNeg = i < 0; 260 i = Math.abs(i); 261 var j = 0; 262 while (i > 0) { 263 result.digits[j++] = i & maxDigitVal; 264 i >>= biRadixBits; 265 } 266 return result; 267} 268 269function reverseStr(s) { 270 var result = ""; 271 for (var i = s.length - 1; i > -1; --i) { 272 result += s.charAt(i); 273 } 274 return result; 275} 276 277function biToString(x, radix) { 278 var b = new BigInt(); 279 b.digits[0] = radix; 280 var qr = biDivideModulo(x, b); 281 var result = hexatrigesimalToChar[qr[1].digits[0]]; 282 while (biCompare(qr[0], bigZero) == 1) { 283 qr = biDivideModulo(qr[0], b); 284 digit = qr[1].digits[0]; 285 result += hexatrigesimalToChar[qr[1].digits[0]]; 286 } 287 return (x.isNeg ? "-" : "") + reverseStr(result); 288} 289 290function biToDecimal(x) { 291 var b = new BigInt(); 292 b.digits[0] = 10; 293 var qr = biDivideModulo(x, b); 294 var result = String(qr[1].digits[0]); 295 while (biCompare(qr[0], bigZero) == 1) { 296 qr = biDivideModulo(qr[0], b); 297 result += String(qr[1].digits[0]); 298 } 299 return (x.isNeg ? "-" : "") + reverseStr(result); 300} 301 302function digitToHex(n) { 303 var mask = 0xf; 304 var result = ""; 305 for (i = 0; i < 4; ++i) { 306 result += hexToChar[n & mask]; 307 n >>>= 4; 308 } 309 return reverseStr(result); 310} 311 312function biToHex(x) { 313 var result = ""; 314 var n = biHighIndex(x); 315 for (var i = biHighIndex(x); i > -1; --i) { 316 result += digitToHex(x.digits[i]); 317 } 318 return result; 319} 320 321function charToHex(c) { 322 var ZERO = 48; 323 var NINE = ZERO + 9; 324 var littleA = 97; 325 var littleZ = littleA + 25; 326 var bigA = 65; 327 var bigZ = 65 + 25; 328 var result; 329 330 if (c >= ZERO && c <= NINE) { 331 result = c - ZERO; 332 } else if (c >= bigA && c <= bigZ) { 333 result = 10 + c - bigA; 334 } else if (c >= littleA && c <= littleZ) { 335 result = 10 + c - littleA; 336 } else { 337 result = 0; 338 } 339 return result; 340} 341 342function hexToDigit(s) { 343 var result = 0; 344 var sl = Math.min(s.length, 4); 345 for (var i = 0; i < sl; ++i) { 346 result <<= 4; 347 result |= charToHex(s.charCodeAt(i)) 348 } 349 return result; 350} 351 352function biFromHex(s) { 353 var result = new BigInt(); 354 var sl = s.length; 355 for (var i = sl, j = 0; i > 0; i -= 4, ++j) {
356 result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4))); 357 } 358 return result; 359} 360 361function biFromString(s, radix) { 362 var isNeg = s.charAt(0) == '-'; 363 var istop = isNeg ? 1 : 0; 364 var result = new BigInt(); 365 var place = new BigInt(); 366 place.digits[0] = 1; // radix^0 367 for (var i = s.length - 1; i >= istop; i--) { 368 var c = s.charCodeAt(i); 369 var digit = charToHex(c); 370 var biDigit = biMultiplyDigit(place, digit); 371 result = biAdd(result, biDigit); 372 place = biMultiplyDigit(place, radix); 373 } 374 result.isNeg = isNeg; 375 return result; 376} 377 378function biDump(b) { 379 return (b.isNeg ? "-" : "") + b.digits.join(" "); 380} 381 382function biAdd(x, y) { 383 var result; 384 385 if (x.isNeg != y.isNeg) { 386 y.isNeg = !y.isNeg; 387 result = biSubtract(x, y); 388 y.isNeg = !y.isNeg; 389 } 390 else { 391 result = new BigInt(); 392 var c = 0; 393 var n; 394 for (var i = 0; i < x.digits.length; ++i) { 395 n = x.digits[i] + y.digits[i] + c; 396 result.digits[i] = n & 0xffff; 397 c = Number(n >= biRadix); 398 } 399 result.isNeg = x.isNeg; 400 } 401 return result; 402} 403 404function biSubtract(x, y) { 405 var result; 406 if (x.isNeg != y.isNeg) { 407 y.isNeg = !y.isNeg; 408 result = biAdd(x, y); 409 y.isNeg = !y.isNeg; 410 } else { 411 result = new BigInt(); 412 var n, c; 413 c = 0; 414 for (var i = 0; i < x.digits.length; ++i) { 415 n = x.digits[i] - y.digits[i] + c; 416 result.digits[i] = n & 0xffff; 417 if (result.digits[i] < 0) result.digits[i] += biRadix; 418 c = 0 - Number(n < 0); 419 } 420 if (c == -1) { 421 c = 0; 422 for (var i = 0; i < x.digits.length; ++i) { 423 n = 0 - result.digits[i] + c; 424 result.digits[i] = n & 0xffff; 425 if (result.digits[i] < 0) result.digits[i] += biRadix; 426 c = 0 - Number(n < 0); 427 } 428 result.isNeg = !x.isNeg; 429 } else { 430 result.isNeg = x.isNeg; 431 } 432 } 433 return result; 434} 435 436function biHighIndex(x) { 437 var result = x.digits.length - 1; 438 while (result > 0 && x.digits[result] == 0) --result; 439 return result; 440} 441 442function biNumBits(x) { 443 var n = biHighIndex(x); 444 var d = x.digits[n]; 445 var m = (n + 1) * bitsPerDigit; 446 var result; 447 for (result = m; result > m - bitsPerDigit; --result) { 448 if ((d & 0x8000) != 0) break; 449 d <<= 1; 450 } 451 return result; 452} 453 454function biMultiply(x, y) { 455 var result = new BigInt(); 456 var c; 457 var n = biHighIndex(x); 458 var t = biHighIndex(y); 459 var u, uv, k; 460 461 for (var i = 0; i <= t; ++i) { 462 c = 0; 463 k = i; 464 for (j = 0; j <= n; ++j, ++k) { 465 uv = result.digits[k] + x.digits[j] * y.digits[i] + c; 466 result.digits[k] = uv & maxDigitVal; 467 c = uv >>> biRadixBits; 468 } 469 result.digits[i + n + 1] = c; 470 } 471 result.isNeg = x.isNeg != y.isNeg; 472 return result; 473} 474 475function biMultiplyDigit(x, y) { 476 var n, c, uv; 477 478 result = new BigInt(); 479 n = biHighIndex(x); 480 c = 0; 481 for (var j = 0; j <= n; ++j) { 482 uv = result.digits[j] + x.digits[j] * y + c; 483 result.digits[j] = uv & maxDigitVal; 484 c = uv >>> biRadixBits; 485 } 486 result.digits[1 + n] = c; 487 return result; 488} 489 490function arrayCopy(src, srcStart, dest, destStart, n) { 491 var m = Math.min(srcStart + n, src.length); 492 for (var i = srcStart, j = destStart; i < m; ++i, ++j) { 493 dest[j] = src[i];
494 } 495} 496 497 498 499function biShiftLeft(x, n) { 500 var digitCount = Math.floor(n / bitsPerDigit); 501 var result = new BigInt(); 502 arrayCopy(x.digits, 0, result.digits, digitCount,result.digits.length - digitCount); 503 var bits = n % bitsPerDigit; 504 var rightBits = bitsPerDigit - bits; 505 for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) { 506 result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) | 507 ((result.digits[i1] & highBitMasks[bits]) >>> 508 (rightBits)); 509 } 510 result.digits[0] = ((result.digits[i] << bits) & maxDigitVal); 511 result.isNeg = x.isNeg; 512 return result; 513} 514 515function biShiftRight(x, n) { 516 var digitCount = Math.floor(n / bitsPerDigit); 517 var result = new BigInt(); 518 arrayCopy(x.digits, digitCount, result.digits, 0,x.digits.length - digitCount); 519 var bits = n % bitsPerDigit; 520 var leftBits = bitsPerDigit - bits; 521 for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) { 522 result.digits[i] = (result.digits[i] >>> bits) | 523 ((result.digits[i1] & lowBitMasks[bits]) << leftBits); 524 } 525 result.digits[result.digits.length - 1] >>>= bits; 526 result.isNeg = x.isNeg; 527 return result; 528} 529 530function biMultiplyByRadixPower(x, n) { 531 var result = new BigInt(); 532 arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n); 533 return result; 534} 535 536function biDivideByRadixPower(x, n) 537{ 538 var result = new BigInt(); 539 arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n); 540 return result; 541} 542 543function biModuloByRadixPower(x, n) 544{ 545 var result = new BigInt(); 546 arrayCopy(x.digits, 0, result.digits, 0, n); 547 return result; 548} 549 550function biCompare(x, y) { 551 if (x.isNeg != y.isNeg) { 552 return 1 - 2 * Number(x.isNeg); 553 } 554 for (var i = x.digits.length - 1; i >= 0; --i) { 555 if (x.digits[i] != y.digits[i]) { 556 if (x.isNeg) { 557 return 1 - 2 * Number(x.digits[i] > y.digits[i]); 558 } else { 559 return 1 - 2 * Number(x.digits[i] < y.digits[i]); 560 } 561 } 562 } 563 return 0; 564} 565 566function biDivideModulo(x, y) { 567 var nb = biNumBits(x); 568 var tb = biNumBits(y); 569 var origYIsNeg = y.isNeg; 570 var q, r; 571 if (nb < tb) { 572 if (x.isNeg) { 573 q = biCopy(bigOne); 574 q.isNeg = !y.isNeg; 575 x.isNeg = false; 576 y.isNeg = false; 577 r = biSubtract(y, x); 578 x.isNeg = true; 579 y.isNeg = origYIsNeg; 580 } else { 581 q = new BigInt(); 582 r = biCopy(x); 583 } 584 return new Array(q, r); 585 } 586 587 q = new BigInt(); 588 r = x; 589 590 var t = Math.ceil(tb / bitsPerDigit) - 1; 591 var lambda = 0; 592 while (y.digits[t] < biHalfRadix) { 593 y = biShiftLeft(y, 1); 594 ++lambda; 595 ++tb; 596 t = Math.ceil(tb / bitsPerDigit) - 1; 597 } 598 599 r = biShiftLeft(r, lambda); 600 nb += lambda; 601 var n = Math.ceil(nb / bitsPerDigit) - 1; 602 603 var b = biMultiplyByRadixPower(y, n - t); 604 while (biCompare(r, b) != -1) { 605 ++q.digits[n - t]; 606 r = biSubtract(r, b); 607 } 608 for (var i = n; i > t; --i) { 609 var ri = (i >= r.digits.length) ? 0 : r.digits[i]; 610 var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1]; 611 var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2]; 612 var yt = (t >= y.digits.length) ? 0 : y.digits[t]; 613 var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1]; 614 if (ri == yt) { 615 q.digits[i - t - 1] = maxDigitVal; 616 } else { 617 q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt); 618 } 619 620 var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1); 621 var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2); 622 while (c1 > c2) { 623 --q.digits[i - t - 1]; 624 c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1); 625 c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2); 626 } 627 628 b = biMultiplyByRadixPower(y, i - t - 1); 629 r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1])); 630 if (r.isNeg) { 631 r = biAdd(r, b); 632 --q.digits[i - t - 1]; 633 } 634 } 635 r = biShiftRight(r, lambda); 636 637 q.isNeg = x.isNeg != origYIsNeg; 638 if (x.isNeg) { 639 if (origYIsNeg) { 640 q = biAdd(q, bigOne); 641 } else { 642 q = biSubtract(q, bigOne); 643 } 644 y = biShiftRight(y, lambda); 645 r = biSubtract(y, r); 646 } 647 648 if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false; 649 650 return new Array(q, r); 651} 652 653function biDivide(x, y) { 654 return biDivideModulo(x, y)[0]; 655} 656 657function biModulo(x, y) { 658 return biDivideModulo(x, y)[1]; 659} 660 661function biMultiplyMod(x, y, m) { 662 return biModulo(biMultiply(x, y), m); 663} 664 665function biPow(x, y) { 666 var result = bigOne; 667 var a = x; 668 while (true) { 669 if ((y & 1) != 0) result = biMultiply(result, a); 670 y >>= 1; 671 if (y == 0) break; 672 a = biMultiply(a, a); 673 } 674 return result; 675} 676 677function biPowMod(x, y, m) { 678 var result = bigOne; 679 var a = x; 680 var k = y; 681 while (true) { 682 if ((k.digits[0] & 1) != 0) result = biMultiplyMod(result, a, m); 683 k = biShiftRight(k, 1); 684 if (k.digits[0] == 0 && biHighIndex(k) == 0) break; 685 a = biMultiplyMod(a, a, m); 686 } 687 return result; 688} 689 690function BarrettMu(m) { 691 this.modulus = biCopy(m); 692 this.k = biHighIndex(this.modulus) + 1; 693 var b2k = new BigInt(); 694 b2k.digits[2 * this.k] = 1; 695 this.mu = biDivide(b2k, this.modulus); 696 this.bkplus1 = new BigInt(); 697 this.bkplus1.digits[this.k + 1] = 1; 698 this.modulo = BarrettMu_modulo; 699 this.multiplyMod = BarrettMu_multiplyMod; 700 this.powMod = BarrettMu_powMod; 701} 702 703function BarrettMu_modulo(x) { 704 var q1 = biDivideByRadixPower(x, this.k - 1); 705 var q2 = biMultiply(q1, this.mu); 706 var q3 = biDivideByRadixPower(q2, this.k + 1); 707 var r1 = biModuloByRadixPower(x, this.k + 1); 708 var r2term = biMultiply(q3, this.modulus); 709 var r2 = biModuloByRadixPower(r2term, this.k + 1); 710 var r = biSubtract(r1, r2); 711 if (r.isNeg) { 712 r = biAdd(r, this.bkplus1); 713 } 714 var rgtem = biCompare(r, this.modulus) >= 0; 715 while (rgtem) { 716 r = biSubtract(r, this.modulus); 717 rgtem = biCompare(r, this.modulus) >= 0; 718 } 719 return r; 720} 721 722function BarrettMu_multiplyMod(x, y) { 723 var xy = biMultiply(x, y); 724 return this.modulo(xy); 725} 726 727function BarrettMu_powMod(x, y) { 728 var result = new BigInt(); 729 result.digits[0] = 1; 730 while (true) { 731 if ((y.digits[0] & 1) != 0) result = this.multiplyMod(result, x); 732 y = biShiftRight(y, 1); 733 if (y.digits[0] == 0 && biHighIndex(y) == 0) break; 734 x = this.multiplyMod(x, x); 735 } 736 return result; 737}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.