PageRenderTime 39ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/libs/external/rsa-sign.js

https://github.com/lloyd/jwcrypto
JavaScript | 155 lines | 98 code | 20 blank | 37 comment | 10 complexity | d4a805ff41e48520cebc42ba4e1088eb MD5 | raw file
  1. //
  2. // rsa-sign.js - adding signing functions to RSAKey class.
  3. //
  4. //
  5. // version: 1.0 (2010-Jun-03)
  6. //
  7. // Copyright (c) 2010 Kenji Urushima (kenji.urushima@gmail.com)
  8. //
  9. // This software is licensed under the terms of the MIT License.
  10. // http://www.opensource.org/licenses/mit-license.php
  11. //
  12. // The above copyright and license notice shall be
  13. // included in all copies or substantial portions of the Software.
  14. //
  15. // Depends on:
  16. // function sha1.hex(s) of sha1.js
  17. // jsbn.js
  18. // jsbn2.js
  19. // rsa.js
  20. // rsa2.js
  21. //
  22. // keysize / pmstrlen
  23. // 512 / 128
  24. // 1024 / 256
  25. // 2048 / 512
  26. // 4096 / 1024
  27. // As for _RSASGIN_DIHEAD values for each hash algorithm, see PKCS#1 v2.1 spec (p38).
  28. var _RSASIGN_DIHEAD = [];
  29. _RSASIGN_DIHEAD['sha1'] = "3021300906052b0e03021a05000414";
  30. _RSASIGN_DIHEAD['sha256'] = "3031300d060960864801650304020105000420";
  31. //_RSASIGN_DIHEAD['md2'] = "3020300c06082a864886f70d020205000410";
  32. //_RSASIGN_DIHEAD['md5'] = "3020300c06082a864886f70d020505000410";
  33. //_RSASIGN_DIHEAD['sha384'] = "3041300d060960864801650304020205000430";
  34. //_RSASIGN_DIHEAD['sha512'] = "3051300d060960864801650304020305000440";
  35. var _RSASIGN_HASHHEXFUNC = [];
  36. _RSASIGN_HASHHEXFUNC['sha1'] = sha1.hex;
  37. _RSASIGN_HASHHEXFUNC['sha256'] = sha256.hex;
  38. // ========================================================================
  39. // Signature Generation
  40. // ========================================================================
  41. function _rsasign_getHexPaddedDigestInfoForString(s, keySize, hashAlg) {
  42. var pmStrLen = keySize / 4;
  43. var hashFunc = _RSASIGN_HASHHEXFUNC[hashAlg];
  44. var sHashHex = hashFunc(s);
  45. var sHead = "0001";
  46. var sTail = "00" + _RSASIGN_DIHEAD[hashAlg] + sHashHex;
  47. var sMid = "";
  48. var fLen = pmStrLen - sHead.length - sTail.length;
  49. for (var i = 0; i < fLen; i += 2) {
  50. sMid += "ff";
  51. }
  52. sPaddedMessageHex = sHead + sMid + sTail;
  53. return sPaddedMessageHex;
  54. }
  55. function _rsasign_signString(s, hashAlg) {
  56. var hPM = _rsasign_getHexPaddedDigestInfoForString(s, this.n.bitLength(), hashAlg);
  57. var biPaddedMessage = parseBigInt(hPM, 16);
  58. var biSign = this.doPrivate(biPaddedMessage);
  59. var hexSign = biSign.toString(16);
  60. return hexSign;
  61. }
  62. function _rsasign_signStringWithSHA1(s) {
  63. var hPM = _rsasign_getHexPaddedDigestInfoForString(s, this.n.bitLength(), 'sha1');
  64. var biPaddedMessage = parseBigInt(hPM, 16);
  65. var biSign = this.doPrivate(biPaddedMessage);
  66. var hexSign = biSign.toString(16);
  67. return hexSign;
  68. }
  69. function _rsasign_signStringWithSHA256(s) {
  70. var hPM = _rsasign_getHexPaddedDigestInfoForString(s, this.n.bitLength(), 'sha256');
  71. var biPaddedMessage = parseBigInt(hPM, 16);
  72. var biSign = this.doPrivate(biPaddedMessage);
  73. var hexSign = biSign.toString(16);
  74. return hexSign;
  75. }
  76. // ========================================================================
  77. // Signature Verification
  78. // ========================================================================
  79. function _rsasign_getDecryptSignatureBI(biSig, hN, hE) {
  80. var rsa = new RSAKey();
  81. rsa.setPublic(hN, hE);
  82. var biDecryptedSig = rsa.doPublic(biSig);
  83. return biDecryptedSig;
  84. }
  85. function _rsasign_getHexDigestInfoFromSig(biSig, hN, hE) {
  86. var biDecryptedSig = _rsasign_getDecryptSignatureBI(biSig, hN, hE);
  87. var hDigestInfo = biDecryptedSig.toString(16).replace(/^1f+00/, '');
  88. return hDigestInfo;
  89. }
  90. function _rsasign_getAlgNameAndHashFromHexDisgestInfo(hDigestInfo) {
  91. for (var algName in _RSASIGN_DIHEAD) {
  92. var head = _RSASIGN_DIHEAD[algName];
  93. var len = head.length;
  94. if (hDigestInfo.substring(0, len) == head) {
  95. var a = [algName, hDigestInfo.substring(len)];
  96. return a;
  97. }
  98. }
  99. return [];
  100. }
  101. function _rsasign_verifySignatureWithArgs(sMsg, biSig, hN, hE) {
  102. var hDigestInfo = _rsasign_getHexDigestInfoFromSig(biSig, hN, hE);
  103. var digestInfoAry = _rsasign_getAlgNameAndHashFromHexDisgestInfo(hDigestInfo);
  104. if (digestInfoAry.length == 0) return false;
  105. var algName = digestInfoAry[0];
  106. var diHashValue = digestInfoAry[1];
  107. var ff = _RSASIGN_HASHHEXFUNC[algName];
  108. var msgHashValue = ff(sMsg);
  109. return (diHashValue == msgHashValue);
  110. }
  111. function _rsasign_verifyHexSignatureForMessage(hSig, sMsg) {
  112. var biSig = parseBigInt(hSig, 16);
  113. var result = _rsasign_verifySignatureWithArgs(sMsg, biSig,
  114. this.n.toString(16),
  115. this.e.toString(16));
  116. return result;
  117. }
  118. function _rsasign_verifyString(sMsg, hSig) {
  119. hSig = hSig.replace(/[ \n]+/g, "");
  120. var biSig = parseBigInt(hSig, 16);
  121. var biDecryptedSig = this.doPublic(biSig);
  122. var hDigestInfo = biDecryptedSig.toString(16).replace(/^1f+00/, '');
  123. var digestInfoAry = _rsasign_getAlgNameAndHashFromHexDisgestInfo(hDigestInfo);
  124. if (digestInfoAry.length == 0) return false;
  125. var algName = digestInfoAry[0];
  126. var diHashValue = digestInfoAry[1];
  127. var ff = _RSASIGN_HASHHEXFUNC[algName];
  128. var msgHashValue = ff(sMsg);
  129. return (diHashValue == msgHashValue);
  130. }
  131. RSAKey.prototype.signString = _rsasign_signString;
  132. RSAKey.prototype.signStringWithSHA1 = _rsasign_signStringWithSHA1;
  133. RSAKey.prototype.signStringWithSHA256 = _rsasign_signStringWithSHA256;
  134. RSAKey.prototype.verifyString = _rsasign_verifyString;
  135. RSAKey.prototype.verifyHexSignatureForMessage = _rsasign_verifyHexSignatureForMessage;