1
1
mirror of https://github.com/r4sas/PBinCLI synced 2025-01-10 14:58:04 +00:00

update get command

This commit is contained in:
R4SAS 2017-02-20 20:56:37 +03:00
parent 5fe5c2f195
commit e986df6413
4 changed files with 35 additions and 34 deletions

View File

@ -13,9 +13,10 @@ def main():
# a send command
send_parser = subparsers.add_parser("send", description="Send data to PrivateBin instance", usage="""
%(prog)s --burn --discus --expire 1day --format plaintext \\
--password mypass image.txt"""
--comment "My file" --password mypass image.txt"""
)
send_parser.add_argument("-b", "--burn", default=False, action="store_true", help="burn sent paste after reading")
send_parser.add_argument("-c", "--comment", help="comment in quotes")
send_parser.add_argument("-d", "--discus", default=False, action="store_true", help="open discussion of sent paste")
send_parser.add_argument("-e", "--expire", default="1day", action="store", help="expiration of paste (default: 1day)")
send_parser.add_argument("-f", "--format", default="plaintext", action="store", help="format of paste (default: plaintext)")

View File

@ -1,24 +1,28 @@
"""Action functions for argparser"""
import json
#import mimetypes
import os
import pbincli.actions
'''from pbincli.sjcl_gcm import SJCL'''
import sys
#import pbincli.sjcl_gcm
import pbincli.sjcl_simple
import pbincli.utils
from base64 import b64encode
from base64 import b64encode, b64decode
from Crypto.Hash import SHA256
from pbincli.transports import privatebin
from zlib import compress
from zlib import compress, decompress
def send(args):
""" Sub-command for sending paste """
if args.comment:
text = args.comment
else:
text = "Test!"
#check_readable(args.filename)
#with open(args.filename, "rb") as f:
# contents = f.read()
#file = b64encode(compress(contents))
data = b'Test!'
passphrase = os.urandom(32)
if args.debug: print("Passphrase: {}".format(passphrase))
@ -26,30 +30,24 @@ def send(args):
p = SHA256.new()
p.update(args.password.encode("UTF-8"))
passphrase = b64encode(passphrase + p.hexdigest().encode("UTF-8"))
else:
passphrase = b64encode(passphrase)
if args.degub: print("Password:\t{}".format(passphrase))
if args.debug: print("Password:\t{}".format(passphrase))
#data = SJCL().encrypt(file, password.decode("UTF-8"))
#cipher = pbincli.sjcl_simple.encrypt(b64encode(passphrase), file)
"""Sending text from 'data' string"""
cipher = pbincli.sjcl_simple.encrypt(passphrase, data)
request = {'data':json.dumps(cipher, ensure_ascii=False).replace(' ',''),'expire':args.expire,'formatter':args.format,'burnafterreading':int(args.burn),'opendiscussion':int(args.discus)
}
#cipher = SJCL().encrypt(b64encode(text), passphrase)
cipher = pbincli.sjcl_simple.encrypt(passphrase, text)
request = {'data':json.dumps(cipher, ensure_ascii=False).replace(' ',''),'expire':args.expire,'formatter':args.format,'burnafterreading':int(args.burn),'opendiscussion':int(args.discus)}
if args.debug: print("Request:\t{}".format(request))
result, server = privatebin().post(request)
if args.debug: print("Response:\t{}\n".format(result.decode("UTF-8")))
result = json.loads(result)
"""Standart response: {"status":0,"id":"aaabbb","url":"\/?aaabbb","deletetoken":"aaabbbccc"}"""
if result['status'] == 0:
print("Paste uploaded!\nPasteID:\t{}\nPassword:\t{}\nDelete token:\t{}\n\nLink:\t{}?{}#{}".format(result['id'], passphrase.decode("UTF-8"), result['deletetoken'], server, result['id'], passphrase.decode("UTF-8")))
else:
print("Something went wrong...\nError:\t{}".format(result['error']))
print("Something went wrong...\nError:\t{}".format(result['message']))
sys.exit(1)
@ -61,19 +59,19 @@ def get(args):
else:
print("PBinCLI error: Incorrect request")
sys.exit(1)
if args.debug: print("Response:\t{}\n".format(result.decode("UTF-8")))
result = json.loads(result)
if result['status'] == 0:
print("Paste received!\n")
text = pbincli.utils.json_loads_byteified(result['data'])
out = pbincli.sjcl_simple.decrypt(paste[1], text)
out = pbincli.sjcl_simple.decrypt(paste[1], text)
#out = pbincli.sjcl_gcm.SJCL().decrypt(text, paste[1])
print(out)
if 'burnafterreading' in result['meta'] and result['meta']['burnafterreading']:
print("Meow!")
result = privatebin().delete(paste[0], 'burnafterreading')
if args.debug: print("Delete response:\t{}\n".format(result.decode("UTF-8")))
else:
print("Something went wrong...\nError:\t{}".format(result['error']))
print("Something went wrong...\nError:\t{}".format(result['message']))
sys.exit(1)

View File

@ -72,9 +72,9 @@ class SJCL(object):
if len(salt) != self.salt_size:
raise Exception("salt should be %d bytes long" % self.salt_size)
dkLen = data["ks"]//8
if dkLen != 16:
raise Exception("key length should be 16 bytes")
dkLen = data["ks"] / 8
if dkLen != 32:
raise Exception("key length should be 32 bytes")
key = PBKDF2(
passphrase,
@ -86,22 +86,23 @@ class SJCL(object):
# print "key", hex_string(key)
ciphertext = base64.b64decode(data["ct"])
# ciphertext = data["ct"]
iv = base64.b64decode(data["iv"])
# print AES.block_size
nonce = truncate_iv(iv, len(ciphertext)*8, data["ts"])
# split tag from ciphertext (tag was simply appended to ciphertext)
mac = ciphertext[-(data["ts"]//8):]
mac = ciphertext[-(data["ts"] / 8):]
# print len(ciphertext)
ciphertext = ciphertext[:-(data["ts"]//8)]
ciphertext = ciphertext[:-(data["ts"] / 8)]
# print len(ciphertext)
# print len(tag)
# print "len", len(nonce)
cipher = AES.new(key, AES.MODE_GCM, nonce)
plaintext = cipher.decrypt(ciphertext)
print(mac)
# print(mac)
# cipher.verify(mac)
return plaintext

View File

@ -1,9 +1,9 @@
import requests
import json
import urllib
class privatebin(object):
#import urllib
class privatebin(object):
def __init__(self):
self.proxies = {'http': 'http://127.0.0.1:4444'}
self.server = 'http://paste.r4sas.i2p/'
@ -21,6 +21,7 @@ class privatebin(object):
return r.text
def delete(self, request):
def delete(self, pasteid, token):
request = {'pasteid':pasteid,'deletetoken':token}
r = requests.post(url=self.server, headers=self.headers, proxies=self.proxies, data=request)
return r.text