Class | Origami::Encryption::Standard::Dictionary |
In: |
sources/parser/encryption.rb
|
Parent: | EncryptionDictionary |
Class defining a standard encryption dictionary.
O | = | owner_key |
U | = | compute_user_password(userpassword, fileid) |
Computes the key that will be used to encrypt/decrypt the document.
# File sources/parser/encryption.rb, line 889 889: def compute_encryption_key(password, fileid) 890: 891: padded = pad_password(password) 892: 893: padded << self.O 894: padded << [ self.P ].pack("i") 895: 896: padded << fileid 897: 898: encrypt_metadata = self.EncryptMetadata and not self.EncryptMetadata.false? 899: padded << "\xFF\xFF\xFF\xFF" if self.R >= 4 and not encrypt_metadata 900: 901: key = Digest::MD5.digest(padded) 902: 903: 50.times { key = Digest::MD5.digest(key[0, self.Length / 8]) } if self.R >= 3 904: 905: if self.R == 2 906: key[0, 5] 907: elsif self.R >= 3 908: key[0, self.Length / 8] 909: end 910: 911: end
Checks owner password.
# File sources/parser/encryption.rb, line 953 953: def is_owner_password?(pass, fileid) 954: 955: key = compute_owner_encryption_key(pass) 956: 957: if self.R == 2 958: user_password = ARC4.decrypt(key, self.O) 959: elsif self.R >= 3 960: user_password = ARC4.decrypt(xor(key, 19), self.O) 961: 19.times { |i| user_password = ARC4.decrypt(xor(key, 18-i), user_password) } 962: end 963: 964: is_user_password?(user_password, fileid) 965: 966: end
Checks user password.
# File sources/parser/encryption.rb, line 940 940: def is_user_password?(pass, fileid) 941: 942: if self.R == 2 943: compute_user_password(pass, fileid) == self.U 944: elsif self.R >= 3 945: compute_user_password(pass, fileid)[0, 16] == self.U[0, 16] 946: end 947: 948: end
Set owner password.
# File sources/parser/encryption.rb, line 916 916: def set_owner_password(userpassword, ownerpassword = nil) 917: 918: key = compute_owner_encryption_key(userpassword, ownerpassword) 919: upadded = pad_password(userpassword) 920: 921: owner_key = ARC4.encrypt(key, upadded) 922: 19.times { |i| owner_key = ARC4.encrypt(xor(key,i+1), owner_key) } if self.R >= 3 923: 924: self.O = owner_key 925: 926: end