blob: 176353c2a7d9be18a962f683cb27e210cfd4216b [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 Thompson61c4ecf2013-08-08 15:56:46 -0700110 cout << "signedInfo.freshnessSeconds: ";
111 if (data.getSignedInfo().getFreshnessSeconds() >= 0)
112 cout << data.getSignedInfo().getFreshnessSeconds() << endl;
113 else
114 cout << "<none>" << endl;
115 cout << "signedInfo.finalBlockID: "
116 << (data.getSignedInfo().getFinalBlockID().size() > 0 ?
117 toHex(data.getSignedInfo().getFinalBlockID()).c_str() : "<none>") << endl;
118 cout << "signedInfo.keyLocator: ";
119 if (data.getSignedInfo().getKeyLocator().getType() >= 0) {
120 if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
Jeff Thompson535751b2013-08-08 17:29:12 -0700121 cout << "Key: " << toHex(data.getSignedInfo().getKeyLocator().getKeyOrCertificate()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700122 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
Jeff Thompson535751b2013-08-08 17:29:12 -0700123 cout << "Certificate: " << toHex(data.getSignedInfo().getKeyLocator().getKeyOrCertificate()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700124 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME)
125 // TODO: Implement keyName.
126 cout << "keyName" << endl;
127 else
128 cout << "<unrecognized ndn_KeyLocatorType " << data.getSignedInfo().getKeyLocator().getType() << ">" << endl;
129 }
130 else
131 cout << "<none>" << endl;
132}
133
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700134int main(int argc, char** argv)
135{
136 try {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700137 Data data;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700138 data.wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700139 cout << "Decoded Data:" << endl;
140 dumpData(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700141 cout << "Decoded Data signature verification: " << (KeyChain::selfVerifyData(Data1, sizeof(Data1)) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700142
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700143 ptr_lib::shared_ptr<vector<unsigned char> > encoding = data.wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700144
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700145 Data reDecodedData;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700146 reDecodedData.wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700147 cout << endl << "Re-decoded Data:" << endl;
148 dumpData(reDecodedData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700149 cout << "Re-decoded Data signature verification: " << (KeyChain::selfVerifyData(&encoding->front(), encoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700150
151 Data freshData(Name("/ndn/abc"));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700152 const unsigned char freshContent[] = "SUCCESS!";
153 freshData.setContent(freshContent, sizeof(freshContent) - 1);
Jeff Thompsonade5b1e2013-08-09 12:16:45 -0700154 freshData.getSignedInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700155
156 KeyChain::defaultSign(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700157 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700158 dumpData(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700159 ptr_lib::shared_ptr<vector<unsigned char> > freshEncoding = freshData.wireEncode();
160 cout << "Freshly-signed Data signature verification: " << (KeyChain::selfVerifyData(&freshEncoding->front(), freshEncoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700161 } catch (exception &e) {
162 cout << "exception: " << e.what() << endl;
163 }
164 return 0;
165}