mirror of
https://github.com/Leseratte10/acsm-calibre-plugin.git
synced 2024-12-22 17:29:56 +06:00
Update signing / encryption code
This commit is contained in:
parent
218d7e6e52
commit
2fae9b83a2
@ -1,10 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
[ ! -f calibre-plugin/cryptography.zip ] && ./package_modules.sh
|
|
||||||
[ ! -f calibre-plugin/rsa.zip ] && ./package_modules.sh
|
|
||||||
[ ! -f calibre-plugin/asn1crypto.zip ] && ./package_modules.sh
|
[ ! -f calibre-plugin/asn1crypto.zip ] && ./package_modules.sh
|
||||||
[ ! -f calibre-plugin/oscrypto.zip ] && ./package_modules.sh
|
[ ! -f calibre-plugin/oscrypto.zip ] && ./package_modules.sh
|
||||||
[ ! -f calibre-plugin/pyasn1.zip ] && ./package_modules.sh
|
|
||||||
|
|
||||||
pushd calibre-plugin
|
pushd calibre-plugin
|
||||||
pushd keyextract
|
pushd keyextract
|
||||||
@ -15,7 +12,7 @@ make
|
|||||||
popd
|
popd
|
||||||
|
|
||||||
# Set module ID. This needs to be changed if any of the module ZIPs change.
|
# Set module ID. This needs to be changed if any of the module ZIPs change.
|
||||||
echo -n "2021-12-15-01" > module_id.txt
|
echo -n "2021-12-19-03" > module_id.txt
|
||||||
|
|
||||||
# Copy LICENSE so it'll be included in the ZIP.
|
# Copy LICENSE so it'll be included in the ZIP.
|
||||||
cp ../LICENSE LICENSE
|
cp ../LICENSE LICENSE
|
||||||
|
@ -138,7 +138,10 @@ class DeACSM(FileTypePlugin):
|
|||||||
|
|
||||||
os.mkdir(rand_path)
|
os.mkdir(rand_path)
|
||||||
|
|
||||||
names = ["cryptography.zip", "rsa.zip", "oscrypto.zip", "asn1crypto.zip", "pyasn1.zip"]
|
names = ["oscrypto.zip", "asn1crypto.zip"]
|
||||||
|
|
||||||
|
# oscrypto is needed to parse the pkcs12 data from Adobe.
|
||||||
|
# asn1crypto is a dependency of oscrypto.
|
||||||
|
|
||||||
lib_dict = self.load_resources(names)
|
lib_dict = self.load_resources(names)
|
||||||
|
|
||||||
@ -174,11 +177,8 @@ class DeACSM(FileTypePlugin):
|
|||||||
# Rename temporary path to actual module path so this will be used next time.
|
# Rename temporary path to actual module path so this will be used next time.
|
||||||
os.rename(rand_path, self.moddir)
|
os.rename(rand_path, self.moddir)
|
||||||
|
|
||||||
sys.path.insert(0, os.path.join(self.moddir, "cryptography"))
|
|
||||||
sys.path.insert(0, os.path.join(self.moddir, "rsa"))
|
|
||||||
sys.path.insert(0, os.path.join(self.moddir, "oscrypto"))
|
sys.path.insert(0, os.path.join(self.moddir, "oscrypto"))
|
||||||
sys.path.insert(0, os.path.join(self.moddir, "asn1crypto"))
|
sys.path.insert(0, os.path.join(self.moddir, "asn1crypto"))
|
||||||
sys.path.insert(0, os.path.join(self.moddir, "pyasn1"))
|
|
||||||
|
|
||||||
# Okay, now all the modules are available, import the Adobe modules.
|
# Okay, now all the modules are available, import the Adobe modules.
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ import urllib.request, ssl
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
import rsa
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from Crypto import Random
|
from Crypto import Random
|
||||||
@ -26,9 +25,13 @@ except ImportError:
|
|||||||
from Cryptodome.PublicKey import RSA
|
from Cryptodome.PublicKey import RSA
|
||||||
from Cryptodome.Hash import SHA
|
from Cryptodome.Hash import SHA
|
||||||
|
|
||||||
from oscrypto import keys
|
try:
|
||||||
from oscrypto.asymmetric import dump_certificate, dump_private_key, dump_public_key
|
from customRSA import CustomRSA
|
||||||
|
except:
|
||||||
|
from calibre_plugins.deacsm.customRSA import CustomRSA
|
||||||
|
|
||||||
|
from oscrypto import keys
|
||||||
|
from oscrypto.asymmetric import dump_certificate, dump_private_key
|
||||||
|
|
||||||
|
|
||||||
VAR_ACS_SERVER_HTTP = "http://adeactivate.adobe.com/adept"
|
VAR_ACS_SERVER_HTTP = "http://adeactivate.adobe.com/adept"
|
||||||
@ -393,9 +396,9 @@ def addNonce():
|
|||||||
def get_cert_from_pkcs12(_pkcs12, _key):
|
def get_cert_from_pkcs12(_pkcs12, _key):
|
||||||
|
|
||||||
_, cert, _ = keys.parse_pkcs12(_pkcs12, _key)
|
_, cert, _ = keys.parse_pkcs12(_pkcs12, _key)
|
||||||
cert = dump_certificate(cert, encoding="der")
|
return dump_certificate(cert, encoding="der")
|
||||||
|
|
||||||
|
|
||||||
return cert
|
|
||||||
|
|
||||||
|
|
||||||
def sign_node(node):
|
def sign_node(node):
|
||||||
@ -421,17 +424,20 @@ def sign_node(node):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
my_pkcs12 = base64.b64decode(pkcs12)
|
my_pkcs12 = base64.b64decode(pkcs12)
|
||||||
|
|
||||||
my_priv_key, _, _ = keys.parse_pkcs12(my_pkcs12, base64.b64encode(devkey_bytes))
|
my_priv_key, _, _ = keys.parse_pkcs12(my_pkcs12, base64.b64encode(devkey_bytes))
|
||||||
my_priv_key = dump_private_key(my_priv_key, None, "der")
|
my_priv_key = dump_private_key(my_priv_key, None, "der")
|
||||||
|
|
||||||
key = rsa.PrivateKey.load_pkcs1(RSA.importKey(my_priv_key).exportKey())
|
|
||||||
keylen = rsa.pkcs1.common.byte_size(key.n)
|
key = RSA.importKey(my_priv_key)
|
||||||
padded = rsa.pkcs1._pad_for_signing(sha_hash, keylen)
|
keylen = CustomRSA.byte_size(key.n)
|
||||||
payload = rsa.pkcs1.transform.bytes2int(padded)
|
padded = CustomRSA.pad_message(sha_hash, keylen)
|
||||||
encrypted = key.blinded_encrypt(payload)
|
payload = CustomRSA.transform_bytes2int(padded)
|
||||||
block = rsa.pkcs1.transform.int2bytes(encrypted, keylen)
|
encrypted = CustomRSA.normal_encrypt(key, payload)
|
||||||
|
block = CustomRSA.transform_int2bytes(encrypted, keylen)
|
||||||
signature = base64.b64encode(block).decode()
|
signature = base64.b64encode(block).decode()
|
||||||
|
|
||||||
|
# Debug
|
||||||
# print("sig is %s\n" % block.hex())
|
# print("sig is %s\n" % block.hex())
|
||||||
|
|
||||||
return signature
|
return signature
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from lxml import etree
|
from lxml import etree
|
||||||
import base64
|
import base64
|
||||||
import os, locale, platform
|
import locale, platform
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA
|
||||||
|
@ -2,7 +2,12 @@ from lxml import etree
|
|||||||
import base64
|
import base64
|
||||||
import os, locale, platform
|
import os, locale, platform
|
||||||
|
|
||||||
from Crypto.Cipher import AES as _AES
|
try:
|
||||||
|
from Crypto.Cipher import AES as _AES
|
||||||
|
except ImportError:
|
||||||
|
# Debian (and Ubuntu) ship pycryptodome, but not in its compatible mode with pycrypto
|
||||||
|
# If `Crypto` can't be found, try under pycryptodome's own namespace
|
||||||
|
from Cryptodome.Cipher import AES as _AES
|
||||||
|
|
||||||
class AES(object):
|
class AES(object):
|
||||||
def __init__(self, key, iv):
|
def __init__(self, key, iv):
|
||||||
|
@ -3,10 +3,7 @@
|
|||||||
pushd calibre-plugin
|
pushd calibre-plugin
|
||||||
|
|
||||||
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/asn1crypto_1.4.0.zip -O asn1crypto.zip
|
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/asn1crypto_1.4.0.zip -O asn1crypto.zip
|
||||||
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/cryptography_36.0.1.zip -O cryptography.zip
|
|
||||||
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/oscrypto_1.2.1.zip -O oscrypto.zip
|
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/oscrypto_1.2.1.zip -O oscrypto.zip
|
||||||
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/pyasn1_0.4.8.zip -O pyasn1.zip
|
|
||||||
wget https://github.com/Leseratte10/acsm-calibre-plugin/releases/download/config/rsa_4.8.zip -O rsa.zip
|
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user