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 956 956: def compute_encryption_key(password, fileid) 957: 958: padded = pad_password(password) 959: 960: padded << self.O 961: padded << [ self.P ].pack("i") 962: 963: padded << fileid 964: 965: encrypt_metadata = self.EncryptMetadata != false 966: padded << "\xFF\xFF\xFF\xFF" if self.R >= 4 and not encrypt_metadata 967: 968: key = Digest::MD5.digest(padded) 969: 970: 50.times { key = Digest::MD5.digest(key[0, self.Length / 8]) } if self.R >= 3 971: 972: if self.R == 2 973: key[0, 5] 974: elsif self.R >= 3 975: key[0, self.Length / 8] 976: end 977: 978: end
Checks owner password.
# File sources/parser/encryption.rb, line 1018 1018: def is_owner_password?(pass, fileid) 1019: 1020: key = compute_owner_encryption_key(pass) 1021: 1022: if self.R == 2 1023: user_password = ARC4.decrypt(key, self.O) 1024: elsif self.R >= 3 1025: user_password = ARC4.decrypt(xor(key, 19), self.O) 1026: 19.times { |i| user_password = ARC4.decrypt(xor(key, 18-i), user_password) } 1027: end 1028: 1029: is_user_password?(user_password, fileid) 1030: end
Checks user password.
# File sources/parser/encryption.rb, line 1005 1005: def is_user_password?(pass, fileid) 1006: 1007: if self.R == 2 1008: compute_user_password(pass, fileid) == self.U 1009: elsif self.R >= 3 1010: compute_user_password(pass, fileid)[0, 16] == self.U[0, 16] 1011: end 1012: 1013: end
Set owner password.
# File sources/parser/encryption.rb, line 983 983: def set_owner_password(userpassword, ownerpassword = nil) 984: 985: key = compute_owner_encryption_key(userpassword, ownerpassword) 986: upadded = pad_password(userpassword) 987: 988: owner_key = ARC4.encrypt(key, upadded) 989: 19.times { |i| owner_key = ARC4.encrypt(xor(key,i+1), owner_key) } if self.R >= 3 990: 991: self.O = owner_key 992: end