Browse Source

update get command

pull/4/head
R4SAS 8 years ago
parent
commit
e986df6413
  1. 3
      pbincli.py
  2. 42
      pbincli/actions.py
  3. 13
      pbincli/sjcl_gcm.py
  4. 9
      pbincli/transports.py

3
pbincli.py

@ -13,9 +13,10 @@ def main(): @@ -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)")

42
pbincli/actions.py

@ -1,24 +1,28 @@ @@ -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): @@ -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): @@ -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_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)

13
pbincli/sjcl_gcm.py

@ -72,9 +72,9 @@ class SJCL(object): @@ -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): @@ -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

9
pbincli/transports.py

@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
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'}
@ -21,6 +21,7 @@ class privatebin(object): @@ -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

Loading…
Cancel
Save