blob: 5d67f0f8bce7b359d97eb76111a62fdd4b42574a [file] [log] [blame]
Jeff Thompson5cae5e52013-07-10 19:41:20 -07001/**
2 * @author: Jeff Thompson
3 * See COPYING for copyright and distribution information.
4 */
5
Jeff Thompson56ec9e22013-08-02 11:34:07 -07006#ifndef NDN_DATA_HPP
Jeff Thompsona0d18c92013-08-06 13:55:32 -07007#define NDN_DATA_HPP
Jeff Thompson5cae5e52013-07-10 19:41:20 -07008
Jeff Thompson46bd45f2013-08-08 16:46:41 -07009#include "common.hpp"
Jeff Thompson53412192013-08-06 13:35:50 -070010#include "name.hpp"
11#include "publisher-public-key-digest.hpp"
12#include "key.hpp"
Jeff Thompson56ec9e22013-08-02 11:34:07 -070013#include "c/data.h"
Jeff Thompson5cae5e52013-07-10 19:41:20 -070014
15namespace ndn {
16
Jeff Thompsonf4585af2013-09-11 14:56:59 -070017/**
18 * A Signature holds the signature bits and other info representing the signature in a data packet.
19 */
Jeff Thompson5cae5e52013-07-10 19:41:20 -070020class Signature {
21public:
22 /**
23 * Set the signatureStruct to point to the values in this signature object, without copying any memory.
24 * WARNING: The resulting pointers in signatureStruct are invalid after a further use of this object which could reallocate memory.
25 * @param signatureStruct a C ndn_Signature struct where the name components array is already allocated.
26 */
Jeff Thompson1656e6a2013-08-29 18:01:48 -070027 void get(struct ndn_Signature& signatureStruct) const;
Jeff Thompson5cae5e52013-07-10 19:41:20 -070028
29 /**
30 * Clear this signature, and set the values by copying from the ndn_Signature struct.
31 * @param signatureStruct a C ndn_Signature struct
32 */
Jeff Thompson1656e6a2013-08-29 18:01:48 -070033 void set(const struct ndn_Signature& signatureStruct);
Jeff Thompson5cae5e52013-07-10 19:41:20 -070034
Jeff Thompson1656e6a2013-08-29 18:01:48 -070035 const std::vector<unsigned char>& getDigestAlgorithm() const { return digestAlgorithm_; }
36 std::vector<unsigned char>& getDigestAlgorithm() { return digestAlgorithm_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -070037
Jeff Thompson1656e6a2013-08-29 18:01:48 -070038 const std::vector<unsigned char>& getWitness() const { return witness_; }
39 std::vector<unsigned char>& getWitness() { return witness_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -070040
Jeff Thompson1656e6a2013-08-29 18:01:48 -070041 const std::vector<unsigned char>& getSignature() const { return signature_; }
42 std::vector<unsigned char>& getSignature() { return signature_; }
Jeff Thompsonf4585af2013-09-11 14:56:59 -070043
44 const PublisherPublicKeyDigest& getPublisherPublicKeyDigest() const { return publisherPublicKeyDigest_; }
45 PublisherPublicKeyDigest& getPublisherPublicKeyDigest() { return publisherPublicKeyDigest_; }
46
47 const KeyLocator& getKeyLocator() const { return keyLocator_; }
48 KeyLocator& getKeyLocator() { return keyLocator_; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -070049
Jeff Thompson1656e6a2013-08-29 18:01:48 -070050 void setDigestAlgorithm(const std::vector<unsigned char>& digestAlgorithm) { digestAlgorithm_ = digestAlgorithm; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -070051 void setDigestAlgorithm(const unsigned char *digestAlgorithm, unsigned int digestAlgorithmLength)
52 {
53 setVector(digestAlgorithm_, digestAlgorithm, digestAlgorithmLength);
54 }
55
Jeff Thompson1656e6a2013-08-29 18:01:48 -070056 void setWitness(const std::vector<unsigned char>& witness) { witness_ = witness; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -070057 void setWitness(const unsigned char *witness, unsigned int witnessLength)
58 {
59 setVector(witness_, witness, witnessLength);
60 }
61
Jeff Thompson1656e6a2013-08-29 18:01:48 -070062 void setSignature(const std::vector<unsigned char>& signature) { signature_ = signature; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -070063 void setSignature(const unsigned char *signature, unsigned int signatureLength)
64 {
65 setVector(signature_, signature, signatureLength);
66 }
Jeff Thompsonf4585af2013-09-11 14:56:59 -070067
68 void setPublisherPublicKeyDigest(const PublisherPublicKeyDigest& publisherPublicKeyDigest) { publisherPublicKeyDigest_ = publisherPublicKeyDigest; }
69
70 void setKeyLocator(const KeyLocator& keyLocator) { keyLocator_ = keyLocator; }
Jeff Thompsonf842d212013-08-12 11:05:28 -070071
72 /**
Jeff Thompsonf4585af2013-09-11 14:56:59 -070073 * Clear all the fields.
Jeff Thompsonf842d212013-08-12 11:05:28 -070074 */
75 void clear()
76 {
77 digestAlgorithm_.clear();
78 witness_.clear();
79 signature_.clear();
Jeff Thompsonf4585af2013-09-11 14:56:59 -070080 publisherPublicKeyDigest_.clear();
81 keyLocator_.clear();
Jeff Thompsonf842d212013-08-12 11:05:28 -070082 }
Jeff Thompson46bd45f2013-08-08 16:46:41 -070083
Jeff Thompson5cae5e52013-07-10 19:41:20 -070084private:
85 std::vector<unsigned char> digestAlgorithm_; /**< if empty, the default is 2.16.840.1.101.3.4.2.1 (sha-256) */
86 std::vector<unsigned char> witness_;
87 std::vector<unsigned char> signature_;
Jeff Thompsonf4585af2013-09-11 14:56:59 -070088 PublisherPublicKeyDigest publisherPublicKeyDigest_;
89 KeyLocator keyLocator_;
Jeff Thompson5cae5e52013-07-10 19:41:20 -070090};
91
Jeff Thompsonf4585af2013-09-11 14:56:59 -070092/**
93 * An MetaInfo holds the meta info which is signed inside the data packet.
94 */
Jeff Thompsonfec716d2013-09-11 13:54:36 -070095class MetaInfo {
Jeff Thompson5cae5e52013-07-10 19:41:20 -070096public:
Jeff Thompsonfec716d2013-09-11 13:54:36 -070097 MetaInfo()
Jeff Thompson5cae5e52013-07-10 19:41:20 -070098 {
99 type_ = ndn_ContentType_DATA;
100 freshnessSeconds_ = -1;
101 }
102
103 /**
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700104 * Set the metaInfoStruct to point to the values in this meta info object, without copying any memory.
105 * WARNING: The resulting pointers in metaInfoStruct are invalid after a further use of this object which could reallocate memory.
106 * @param metaInfoStruct a C ndn_MetaInfo struct where the name components array is already allocated.
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700107 */
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700108 void get(struct ndn_MetaInfo& metaInfoStruct) const;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700109
110 /**
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700111 * Clear this meta info, and set the values by copying from the ndn_MetaInfo struct.
112 * @param metaInfoStruct a C ndn_MetaInfo struct
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700113 */
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700114 void set(const struct ndn_MetaInfo& metaInfoStruct);
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700115
Jeff Thompson210b92f2013-07-11 15:16:03 -0700116 double getTimestampMilliseconds() const { return timestampMilliseconds_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700117
Jeff Thompsond8776352013-08-16 18:09:30 -0700118 ndn_ContentType getType() const { return type_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700119
120 int getFreshnessSeconds() const { return freshnessSeconds_; }
121
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700122 const std::vector<unsigned char>& getFinalBlockID() const { return finalBlockID_; }
123 std::vector<unsigned char>& getFinalBlockID() { return finalBlockID_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700124
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700125 void setTimestampMilliseconds(double timestampMilliseconds) { timestampMilliseconds_ = timestampMilliseconds; }
126
Jeff Thompsond8776352013-08-16 18:09:30 -0700127 void setType(ndn_ContentType type) { type_ = type; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700128
129 void setFreshnessSeconds(int freshnessSeconds) { freshnessSeconds_ = freshnessSeconds; }
130
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700131 void setFinalBlockID(const std::vector<unsigned char>& finalBlockID) { finalBlockID_ = finalBlockID; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700132 void setFinalBlockID(const unsigned char *finalBlockID, unsigned int finalBlockIdLength)
133 {
134 setVector(finalBlockID_, finalBlockID, finalBlockIdLength);
135 }
136
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700137private:
Jeff Thompson210b92f2013-07-11 15:16:03 -0700138 double timestampMilliseconds_; /**< milliseconds since 1/1/1970. -1 for none */
Jeff Thompsond8776352013-08-16 18:09:30 -0700139 ndn_ContentType type_; /**< default is ndn_ContentType_DATA. -1 for none */
Jeff Thompson210b92f2013-07-11 15:16:03 -0700140 int freshnessSeconds_; /**< -1 for none */
141 std::vector<unsigned char> finalBlockID_; /** size 0 for none */
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700142};
143
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700144class Data {
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700145public:
Jeff Thompsonf5dbd272013-08-08 16:49:55 -0700146 Data()
147 {
148 }
149
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700150 Data(const Name& name)
Jeff Thompsonf5dbd272013-08-08 16:49:55 -0700151 : name_(name)
152 {
153 }
154
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700155 ptr_lib::shared_ptr<std::vector<unsigned char> > wireEncode(WireFormat& wireFormat) const
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700156 {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700157 return wireFormat.encodeData(*this);
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700158 }
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700159 ptr_lib::shared_ptr<std::vector<unsigned char> > wireEncode() const
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700160 {
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700161 return wireEncode(*WireFormat::getDefaultWireFormat());
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700162 }
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700163 void wireDecode(const unsigned char *input, unsigned int inputLength, WireFormat& wireFormat)
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700164 {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700165 wireFormat.decodeData(*this, input, inputLength);
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700166 }
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700167 void wireDecode(const unsigned char *input, unsigned int inputLength)
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700168 {
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700169 wireDecode(input, inputLength, *WireFormat::getDefaultWireFormat());
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700170 }
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700171 void wireDecode(const std::vector<unsigned char>& input, WireFormat& wireFormat)
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700172 {
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700173 wireDecode(&input[0], input.size(), wireFormat);
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700174 }
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700175 void wireDecode(const std::vector<unsigned char>& input)
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700176 {
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700177 wireDecode(&input[0], input.size());
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700178 }
179
180 /**
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700181 * Set the dataStruct to point to the values in this interest, without copying any memory.
182 * WARNING: The resulting pointers in dataStruct are invalid after a further use of this object which could reallocate memory.
183 * @param dataStruct a C ndn_Data struct where the name components array is already allocated.
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700184 */
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700185 void get(struct ndn_Data& dataStruct) const;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700186
187 /**
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700188 * Clear this data object, and set the values by copying from the ndn_Data struct.
189 * @param dataStruct a C ndn_Data struct
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700190 */
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700191 void set(const struct ndn_Data& dataStruct);
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700192
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700193 const Signature& getSignature() const { return signature_; }
194 Signature& getSignature() { return signature_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700195
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700196 const Name& getName() const { return name_; }
197 Name& getName() { return name_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700198
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700199 const MetaInfo& getMetaInfo() const { return metaInfo_; }
200 MetaInfo& getMetaInfo() { return metaInfo_; }
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700201
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700202 const std::vector<unsigned char>& getContent() const { return content_; }
203 std::vector<unsigned char>& getContent() { return content_; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700204
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700205 void setSignature(const Signature& signature) { signature_ = signature; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700206
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700207 void setName(const Name& name) { name_ = name; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700208
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700209 void setMetainfo(const MetaInfo& metaInfo) { metaInfo_ = metaInfo; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700210
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700211 void setContent(const std::vector<unsigned char>& content) { content_ = content; }
Jeff Thompson46bd45f2013-08-08 16:46:41 -0700212 void setContent(const unsigned char *content, unsigned int contentLength)
213 {
214 setVector(content_, content, contentLength);
215 }
Jeff Thompsonac1b0ac2013-08-08 20:09:39 -0700216
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700217private:
218 Signature signature_;
219 Name name_;
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700220 MetaInfo metaInfo_;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700221 std::vector<unsigned char> content_;
222};
223
224}
225
226#endif