xref: /aosp_15_r20/external/libchrome/crypto/symmetric_key.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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