Class: Itsdangerousr::Signer

Inherits:
Object
  • Object
show all
Defined in:
lib/itsdangerousr.rb

Direct Known Subclasses

TimestampSigner

Instance Method Summary collapse

Constructor Details

#initialize(secret_key, options = {}) ⇒ Signer

Returns a new instance of Signer.



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/itsdangerousr.rb', line 53

def initialize(secret_key, options={})
  defaults = {:salt => 'itsdangerous.Signer', :sep => '.',
              :key_derivation => 'django-concat',
              :digest_method => OpenSSL::Digest::SHA1,
              :algorithm => HMACAlgorithm.new()}
  options = defaults.merge(options)
  @secret_key = secret_key
  @sep = options[:sep]
  @salt = options[:salt]
  @key_derivation = options[:key_derivation]
  @digest_method = options[:digest_method]
  @algorithm = options[:algorithm]
end

Instance Method Details

#derive_keyObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/itsdangerousr.rb', line 77

def derive_key
  case @key_derivation
    when 'concat'
      @digest_method.digest(@salt + @secret_key)
    when 'django-concat'
      @digest_method.digest(@salt + 'signer' + @secret_key)
    when 'hmac'
      hmac = OpenSSL::HMAC.new(@secret_key, @digest_method)
      hmac.update(@salt)
      hmac.digest()
    when 'none'
      @secret_key
    else
      raise TypeError, 'Unknown key derivation method'
  end
end

#get_signature(value) ⇒ Object



67
68
69
70
71
# File 'lib/itsdangerousr.rb', line 67

def get_signature(value)
  key = derive_key()
  sig = @algorithm.get_signature(key, value)
  Itsdangerousr.base64_encode(sig)
end

#sign(value) ⇒ Object



73
74
75
# File 'lib/itsdangerousr.rb', line 73

def sign(value)
  value + @sep + get_signature(value)
end

#unsign(signed_value) ⇒ Object



103
104
105
106
107
108
109
110
111
112
# File 'lib/itsdangerousr.rb', line 103

def unsign(signed_value)
  unless signed_value.include?('.')
    raise BadSignature, "No #{@sep} found in signed value"
  end
  value, _, sig = signed_value.rpartition(@sep)
  unless verify_signature(value, sig)
    raise BadSignature.new("Signature #{sig} does not match", value)
  end
  value
end

#validate(signed_value) ⇒ Object



94
95
96
97
98
99
100
101
# File 'lib/itsdangerousr.rb', line 94

def validate(signed_value)
  begin
    unsign(signed_value)
    true
  rescue BadSignature
    false
  end
end

#verify_signature(value, sig) ⇒ Object



114
115
116
117
118
# File 'lib/itsdangerousr.rb', line 114

def verify_signature(value, sig)
  key = derive_key()
  sig = Itsdangerousr.base64_decode(sig)
  @algorithm.verify_signature(key, value, sig)
end