1
2
3
4
5
6
7
8
9
10
11
12
13
14 import hashlib
15
16 from M2Crypto import RSA, X509
17
18 from Anomos import tobinary
19 from Anomos.Crypto import global_randfile
20 import Anomos.Crypto
21
24 self.hash_alg = 'sha256'
25 self.fingerprint = certObj.get_fingerprint(self.hash_alg)
26 self.pubkey = certObj.get_pubkey().get_rsa()
27
28
29
30 if not isinstance(self.pubkey, RSA.RSA_pub):
31 self.pubkey = RSA.new_pub_key((self.pubkey.e, self.pubkey.n))
32
33 - def cmp(self, certObj):
34 return self.fingerprint == certObj.get_fingerprint(self.hash_alg)
35
36 - def encrypt(self, data, rmsglen=None):
37 """
38 @type data: string
39 @return: ciphertext of data, format: {RSA encrypted session key}[Checksum(sessionkey, info, content)][msg length][content][padding]
40 @rtype: string
41 """
42 sessionkey = Anomos.Crypto.AESKey()
43
44 esk = self.pubkey.public_encrypt(sessionkey.key+sessionkey.iv, RSA.pkcs1_oaep_padding)
45 if rmsglen:
46 bmsglen = tobinary(rmsglen)
47 else:
48 rmsglen = len(data)
49 bmsglen = tobinary(len(data))
50 checksum = hashlib.sha1(sessionkey.key + bmsglen + data[:rmsglen]).digest()
51 content = checksum + bmsglen + data
52 padlen = 32-(len(content)%32)
53 padding = Anomos.Crypto.get_rand(padlen)
54 ciphertext = sessionkey.encrypt(content+padding)
55 return esk + ciphertext
56