### Home Classes Methods

### In Files

- lib/origami/encryption.rb

### Parent

Origami::Encryption::EncryptionDictionary

### Methods

- #compute_owner_encryption_key
- #compute_user_encryption_key
- #is_owner_password?
- #is_user_password?
- #retrieve_user_password
- #set_passwords

### Class/Module Index

Quicksearch

- Origami
- Origami::Action
- Origami::Action::GoTo
- Origami::Action::GoToE
- Origami::Action::GoToE::EmbeddedTarget
- Origami::Action::GoToE::EmbeddedTarget::Relationship
- Origami::Action::GoToR
- Origami::Action::ImportData
- Origami::Action::JavaScript
- Origami::Action::Launch
- Origami::Action::Launch::WindowsLaunchParams
- Origami::Action::Named
- Origami::Action::RichMediaExecute
- Origami::Action::RichMediaExecute::Command
- Origami::Action::SubmitForm
- Origami::Action::SubmitForm::Flags
- Origami::Action::URI
- Origami::Adobe
- Origami::Adobe::PPKLite
- Origami::Adobe::PPKLite::AddressList
- Origami::Adobe::PPKLite::Catalog
- Origami::Adobe::PPKLite::Certificate
- Origami::Adobe::PPKLite::Certificate::Flags
- Origami::Adobe::PPKLite::Descriptor
- Origami::Adobe::PPKLite::Header
- Origami::Adobe::PPKLite::PPK
- Origami::Adobe::PPKLite::Parser
- Origami::Adobe::PPKLite::Revision
- Origami::Adobe::PPKLite::User
- Origami::Adobe::PPKLite::UserList
- Origami::AnimationStyle3D
- Origami::AnimationStyle3D::Styles
- Origami::Annotation
- Origami::Annotation::AdditionalActions
- Origami::Annotation::AppearanceCharacteristics
- Origami::Annotation::AppearanceCharacteristics::CaptionStyle
- Origami::Annotation::AppearanceDictionary
- Origami::Annotation::AppearanceStream
- Origami::Annotation::Artwork3D
- Origami::Annotation::Artwork3D::Activation
- Origami::Annotation::Artwork3D::Activation::Events
- Origami::Annotation::Artwork3D::Activation::State
- Origami::Annotation::BorderStyle
- Origami::Annotation::Circle
- Origami::Annotation::FileAttachment
- Origami::Annotation::FileAttachment::Icons
- Origami::Annotation::Flags
- Origami::Annotation::FreeText
- Origami::Annotation::FreeText::Intent
- Origami::Annotation::Link
- Origami::Annotation::Link::Highlight
- Origami::Annotation::Markup
- Origami::Annotation::RichMedia
- Origami::Annotation::RichMedia::Activation
- Origami::Annotation::RichMedia::Animation
- Origami::Annotation::RichMedia::Configuration
- Origami::Annotation::RichMedia::Content
- Origami::Annotation::RichMedia::CuePoint
- Origami::Annotation::RichMedia::Deactivation
- Origami::Annotation::RichMedia::Instance
- Origami::Annotation::RichMedia::Parameters
- Origami::Annotation::RichMedia::Parameters::Binding
- Origami::Annotation::RichMedia::Position
- Origami::Annotation::RichMedia::Presentation
- Origami::Annotation::RichMedia::Settings
- Origami::Annotation::RichMedia::Window
- Origami::Annotation::Screen
- Origami::Annotation::Shape
- Origami::Annotation::Sound
- Origami::Annotation::Sound::Icons
- Origami::Annotation::Square
- Origami::Annotation::Text
- Origami::Annotation::Text::TextName
- Origami::Annotation::Triggerable
- Origami::Annotation::Widget
- Origami::Annotation::Widget::Button
- Origami::Annotation::Widget::Button::Flags
- Origami::Annotation::Widget::CheckBox
- Origami::Annotation::Widget::Choice
- Origami::Annotation::Widget::Choice::Flags
- Origami::Annotation::Widget::ComboBox
- Origami::Annotation::Widget::Highlight
- Origami::Annotation::Widget::ListBox
- Origami::Annotation::Widget::PushButton
- Origami::Annotation::Widget::Radio
- Origami::Annotation::Widget::Signature
- Origami::Annotation::Widget::Text
- Origami::Annotation::Widget::Text::Flags
- Origami::Array
- Origami::Background3D
- Origami::Boolean
- Origami::ByteString
- Origami::Catalog
- Origami::CatalogAdditionalActions
- Origami::Console
- Origami::Console::Colors
- Origami::ContentStream
- Origami::CrossSection3D
- Origami::Destination
- Origami::Destination::GlobalBoundingBoxFit
- Origami::Destination::GlobalFit
- Origami::Destination::HorizontalBoudingBoxFit
- Origami::Destination::HorizontalFit
- Origami::Destination::RectangleFit
- Origami::Destination::VerticalBoundingBoxFit
- Origami::Destination::VerticalFit
- Origami::Destination::Zoom
- Origami::DeveloperExtension
- Origami::Dictionary
- Origami::EmbeddedFileParameters
- Origami::EmbeddedFileStream
- Origami::Encoding
- Origami::Encryption
- Origami::Encryption::AES
- Origami::Encryption::ARC4
- Origami::Encryption::CryptFilterDictionary
- Origami::Encryption::EncryptedDocument
- Origami::Encryption::EncryptedObject
- Origami::Encryption::EncryptedStream
- Origami::Encryption::EncryptedString
- Origami::Encryption::EncryptionDictionary
- Origami::Encryption::Identity
- Origami::Encryption::Standard
- Origami::Encryption::Standard::Dictionary
- Origami::Encryption::Standard::Permissions
- Origami::Extensions
- Origami::ExternalFile
- Origami::ExternalStream
- Origami::FDF
- Origami::FDF::Header
- Origami::FDF::Parser
- Origami::FDF::Revision
- Origami::Field
- Origami::Field::Flags
- Origami::Field::Subform
- Origami::Field::Subform::AdditionalActions
- Origami::Field::Subform::CertificateSeedValue
- Origami::Field::Subform::CertificateSeedValue::URL
- Origami::Field::Subform::SignatureLock
- Origami::Field::Subform::SignatureLock::Actions
- Origami::Field::Subform::SignatureSeedValue
- Origami::Field::Subform::SignatureSeedValue::Digest
- Origami::Field::TextAlign
- Origami::Field::Type
- Origami::FileSpec
- Origami::Filename
- Origami::Filter
- Origami::Filter::A85
- Origami::Filter::AHx
- Origami::Filter::ASCII85
- Origami::Filter::ASCIIHex
- Origami::Filter::CCF
- Origami::Filter::CCITTFax
- Origami::Filter::CCITTFax::DecodeParms
- Origami::Filter::ClassMethods
- Origami::Filter::Crypt
- Origami::Filter::Crypt::DecodeParms
- Origami::Filter::DCT
- Origami::Filter::DCT::DecodeParms
- Origami::Filter::Fl
- Origami::Filter::Flate
- Origami::Filter::Flate::DecodeParms
- Origami::Filter::InvalidFlateDataError
- Origami::Filter::JBIG2
- Origami::Filter::JBIG2::DecodeParms
- Origami::Filter::JPX
- Origami::Filter::LZW
- Origami::Filter::LZW::DecodeParms
- Origami::Filter::Predictor
- Origami::Filter::RL
- Origami::Filter::RunLength
- Origami::Filter::Utils
- Origami::Filter::Utils::BitReader
- Origami::Filter::Utils::BitWriter
- Origami::Font
- Origami::Font::TrueType
- Origami::Font::Type1
- Origami::Font::Type1::Standard
- Origami::Font::Type1::Standard::Courier
- Origami::Font::Type1::Standard::CourierBold
- Origami::Font::Type1::Standard::CourierBoldOblique
- Origami::Font::Type1::Standard::CourierOblique
- Origami::Font::Type1::Standard::Helvetica
- Origami::Font::Type1::Standard::HelveticaBold
- Origami::Font::Type1::Standard::HelveticaBoldOblique
- Origami::Font::Type1::Standard::HelveticaOblique
- Origami::Font::Type1::Standard::Symbol
- Origami::Font::Type1::Standard::TimesBold
- Origami::Font::Type1::Standard::TimesBoldItalic
- Origami::Font::Type1::Standard::TimesItalic
- Origami::Font::Type1::Standard::TimesRoman
- Origami::Font::Type1::Standard::ZapfDingbats
- Origami::Font::Type3
- Origami::FontDescriptor
- Origami::FontStream
- Origami::Function
- Origami::Function::Exponential
- Origami::Function::PostScript
- Origami::Function::Sampled
- Origami::Function::Stitching
- Origami::Function::Type
- Origami::Graphics
- Origami::Graphics::Canvas
- Origami::Graphics::Color
- Origami::Graphics::Color::BlendMode
- Origami::Graphics::Color::CMYK
- Origami::Graphics::Color::GrayScale
- Origami::Graphics::Color::ICCProfile
- Origami::Graphics::Color::Intent
- Origami::Graphics::Color::RGB
- Origami::Graphics::Color::Space
- Origami::Graphics::DashPattern
- Origami::Graphics::DummyCanvas
- Origami::Graphics::ExtGState
- Origami::Graphics::FormXObject
- Origami::Graphics::ImageXObject
- Origami::Graphics::InvalidColorError
- Origami::Graphics::InvalidPathError
- Origami::Graphics::LineCapStyle
- Origami::Graphics::LineJoinStyle
- Origami::Graphics::Path
- Origami::Graphics::Path::Line
- Origami::Graphics::Path::Segment
- Origami::Graphics::Pattern
- Origami::Graphics::Pattern::Shading
- Origami::Graphics::Pattern::Shading::Axial
- Origami::Graphics::Pattern::Shading::CoonsPathMesh
- Origami::Graphics::Pattern::Shading::FreeFormTriangleMesh
- Origami::Graphics::Pattern::Shading::FunctionBased
- Origami::Graphics::Pattern::Shading::LatticeFormTriangleMesh
- Origami::Graphics::Pattern::Shading::Radial
- Origami::Graphics::Pattern::Shading::ShadingObject
- Origami::Graphics::Pattern::Shading::TensorProductPatchMesh
- Origami::Graphics::Pattern::Shading::Type
- Origami::Graphics::Pattern::Tiling
- Origami::Graphics::Pattern::Tiling::PaintType
- Origami::Graphics::Pattern::Tiling::Type
- Origami::Graphics::Pattern::Type
- Origami::Graphics::ReferenceDictionary
- Origami::Graphics::State
- Origami::Graphics::TextCanvas
- Origami::Graphics::XObject
- Origami::HexaString
- Origami::HintStream
- Origami::HintTable
- Origami::HintTable::ClassMethods
- Origami::HintTable::PageOffsetTable
- Origami::HintTable::SharedObjectTable
- Origami::Integer
- Origami::InteractiveForm
- Origami::InteractiveForm::SigFlags
- Origami::InvalidPDFInstructionError
- Origami::InvalidXRefStreamObjectError
- Origami::LightingScheme3D
- Origami::LightingScheme3D::Styles
- Origami::Linearization
- Origami::Metadata
- Origami::MetadataStream
- Origami::Name
- Origami::NameLeaf
- Origami::NameTreeNode
- Origami::Names
- Origami::Names::Root
- Origami::NavigationNode
- Origami::Node3D
- Origami::Null
- Origami::Number
- Origami::Obfuscator
- Origami::Object
- Origami::ObjectStream
- Origami::Outline
- Origami::OutlineItem
- Origami::OutlineItem::Style
- Origami::OutputIntent
- Origami::OutputIntent::Intent
- Origami::PDF
- Origami::PDF::Header
- Origami::PDF::Instruction
- Origami::PDF::JavaScript
- Origami::PDF::JavaScript::AcroTimer
- Origami::PDF::JavaScript::AcrobatObject
- Origami::PDF::JavaScript::Acrohelp
- Origami::PDF::JavaScript::App
- Origami::PDF::JavaScript::Arg
- Origami::PDF::JavaScript::Console
- Origami::PDF::JavaScript::Data
- Origami::PDF::JavaScript::Doc
- Origami::PDF::JavaScript::Doc::Info
- Origami::PDF::JavaScript::Engine
- Origami::PDF::JavaScript::EngineError
- Origami::PDF::JavaScript::Field
- Origami::PDF::JavaScript::GeneralError
- Origami::PDF::JavaScript::Global
- Origami::PDF::JavaScript::HelpError
- Origami::PDF::JavaScript::Interval
- Origami::PDF::JavaScript::InvalidArgsError
- Origami::PDF::JavaScript::MissingArgError
- Origami::PDF::JavaScript::NotAllowedError
- Origami::PDF::JavaScript::Platforms
- Origami::PDF::JavaScript::ReadStream
- Origami::PDF::JavaScript::TimeOut
- Origami::PDF::JavaScript::TypeError
- Origami::PDF::JavaScript::Util
- Origami::PDF::JavaScript::Viewers
- Origami::PDF::LinearParser
- Origami::PDF::Parser
- Origami::PDF::Revision
- Origami::Page
- Origami::Page::Format
- Origami::PageAdditionalActions
- Origami::PageTreeNode
- Origami::Perms
- Origami::Projection3D
- Origami::Projection3D::ClippingStyles
- Origami::Projection3D::Scaling
- Origami::Real
- Origami::Rectangle
- Origami::Reference
- Origami::Reference3D
- Origami::RenderMode3D
- Origami::RenderMode3D::Modes
- Origami::Requirement
- Origami::Requirement::Handler
- Origami::Requirement::Handler::Type
- Origami::Resources
- Origami::ResourcesHolder
- Origami::Signature
- Origami::Signature::AppData
- Origami::Signature::BuildData
- Origami::Signature::BuildProperties
- Origami::Signature::DigitalSignature
- Origami::Signature::Reference
- Origami::Signature::SigQData
- Origami::Stream
- Origami::String
- Origami::String::Encoding
- Origami::String::Encoding::PDFDocEncoding
- Origami::String::Encoding::UTF16BE
- Origami::Text
- Origami::Text::Rendering
- Origami::Text::State
- Origami::Trailer
- Origami::U3DStream
- Origami::URL
- Origami::UsageRights
- Origami::UsageRights::Rights
- Origami::UsageRights::TransformParams
- Origami::V8
- Origami::V8::Object
- Origami::View3D
- Origami::ViewerPreferences
- Origami::Webcapture
- Origami::Webcapture::Command
- Origami::Webcapture::Command::Flags
- Origami::Webcapture::CommandSettings
- Origami::Webcapture::SourceInformation
- Origami::Webcapture::SourceInformation::SubmissionType
- Origami::Webcapture::SpiderInfo
- Origami::XDP
- Origami::XDP::Package
- Origami::XDP::Packet
- Origami::XDP::Packet::Config
- Origami::XDP::Packet::Config::AdjustData
- Origami::XDP::Packet::Config::Attributes
- Origami::XDP::Packet::Config::Base
- Origami::XDP::Packet::Config::Common
- Origami::XDP::Packet::Config::Data
- Origami::XDP::Packet::Config::Debug
- Origami::XDP::Packet::Config::ExcludeNS
- Origami::XDP::Packet::Config::GroupParent
- Origami::XDP::Packet::Config::IfEmpty
- Origami::XDP::Packet::Config::IncrementalLoad
- Origami::XDP::Packet::Config::Locale
- Origami::XDP::Packet::Config::LocaleSet
- Origami::XDP::Packet::Config::Log
- Origami::XDP::Packet::Config::Message
- Origami::XDP::Packet::Config::Messaging
- Origami::XDP::Packet::Config::Mode
- Origami::XDP::Packet::Config::MsgId
- Origami::XDP::Packet::Config::NameAttr
- Origami::XDP::Packet::Config::OutputXSL
- Origami::XDP::Packet::Config::Picture
- Origami::XDP::Packet::Config::Presence
- Origami::XDP::Packet::Config::Range
- Origami::XDP::Packet::Config::Record
- Origami::XDP::Packet::Config::Relevant
- Origami::XDP::Packet::Config::Rename
- Origami::XDP::Packet::Config::Severity
- Origami::XDP::Packet::Config::StartNode
- Origami::XDP::Packet::Config::StartPage
- Origami::XDP::Packet::Config::SuppressBanner
- Origami::XDP::Packet::Config::Template
- Origami::XDP::Packet::Config::Threshold
- Origami::XDP::Packet::Config::To
- Origami::XDP::Packet::Config::Transform
- Origami::XDP::Packet::Config::URI
- Origami::XDP::Packet::Config::ValidationMessaging
- Origami::XDP::Packet::Config::VersionControl
- Origami::XDP::Packet::Config::Whitespace
- Origami::XDP::Packet::Config::Window
- Origami::XDP::Packet::Config::XSL
- Origami::XDP::Packet::ConnectionSet
- Origami::XDP::Packet::ConnectionSet::EffectiveInputPolicy
- Origami::XDP::Packet::ConnectionSet::EffectiveOutputPolicy
- Origami::XDP::Packet::ConnectionSet::Operation
- Origami::XDP::Packet::ConnectionSet::RootElement
- Origami::XDP::Packet::ConnectionSet::SOAPAction
- Origami::XDP::Packet::ConnectionSet::SOAPAddress
- Origami::XDP::Packet::ConnectionSet::URI
- Origami::XDP::Packet::ConnectionSet::WSDLAddress
- Origami::XDP::Packet::ConnectionSet::WSDLConnection
- Origami::XDP::Packet::ConnectionSet::XMLConnection
- Origami::XDP::Packet::ConnectionSet::XSDConnection
- Origami::XDP::Packet::Datasets
- Origami::XDP::Packet::Datasets::Data
- Origami::XDP::Packet::LocaleSet
- Origami::XDP::Packet::PDF
- Origami::XDP::Packet::Signature
- Origami::XDP::Packet::SourceSet
- Origami::XDP::Packet::StyleSheet
- Origami::XDP::Packet::Template
- Origami::XDP::Packet::Template::AppearanceFilter
- Origami::XDP::Packet::Template::Arc
- Origami::XDP::Packet::Template::Area
- Origami::XDP::Packet::Template::Assist
- Origami::XDP::Packet::Template::Barcode
- Origami::XDP::Packet::Template::Bind
- Origami::XDP::Packet::Template::BindItems
- Origami::XDP::Packet::Template::Bookend
- Origami::XDP::Packet::Template::Boolean
- Origami::XDP::Packet::Template::Border
- Origami::XDP::Packet::Template::Break
- Origami::XDP::Packet::Template::BreakAfter
- Origami::XDP::Packet::Template::BreakBefore
- Origami::XDP::Packet::Template::Button
- Origami::XDP::Packet::Template::Calculate
- Origami::XDP::Packet::Template::Caption
- Origami::XDP::Packet::Template::Certificate
- Origami::XDP::Packet::Template::Certificates
- Origami::XDP::Packet::Template::CheckButton
- Origami::XDP::Packet::Template::ChoiceList
- Origami::XDP::Packet::Template::Color
- Origami::XDP::Packet::Template::Comb
- Origami::XDP::Packet::Template::Connect
- Origami::XDP::Packet::Template::ContentArea
- Origami::XDP::Packet::Template::Corner
- Origami::XDP::Packet::Template::Date
- Origami::XDP::Packet::Template::DateTime
- Origami::XDP::Packet::Template::DateTimeEdit
- Origami::XDP::Packet::Template::Decimal
- Origami::XDP::Packet::Template::DefaultUI
- Origami::XDP::Packet::Template::Desc
- Origami::XDP::Packet::Template::DigestMethod
- Origami::XDP::Packet::Template::DigestMethods
- Origami::XDP::Packet::Template::Draw
- Origami::XDP::Packet::Template::Edge
- Origami::XDP::Packet::Template::Encoding
- Origami::XDP::Packet::Template::Encodings
- Origami::XDP::Packet::Template::Encrypt
- Origami::XDP::Packet::Template::Event
- Origami::XDP::Packet::Template::ExData
- Origami::XDP::Packet::Template::ExObject
- Origami::XDP::Packet::Template::ExclGroup
- Origami::XDP::Packet::Template::Execute
- Origami::XDP::Packet::Template::Extras
- Origami::XDP::Packet::Template::Field
- Origami::XDP::Packet::Template::Fill
- Origami::XDP::Packet::Template::Filter
- Origami::XDP::Packet::Template::Float
- Origami::XDP::Packet::Template::Font
- Origami::XDP::Packet::Template::FormCalcScript
- Origami::XDP::Packet::Template::Format
- Origami::XDP::Packet::Template::Handler
- Origami::XDP::Packet::Template::Hyphenation
- Origami::XDP::Packet::Template::Image
- Origami::XDP::Packet::Template::ImageEdit
- Origami::XDP::Packet::Template::Integer
- Origami::XDP::Packet::Template::Issuers
- Origami::XDP::Packet::Template::Items
- Origami::XDP::Packet::Template::JavaScript
- Origami::XDP::Packet::Template::Keep
- Origami::XDP::Packet::Template::KeyUsage
- Origami::XDP::Packet::Template::Line
- Origami::XDP::Packet::Template::Linear
- Origami::XDP::Packet::Template::LockDocument
- Origami::XDP::Packet::Template::MDP
- Origami::XDP::Packet::Template::Manifest
- Origami::XDP::Packet::Template::Margin
- Origami::XDP::Packet::Template::Medium
- Origami::XDP::Packet::Template::Message
- Origami::XDP::Packet::Template::NumericEdit
- Origami::XDP::Packet::Template::OID
- Origami::XDP::Packet::Template::OIDs
- Origami::XDP::Packet::Template::Occur
- Origami::XDP::Packet::Template::Overflow
- Origami::XDP::Packet::Template::PageArea
- Origami::XDP::Packet::Template::PageSet
- Origami::XDP::Packet::Template::Para
- Origami::XDP::Packet::Template::PasswordEdit
- Origami::XDP::Packet::Template::Pattern
- Origami::XDP::Packet::Template::Picture
- Origami::XDP::Packet::Template::Proto
- Origami::XDP::Packet::Template::Radial
- Origami::XDP::Packet::Template::Reason
- Origami::XDP::Packet::Template::Reasons
- Origami::XDP::Packet::Template::Rectangle
- Origami::XDP::Packet::Template::Ref
- Origami::XDP::Packet::Template::Script
- Origami::XDP::Packet::Template::SetProperty
- Origami::XDP::Packet::Template::SignData
- Origami::XDP::Packet::Template::Signature
- Origami::XDP::Packet::Template::Signing
- Origami::XDP::Packet::Template::Solid
- Origami::XDP::Packet::Template::Speak
- Origami::XDP::Packet::Template::Stipple
- Origami::XDP::Packet::Template::Subform
- Origami::XDP::Packet::Template::SubformSet
- Origami::XDP::Packet::Template::SubjectDN
- Origami::XDP::Packet::Template::SubjectDNs
- Origami::XDP::Packet::Template::Submit
- Origami::XDP::Packet::Template::Text
- Origami::XDP::Packet::Template::TextEdit
- Origami::XDP::Packet::Template::Time
- Origami::XDP::Packet::Template::TimeStamp
- Origami::XDP::Packet::Template::ToolTip
- Origami::XDP::Packet::Template::Traversal
- Origami::XDP::Packet::Template::Traverse
- Origami::XDP::Packet::Template::UI
- Origami::XDP::Packet::Template::Validate
- Origami::XDP::Packet::Template::Value
- Origami::XDP::Packet::Template::Variables
- Origami::XDP::Packet::XDC
- Origami::XDP::Packet::XFDF
- Origami::XDP::Packet::XMPMeta
- Origami::XDP::XDP
- Origami::XFA
- Origami::XFA::ClassMethods
- Origami::XFA::Element
- Origami::XRef
- Origami::XRef::Section
- Origami::XRef::Subsection
- Origami::XRefStream
- Origami::XRefToCompressedObj
- EmptySymbol
- Fixnum
- Hash

