blob: 149f10e4c71bada561a734bd8b7f5e83348bdc61 [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 Thompson63d02692013-08-16 12:09:07 -0700121 cout << "Key: " << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700122 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
Jeff Thompson63d02692013-08-16 12:09:07 -0700123 cout << "Certificate: " << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson7329a132013-08-16 15:57:37 -0700124 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
125 cout << "KeyName: " << data.getSignedInfo().getKeyLocator().getKeyName().to_uri() << endl;
126 cout << "signedInfo.keyLocator: ";
127 bool showKeyNameData = true;
128 if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
129 cout << "PublisherPublicKeyDigest: ";
130 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
131 cout << "PublisherCertificateDigest: ";
132 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
133 cout << "PublisherIssuerKeyDigest: ";
134 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
135 cout << "PublisherIssuerCertificateDigest: ";
136 else {
137 cout << "<unrecognized ndn_KeyNameType " << data.getSignedInfo().getKeyLocator().getKeyNameType() << ">" << endl;
138 showKeyNameData = false;
139 }
140 if (showKeyNameData)
141 cout << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
142 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700143 else
144 cout << "<unrecognized ndn_KeyLocatorType " << data.getSignedInfo().getKeyLocator().getType() << ">" << endl;
145 }
146 else
147 cout << "<none>" << endl;
148}
149
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700150int main(int argc, char** argv)
151{
152 try {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700153 Data data;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700154 data.wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700155 cout << "Decoded Data:" << endl;
156 dumpData(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700157 cout << "Decoded Data signature verification: " << (KeyChain::selfVerifyData(Data1, sizeof(Data1)) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700158
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700159 ptr_lib::shared_ptr<vector<unsigned char> > encoding = data.wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700160
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700161 Data reDecodedData;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700162 reDecodedData.wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700163 cout << endl << "Re-decoded Data:" << endl;
164 dumpData(reDecodedData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700165 cout << "Re-decoded Data signature verification: " << (KeyChain::selfVerifyData(&encoding->front(), encoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700166
167 Data freshData(Name("/ndn/abc"));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700168 const unsigned char freshContent[] = "SUCCESS!";
169 freshData.setContent(freshContent, sizeof(freshContent) - 1);
Jeff Thompsonade5b1e2013-08-09 12:16:45 -0700170 freshData.getSignedInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700171
172 KeyChain::defaultSign(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700173 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700174 dumpData(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700175 ptr_lib::shared_ptr<vector<unsigned char> > freshEncoding = freshData.wireEncode();
176 cout << "Freshly-signed Data signature verification: " << (KeyChain::selfVerifyData(&freshEncoding->front(), freshEncoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700177 } catch (exception &e) {
178 cout << "exception: " << e.what() << endl;
179 }
180 return 0;
181}