|
|
@ -164,9 +164,12 @@ class Paste: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def decrypt(self): |
|
|
|
def decrypt(self): |
|
|
|
from json import loads as json_decode |
|
|
|
# that is wrapper which running needed function regrading to paste version |
|
|
|
|
|
|
|
self._decryptV2() if self._version == 2 else self._decryptV1() |
|
|
|
|
|
|
|
|
|
|
|
if self._version == 2: |
|
|
|
|
|
|
|
|
|
|
|
def _decryptV2(self): |
|
|
|
|
|
|
|
from json import loads as json_decode |
|
|
|
iv = b64decode(self._data['adata'][0][0]) |
|
|
|
iv = b64decode(self._data['adata'][0][0]) |
|
|
|
salt = b64decode(self._data['adata'][0][1]) |
|
|
|
salt = b64decode(self._data['adata'][0][1]) |
|
|
|
key = self.__deriveKey(salt) |
|
|
|
key = self.__deriveKey(salt) |
|
|
@ -186,13 +189,14 @@ class Paste: |
|
|
|
if 'attachment' in cipher_message and 'attachment_name' in cipher_message: |
|
|
|
if 'attachment' in cipher_message and 'attachment_name' in cipher_message: |
|
|
|
self._attachment = cipher_message['attachment'] |
|
|
|
self._attachment = cipher_message['attachment'] |
|
|
|
self._attachment_name = cipher_message['attachment_name'] |
|
|
|
self._attachment_name = cipher_message['attachment_name'] |
|
|
|
else: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _decryptV1(self): |
|
|
|
from sjcl import SJCL |
|
|
|
from sjcl import SJCL |
|
|
|
|
|
|
|
from json import loads as json_decode |
|
|
|
|
|
|
|
|
|
|
|
password = self.__preparePassKey() |
|
|
|
password = self.__preparePassKey() |
|
|
|
|
|
|
|
|
|
|
|
cipher_text = json_decode(self._data['data']) |
|
|
|
cipher_text = json_decode(self._data['data']) |
|
|
|
|
|
|
|
|
|
|
|
if self._debug: print("Text:\t{}\n".format(cipher_text)) |
|
|
|
if self._debug: print("Text:\t{}\n".format(cipher_text)) |
|
|
|
|
|
|
|
|
|
|
|
text = SJCL().decrypt(cipher_text, password) |
|
|
|
text = SJCL().decrypt(cipher_text, password) |
|
|
@ -215,8 +219,18 @@ class Paste: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def encrypt(self, formatter, burnafterreading, discussion, expiration): |
|
|
|
def encrypt(self, formatter, burnafterreading, discussion, expiration): |
|
|
|
|
|
|
|
# that is wrapper which running needed function regrading to paste version |
|
|
|
|
|
|
|
self._formatter = formatter |
|
|
|
|
|
|
|
self._burnafterreading = burnafterreading |
|
|
|
|
|
|
|
self._discussion = discussion |
|
|
|
|
|
|
|
self._expiration = expiration |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._encryptV2() if self._version == 2 else self._encryptV1() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _encryptV2(self): |
|
|
|
from pbincli.utils import json_encode |
|
|
|
from pbincli.utils import json_encode |
|
|
|
if self._version == 2: |
|
|
|
|
|
|
|
iv = get_random_bytes(CIPHER_TAG_BYTES) |
|
|
|
iv = get_random_bytes(CIPHER_TAG_BYTES) |
|
|
|
salt = get_random_bytes(CIPHER_SALT_BYTES) |
|
|
|
salt = get_random_bytes(CIPHER_SALT_BYTES) |
|
|
|
key = self.__deriveKey(salt) |
|
|
|
key = self.__deriveKey(salt) |
|
|
@ -233,9 +247,9 @@ class Paste: |
|
|
|
'gcm', |
|
|
|
'gcm', |
|
|
|
self._compression |
|
|
|
self._compression |
|
|
|
], |
|
|
|
], |
|
|
|
formatter, |
|
|
|
self._formatter, |
|
|
|
int(discussion), |
|
|
|
int(self._discussion), |
|
|
|
int(burnafterreading) |
|
|
|
int(self._burnafterreading) |
|
|
|
] |
|
|
|
] |
|
|
|
cipher_message = {'paste':self._text} |
|
|
|
cipher_message = {'paste':self._text} |
|
|
|
if self._attachment: |
|
|
|
if self._attachment: |
|
|
@ -245,15 +259,16 @@ class Paste: |
|
|
|
cipher = self.__initializeCipher(key, iv, adata) |
|
|
|
cipher = self.__initializeCipher(key, iv, adata) |
|
|
|
ciphertext, tag = cipher.encrypt_and_digest(self.__compress(json_encode(cipher_message))) |
|
|
|
ciphertext, tag = cipher.encrypt_and_digest(self.__compress(json_encode(cipher_message))) |
|
|
|
|
|
|
|
|
|
|
|
self._data = {'v':2,'adata':adata,'ct':b64encode(ciphertext + tag).decode(),'meta':{'expire':expiration}} |
|
|
|
self._data = {'v':2,'adata':adata,'ct':b64encode(ciphertext + tag).decode(),'meta':{'expire':self._expiration}} |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
|
|
|
|
def _encryptV1(self): |
|
|
|
from sjcl import SJCL |
|
|
|
from sjcl import SJCL |
|
|
|
|
|
|
|
from pbincli.utils import json_encode |
|
|
|
|
|
|
|
|
|
|
|
self._data = {'expire':expiration,'formatter':formatter,'burnafterreading':int(burnafterreading),'opendiscussion':int(discussion)} |
|
|
|
self._data = {'expire':self._expiration,'formatter':self._formatter,'burnafterreading':int(self._burnafterreading),'opendiscussion':int(self._discussion)} |
|
|
|
|
|
|
|
|
|
|
|
password = self.__preparePassKey() |
|
|
|
password = self.__preparePassKey() |
|
|
|
|
|
|
|
|
|
|
|
if self._debug: print("Password:\t{}".format(password)) |
|
|
|
if self._debug: print("Password:\t{}".format(password)) |
|
|
|
|
|
|
|
|
|
|
|
# Encrypting text |
|
|
|
# Encrypting text |
|
|
@ -271,4 +286,3 @@ class Paste: |
|
|
|
|
|
|
|
|
|
|
|
self._data['attachment'] = json_encode(cipherfile) |
|
|
|
self._data['attachment'] = json_encode(cipherfile) |
|
|
|
self._data['attachmentname'] = json_encode(cipherfilename) |
|
|
|
self._data['attachmentname'] = json_encode(cipherfilename) |
|
|
|
|
|
|
|
|
|
|
|