No matching classes.

# Origami::Encryption::Standard::Dictionary

Class defining a standard encryption dictionary.

### Constants

O
OE
Perms
U
UE

### Public Instance Methods

compute_owner_encryption_key(ownerpassword) click to toggle source

Computes the key that will be used to encrypt/decrypt the document contents with owner password. Revision 5 and above.

    # File lib/origami/encryption.rb, line 1157
    def compute_owner_encryption_key(ownerpassword)
      if self.R >= 5
        passwd = password_to_utf8(ownerpassword)

        oks = self.O[40, 8]

        if self.R == 5
          okey = Digest::SHA256.digest(passwd + oks + self.U)
        else
          okey = compute_hardened_hash(passwd, oks, self.U)
        end

        iv = ::Array.new(AES::BLOCKSIZE, 0).pack("C*")
        AES.new(okey, nil, false).decrypt(iv + self.OE.value)
      end
    end

compute_user_encryption_key(userpassword, fileid) click to toggle source

Computes the key that will be used to encrypt/decrypt the document contents with user password.

    # File lib/origami/encryption.rb, line 1114
    def compute_user_encryption_key(userpassword, fileid)

      if self.R < 5
        padded = pad_password(userpassword)
        padded.force_encoding('binary') if RUBY_VERSION > '1.8'

        padded << self.O
        padded << [ self.P ].pack("i")

        padded << fileid

        encrypt_metadata = self.EncryptMetadata != false
        padded << [ -1 ].pack("i") if self.R >= 4 and not encrypt_metadata

        key = Digest::MD5.digest(padded)

        50.times { key = Digest::MD5.digest(key[0, self.Length / 8]) } if self.R >= 3

        if self.R == 2
          key[0, 5]
        elsif self.R >= 3
          key[0, self.Length / 8]
        end
      else
        passwd = password_to_utf8(userpassword)

        uks = self.U[40, 8]

        if self.R == 5
          ukey = Digest::SHA256.digest(passwd + uks)
        else
          ukey = compute_hardened_hash(passwd, uks)
        end

        iv = ::Array.new(AES::BLOCKSIZE, 0).pack("C*")
        AES.new(ukey, nil, false).decrypt(iv + self.UE.value)
      end
    end

