_base.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojox.encoding.digests._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojox.encoding.digests._base"] = true;
  8. dojo.provide("dojox.encoding.digests._base");
  9. dojo.getObject("encoding.digests", true, dojox);
  10. (function(){
  11. //TODO: see if it makes sense to meld this into one with the
  12. // crypto base enums
  13. var d=dojox.encoding.digests;
  14. d.outputTypes={
  15. // summary:
  16. // Enumeration for input and output encodings.
  17. Base64:0, Hex:1, String:2, Raw:3
  18. };
  19. // word-based addition
  20. d.addWords=function(/* word */a, /* word */b){
  21. // summary:
  22. // add a pair of words together with rollover
  23. var l=(a&0xFFFF)+(b&0xFFFF);
  24. var m=(a>>16)+(b>>16)+(l>>16);
  25. return (m<<16)|(l&0xFFFF); // word
  26. };
  27. // word-based conversion method, for efficiency sake;
  28. // most digests operate on words, and this should be faster
  29. // than the encoding version (which works on bytes).
  30. var chrsz=8; // 16 for Unicode
  31. var mask=(1<<chrsz)-1;
  32. d.stringToWord=function(/* string */s){
  33. // summary:
  34. // convert a string to a word array
  35. var wa=[];
  36. for(var i=0, l=s.length*chrsz; i<l; i+=chrsz){
  37. wa[i>>5]|=(s.charCodeAt(i/chrsz)&mask)<<(i%32);
  38. }
  39. return wa; // word[]
  40. };
  41. d.wordToString=function(/* word[] */wa){
  42. // summary:
  43. // convert an array of words to a string
  44. var s=[];
  45. for(var i=0, l=wa.length*32; i<l; i+=chrsz){
  46. s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&mask));
  47. }
  48. return s.join(""); // string
  49. }
  50. d.wordToHex=function(/* word[] */wa){
  51. // summary:
  52. // convert an array of words to a hex tab
  53. var h="0123456789abcdef", s=[];
  54. for(var i=0, l=wa.length*4; i<l; i++){
  55. s.push(h.charAt((wa[i>>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF));
  56. }
  57. return s.join(""); // string
  58. }
  59. d.wordToBase64=function(/* word[] */wa){
  60. // summary:
  61. // convert an array of words to base64 encoding, should be more efficient
  62. // than using dojox.encoding.base64
  63. var p="=", tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s=[];
  64. for(var i=0, l=wa.length*4; i<l; i+=3){
  65. 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);
  66. for(var j=0; j<4; j++){
  67. if(i*8+j*6>wa.length*32){
  68. s.push(p);
  69. } else {
  70. s.push(tab.charAt((t>>6*(3-j))&0x3F));
  71. }
  72. }
  73. }
  74. return s.join(""); // string
  75. };
  76. })();
  77. }