blob: 9803cdcf2498edab46783cb2072bb454e002bcae [file] [log] [blame]
Daniel Erat59c5f4b2015-08-24 12:50:25 -06001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CRYPTO_SYMMETRIC_KEY_H_
6#define CRYPTO_SYMMETRIC_KEY_H_
7
Alex Vakulenko0d205d72016-01-15 13:02:14 -08008#include <stddef.h>
9
Luis Hector Chavez0c4f26a2016-07-15 16:23:21 -070010#include <memory>
Daniel Erat59c5f4b2015-08-24 12:50:25 -060011#include <string>
12
Alex Vakulenko0d205d72016-01-15 13:02:14 -080013#include "base/macros.h"
14#include "build/build_config.h"
Daniel Erat59c5f4b2015-08-24 12:50:25 -060015#include "crypto/crypto_export.h"
16
Daniel Erat59c5f4b2015-08-24 12:50:25 -060017namespace crypto {
18
19// Wraps a platform-specific symmetric key and allows it to be held in a
20// scoped_ptr.
21class CRYPTO_EXPORT SymmetricKey {
22 public:
23 // Defines the algorithm that a key will be used with. See also
24 // classs Encrptor.
25 enum Algorithm {
26 AES,
27 HMAC_SHA1,
28 };
29
30 virtual ~SymmetricKey();
31
32 // Generates a random key suitable to be used with |algorithm| and of
33 // |key_size_in_bits| bits. |key_size_in_bits| must be a multiple of 8.
34 // The caller is responsible for deleting the returned SymmetricKey.
Luis Hector Chavez0c4f26a2016-07-15 16:23:21 -070035 static std::unique_ptr<SymmetricKey> GenerateRandomKey(
36 Algorithm algorithm,
37 size_t key_size_in_bits);
Daniel Erat59c5f4b2015-08-24 12:50:25 -060038
39 // Derives a key from the supplied password and salt using PBKDF2, suitable
40 // for use with specified |algorithm|. Note |algorithm| is not the algorithm
41 // used to derive the key from the password. |key_size_in_bits| must be a
42 // multiple of 8. The caller is responsible for deleting the returned
43 // SymmetricKey.
Luis Hector Chavez0c4f26a2016-07-15 16:23:21 -070044 static std::unique_ptr<SymmetricKey> DeriveKeyFromPassword(
45 Algorithm algorithm,
46 const std::string& password,
47 const std::string& salt,
48 size_t iterations,
49 size_t key_size_in_bits);
Daniel Erat59c5f4b2015-08-24 12:50:25 -060050
51 // Imports an array of key bytes in |raw_key|. This key may have been
52 // generated by GenerateRandomKey or DeriveKeyFromPassword and exported with
Jakub Pawlowski86aa2252017-04-05 09:22:29 -070053 // key(). The key must be of suitable size for use with |algorithm|.
54 // The caller owns the returned SymmetricKey.
Luis Hector Chavez0c4f26a2016-07-15 16:23:21 -070055 static std::unique_ptr<SymmetricKey> Import(Algorithm algorithm,
56 const std::string& raw_key);
Jay Civelli3a83cdd2017-03-22 17:31:44 -070057
Jakub Pawlowski86aa2252017-04-05 09:22:29 -070058 // Returns the raw platform specific key data.
59 const std::string& key() const { return key_; }
Daniel Erat59c5f4b2015-08-24 12:50:25 -060060
61 private:
Jay Civelli3a83cdd2017-03-22 17:31:44 -070062 SymmetricKey();
Daniel Erat59c5f4b2015-08-24 12:50:25 -060063
Daniel Erat59c5f4b2015-08-24 12:50:25 -060064 std::string key_;
Daniel Erat59c5f4b2015-08-24 12:50:25 -060065
66 DISALLOW_COPY_AND_ASSIGN(SymmetricKey);
67};
68
69} // namespace crypto
70
71#endif // CRYPTO_SYMMETRIC_KEY_H_