is_owner_password?(pass, salt) click to toggle source

Checks owner password. For version 2,3 and 4, salt is the document ID. For version 5, salt is (Owner Key Salt + U)

    # File lib/origami/encryption.rb, line 1248
    def is_owner_password?(pass, salt)

      if self.R < 5
        user_password = retrieve_user_password(pass)
        is_user_password?(user_password, salt)
      elsif self.R == 5
        ovs = self.O[32, 8]
        Digest::SHA256.digest(password_to_utf8(pass) + ovs + self.U) == self.O[0, 32]
      elsif self.R == 6
        ovs = self.O[32, 8]
        compute_hardened_hash(password_to_utf8(pass), ovs, self.U[0,48]) == self.O[0, 32]
      end
    end

is_user_password?(pass, salt) click to toggle source

Checks user password. For version 2,3 and 4, salt is the document ID. For version 5 and 6, salt is the User Key Salt.

    # File lib/origami/encryption.rb, line 1229
    def is_user_password?(pass, salt)
      if self.R == 2
        compute_user_password(pass, salt) == self.U
      elsif self.R == 3 or self.R == 4
        compute_user_password(pass, salt)[0, 16] == self.U[0, 16]
      elsif self.R == 5
        uvs = self.U[32, 8]
        Digest::SHA256.digest(password_to_utf8(pass) + uvs) == self.U[0, 32]
      elsif self.R == 6
        uvs = self.U[32, 8]
        compute_hardened_hash(password_to_utf8(pass), uvs) == self.U[0, 32]
      end
    end

