blob: b24246b181ba87b3498aa5b6d0ffb0e1e497f0ac [file] [log] [blame]
Jeff Thompson6c314bc2013-09-23 18:09:38 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
3 * Copyright (C) 2013 Regents of the University of California.
4 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
5 * See COPYING for copyright and distribution information.
6 */
7
Yingdi Yu87581582014-01-14 14:28:39 -08008#ifndef NDN_SEC_TPM_MEMORY_HPP
9#define NDN_SEC_TPM_MEMORY_HPP
Jeff Thompson6c314bc2013-09-23 18:09:38 -070010
Alexander Afanasyeve2dcdfd2014-02-07 15:53:28 -080011#include "../common.hpp"
Yingdi Yu87581582014-01-14 14:28:39 -080012#include "sec-tpm.hpp"
Jeff Thompson6c314bc2013-09-23 18:09:38 -070013
14struct rsa_st;
15
16namespace ndn {
17
18/**
19 * MemoryPrivateKeyStorage extends PrivateKeyStorage to implement a simple in-memory private key store. You should
20 * initialize by calling setKeyPairForKeyName.
21 */
Yingdi Yu87581582014-01-14 14:28:39 -080022class SecTpmMemory : public SecTpm {
Jeff Thompson6c314bc2013-09-23 18:09:38 -070023public:
Yingdi Yu87581582014-01-14 14:28:39 -080024 struct Error : public SecTpm::Error { Error(const std::string &what) : SecTpm::Error(what) {} };
Alexander Afanasyeve64788e2014-01-05 22:38:21 -080025
Jeff Thompson6c314bc2013-09-23 18:09:38 -070026 /**
27 * The virtual destructor
28 */
29 virtual
Yingdi Yu87581582014-01-14 14:28:39 -080030 ~SecTpmMemory();
Jeff Thompson6c314bc2013-09-23 18:09:38 -070031
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080032 /******************************
33 * From TrustedPlatformModule *
34 ******************************/
35
Jeff Thompson6c314bc2013-09-23 18:09:38 -070036 virtual void
Yingdi Yu87581582014-01-14 14:28:39 -080037 generateKeyPairInTpm(const Name& keyName, KeyType keyType, int keySize);
Jeff Thompson6c314bc2013-09-23 18:09:38 -070038
39 /**
40 * Get the public key
41 * @param keyName The name of public key.
42 * @return The public key.
43 */
44 virtual ptr_lib::shared_ptr<PublicKey>
Yingdi Yu87581582014-01-14 14:28:39 -080045 getPublicKeyFromTpm(const Name& keyName);
Yingdi Yu28fd32f2014-01-28 19:03:03 -080046
47 /**
48 * Delete a key pair of asymmetric keys.
49 * @param keyName The name of the key pair.
50 */
51 virtual void
52 deleteKeyPairInTpm(const Name &keyName);
Jeff Thompson6c314bc2013-09-23 18:09:38 -070053
54 /**
55 * Fetch the private key for keyName and sign the data, returning a signature Blob.
56 * @param data Pointer to the input byte array.
57 * @param dataLength The length of data.
58 * @param keyName The name of the signing key.
59 * @param digestAlgorithm the digest algorithm.
60 * @return The signature, or a null pointer if signing fails.
61 */
Alexander Afanasyeve64788e2014-01-05 22:38:21 -080062 virtual Block
Yingdi Yub4bb85a2014-01-16 10:11:04 -080063 signInTpm(const uint8_t *data, size_t dataLength, const Name& keyName, DigestAlgorithm digestAlgorithm);
Alexander Afanasyeve64788e2014-01-05 22:38:21 -080064
Jeff Thompson6c314bc2013-09-23 18:09:38 -070065 /**
66 * Decrypt data.
67 * @param keyName The name of the decrypting key.
68 * @param data The byte to be decrypted.
69 * @param dataLength the length of data.
70 * @param isSymmetric If true symmetric encryption is used, otherwise asymmetric decryption is used.
71 * @return The decrypted data.
72 */
Alexander Afanasyeve64788e2014-01-05 22:38:21 -080073 virtual ConstBufferPtr
Yingdi Yub4bb85a2014-01-16 10:11:04 -080074 decryptInTpm(const Name& keyName, const uint8_t* data, size_t dataLength, bool isSymmetric);
Jeff Thompson6c314bc2013-09-23 18:09:38 -070075
76 /**
77 * Encrypt data.
78 * @param keyName The name of the encrypting key.
79 * @param data The byte to be encrypted.
80 * @param dataLength the length of data.
81 * @param isSymmetric If true symmetric encryption is used, otherwise asymmetric decryption is used.
82 * @return The encrypted data.
83 */
Alexander Afanasyeve64788e2014-01-05 22:38:21 -080084 virtual ConstBufferPtr
Yingdi Yub4bb85a2014-01-16 10:11:04 -080085 encryptInTpm(const Name& keyName, const uint8_t* data, size_t dataLength, bool isSymmetric);
Jeff Thompson6c314bc2013-09-23 18:09:38 -070086
87 /**
88 * @brief Generate a symmetric key.
89 * @param keyName The name of the key.
90 * @param keyType The type of the key, e.g. KEY_TYPE_AES.
91 * @param keySize The size of the key.
92 */
93 virtual void
Yingdi Yub4bb85a2014-01-16 10:11:04 -080094 generateSymmetricKeyInTpm(const Name& keyName, KeyType keyType, int keySize);
Jeff Thompson6c314bc2013-09-23 18:09:38 -070095
Yingdi Yu4b752752014-02-18 12:24:03 -080096 virtual bool
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080097 doesKeyExistInTpm(const Name& keyName, KeyClass keyClass);
98
99 virtual bool
Yingdi Yu4b752752014-02-18 12:24:03 -0800100 generateRandomBlock(uint8_t* res, size_t size);
101
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800102 /******************************
103 * SecTpmMemory specific *
104 ******************************/
105
Jeff Thompson6c314bc2013-09-23 18:09:38 -0700106 /**
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800107 * @brief Set the public and private key for the keyName.
108 *
109 * @param keyName The key name.
110 * @param publicKeyDer The public key DER byte array.
111 * @param publicKeyDerLength The length of publicKeyDer.
112 * @param privateKeyDer The private key DER byte array.
113 * @param privateKeyDerLength The length of privateKeyDer.
Jeff Thompson6c314bc2013-09-23 18:09:38 -0700114 */
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800115 void setKeyPairForKeyName(const Name& keyName,
116 uint8_t *publicKeyDer, size_t publicKeyDerLength,
117 uint8_t *privateKeyDer, size_t privateKeyDerLength);
118
119protected:
120 /******************************
121 * From TrustedPlatformModule *
122 ******************************/
123 virtual ConstBufferPtr
124 exportPrivateKeyPkcs1FromTpm(const Name& keyName);
125
Jeff Thompson6c314bc2013-09-23 18:09:38 -0700126 virtual bool
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800127 importPrivateKeyPkcs1IntoTpm(const Name& keyName, const uint8_t* buf, size_t size);
128
129 virtual bool
130 importPublicKeyPkcs1IntoTpm(const Name& keyName, const uint8_t* buf, size_t size);
131
Jeff Thompson6c314bc2013-09-23 18:09:38 -0700132
133private:
Alexander Afanasyeve64788e2014-01-05 22:38:21 -0800134 class RsaPrivateKey;
135
136 typedef std::map<std::string, ptr_lib::shared_ptr<PublicKey> > PublicKeyStore;
137 typedef std::map<std::string, ptr_lib::shared_ptr<RsaPrivateKey> > PrivateKeyStore;
138
139 PublicKeyStore publicKeyStore_; /**< The map key is the keyName.toUri() */
140 PrivateKeyStore privateKeyStore_; /**< The map key is the keyName.toUri() */
Jeff Thompson6c314bc2013-09-23 18:09:38 -0700141};
142
143}
144
145#endif