sign.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/__node_modules/browserify-sign/browser/sign.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js
  12. var Buffer = require('safe-buffer').Buffer
  13. var createHmac = require('create-hmac')
  14. var crt = require('browserify-rsa')
  15. var EC = require('elliptic').ec
  16. var BN = require('bn.js')
  17. var parseKeys = require('parse-asn1')
  18. var curves = require('./curves.json')
  19. function sign (hash, key, hashType, signType, tag) {
  20. var priv = parseKeys(key)
  21. if (priv.curve) {
  22. // rsa keys can be interpreted as ecdsa ones in openssl
  23. if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type')
  24. return ecSign(hash, priv)
  25. } else if (priv.type === 'dsa') {
  26. if (signType !== 'dsa') throw new Error('wrong private key type')
  27. return dsaSign(hash, priv, hashType)
  28. } else {
  29. if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type')
  30. }
  31. hash = Buffer.concat([tag, hash])
  32. var len = priv.modulus.byteLength()
  33. var pad = [0, 1]
  34. while (hash.length + pad.length + 1 < len) pad.push(0xff)
  35. pad.push(0x00)
  36. var i = -1
  37. while (++i < hash.length) pad.push(hash[i])
  38. var out = crt(pad, priv)
  39. return out
  40. }
  41. function ecSign (hash, priv) {
  42. var curveId = curves[priv.curve.join('.')]
  43. if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.'))
  44. var curve = new EC(curveId)
  45. var key = curve.keyFromPrivate(priv.privateKey)
  46. var out = key.sign(hash)
  47. return Buffer.from(out.toDER())
  48. }
  49. function dsaSign (hash, priv, algo) {
  50. var x = priv.params.priv_key
  51. var p = priv.params.p
  52. var q = priv.params.q
  53. var g = priv.params.g
  54. var r = new BN(0)
  55. var k
  56. var H = bits2int(hash, q).mod(q)
  57. var s = false
  58. var kv = getKey(x, q, hash, algo)
  59. while (s === false) {
  60. k = makeKey(q, kv, algo)
  61. r = makeR(g, k, p, q)
  62. s = k.invm(q).imul(H.add(x.mul(r))).mod(q)
  63. if (s.cmpn(0) === 0) {
  64. s = false
  65. r = new BN(0)
  66. }
  67. }
  68. return toDER(r, s)
  69. }
  70. function toDER (r, s) {
  71. r = r.toArray()
  72. s = s.toArray()
  73. // Pad values
  74. if (r[0] & 0x80) r = [0].concat(r)
  75. if (s[0] & 0x80) s = [0].concat(s)
  76. var total = r.length + s.length + 4
  77. var res = [0x30, total, 0x02, r.length]
  78. res = res.concat(r, [0x02, s.length], s)
  79. return Buffer.from(res)
  80. }
  81. function getKey (x, q, hash, algo) {
  82. x = Buffer.from(x.toArray())
  83. if (x.length < q.byteLength()) {
  84. var zeros = Buffer.alloc(q.byteLength() - x.length)
  85. x = Buffer.concat([zeros, x])
  86. }
  87. var hlen = hash.length
  88. var hbits = bits2octets(hash, q)
  89. var v = Buffer.alloc(hlen)
  90. v.fill(1)
  91. var k = Buffer.alloc(hlen)
  92. k = createHmac(algo, k).update(v).update(Buffer.from([0])).update(x).update(hbits).digest()
  93. v = createHmac(algo, k).update(v).digest()
  94. k = createHmac(algo, k).update(v).update(Buffer.from([1])).update(x).update(hbits).digest()
  95. v = createHmac(algo, k).update(v).digest()
  96. return { k: k, v: v }
  97. }
  98. function bits2int (obits, q) {
  99. var bits = new BN(obits)
  100. var shift = (obits.length << 3) - q.bitLength()
  101. if (shift > 0) bits.ishrn(shift)
  102. return bits
  103. }
  104. function bits2octets (bits, q) {
  105. bits = bits2int(bits, q)
  106. bits = bits.mod(q)
  107. var out = Buffer.from(bits.toArray())
  108. if (out.length < q.byteLength()) {
  109. var zeros = Buffer.alloc(q.byteLength() - out.length)
  110. out = Buffer.concat([zeros, out])
  111. }
  112. return out
  113. }
  114. function makeKey (q, kv, algo) {
  115. var t
  116. var k
  117. do {
  118. t = Buffer.alloc(0)
  119. while (t.length * 8 < q.bitLength()) {
  120. kv.v = createHmac(algo, kv.k).update(kv.v).digest()
  121. t = Buffer.concat([t, kv.v])
  122. }
  123. k = bits2int(t, q)
  124. kv.k = createHmac(algo, kv.k).update(kv.v).update(Buffer.from([0])).digest()
  125. kv.v = createHmac(algo, kv.k).update(kv.v).digest()
  126. } while (k.cmp(q) !== -1)
  127. return k
  128. }
  129. function makeR (g, k, p, q) {
  130. return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q)
  131. }
  132. module.exports = sign
  133. module.exports.getKey = getKey
  134. module.exports.makeKey = makeKey
  135. }
  136. if (nodeEnv) {
  137. __define(__module.exports, __require, __module);
  138. }
  139. else {
  140. __quick_compile_project__.registerModuleFunc(__filename, function () {
  141. __define(__module.exports, __require, __module);
  142. });
  143. }
  144. })();