retrieve_user_password(ownerpassword) click to toggle source

Retrieve user password from owner password. Cannot be used with revision 5.

    # File lib/origami/encryption.rb, line 1266
    def retrieve_user_password(ownerpassword)
      key = compute_owner_key(ownerpassword)

      if self.R == 2
        ARC4.decrypt(key, self.O)
      elsif self.R == 3 or self.R == 4
        user_password = ARC4.decrypt(xor(key, 19), self.O)
        19.times { |i| user_password = ARC4.decrypt(xor(key, 18-i), user_password) }

        user_password
      end
    end

set_passwords(ownerpassword, userpassword, salt = nil) click to toggle source

Set up document passwords.

    # File lib/origami/encryption.rb, line 1177
    def set_passwords(ownerpassword, userpassword, salt = nil)
      if self.R < 5
        key = compute_owner_key(ownerpassword)
        upadded = pad_password(userpassword)

        owner_key = ARC4.encrypt(key, upadded)
        19.times { |i| owner_key = ARC4.encrypt(xor(key,i+1), owner_key) } if self.R >= 3

        self.O = owner_key
        self.U = compute_user_password(userpassword, salt)

      else
        upass = password_to_utf8(userpassword)
        opass = password_to_utf8(ownerpassword)

        uvs, uks, ovs, oks = ::Array.new(4) { Encryption.rand_bytes(8) }
        file_key = Encryption.strong_rand_bytes(32)
        iv = ::Array.new(AES::BLOCKSIZE, 0).pack("C*")

        if self.R == 5
          self.U = Digest::SHA256.digest(upass + uvs) + uvs + uks
          self.O = Digest::SHA256.digest(opass + ovs + self.U) + ovs + oks
          ukey = Digest::SHA256.digest(upass + uks)
          okey = Digest::SHA256.digest(opass + oks + self.U)
        else
          self.U = compute_hardened_hash(upass, uvs) + uvs + uks
          self.O = compute_hardened_hash(opass, ovs, self.U) + ovs + oks
          ukey = compute_hardened_hash(upass, uks)
          okey = compute_hardened_hash(opass, oks, self.U)
        end

        self.UE = AES.new(ukey, iv, false).encrypt(file_key)[iv.size, 32]
        self.OE = AES.new(okey, iv, false).encrypt(file_key)[iv.size, 32]

        perms =
          [ self.P ].pack("V") +                              # 0-3
          [ -1 ].pack("V") +                                  # 4-7
          (self.EncryptMetadata == true ? "T" : "F") +        # 8
          "adb" +                                             # 9-11
          [ 0 ].pack("V")                                     # 12-15

        self.Perms = AES.new(file_key, iv, false).encrypt(perms)[iv.size, 16]

        file_key
      end
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.