Guest User

Untitled

a guest
Apr 12th, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var Promise = require("bluebird"),
  2.     br = require('binary-reader'),
  3.     nacl = require('js-nacl'),
  4.     sha256 = require("sha256"),
  5.     utf8 = require('utf-8'),
  6.     base64 = require('base-64')
  7.  
  8. nacl = nacl.instantiate()
  9.  
  10. module.exports = function(app) {
  11.     const CAPTCHA_BLOCK_LENGT = 32 + 32 + 125
  12.     const CAPTCHA_COUNT = 1048576
  13.     const POW_LIMIT = 1
  14.  
  15.     return {
  16.         verify: function(post) {
  17.             var sign, hash
  18.  
  19.             sign = nacl.from_hex(this.getSign(post))
  20.             post = utf8.setBytesFromString(this.cutSign(post))
  21.             hash = nacl.from_hex(sha256(post))
  22.  
  23.             if (this.checkPOW(hash))
  24.                 return this.getCaptchaByIdx(this.getCaptchaIdx(hash))
  25.                     .then(function(data) {
  26.                         return nacl.crypto_sign_verify_detached(sign, post, data.pk)
  27.                     })
  28.             else
  29.                 return Promise.resolve(false)
  30.         },
  31.  
  32.         checkPOW: function(hash) {
  33.             for (var result = false, i = 0, l = hash.length; i < l; i++)
  34.                 if (hash[i] <= POW_LIMIT && hash[i + 1] <= POW_LIMIT && hash[i + 2] <= POW_LIMIT) {
  35.                     result = true
  36.                     break
  37.                 }
  38.  
  39.             return result
  40.         },
  41.  
  42.         cutSign: function(post) {
  43.             return post.replace(/\[sign=.+\]/g, '')
  44.         },
  45.  
  46.         getSign: function(post) {
  47.             return post.match(/\[sign=(.+)\]/g)[0].replace(/\[sign=(.+)\]/g, '$1')
  48.         },
  49.  
  50.         getCaptchaIdx: function(hash) {
  51.             return (hash[0] + hash[1] * 256 + hash[2] * 256 * 256) % CAPTCHA_COUNT
  52.         },
  53.  
  54.         getCaptchaByIdx: function(idx) {
  55.             return this.getCaptchaBlockByIdx(idx)
  56.                 .then(this.parseCaptchaBlock)
  57.         },
  58.  
  59.         getCaptchaBlockByIdx: function(idx) {
  60.             return new Promise((resolve, reject) => br.open('./captcha.nbc')
  61.                 .on ("error", (err) => reject(err))
  62.                 .seek(CAPTCHA_BLOCK_LENGT * idx)
  63.                 .read(CAPTCHA_BLOCK_LENGT, (len, data) => resolve(data))
  64.                 .close ())
  65.         },
  66.  
  67.         parseCaptchaBlock: function(data) {
  68.             return Promise.resolve({
  69.                 pk: data.slice(0, 32),
  70.                 sk: data.slice(32, 64),
  71.                 c: data.slice(64).toString('base64')
  72.             })
  73.         }
  74.     }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment