blob: 41ad0a23a8ab43be7cf0d8ca52cddb440d5befca [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 Thompson27e02cd2013-08-01 16:56:05 -070010#if 0
Jeff Thompson40d67ce2013-07-15 17:33:01 -070011#include <boost/date_time/posix_time/posix_time_types.hpp>
12#include <boost/date_time/posix_time/time_serialize.hpp>
13#include <boost/date_time/gregorian/gregorian.hpp>
Jeff Thompson27e02cd2013-08-01 16:56:05 -070014#endif
Jeff Thompson56ec9e22013-08-02 11:34:07 -070015#include <ndn-cpp/data.hpp>
Jeff Thompsonb81192e2013-08-09 09:34:51 -070016#include <ndn-cpp/key-chain.hpp>
Jeff Thompson5cae5e52013-07-10 19:41:20 -070017
18using namespace std;
19using namespace ndn;
Jeff Thompson27e02cd2013-08-01 16:56:05 -070020#if 0
Jeff Thompson40d67ce2013-07-15 17:33:01 -070021using namespace boost::posix_time;
22using namespace boost::gregorian;
Jeff Thompson27e02cd2013-08-01 16:56:05 -070023#endif
Jeff Thompson5cae5e52013-07-10 19:41:20 -070024
Jeff Thompson56ec9e22013-08-02 11:34:07 -070025unsigned char Data1[] = {
260x04, 0x82, // NDN Data
Jeff Thompson5cae5e52013-07-10 19:41:20 -070027 0x02, 0xaa, // Signature
28 0x03, 0xb2, // SignatureBits
29 0x08, 0x85, 0x20, 0xea, 0xb5, 0xb0, 0x63, 0xda, 0x94, 0xe9, 0x68, 0x7a,
30 0x8e, 0x65, 0x60, 0xe0, 0xc6, 0x43, 0x96, 0xd9, 0x69, 0xb4, 0x40, 0x72, 0x52, 0x00, 0x2c, 0x8e, 0x2a, 0xf5,
31 0x47, 0x12, 0x59, 0x93, 0xda, 0xed, 0x82, 0xd0, 0xf8, 0xe6, 0x65, 0x09, 0x87, 0x84, 0x54, 0xc7, 0xce, 0x9a,
32 0x93, 0x0d, 0x47, 0xf1, 0xf9, 0x3b, 0x98, 0x78, 0x2c, 0x22, 0x21, 0xd9, 0x2b, 0xda, 0x03, 0x30, 0x84, 0xf3,
33 0xc5, 0x52, 0x64, 0x2b, 0x1d, 0xde, 0x50, 0xe0, 0xee, 0xca, 0xa2, 0x73, 0x7a, 0x93, 0x30, 0xa8, 0x47, 0x7f,
34 0x6f, 0x41, 0xb0, 0xc8, 0x6e, 0x89, 0x1c, 0xcc, 0xf9, 0x01, 0x44, 0xc3, 0x08, 0xcf, 0x77, 0x47, 0xfc, 0xed,
35 0x48, 0xf0, 0x4c, 0xe9, 0xc2, 0x3b, 0x7d, 0xef, 0x6e, 0xa4, 0x80, 0x40, 0x9e, 0x43, 0xb6, 0x77, 0x7a, 0x1d,
36 0x51, 0xed, 0x98, 0x33, 0x93, 0xdd, 0x88, 0x01, 0x0e, 0xd3,
37 0x00,
38 0x00,
39 0xf2, 0xfa, 0x9d, 0x6e, 0x64, 0x6e, 0x00, 0xfa, 0x9d, 0x61, 0x62, 0x63, 0x00, 0x00, // Name
40 0x01, 0xa2, // SignedInfo
41 0x03, 0xe2, // PublisherPublicKeyDigest
42 0x02, 0x85, 0xb5, 0x50, 0x6b, 0x1a,
43 0xba, 0x3d, 0xa7, 0x76, 0x1b, 0x0f, 0x8d, 0x61, 0xa4, 0xaa, 0x7e, 0x3b, 0x6d, 0x15, 0xb4, 0x26, 0xfe, 0xb5,
44 0xbd, 0xa8, 0x23, 0x89, 0xac, 0xa7, 0x65, 0xa3, 0xb8, 0x1c,
45 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070046 0x02, 0xba, // Timestamp
47 0xb5, 0x05, 0x1d, 0xde, 0xe9, 0x5b, 0xdb,
48 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070049 0x01, 0xe2, // KeyLocator
50 0x01, 0xda, // Key
51 0x0a, 0x95, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
52 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
53 0x81, 0x00, 0xe1, 0x7d, 0x30, 0xa7, 0xd8, 0x28, 0xab, 0x1b, 0x84, 0x0b, 0x17, 0x54, 0x2d, 0xca, 0xf6, 0x20,
54 0x7a, 0xfd, 0x22, 0x1e, 0x08, 0x6b, 0x2a, 0x60, 0xd1, 0x6c, 0xb7, 0xf5, 0x44, 0x48, 0xba, 0x9f, 0x3f, 0x08,
55 0xbc, 0xd0, 0x99, 0xdb, 0x21, 0xdd, 0x16, 0x2a, 0x77, 0x9e, 0x61, 0xaa, 0x89, 0xee, 0xe5, 0x54, 0xd3, 0xa4,
56 0x7d, 0xe2, 0x30, 0xbc, 0x7a, 0xc5, 0x90, 0xd5, 0x24, 0x06, 0x7c, 0x38, 0x98, 0xbb, 0xa6, 0xf5, 0xdc, 0x43,
57 0x60, 0xb8, 0x45, 0xed, 0xa4, 0x8c, 0xbd, 0x9c, 0xf1, 0x26, 0xa7, 0x23, 0x44, 0x5f, 0x0e, 0x19, 0x52, 0xd7,
58 0x32, 0x5a, 0x75, 0xfa, 0xf5, 0x56, 0x14, 0x4f, 0x9a, 0x98, 0xaf, 0x71, 0x86, 0xb0, 0x27, 0x86, 0x85, 0xb8,
59 0xe2, 0xc0, 0x8b, 0xea, 0x87, 0x17, 0x1b, 0x4d, 0xee, 0x58, 0x5c, 0x18, 0x28, 0x29, 0x5b, 0x53, 0x95, 0xeb,
60 0x4a, 0x17, 0x77, 0x9f, 0x02, 0x03, 0x01, 0x00, 0x01,
61 0x00,
62 0x00,
63 0x00,
64 0x01, 0x9a, // Content
65 0xc5, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
66 0x00,
670x00,
681
69};
70
Jeff Thompson27e02cd2013-08-01 16:56:05 -070071#if 0
Jeff Thompson40d67ce2013-07-15 17:33:01 -070072const ptime UNIX_EPOCH_TIME = ptime (date (1970, Jan, 1));
Jeff Thompson27e02cd2013-08-01 16:56:05 -070073#endif
Jeff Thompson40d67ce2013-07-15 17:33:01 -070074
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070075static void dumpData(const Data &data)
76{
77 cout << "name: " << data.getName().to_uri() << endl;
78 if (data.getContent().size() > 0) {
79 cout << "content (raw): ";
80 for (unsigned int i = 0; i < data.getContent().size(); ++i)
81 cout << data.getContent()[i];
82 cout<< endl;
83 cout << "content (hex): " << toHex(data.getContent()) << endl;
84 }
85 else
86 cout << "content: <empty>" << endl;
87
88 cout << "signature.digestAlgorithm: "
89 << (data.getSignature().getDigestAlgorithm().size() > 0 ? toHex(data.getSignature().getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
90 cout << "signature.witness: "
91 << (data.getSignature().getWitness().size() > 0 ? toHex(data.getSignature().getWitness()).c_str() : "<none>") << endl;
Jeff Thompson535751b2013-08-08 17:29:12 -070092 cout << "signature.signature: "
93 << (data.getSignature().getSignature().size() > 0 ? toHex(data.getSignature().getSignature()).c_str() : "<none>") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070094
95 cout << "signedInfo.publisherPublicKeyDigest: "
96 << (data.getSignedInfo().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest().size() > 0 ?
97 toHex(data.getSignedInfo().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -070098 cout << "signedInfo.timestamp: ";
Jeff Thompsonade5b1e2013-08-09 12:16:45 -070099 if (data.getSignedInfo().getTimestampMilliseconds() >= 0) {
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700100 cout << data.getSignedInfo().getTimestampMilliseconds() << " milliseconds" << endl;
101 // TODO: dump timestamp real date.
Jeff Thompsonade5b1e2013-08-09 12:16:45 -0700102#if 0
103 ptime timestamp = UNIX_EPOCH_TIME + milliseconds(data.getSignedInfo().getTimestampMilliseconds());
104 cout << "Data timestamp " << timestamp.date().year() << "/" << timestamp.date().month() << "/" << timestamp.date().day()
105 << " " << timestamp.time_of_day().hours() << ":" << timestamp.time_of_day().minutes() << ":" << timestamp.time_of_day().seconds() << endl;
106#endif
107 }
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700108 else
109 cout << "<none>" << endl;
Jeff Thompsondebd8ee2013-08-16 19:44:58 -0700110 if (!(data.getSignedInfo().getType() < 0 || data.getSignedInfo().getType() == ndn_ContentType_DATA)) {
111 cout << "signedInfo.type: ";
112 if (data.getSignedInfo().getType() == ndn_ContentType_ENCR)
113 cout << "ENCR" << endl;
114 else if (data.getSignedInfo().getType() == ndn_ContentType_GONE)
115 cout << "GONE" << endl;
116 else if (data.getSignedInfo().getType() == ndn_ContentType_KEY)
117 cout << "KEY" << endl;
118 else if (data.getSignedInfo().getType() == ndn_ContentType_LINK)
119 cout << "LINK" << endl;
120 else if (data.getSignedInfo().getType() == ndn_ContentType_NACK)
121 cout << "NACK" << endl;
122 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700123 cout << "signedInfo.freshnessSeconds: ";
124 if (data.getSignedInfo().getFreshnessSeconds() >= 0)
125 cout << data.getSignedInfo().getFreshnessSeconds() << endl;
126 else
127 cout << "<none>" << endl;
128 cout << "signedInfo.finalBlockID: "
129 << (data.getSignedInfo().getFinalBlockID().size() > 0 ?
130 toHex(data.getSignedInfo().getFinalBlockID()).c_str() : "<none>") << endl;
131 cout << "signedInfo.keyLocator: ";
132 if (data.getSignedInfo().getKeyLocator().getType() >= 0) {
133 if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
Jeff Thompson63d02692013-08-16 12:09:07 -0700134 cout << "Key: " << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700135 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
Jeff Thompson63d02692013-08-16 12:09:07 -0700136 cout << "Certificate: " << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson7329a132013-08-16 15:57:37 -0700137 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
138 cout << "KeyName: " << data.getSignedInfo().getKeyLocator().getKeyName().to_uri() << endl;
139 cout << "signedInfo.keyLocator: ";
140 bool showKeyNameData = true;
141 if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
142 cout << "PublisherPublicKeyDigest: ";
143 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
144 cout << "PublisherCertificateDigest: ";
145 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
146 cout << "PublisherIssuerKeyDigest: ";
147 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
148 cout << "PublisherIssuerCertificateDigest: ";
149 else {
150 cout << "<unrecognized ndn_KeyNameType " << data.getSignedInfo().getKeyLocator().getKeyNameType() << ">" << endl;
151 showKeyNameData = false;
152 }
153 if (showKeyNameData)
154 cout << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
155 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700156 else
157 cout << "<unrecognized ndn_KeyLocatorType " << data.getSignedInfo().getKeyLocator().getType() << ">" << endl;
158 }
159 else
160 cout << "<none>" << endl;
161}
162
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700163int main(int argc, char** argv)
164{
165 try {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700166 Data data;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700167 data.wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700168 cout << "Decoded Data:" << endl;
169 dumpData(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700170 cout << "Decoded Data signature verification: " << (KeyChain::selfVerifyData(Data1, sizeof(Data1)) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700171
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700172 ptr_lib::shared_ptr<vector<unsigned char> > encoding = data.wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700173
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700174 Data reDecodedData;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700175 reDecodedData.wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700176 cout << endl << "Re-decoded Data:" << endl;
177 dumpData(reDecodedData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700178 cout << "Re-decoded Data signature verification: " << (KeyChain::selfVerifyData(&encoding->front(), encoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700179
180 Data freshData(Name("/ndn/abc"));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700181 const unsigned char freshContent[] = "SUCCESS!";
182 freshData.setContent(freshContent, sizeof(freshContent) - 1);
Jeff Thompsonade5b1e2013-08-09 12:16:45 -0700183 freshData.getSignedInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700184
185 KeyChain::defaultSign(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700186 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700187 dumpData(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700188 ptr_lib::shared_ptr<vector<unsigned char> > freshEncoding = freshData.wireEncode();
189 cout << "Freshly-signed Data signature verification: " << (KeyChain::selfVerifyData(&freshEncoding->front(), freshEncoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700190 } catch (exception &e) {
191 cout << "exception: " << e.what() << endl;
192 }
193 return 0;
194}