blob: ff54aa96fffb4351dc1317f1415fa58a06a1815d [file] [log] [blame]
Jeff Thompson47c93cf2013-08-09 00:38:48 -07001/**
Jeff Thompson7687dc02013-09-13 11:54:07 -07002 * Copyright (C) 2013 Regents of the University of California.
3 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
Jeff Thompson47c93cf2013-08-09 00:38:48 -07004 * See COPYING for copyright and distribution information.
5 */
6
7#ifndef NDN_KEY_CHAIN_HPP
Jeff Thompson2d27e2f2013-08-09 12:55:00 -07008#define NDN_KEY_CHAIN_HPP
Jeff Thompson47c93cf2013-08-09 00:38:48 -07009
Jeff Thompson7a67cb62013-08-26 11:43:18 -070010#include "../data.hpp"
Jeff Thompson2ce8f492013-09-17 18:01:25 -070011#include "../face.hpp"
12#include "identity/identity-manager.hpp"
Jeff Thompson47c93cf2013-08-09 00:38:48 -070013
14namespace ndn {
15
Jeff Thompson29ce3102013-09-27 11:47:48 -070016class PolicyManager;
17
Jeff Thompson2ce8f492013-09-17 18:01:25 -070018/**
19 * An OnVerified function object is used to pass a callback to verifyData to report a successful verification.
20 */
21typedef func_lib::function<void(const ptr_lib::shared_ptr<Data>& data)> OnVerified;
22
23/**
24 * An OnVerifyFailed function object is used to pass a callback to verifyData to report a failed verification.
25 */
Jeff Thompson29ce3102013-09-27 11:47:48 -070026typedef func_lib::function<void(const ptr_lib::shared_ptr<Data>& data)> OnVerifyFailed;
Jeff Thompson2ce8f492013-09-17 18:01:25 -070027
Jeff Thompsonffa36f92013-09-20 08:42:41 -070028/**
29 * Keychain is main class of security library.
30 *
31 * The Keychain class provides a set of interfaces to the security library such as identity management, policy configuration
32 * and packet signing and verification.
33 */
Jeff Thompson47c93cf2013-08-09 00:38:48 -070034class KeyChain {
35public:
Jeff Thompson29ce3102013-09-27 11:47:48 -070036 KeyChain
37 (const ptr_lib::shared_ptr<IdentityManager>& identityManager, const ptr_lib::shared_ptr<PolicyManager>& policyManager);
Jeff Thompson2ce8f492013-09-17 18:01:25 -070038
Jeff Thompson47c93cf2013-08-09 00:38:48 -070039 /**
Jeff Thompson2ce8f492013-09-17 18:01:25 -070040 * Wire encode the Data object, sign it and set its signature.
Jeff Thompsonade5b1e2013-08-09 12:16:45 -070041 * Note: the caller must make sure the timestamp is correct, for example with
Jeff Thompsonfec716d2013-09-11 13:54:36 -070042 * data.getMetaInfo().setTimestampMilliseconds(time(NULL) * 1000.0).
Jeff Thompson2ce8f492013-09-17 18:01:25 -070043 * @param data The Data object to be signed. This updates its signature and key locator field and wireEncoding.
Jeff Thompson9296f0c2013-09-23 18:10:27 -070044 * @param certificateName The certificate name of the key to use for signing. If omitted, infer the signing identity from the data packet name.
Jeff Thompson8d24fe12013-09-18 15:54:51 -070045 * @param wireFormat A WireFormat object used to encode the input. If omitted, use WireFormat getDefaultWireFormat().
Jeff Thompson3c73da42013-08-12 11:19:05 -070046 */
Jeff Thompson2ce8f492013-09-17 18:01:25 -070047 void
Jeff Thompson29ce3102013-09-27 11:47:48 -070048 sign(Data& data, const Name& certificateName, WireFormat& wireFormat = *WireFormat::getDefaultWireFormat());
49
50 /**
51 * Wire encode the Data object, sign it and set its signature.
52 * Note: the caller must make sure the timestamp is correct, for example with
53 * data.getMetaInfo().setTimestampMilliseconds(time(NULL) * 1000.0).
54 * @param data The Data object to be signed. This updates its signature and key locator field and wireEncoding.
55 * @param identityName The identity name for the key to use for signing. If omitted, infer the signing identity from the data packet name.
56 * @param wireFormat A WireFormat object used to encode the input. If omitted, use WireFormat getDefaultWireFormat().
57 */
58 void
59 signByIdentity(Data& data, const Name& identityName = Name(), WireFormat& wireFormat = *WireFormat::getDefaultWireFormat());
Jeff Thompson3c73da42013-08-12 11:19:05 -070060
61 /**
Jeff Thompson2ce8f492013-09-17 18:01:25 -070062 * Check the signature on the Data object and call either onVerify or onVerifyFailed.
63 * We use callback functions because verify may fetch information to check the signature.
Jeff Thompson29ce3102013-09-27 11:47:48 -070064 * @param data The Data object with the signature to check. It is an error if data does not have a wireEncoding.
65 * To set the wireEncoding, you can call data.wireDecode.
66 * @param onVerified If the signature is verified, this calls onVerified(data).
67 * @param onVerifyFailed If the signature check fails, this calls onVerifyFailed(data).
Jeff Thompson8efe5ad2013-08-20 17:36:38 -070068 */
Jeff Thompson2ce8f492013-09-17 18:01:25 -070069 void
Jeff Thompson7c5d2312013-09-25 16:07:15 -070070 verifyData
71 (const ptr_lib::shared_ptr<Data>& data, const OnVerified& onVerified, const OnVerifyFailed& onVerifyFailed, int stepCount = 0);
Jeff Thompson8efe5ad2013-08-20 17:36:38 -070072
73 /**
Jeff Thompson2ce8f492013-09-17 18:01:25 -070074 * Set the Face which will be used to fetch required certificates.
75 * @param face A pointer to the Face object.
Jeff Thompson1e90d8c2013-08-12 16:09:25 -070076 */
Jeff Thompson2ce8f492013-09-17 18:01:25 -070077 void
78 setFace(Face* face) { face_ = face; }
79
80private:
Jeff Thompson40f361a2013-09-25 13:12:48 -070081 ptr_lib::shared_ptr<IdentityManager> identityManager_;
Jeff Thompson29ce3102013-09-27 11:47:48 -070082 ptr_lib::shared_ptr<PolicyManager> policyManager_;
Jeff Thompson2ce8f492013-09-17 18:01:25 -070083 Face* face_;
84 const int maxSteps_;
Jeff Thompson47c93cf2013-08-09 00:38:48 -070085};
86
87}
88
89#endif