blob: cf9a352bbefce2d21fa7c0172172069ec12fc6eb [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
6#include <cstdlib>
7#include <sstream>
8#include <iostream>
Jeff Thompsonade5b1e2013-08-09 12:16:45 -07009#include <time.h>
Jeff Thompson17882b42013-08-23 16:23:22 -070010#include "../ndn-cpp/data.hpp"
Jeff Thompson7a67cb62013-08-26 11:43:18 -070011#include "../ndn-cpp/security/key-chain.hpp"
Jeff Thompson5cae5e52013-07-10 19:41:20 -070012
13using namespace std;
14using namespace ndn;
15
Jeff Thompson56ec9e22013-08-02 11:34:07 -070016unsigned char Data1[] = {
170x04, 0x82, // NDN Data
Jeff Thompson5cae5e52013-07-10 19:41:20 -070018 0x02, 0xaa, // Signature
19 0x03, 0xb2, // SignatureBits
20 0x08, 0x85, 0x20, 0xea, 0xb5, 0xb0, 0x63, 0xda, 0x94, 0xe9, 0x68, 0x7a,
21 0x8e, 0x65, 0x60, 0xe0, 0xc6, 0x43, 0x96, 0xd9, 0x69, 0xb4, 0x40, 0x72, 0x52, 0x00, 0x2c, 0x8e, 0x2a, 0xf5,
22 0x47, 0x12, 0x59, 0x93, 0xda, 0xed, 0x82, 0xd0, 0xf8, 0xe6, 0x65, 0x09, 0x87, 0x84, 0x54, 0xc7, 0xce, 0x9a,
23 0x93, 0x0d, 0x47, 0xf1, 0xf9, 0x3b, 0x98, 0x78, 0x2c, 0x22, 0x21, 0xd9, 0x2b, 0xda, 0x03, 0x30, 0x84, 0xf3,
24 0xc5, 0x52, 0x64, 0x2b, 0x1d, 0xde, 0x50, 0xe0, 0xee, 0xca, 0xa2, 0x73, 0x7a, 0x93, 0x30, 0xa8, 0x47, 0x7f,
25 0x6f, 0x41, 0xb0, 0xc8, 0x6e, 0x89, 0x1c, 0xcc, 0xf9, 0x01, 0x44, 0xc3, 0x08, 0xcf, 0x77, 0x47, 0xfc, 0xed,
26 0x48, 0xf0, 0x4c, 0xe9, 0xc2, 0x3b, 0x7d, 0xef, 0x6e, 0xa4, 0x80, 0x40, 0x9e, 0x43, 0xb6, 0x77, 0x7a, 0x1d,
27 0x51, 0xed, 0x98, 0x33, 0x93, 0xdd, 0x88, 0x01, 0x0e, 0xd3,
28 0x00,
29 0x00,
30 0xf2, 0xfa, 0x9d, 0x6e, 0x64, 0x6e, 0x00, 0xfa, 0x9d, 0x61, 0x62, 0x63, 0x00, 0x00, // Name
31 0x01, 0xa2, // SignedInfo
32 0x03, 0xe2, // PublisherPublicKeyDigest
33 0x02, 0x85, 0xb5, 0x50, 0x6b, 0x1a,
34 0xba, 0x3d, 0xa7, 0x76, 0x1b, 0x0f, 0x8d, 0x61, 0xa4, 0xaa, 0x7e, 0x3b, 0x6d, 0x15, 0xb4, 0x26, 0xfe, 0xb5,
35 0xbd, 0xa8, 0x23, 0x89, 0xac, 0xa7, 0x65, 0xa3, 0xb8, 0x1c,
36 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070037 0x02, 0xba, // Timestamp
38 0xb5, 0x05, 0x1d, 0xde, 0xe9, 0x5b, 0xdb,
39 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070040 0x01, 0xe2, // KeyLocator
41 0x01, 0xda, // Key
42 0x0a, 0x95, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
43 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
44 0x81, 0x00, 0xe1, 0x7d, 0x30, 0xa7, 0xd8, 0x28, 0xab, 0x1b, 0x84, 0x0b, 0x17, 0x54, 0x2d, 0xca, 0xf6, 0x20,
45 0x7a, 0xfd, 0x22, 0x1e, 0x08, 0x6b, 0x2a, 0x60, 0xd1, 0x6c, 0xb7, 0xf5, 0x44, 0x48, 0xba, 0x9f, 0x3f, 0x08,
46 0xbc, 0xd0, 0x99, 0xdb, 0x21, 0xdd, 0x16, 0x2a, 0x77, 0x9e, 0x61, 0xaa, 0x89, 0xee, 0xe5, 0x54, 0xd3, 0xa4,
47 0x7d, 0xe2, 0x30, 0xbc, 0x7a, 0xc5, 0x90, 0xd5, 0x24, 0x06, 0x7c, 0x38, 0x98, 0xbb, 0xa6, 0xf5, 0xdc, 0x43,
48 0x60, 0xb8, 0x45, 0xed, 0xa4, 0x8c, 0xbd, 0x9c, 0xf1, 0x26, 0xa7, 0x23, 0x44, 0x5f, 0x0e, 0x19, 0x52, 0xd7,
49 0x32, 0x5a, 0x75, 0xfa, 0xf5, 0x56, 0x14, 0x4f, 0x9a, 0x98, 0xaf, 0x71, 0x86, 0xb0, 0x27, 0x86, 0x85, 0xb8,
50 0xe2, 0xc0, 0x8b, 0xea, 0x87, 0x17, 0x1b, 0x4d, 0xee, 0x58, 0x5c, 0x18, 0x28, 0x29, 0x5b, 0x53, 0x95, 0xeb,
51 0x4a, 0x17, 0x77, 0x9f, 0x02, 0x03, 0x01, 0x00, 0x01,
52 0x00,
53 0x00,
54 0x00,
55 0x01, 0x9a, // Content
56 0xc5, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
57 0x00,
580x00,
591
60};
61
Jeff Thompson1656e6a2013-08-29 18:01:48 -070062static void dumpData(const Data& data)
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070063{
64 cout << "name: " << data.getName().to_uri() << endl;
65 if (data.getContent().size() > 0) {
66 cout << "content (raw): ";
67 for (unsigned int i = 0; i < data.getContent().size(); ++i)
68 cout << data.getContent()[i];
69 cout<< endl;
70 cout << "content (hex): " << toHex(data.getContent()) << endl;
71 }
72 else
73 cout << "content: <empty>" << endl;
Jeff Thompsonfec716d2013-09-11 13:54:36 -070074
75 cout << "metaInfo.publisherPublicKeyDigest: "
76 << (data.getMetaInfo().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest().size() > 0 ?
77 toHex(data.getMetaInfo().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
78 cout << "metaInfo.timestamp: ";
79 if (data.getMetaInfo().getTimestampMilliseconds() >= 0) {
80 time_t seconds = data.getMetaInfo().getTimestampMilliseconds() / 1000.0;
81 cout << data.getMetaInfo().getTimestampMilliseconds() << " milliseconds, UTC time: " << asctime(gmtime(&seconds));
82 }
83 else
84 cout << "<none>" << endl;
85 if (!(data.getMetaInfo().getType() < 0 || data.getMetaInfo().getType() == ndn_ContentType_DATA)) {
86 cout << "metaInfo.type: ";
87 if (data.getMetaInfo().getType() == ndn_ContentType_ENCR)
88 cout << "ENCR" << endl;
89 else if (data.getMetaInfo().getType() == ndn_ContentType_GONE)
90 cout << "GONE" << endl;
91 else if (data.getMetaInfo().getType() == ndn_ContentType_KEY)
92 cout << "KEY" << endl;
93 else if (data.getMetaInfo().getType() == ndn_ContentType_LINK)
94 cout << "LINK" << endl;
95 else if (data.getMetaInfo().getType() == ndn_ContentType_NACK)
96 cout << "NACK" << endl;
97 }
98 cout << "metaInfo.freshnessSeconds: ";
99 if (data.getMetaInfo().getFreshnessSeconds() >= 0)
100 cout << data.getMetaInfo().getFreshnessSeconds() << endl;
101 else
102 cout << "<none>" << endl;
103 cout << "metaInfo.finalBlockID: "
104 << (data.getMetaInfo().getFinalBlockID().size() > 0 ?
105 toHex(data.getMetaInfo().getFinalBlockID()).c_str() : "<none>") << endl;
106 cout << "metaInfo.keyLocator: ";
107 if ((int)data.getMetaInfo().getKeyLocator().getType() >= 0) {
108 if (data.getMetaInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
109 cout << "Key: " << toHex(data.getMetaInfo().getKeyLocator().getKeyData()) << endl;
110 else if (data.getMetaInfo().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
111 cout << "Certificate: " << toHex(data.getMetaInfo().getKeyLocator().getKeyData()) << endl;
112 else if (data.getMetaInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
113 cout << "KeyName: " << data.getMetaInfo().getKeyLocator().getKeyName().to_uri() << endl;
114 cout << "metaInfo.keyLocator: ";
115 if ((int)data.getMetaInfo().getKeyLocator().getKeyNameType() >= 0) {
116 bool showKeyNameData = true;
117 if (data.getMetaInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
118 cout << "PublisherPublicKeyDigest: ";
119 else if (data.getMetaInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
120 cout << "PublisherCertificateDigest: ";
121 else if (data.getMetaInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
122 cout << "PublisherIssuerKeyDigest: ";
123 else if (data.getMetaInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
124 cout << "PublisherIssuerCertificateDigest: ";
125 else {
126 cout << "<unrecognized ndn_KeyNameType " << data.getMetaInfo().getKeyLocator().getKeyNameType() << ">" << endl;
127 showKeyNameData = false;
128 }
129 if (showKeyNameData)
130 cout << toHex(data.getMetaInfo().getKeyLocator().getKeyData()) << endl;
131 }
132 else
133 cout << "<no key digest>" << endl;
134 }
135 else
136 cout << "<unrecognized ndn_KeyLocatorType " << data.getMetaInfo().getKeyLocator().getType() << ">" << endl;
137 }
138 else
139 cout << "<none>" << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700140
141 cout << "signature.digestAlgorithm: "
142 << (data.getSignature().getDigestAlgorithm().size() > 0 ? toHex(data.getSignature().getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
143 cout << "signature.witness: "
144 << (data.getSignature().getWitness().size() > 0 ? toHex(data.getSignature().getWitness()).c_str() : "<none>") << endl;
Jeff Thompson535751b2013-08-08 17:29:12 -0700145 cout << "signature.signature: "
146 << (data.getSignature().getSignature().size() > 0 ? toHex(data.getSignature().getSignature()).c_str() : "<none>") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700147}
148
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700149int main(int argc, char** argv)
150{
151 try {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700152 Data data;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700153 data.wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700154 cout << "Decoded Data:" << endl;
155 dumpData(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700156 cout << "Decoded Data signature verification: " << (KeyChain::selfVerifyData(Data1, sizeof(Data1)) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700157
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700158 ptr_lib::shared_ptr<vector<unsigned char> > encoding = data.wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700159
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700160 Data reDecodedData;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700161 reDecodedData.wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700162 cout << endl << "Re-decoded Data:" << endl;
163 dumpData(reDecodedData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700164 cout << "Re-decoded Data signature verification: " << (KeyChain::selfVerifyData(&encoding->front(), encoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700165
166 Data freshData(Name("/ndn/abc"));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700167 const unsigned char freshContent[] = "SUCCESS!";
168 freshData.setContent(freshContent, sizeof(freshContent) - 1);
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700169 freshData.getMetaInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700170
171 KeyChain::defaultSign(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700172 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700173 dumpData(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700174 ptr_lib::shared_ptr<vector<unsigned char> > freshEncoding = freshData.wireEncode();
175 cout << "Freshly-signed Data signature verification: " << (KeyChain::selfVerifyData(&freshEncoding->front(), freshEncoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700176 } catch (exception& e) {
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700177 cout << "exception: " << e.what() << endl;
178 }
179 return 0;
180}