Projekt

Obecné

Profil

Stáhnout (2.27 KB) Statistiky
| Větev: | Revize:
1
var parseKeys = require('parse-asn1')
2
var randomBytes = require('randombytes')
3
var createHash = require('create-hash')
4
var mgf = require('./mgf')
5
var xor = require('./xor')
6
var BN = require('bn.js')
7
var withPublic = require('./withPublic')
8
var crt = require('browserify-rsa')
9
var Buffer = require('safe-buffer').Buffer
10

    
11
module.exports = function publicEncrypt (publicKey, msg, reverse) {
12
  var padding
13
  if (publicKey.padding) {
14
    padding = publicKey.padding
15
  } else if (reverse) {
16
    padding = 1
17
  } else {
18
    padding = 4
19
  }
20
  var key = parseKeys(publicKey)
21
  var paddedMsg
22
  if (padding === 4) {
23
    paddedMsg = oaep(key, msg)
24
  } else if (padding === 1) {
25
    paddedMsg = pkcs1(key, msg, reverse)
26
  } else if (padding === 3) {
27
    paddedMsg = new BN(msg)
28
    if (paddedMsg.cmp(key.modulus) >= 0) {
29
      throw new Error('data too long for modulus')
30
    }
31
  } else {
32
    throw new Error('unknown padding')
33
  }
34
  if (reverse) {
35
    return crt(paddedMsg, key)
36
  } else {
37
    return withPublic(paddedMsg, key)
38
  }
39
}
40

    
41
function oaep (key, msg) {
42
  var k = key.modulus.byteLength()
43
  var mLen = msg.length
44
  var iHash = createHash('sha1').update(Buffer.alloc(0)).digest()
45
  var hLen = iHash.length
46
  var hLen2 = 2 * hLen
47
  if (mLen > k - hLen2 - 2) {
48
    throw new Error('message too long')
49
  }
50
  var ps = Buffer.alloc(k - mLen - hLen2 - 2)
51
  var dblen = k - hLen - 1
52
  var seed = randomBytes(hLen)
53
  var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen))
54
  var maskedSeed = xor(seed, mgf(maskedDb, hLen))
55
  return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k))
56
}
57
function pkcs1 (key, msg, reverse) {
58
  var mLen = msg.length
59
  var k = key.modulus.byteLength()
60
  if (mLen > k - 11) {
61
    throw new Error('message too long')
62
  }
63
  var ps
64
  if (reverse) {
65
    ps = Buffer.alloc(k - mLen - 3, 0xff)
66
  } else {
67
    ps = nonZero(k - mLen - 3)
68
  }
69
  return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k))
70
}
71
function nonZero (len) {
72
  var out = Buffer.allocUnsafe(len)
73
  var i = 0
74
  var cache = randomBytes(len * 2)
75
  var cur = 0
76
  var num
77
  while (i < len) {
78
    if (cur === cache.length) {
79
      cache = randomBytes(len * 2)
80
      cur = 0
81
    }
82
    num = cache[cur++]
83
    if (num) {
84
      out[i++] = num
85
    }
86
  }
87
  return out
88
}
(8-8/11)