_base.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. define("dojox/encoding/digests/_base", ["dojo/_base/lang"], function(lang){
  2. var d = lang.getObject("dojox.encoding.digests", true);
  3. /*=====
  4. d = dojox.encoding.digests;
  5. =====*/
  6. //TODO: see if it makes sense to meld this into one with the
  7. // crypto base enums
  8. d.outputTypes={
  9. // summary:
  10. // Enumeration for input and output encodings.
  11. Base64:0, Hex:1, String:2, Raw:3
  12. };
  13. // word-based addition
  14. d.addWords=function(/* word */a, /* word */b){
  15. // summary:
  16. // add a pair of words together with rollover
  17. var l=(a&0xFFFF)+(b&0xFFFF);
  18. var m=(a>>16)+(b>>16)+(l>>16);
  19. return (m<<16)|(l&0xFFFF); // word
  20. };
  21. // word-based conversion method, for efficiency sake;
  22. // most digests operate on words, and this should be faster
  23. // than the encoding version (which works on bytes).
  24. var chrsz=8; // 16 for Unicode
  25. var mask=(1<<chrsz)-1;
  26. d.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. d.wordToString=function(/* word[] */wa){
  36. // summary:
  37. // convert an array of words to a string
  38. var s=[];
  39. for(var i=0, l=wa.length*32; i<l; i+=chrsz){
  40. s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&mask));
  41. }
  42. return s.join(""); // string
  43. }
  44. d.wordToHex=function(/* word[] */wa){
  45. // summary:
  46. // convert an array of words to a hex tab
  47. var h="0123456789abcdef", s=[];
  48. for(var i=0, l=wa.length*4; i<l; i++){
  49. s.push(h.charAt((wa[i>>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF));
  50. }
  51. return s.join(""); // string
  52. }
  53. d.wordToBase64=function(/* word[] */wa){
  54. // summary:
  55. // convert an array of words to base64 encoding, should be more efficient
  56. // than using dojox.encoding.base64
  57. var p="=", tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s=[];
  58. for(var i=0, l=wa.length*4; i<l; i+=3){
  59. 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);
  60. for(var j=0; j<4; j++){
  61. if(i*8+j*6>wa.length*32){
  62. s.push(p);
  63. } else {
  64. s.push(tab.charAt((t>>6*(3-j))&0x3F));
  65. }
  66. }
  67. }
  68. return s.join(""); // string
  69. };
  70. return d;
  71. });