Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var Promise = require("bluebird"),
- br = require('binary-reader'),
- nacl = require('js-nacl'),
- sha256 = require("sha256"),
- utf8 = require('utf-8'),
- base64 = require('base-64')
- nacl = nacl.instantiate()
- module.exports = function(app) {
- const CAPTCHA_BLOCK_LENGT = 32 + 32 + 125
- const CAPTCHA_COUNT = 1048576
- const POW_LIMIT = 1
- return {
- verify: function(post) {
- var sign, hash
- sign = nacl.from_hex(this.getSign(post))
- post = utf8.setBytesFromString(this.cutSign(post))
- hash = nacl.from_hex(sha256(post))
- if (this.checkPOW(hash))
- return this.getCaptchaByIdx(this.getCaptchaIdx(hash))
- .then(function(data) {
- return nacl.crypto_sign_verify_detached(sign, post, data.pk)
- })
- else
- return Promise.resolve(false)
- },
- checkPOW: function(hash) {
- for (var result = false, i = 0, l = hash.length; i < l; i++)
- if (hash[i] <= POW_LIMIT && hash[i + 1] <= POW_LIMIT && hash[i + 2] <= POW_LIMIT) {
- result = true
- break
- }
- return result
- },
- cutSign: function(post) {
- return post.replace(/\[sign=.+\]/g, '')
- },
- getSign: function(post) {
- return post.match(/\[sign=(.+)\]/g)[0].replace(/\[sign=(.+)\]/g, '$1')
- },
- getCaptchaIdx: function(hash) {
- return (hash[0] + hash[1] * 256 + hash[2] * 256 * 256) % CAPTCHA_COUNT
- },
- getCaptchaByIdx: function(idx) {
- return this.getCaptchaBlockByIdx(idx)
- .then(this.parseCaptchaBlock)
- },
- getCaptchaBlockByIdx: function(idx) {
- return new Promise((resolve, reject) => br.open('./captcha.nbc')
- .on ("error", (err) => reject(err))
- .seek(CAPTCHA_BLOCK_LENGT * idx)
- .read(CAPTCHA_BLOCK_LENGT, (len, data) => resolve(data))
- .close ())
- },
- parseCaptchaBlock: function(data) {
- return Promise.resolve({
- pk: data.slice(0, 32),
- sk: data.slice(32, 64),
- c: data.slice(64).toString('base64')
- })
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment