1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef CRYPTO_SYMMETRIC_KEY_H_ 6*635a8641SAndroid Build Coastguard Worker #define CRYPTO_SYMMETRIC_KEY_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stddef.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include <memory> 11*635a8641SAndroid Build Coastguard Worker #include <string> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/macros.h" 14*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h" 15*635a8641SAndroid Build Coastguard Worker #include "crypto/crypto_export.h" 16*635a8641SAndroid Build Coastguard Worker 17*635a8641SAndroid Build Coastguard Worker namespace crypto { 18*635a8641SAndroid Build Coastguard Worker 19*635a8641SAndroid Build Coastguard Worker // Wraps a platform-specific symmetric key and allows it to be held in a 20*635a8641SAndroid Build Coastguard Worker // scoped_ptr. 21*635a8641SAndroid Build Coastguard Worker class CRYPTO_EXPORT SymmetricKey { 22*635a8641SAndroid Build Coastguard Worker public: 23*635a8641SAndroid Build Coastguard Worker // Defines the algorithm that a key will be used with. See also 24*635a8641SAndroid Build Coastguard Worker // classs Encrptor. 25*635a8641SAndroid Build Coastguard Worker enum Algorithm { 26*635a8641SAndroid Build Coastguard Worker AES, 27*635a8641SAndroid Build Coastguard Worker HMAC_SHA1, 28*635a8641SAndroid Build Coastguard Worker }; 29*635a8641SAndroid Build Coastguard Worker 30*635a8641SAndroid Build Coastguard Worker virtual ~SymmetricKey(); 31*635a8641SAndroid Build Coastguard Worker 32*635a8641SAndroid Build Coastguard Worker // Generates a random key suitable to be used with |algorithm| and of 33*635a8641SAndroid Build Coastguard Worker // |key_size_in_bits| bits. |key_size_in_bits| must be a multiple of 8. 34*635a8641SAndroid Build Coastguard Worker // The caller is responsible for deleting the returned SymmetricKey. 35*635a8641SAndroid Build Coastguard Worker static std::unique_ptr<SymmetricKey> GenerateRandomKey( 36*635a8641SAndroid Build Coastguard Worker Algorithm algorithm, 37*635a8641SAndroid Build Coastguard Worker size_t key_size_in_bits); 38*635a8641SAndroid Build Coastguard Worker 39*635a8641SAndroid Build Coastguard Worker // Derives a key from the supplied password and salt using PBKDF2, suitable 40*635a8641SAndroid Build Coastguard Worker // for use with specified |algorithm|. Note |algorithm| is not the algorithm 41*635a8641SAndroid Build Coastguard Worker // used to derive the key from the password. |key_size_in_bits| must be a 42*635a8641SAndroid Build Coastguard Worker // multiple of 8. The caller is responsible for deleting the returned 43*635a8641SAndroid Build Coastguard Worker // SymmetricKey. 44*635a8641SAndroid Build Coastguard Worker static std::unique_ptr<SymmetricKey> DeriveKeyFromPassword( 45*635a8641SAndroid Build Coastguard Worker Algorithm algorithm, 46*635a8641SAndroid Build Coastguard Worker const std::string& password, 47*635a8641SAndroid Build Coastguard Worker const std::string& salt, 48*635a8641SAndroid Build Coastguard Worker size_t iterations, 49*635a8641SAndroid Build Coastguard Worker size_t key_size_in_bits); 50*635a8641SAndroid Build Coastguard Worker 51*635a8641SAndroid Build Coastguard Worker // Imports an array of key bytes in |raw_key|. This key may have been 52*635a8641SAndroid Build Coastguard Worker // generated by GenerateRandomKey or DeriveKeyFromPassword and exported with 53*635a8641SAndroid Build Coastguard Worker // key(). The key must be of suitable size for use with |algorithm|. 54*635a8641SAndroid Build Coastguard Worker // The caller owns the returned SymmetricKey. 55*635a8641SAndroid Build Coastguard Worker static std::unique_ptr<SymmetricKey> Import(Algorithm algorithm, 56*635a8641SAndroid Build Coastguard Worker const std::string& raw_key); 57*635a8641SAndroid Build Coastguard Worker 58*635a8641SAndroid Build Coastguard Worker // Returns the raw platform specific key data. key()59*635a8641SAndroid Build Coastguard Worker const std::string& key() const { return key_; } 60*635a8641SAndroid Build Coastguard Worker 61*635a8641SAndroid Build Coastguard Worker private: 62*635a8641SAndroid Build Coastguard Worker SymmetricKey(); 63*635a8641SAndroid Build Coastguard Worker 64*635a8641SAndroid Build Coastguard Worker std::string key_; 65*635a8641SAndroid Build Coastguard Worker 66*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(SymmetricKey); 67*635a8641SAndroid Build Coastguard Worker }; 68*635a8641SAndroid Build Coastguard Worker 69*635a8641SAndroid Build Coastguard Worker } // namespace crypto 70*635a8641SAndroid Build Coastguard Worker 71*635a8641SAndroid Build Coastguard Worker #endif // CRYPTO_SYMMETRIC_KEY_H_ 72