Class: Familia::Encryption::Provider

Inherits:
Object
  • Object
show all
Defined in:
lib/familia/encryption/provider.rb

Overview

Base provider class - similar to FieldType pattern

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeProvider

Returns a new instance of Provider.



11
12
13
14
15
# File 'lib/familia/encryption/provider.rb', line 11

def initialize
  @algorithm = self.class::ALGORITHM
  @nonce_size = self.class::NONCE_SIZE
  @auth_tag_size = self.class::AUTH_TAG_SIZE
end

Instance Attribute Details

#algorithmObject (readonly)

Returns the value of attribute algorithm.



9
10
11
# File 'lib/familia/encryption/provider.rb', line 9

def algorithm
  @algorithm
end

#auth_tag_sizeObject (readonly)

Returns the value of attribute auth_tag_size.



9
10
11
# File 'lib/familia/encryption/provider.rb', line 9

def auth_tag_size
  @auth_tag_size
end

#nonce_sizeObject (readonly)

Returns the value of attribute nonce_size.



9
10
11
# File 'lib/familia/encryption/provider.rb', line 9

def nonce_size
  @nonce_size
end

Class Method Details

.available?Boolean

Check if this provider is available

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)


48
49
50
# File 'lib/familia/encryption/provider.rb', line 48

def self.available?
  raise NotImplementedError
end

.dependency_hintObject

Human-readable name of the runtime dependency this provider needs to be available?, or nil when it has none (e.g. an always-available OpenSSL provider). Used only to build a helpful error when a field is pinned to a known algorithm whose provider isn't installed on this node; override in subclasses whose availability is gated on an optional library.



62
63
64
# File 'lib/familia/encryption/provider.rb', line 62

def self.dependency_hint
  nil
end

.priorityObject

Priority for automatic selection (higher = preferred)



53
54
55
# File 'lib/familia/encryption/provider.rb', line 53

def self.priority
  0
end

Instance Method Details

#decrypt(ciphertext, key, nonce, auth_tag, additional_data = nil) ⇒ Object

Raises:

  • (NotImplementedError)


29
30
31
# File 'lib/familia/encryption/provider.rb', line 29

def decrypt(ciphertext, key, nonce, auth_tag, additional_data = nil)
  raise NotImplementedError
end

#derive_key(master_key, context) ⇒ Object

Raises:

  • (NotImplementedError)


37
38
39
# File 'lib/familia/encryption/provider.rb', line 37

def derive_key(master_key, context)
  raise NotImplementedError
end

#encrypt(plaintext, key, additional_data = nil) ⇒ Object

Public interface methods that subclasses must implement

Raises:

  • (NotImplementedError)


25
26
27
# File 'lib/familia/encryption/provider.rb', line 25

def encrypt(plaintext, key, additional_data = nil)
  raise NotImplementedError
end

#generate_nonceObject

Raises:

  • (NotImplementedError)


33
34
35
# File 'lib/familia/encryption/provider.rb', line 33

def generate_nonce
  raise NotImplementedError
end

#key_sizeObject

Derived-key length in bytes. Read lazily rather than in initialize so provider subclasses written before KEY_SIZE existed still construct; they raise a NameError naming the missing constant only when asked.



20
21
22
# File 'lib/familia/encryption/provider.rb', line 20

def key_size
  self.class::KEY_SIZE
end

#secure_wipe(key) ⇒ Object

Clear key from memory (best effort, no security guarantees) Ruby provides no reliable way to securely wipe memory



43
44
45
# File 'lib/familia/encryption/provider.rb', line 43

def secure_wipe(key)
  key&.clear if key.respond_to?(:clear)
end