1 | define(["dojo/_base/lang"], function(lang){ |
---|
2 | // These functions are 32-bit word-based. See _sha-64 for 64-bit word ops. |
---|
3 | var base = lang.getObject("dojox.encoding.digests", true); |
---|
4 | |
---|
5 | base.outputTypes={ |
---|
6 | // summary: |
---|
7 | // Enumeration for input and output encodings. |
---|
8 | Base64:0, Hex:1, String:2, Raw:3 |
---|
9 | }; |
---|
10 | |
---|
11 | // word-based addition |
---|
12 | base.addWords=function(/* word */a, /* word */b){ |
---|
13 | // summary: |
---|
14 | // add a pair of words together with rollover |
---|
15 | var l=(a&0xFFFF)+(b&0xFFFF); |
---|
16 | var m=(a>>16)+(b>>16)+(l>>16); |
---|
17 | return (m<<16)|(l&0xFFFF); // word |
---|
18 | }; |
---|
19 | |
---|
20 | // word-based conversion method, for efficiency sake; |
---|
21 | // most digests operate on words, and this should be faster |
---|
22 | // than the encoding version (which works on bytes). |
---|
23 | var chrsz=8; // 16 for Unicode |
---|
24 | var mask=(1<<chrsz)-1; |
---|
25 | |
---|
26 | base.stringToWord=function(/* string */s){ |
---|
27 | // summary: |
---|
28 | // convert a string to a word array |
---|
29 | var wa=[]; |
---|
30 | for(var i=0, l=s.length*chrsz; i<l; i+=chrsz){ |
---|
31 | wa[i>>5]|=(s.charCodeAt(i/chrsz)&mask)<<(i%32); |
---|
32 | } |
---|
33 | return wa; // word[] |
---|
34 | }; |
---|
35 | |
---|
36 | base.wordToString=function(/* word[] */wa){ |
---|
37 | // summary: |
---|
38 | // convert an array of words to a string |
---|
39 | var s=[]; |
---|
40 | for(var i=0, l=wa.length*32; i<l; i+=chrsz){ |
---|
41 | s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&mask)); |
---|
42 | } |
---|
43 | return s.join(""); // string |
---|
44 | }; |
---|
45 | |
---|
46 | base.wordToHex=function(/* word[] */wa){ |
---|
47 | // summary: |
---|
48 | // convert an array of words to a hex tab |
---|
49 | var h="0123456789abcdef", s=[]; |
---|
50 | for(var i=0, l=wa.length*4; i<l; i++){ |
---|
51 | s.push(h.charAt((wa[i>>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF)); |
---|
52 | } |
---|
53 | return s.join(""); // string |
---|
54 | }; |
---|
55 | |
---|
56 | base.wordToBase64=function(/* word[] */wa){ |
---|
57 | // summary: |
---|
58 | // convert an array of words to base64 encoding, should be more efficient |
---|
59 | // than using dojox.encoding.base64 |
---|
60 | var p="=", tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s=[]; |
---|
61 | for(var i=0, l=wa.length*4; i<l; i+=3){ |
---|
62 | var t=(((wa[i>>2]>>8*(i%4))&0xFF)<<16)|(((wa[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((wa[i+2>>2]>>8*((i+2)%4))&0xFF); |
---|
63 | for(var j=0; j<4; j++){ |
---|
64 | if(i*8+j*6>wa.length*32){ |
---|
65 | s.push(p); |
---|
66 | } else { |
---|
67 | s.push(tab.charAt((t>>6*(3-j))&0x3F)); |
---|
68 | } |
---|
69 | } |
---|
70 | } |
---|
71 | return s.join(""); // string |
---|
72 | }; |
---|
73 | |
---|
74 | // convert to UTF-8 |
---|
75 | base.stringToUtf8 = function(input){ |
---|
76 | var output = ""; |
---|
77 | var i = -1; |
---|
78 | var x, y; |
---|
79 | |
---|
80 | while(++i < input.length){ |
---|
81 | x = input.charCodeAt(i); |
---|
82 | y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; |
---|
83 | if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF){ |
---|
84 | x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); |
---|
85 | i++; |
---|
86 | } |
---|
87 | |
---|
88 | if(x <= 0x7F) |
---|
89 | output += String.fromCharCode(x); |
---|
90 | else if(x <= 0x7FF) |
---|
91 | output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), 0x80 | (x & 0x3F)); |
---|
92 | else if(x <= 0xFFFF) |
---|
93 | output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F)); |
---|
94 | else if(x <= 0x1FFFFF) |
---|
95 | output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), 0x80 | ((x >>> 12) & 0x3F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F)); |
---|
96 | } |
---|
97 | return output; |
---|
98 | }; |
---|
99 | |
---|
100 | return base; |
---|
101 | }); |
---|