有名なライブラリのライセンスがよく分かんなかった(ほぼ言いがかり)ので自分で作った。 SHA1を計算する入出力ともにバイナリなプログラムです。 使いたい人は好きに使ってください。この実装はパブリックドメインにします。

形式
JavaScript
投稿日時
2018-02-08 00:00
公開期間
無期限
  1. function sha1(m){
  2. let add = function(a, b){
  3. return ((a >>> 0) + (b >>> 0)) | 0;
  4. }
  5. let lrot = function(v, r){
  6. return (v << r) | (v >>> (32 - r));
  7. }
  8. let h = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
  9. let ml = m.length * 8;
  10. m += "\x80";
  11. while(m.length % 64 != 60){
  12. m += "\x00";
  13. }
  14. for(let i = 24; i >= 0; i -= 8){
  15. m += String.fromCharCode((ml >>> i) & 0xff);
  16. }
  17. for(let cn = 0; cn < m.length; cn += 64){
  18. let w = new Array(80);
  19. for(let i = 0; i < 16; i++){
  20. w[i] = 0;
  21. for(let j = 0; j < 4; j++){
  22. w[i] <<= 8;
  23. w[i] |= m.charCodeAt(cn + i * 4 + j);
  24. }
  25. }
  26. for(let i = 16; i < 80; i++){
  27. w[i] = lrot(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16], 1);
  28. }
  29. let a = h.concat([]);
  30. for(let i = 0; i < 80; i++){
  31. let f, k;
  32. if(i < 20){
  33. f = (a[1] & a[2]) | (~a[1] & a[3]);
  34. k = 0x5a827999;
  35. }else if(i < 40){
  36. f = a[1] ^ a[2] ^ a[3];
  37. k = 0x6ed9eba1;
  38. }else if(i < 60){
  39. f = (a[1] & a[2]) | (a[1] & a[3]) | (a[2] & a[3]);
  40. k = 0x8f1bbcdc;
  41. }else{
  42. f = a[1] ^ a[2] ^ a[3];
  43. k = 0xca62c1d6;
  44. }
  45. let tmp = add(add(add(add(lrot(a[0], 5), f), a[4]), k), w[i]);
  46. a[4] = a[3];
  47. a[3] = a[2];
  48. a[2] = lrot(a[1], 30);
  49. a[1] = a[0];
  50. a[0] = tmp;
  51. }
  52. for(let i = 0; i < 5; i++){
  53. h[i] = add(h[i], a[i]);
  54. }
  55. }
  56. let hh = "";
  57. for(let hp of h){
  58. for(let i = 24; i >= 0; i -= 8){
  59. hh += String.fromCharCode((hp >>> i) & 0xff);
  60. }
  61. }
  62. return hh;
  63. }
ダウンロード 印刷用表示

このコピペの URL

JavaScript での埋め込み

iframe での埋め込み

元のテキスト