1 | fs = require "fs"
|
2 | Crypto = require "crypto"
|
3 | {Method} = require "fairmont-multimethods"
|
4 | {isBuffer, isString} = require "./type"
|
5 | Base64Words = require "base64-words"
|
6 | {promise, async} = require "./promise"
|
7 |
|
8 | md5 = Method.create()
|
9 |
|
10 | Method.define md5, isString,
|
11 | (string) -> Crypto.createHash('md5').update(string, 'utf-8').digest("hex")
|
12 |
|
13 | Method.define md5, isBuffer,
|
14 | (buffer) -> Crypto.createHash('md5').update(buffer, 'binary').digest("hex")
|
15 |
|
16 | base64 = Method.create()
|
17 | Method.define base64, isString, (string) -> base64 new Buffer string
|
18 | Method.define base64, isBuffer, (buffer) -> buffer.toString 'base64'
|
19 |
|
20 |
|
21 | base64URL = (buffer) ->
|
22 | base64 buffer
|
23 | .replace(/\+/g, '-')
|
24 | .replace(/\//g, '_')
|
25 | .replace(/\=+$/, '')
|
26 |
|
27 |
|
28 | toBase64Words = (buffer) ->
|
29 | Base64Words.fromBase64 base64URL buffer
|
30 |
|
31 | fromBase64Words = (string) ->
|
32 | new Buffer (Base64Words.toBase64 string), 'base64'
|
33 |
|
34 |
|
35 |
|
36 | randomBytes = unless process.platform == "win32"
|
37 | (n) ->
|
38 | promise (resolve, reject) ->
|
39 | fs.open "/dev/urandom", "r", (error, fd) ->
|
40 | buffer = Buffer.alloc n
|
41 | fs.read fd, buffer, 0, n, 0, (error, m) ->
|
42 | if n == m
|
43 | resolve buffer
|
44 | else
|
45 | reject "Unable to read #{n} bytes from /dev/urandom"
|
46 | else
|
47 | (n) ->
|
48 | promise (resolve, reject) ->
|
49 | Crypto.randomBytes n, (error, buffer) ->
|
50 | unless error?
|
51 | resolve buffer
|
52 | else
|
53 | reject error
|
54 |
|
55 | randomKey = async (n) -> base64URL yield randomBytes n
|
56 | randomWords = async (n) -> toBase64Words yield randomBytes n
|
57 |
|
58 | module.exports = {md5,
|
59 | base64, base64URL,
|
60 | toBase64Words, fromBase64Words
|
61 | randomBytes, randomKey, randomWords}
|