mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Refactor encryption into the globals module for ease of re-use
This commit is contained in:
parent
63381b7859
commit
6649b60dc5
@ -1,6 +1,8 @@
|
|||||||
# vim:fileencoding=utf-8
|
# vim:fileencoding=utf-8
|
||||||
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
|
||||||
|
from aes import GCM
|
||||||
|
|
||||||
_boss = None
|
_boss = None
|
||||||
|
|
||||||
def set_boss(b):
|
def set_boss(b):
|
||||||
@ -10,3 +12,21 @@ def set_boss(b):
|
|||||||
def get_boss():
|
def get_boss():
|
||||||
return _boss
|
return _boss
|
||||||
|
|
||||||
|
class Messenger:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.secret = Uint8Array(64)
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
window.crypto.getRandomValues(self.secret)
|
||||||
|
self.gcm_to_iframe = GCM(self.secret.subarray(0, 32))
|
||||||
|
self.gcm_from_iframe = GCM(self.secret.subarray(32))
|
||||||
|
|
||||||
|
def encrypt(self, data):
|
||||||
|
return self.gcm_to_iframe.encrypt(JSON.stringify(data))
|
||||||
|
|
||||||
|
def decrypt(self, data):
|
||||||
|
return JSON.parse(self.gcm_from_iframe.decrypt(data))
|
||||||
|
|
||||||
|
messenger = Messenger()
|
||||||
|
iframe_id = 'read-book-iframe'
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
# vim:fileencoding=utf-8
|
# vim:fileencoding=utf-8
|
||||||
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
|
||||||
from aes import GCM
|
|
||||||
|
|
||||||
def decode_component(x):
|
def decode_component(x):
|
||||||
x = str.replace(x,',p', '|')
|
x = str.replace(x,',p', '|')
|
||||||
@ -11,17 +10,6 @@ def decode_url(x):
|
|||||||
parts = x.split(',,')
|
parts = x.split(',,')
|
||||||
return decode_component(parts[0]), decode_component(parts[1] or '')
|
return decode_component(parts[0]), decode_component(parts[1] or '')
|
||||||
|
|
||||||
secret = Uint8Array(64)
|
|
||||||
window.crypto.getRandomValues(secret)
|
|
||||||
gcm_to_iframe, gcm_from_iframe = GCM(secret.subarray(0, 32)), GCM(secret.subarray(32))
|
|
||||||
iframe_id = 'read-book-iframe'
|
|
||||||
|
|
||||||
def encrypt_message(data):
|
|
||||||
return gcm_to_iframe.encrypt(JSON.stringify(data))
|
|
||||||
|
|
||||||
def decrypt_message(data):
|
|
||||||
return JSON.parse(gcm_from_iframe.decrypt(data))
|
|
||||||
|
|
||||||
class Resource:
|
class Resource:
|
||||||
|
|
||||||
def __init__(self, name, mimetype, data, placeholder, parent):
|
def __init__(self, name, mimetype, data, placeholder, parent):
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
|
|
||||||
from elementmaker import E
|
from elementmaker import E
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
from read_book.resources import ResourceManager, encrypt_message, iframe_id, decrypt_message, secret
|
from read_book.globals import messenger, iframe_id
|
||||||
|
from read_book.resources import ResourceManager
|
||||||
|
|
||||||
LOADING_DOC = '''
|
LOADING_DOC = '''
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@ -59,7 +60,7 @@ class View:
|
|||||||
|
|
||||||
def send_message(self, data):
|
def send_message(self, data):
|
||||||
if self.encrypted_communications:
|
if self.encrypted_communications:
|
||||||
data = encrypt_message(data)
|
data = messenger.encrypt(data)
|
||||||
self.iframe.contentWindow.postMessage(data, '*')
|
self.iframe.contentWindow.postMessage(data, '*')
|
||||||
|
|
||||||
def handle_message(self, event):
|
def handle_message(self, event):
|
||||||
@ -68,7 +69,7 @@ class View:
|
|||||||
data = event.data
|
data = event.data
|
||||||
if self.encrypted_communications:
|
if self.encrypted_communications:
|
||||||
try:
|
try:
|
||||||
data = decrypt_message(data)
|
data = messenger.decrypt(data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('Could not process message from iframe:')
|
print('Could not process message from iframe:')
|
||||||
console.log(e)
|
console.log(e)
|
||||||
@ -80,7 +81,8 @@ class View:
|
|||||||
print('Unknown action in message from iframe to parent: ' + data.action)
|
print('Unknown action in message from iframe to parent: ' + data.action)
|
||||||
|
|
||||||
def on_iframe_ready(self, data):
|
def on_iframe_ready(self, data):
|
||||||
self.send_message({'action':'keys', 'secret':secret})
|
messenger.reset()
|
||||||
|
self.send_message({'action':'keys', 'secret':messenger.secret})
|
||||||
self.iframe_ready = True
|
self.iframe_ready = True
|
||||||
if self.pending_spine_load:
|
if self.pending_spine_load:
|
||||||
self.show_spine_item_stage2()
|
self.show_spine_item_stage2()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user