Home | History | Annotate | Download | only in cryptotoken
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 /** @fileoverview Various string utility functions */
      6 'use strict';
      7 
      8 /**
      9  * Converts a string to an array of bytes.
     10  * @param {string} s The string to convert.
     11  * @param {(Array|Uint8Array)=} bytes The Array-like object into which to store
     12  *     the bytes. A new Array will be created if not provided.
     13  * @return {(Array|Uint8Array)} An array of bytes representing the string.
     14  */
     15 function UTIL_StringToBytes(s, bytes) {
     16   bytes = bytes || new Array(s.length);
     17   for (var i = 0; i < s.length; ++i)
     18     bytes[i] = s.charCodeAt(i);
     19   return bytes;
     20 }
     21 
     22 function UTIL_BytesToString(b) {
     23   return String.fromCharCode.apply(null, b);
     24 }
     25 
     26 function UTIL_BytesToHex(b) {
     27   if (!b) return '(null)';
     28   var hexchars = '0123456789ABCDEF';
     29   var hexrep = new Array(b.length * 2);
     30 
     31   for (var i = 0; i < b.length; ++i) {
     32     hexrep[i * 2 + 0] = hexchars.charAt((b[i] >> 4) & 15);
     33     hexrep[i * 2 + 1] = hexchars.charAt(b[i] & 15);
     34   }
     35   return hexrep.join('');
     36 }
     37 
     38 function UTIL_BytesToHexWithSeparator(b, sep) {
     39   var hexchars = '0123456789ABCDEF';
     40   var stride = 2 + (sep ? 1 : 0);
     41   var hexrep = new Array(b.length * stride);
     42 
     43   for (var i = 0; i < b.length; ++i) {
     44     if (sep) hexrep[i * stride + 0] = sep;
     45     hexrep[i * stride + stride - 2] = hexchars.charAt((b[i] >> 4) & 15);
     46     hexrep[i * stride + stride - 1] = hexchars.charAt(b[i] & 15);
     47   }
     48   return (sep ? hexrep.slice(1) : hexrep).join('');
     49 }
     50 
     51 function UTIL_HexToBytes(h) {
     52   var hexchars = '0123456789ABCDEFabcdef';
     53   var res = new Uint8Array(h.length / 2);
     54   for (var i = 0; i < h.length; i += 2) {
     55     if (hexchars.indexOf(h.substring(i, i + 1)) == -1) break;
     56     res[i / 2] = parseInt(h.substring(i, i + 2), 16);
     57   }
     58   return res;
     59 }
     60 
     61 function UTIL_equalArrays(a, b) {
     62   if (!a || !b) return false;
     63   if (a.length != b.length) return false;
     64   var accu = 0;
     65   for (var i = 0; i < a.length; ++i)
     66     accu |= a[i] ^ b[i];
     67   return accu === 0;
     68 }
     69 
     70 function UTIL_ltArrays(a, b) {
     71   if (a.length < b.length) return true;
     72   if (a.length > b.length) return false;
     73   for (var i = 0; i < a.length; ++i) {
     74     if (a[i] < b[i]) return true;
     75     if (a[i] > b[i]) return false;
     76   }
     77   return false;
     78 }
     79 
     80 function UTIL_gtArrays(a, b) {
     81   return UTIL_ltArrays(b, a);
     82 }
     83 
     84 function UTIL_geArrays(a, b) {
     85   return !UTIL_ltArrays(a, b);
     86 }
     87 
     88 function UTIL_unionArrays(a, b) {
     89   var obj = {};
     90   for (var i = 0; i < a.length; i++) {
     91     obj[a[i]] = a[i];
     92   }
     93   for (var i = 0; i < b.length; i++) {
     94     obj[b[i]] = b[i];
     95   }
     96   var union = [];
     97   for (var k in obj) {
     98     union.push(obj[k]);
     99   }
    100   return union;
    101 }
    102 
    103 function UTIL_getRandom(a) {
    104   var tmp = new Array(a);
    105   var rnd = new Uint8Array(a);
    106   window.crypto.getRandomValues(rnd);  // Yay!
    107   for (var i = 0; i < a; ++i) tmp[i] = rnd[i] & 255;
    108   return tmp;
    109 }
    110 
    111 function UTIL_setFavicon(icon) {
    112   // Construct a new favion link tag
    113   var faviconLink = document.createElement('link');
    114   faviconLink.rel = 'Shortcut Icon';
    115   faviconLink.type = 'image/x-icon';
    116   faviconLink.href = icon;
    117 
    118   // Remove the old favion, if it exists
    119   var head = document.getElementsByTagName('head')[0];
    120   var links = head.getElementsByTagName('link');
    121   for (var i = 0; i < links.length; i++) {
    122     var link = links[i];
    123     if (link.type == faviconLink.type && link.rel == faviconLink.rel) {
    124       head.removeChild(link);
    125     }
    126   }
    127 
    128   // Add in the new one
    129   head.appendChild(faviconLink);
    130 }
    131 
    132 // Erase all entries in array
    133 function UTIL_clear(a) {
    134   if (a instanceof Array) {
    135     for (var i = 0; i < a.length; ++i)
    136       a[i] = 0;
    137   }
    138 }
    139 
    140 // hr:min:sec.milli string
    141 function UTIL_time() {
    142   var d = new Date();
    143   var m = '000' + d.getMilliseconds();
    144   var s = d.toTimeString().substring(0, 8) + '.' + m.substring(m.length - 3);
    145   return s;
    146 }
    147 var UTIL_events = [];
    148 var UTIL_max_events = 500;
    149 
    150 function UTIL_fmt(s) {
    151   var line = UTIL_time() + ' ' + s;
    152   if (UTIL_events.push(line) > UTIL_max_events) {
    153     // Drop from head.
    154     UTIL_events.splice(0, UTIL_events.length - UTIL_max_events);
    155   }
    156   return line;
    157 }
    158