| // Copyright 2016 The Fuchsia Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_ENCODER_CLIENT_SECRET_H_ |
| #define COBALT_ENCODER_CLIENT_SECRET_H_ |
| |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "util/crypto_util/random.h" |
| #include "util/crypto_util/types.h" |
| |
| namespace cobalt { |
| namespace encoder { |
| |
| using crypto::byte; |
| |
| // A ClientSecret is a wrapper around an array of bytes containing |
| // random bytes from a CSPRNG. Clients should invoke GenerateNewSecret() |
| // once, and then permanently and securely save the token returned by |
| // GetToken(). After that clients should reconstruct the token using |
| // FromToken(). |
| // |
| // Tokens are passed into several different methods in the Encoder API. |
| class ClientSecret { |
| public: |
| // Move constructor |
| ClientSecret(ClientSecret&& other) { bytes_ = std::move(other.bytes_); } |
| |
| // Copy constructor |
| ClientSecret(const ClientSecret& other) { bytes_ = other.bytes_; } |
| |
| bool operator==(const ClientSecret& other) const { |
| if (!valid() || !other.valid()) { |
| return false; |
| } |
| return bytes_ == other.bytes_; |
| } |
| |
| bool operator!=(const ClientSecret& other) const { |
| return !operator==(other); |
| } |
| |
| // Returns a ClientSecret with freshly generated bytes. |
| static ClientSecret GenerateNewSecret(); |
| |
| // Returns a ClientSecret with bytes decoded from |token|. If token is not |
| // valid then the returned ClientSecret will have valid() == false. |
| static ClientSecret FromToken(const std::string& token); |
| |
| // Is this ClientSecret valid? An invalid ClientSecret may occur when an |
| // invalid token is passed to FromToken(), or after a move occurs. |
| bool valid() const { return !bytes_.empty(); } |
| |
| // Returns a token that may be used to reconstitute this ClientSecret |
| // using the FromToken() function. Returns the empty string if this |
| // ClientSecret is not valid. |
| // |
| // This method is not thread safe. |
| std::string GetToken(); |
| |
| const byte* data() const { return bytes_.data(); } |
| |
| static const size_t kNumSecretBytes = 16; |
| |
| // For internal testing use only. Does not take ownership of |rand|. |
| // Uses |rand| to generate the new secret. |
| static ClientSecret GenerateNewSecret(crypto::Random* rand); |
| |
| private: |
| // Private default constructor |
| ClientSecret() {} |
| std::vector<byte> bytes_; |
| }; |
| |
| } // namespace encoder |
| } // namespace cobalt |
| |
| #endif // COBALT_ENCODER_CLIENT_SECRET_H_ |