lib/fernet/secret.rb in fernet-2.0.rc1 vs lib/fernet/secret.rb in fernet-2.0.rc2
- old
+ new
@@ -1,24 +1,46 @@
require 'base64'
+
module Fernet
+ # Internal: Encapsulates a secret key, a 32-byte sequence consisting
+ # of an encryption and a signing key.
class Secret
class InvalidSecret < RuntimeError; end
+ # Internal - Initialize a Secret
+ #
+ # secret - the secret, optionally encoded with either standard or
+ # URL safe variants of Base64 encoding
+ #
+ # Raises Fernet::Secret::InvalidSecret if it cannot be decoded or is
+ # not of the expected length
def initialize(secret)
- @secret = Base64.urlsafe_decode64(secret)
- unless @secret.bytesize == 32
- raise InvalidSecret, "Secret must be 32 bytes, instead got #{@secret.bytesize}"
+ if secret.bytesize == 32
+ @secret = secret
+ else
+ begin
+ @secret = Base64.urlsafe_decode64(secret)
+ rescue ArgumentError
+ @secret = Base64.decode64(secret)
+ end
+ unless @secret.bytesize == 32
+ raise InvalidSecret,
+ "Secret must be 32 bytes, instead got #{@secret.bytesize}"
+ end
end
end
+ # Internal: Returns the portion of the secret token used for encryption
def encryption_key
@secret.slice(16, 16)
end
+ # Internal: Returns the portion of the secret token used for signing
def signing_key
@secret.slice(0, 16)
end
+ # Public: String representation of this secret, masks to avoid leaks.
def to_s
"<Fernet::Secret [masked]>"
end
alias to_s inspect
end