Module: SimpleOAuth::Signature

Defined in:
lib/simple_oauth/signature.rb,
sig/simple_oauth/signature.rbs

Overview

Signature computation methods for OAuth 1.0

This module provides a registry of signature methods that can be extended with custom implementations. Built-in methods include HMAC-SHA1, HMAC-SHA256, RSA-SHA1, RSA-SHA256, and PLAINTEXT.

Examples:

Register a custom signature method

SimpleOAuth::Signature.register("HMAC-SHA512") do |secret, signature_base|
  SimpleOAuth::Signature.encode_base64(
    OpenSSL::HMAC.digest("SHA512", secret, signature_base)
  )
end

Check if a signature method is registered

SimpleOAuth::Signature.registered?("HMAC-SHA1") # => true
SimpleOAuth::Signature.registered?("CUSTOM")    # => false

Constant Summary collapse

DEFAULT_DIGEST =

The hash algorithm of the signature methods RFC 5849 defines

Returns:

  • (String)
"SHA1"

Class Method Summary collapse

Class Method Details

.decode_base64(data) ⇒ String

Decodes Base64-encoded data

Parameters:

  • data (String)

Returns:

  • (String)


164
165
166
167
# File 'lib/simple_oauth/signature.rb', line 164

def decode_base64(data)
  # "m" is Base64, and is lenient about characters outside the alphabet
  data.unpack1("m") #: String
end

.digest(name) ⇒ String

Returns the hash algorithm a signature method signs with

Parameters:

  • name (String, Symbol)

Returns:

  • (String)


97
98
99
# File 'lib/simple_oauth/signature.rb', line 97

def digest(name)
  fetch(name).fetch(:digest)
end

.encode_base64(data) ⇒ String

Encodes binary data as Base64 without newlines

Parameters:

  • data (String)

Returns:

  • (String)


177
178
179
180
# File 'lib/simple_oauth/signature.rb', line 177

def encode_base64(data)
  # "m0" is Base64 with no line breaks
  [data].pack("m0")
end

.register(name, rsa: false, verify: nil, digest: DEFAULT_DIGEST) {|arg0, arg1| ... } ⇒ void

This method returns an undefined value.

Registers a custom signature method

Parameters:

  • name (String, Symbol)
  • rsa: (Boolean) (defaults to: false)
  • verify: (verifier_block, nil) (defaults to: nil)
  • digest: (String) (defaults to: DEFAULT_DIGEST)

Yields:

Yield Parameters:

  • arg0 (Object)
  • arg1 (String)

Yield Returns:

  • (String)


50
51
52
# File 'lib/simple_oauth/signature.rb', line 50

def register(name, rsa: false, verify: nil, digest: DEFAULT_DIGEST, &block)
  @registry[normalize_name(name)] = {implementation: block, rsa: rsa, verifier: verify, digest: digest}
end

.registered?(name) ⇒ Boolean

Checks if a signature method is registered

Parameters:

  • name (String, Symbol)

Returns:

  • (Boolean)


61
62
63
# File 'lib/simple_oauth/signature.rb', line 61

def registered?(name)
  @registry.key?(normalize_name(name))
end

.registered_methodsArray[String]

Returns list of registered signature method names

Returns:

  • (Array[String])


72
73
74
# File 'lib/simple_oauth/signature.rb', line 72

def registered_methods
  @registry.keys
end

.reset!void

This method returns an undefined value.

Resets the registry to only built-in methods



151
152
153
154
# File 'lib/simple_oauth/signature.rb', line 151

def reset!
  @registry.clear
  register_builtin_methods
end

.rsa?(name) ⇒ Boolean

Checks if a signature method uses RSA

Parameters:

  • name (String, Symbol)

Returns:

  • (Boolean)


85
86
87
# File 'lib/simple_oauth/signature.rb', line 85

def rsa?(name)
  fetch(name).fetch(:rsa)
end

.sign(name, secret, signature_base) ⇒ String

Computes a signature using the specified method

Parameters:

  • name (String, Symbol)
  • secret (String, nil)
  • signature_base (String)

Returns:

  • (String)


111
112
113
# File 'lib/simple_oauth/signature.rb', line 111

def sign(name, secret, signature_base)
  fetch(name).fetch(:implementation).call(secret, signature_base)
end

.unregister(name) ⇒ void

This method returns an undefined value.

Unregisters a signature method

Parameters:

  • name (String, Symbol)


141
142
143
# File 'lib/simple_oauth/signature.rb', line 141

def unregister(name)
  @registry.delete(normalize_name(name))
end

.verify(name, key, signature_base, signature) ⇒ Boolean

Verifies a signature against a key and a signature base string

Parameters:

  • name (String, Symbol)
  • key (String, nil)
  • signature_base (String)
  • signature (String)

Returns:

  • (Boolean)


127
128
129
130
131
132
# File 'lib/simple_oauth/signature.rb', line 127

def verify(name, key, signature_base, signature)
  verifier = fetch(name).fetch(:verifier)
  return OpenSSL.secure_compare(sign(name, key, signature_base), signature) if verifier.nil?

  verifier.call(key, signature_base, signature)
end