blob: 0246477e61f66a27d8203284030b6b9711d9f2ac [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
Jeff Thompsonfec716d2013-09-11 13:54:36 -070075 cout << "metaInfo.timestamp: ";
76 if (data.getMetaInfo().getTimestampMilliseconds() >= 0) {
77 time_t seconds = data.getMetaInfo().getTimestampMilliseconds() / 1000.0;
78 cout << data.getMetaInfo().getTimestampMilliseconds() << " milliseconds, UTC time: " << asctime(gmtime(&seconds));
79 }
80 else
81 cout << "<none>" << endl;
82 if (!(data.getMetaInfo().getType() < 0 || data.getMetaInfo().getType() == ndn_ContentType_DATA)) {
83 cout << "metaInfo.type: ";
84 if (data.getMetaInfo().getType() == ndn_ContentType_ENCR)
85 cout << "ENCR" << endl;
86 else if (data.getMetaInfo().getType() == ndn_ContentType_GONE)
87 cout << "GONE" << endl;
88 else if (data.getMetaInfo().getType() == ndn_ContentType_KEY)
89 cout << "KEY" << endl;
90 else if (data.getMetaInfo().getType() == ndn_ContentType_LINK)
91 cout << "LINK" << endl;
92 else if (data.getMetaInfo().getType() == ndn_ContentType_NACK)
93 cout << "NACK" << endl;
94 }
95 cout << "metaInfo.freshnessSeconds: ";
96 if (data.getMetaInfo().getFreshnessSeconds() >= 0)
97 cout << data.getMetaInfo().getFreshnessSeconds() << endl;
98 else
99 cout << "<none>" << endl;
100 cout << "metaInfo.finalBlockID: "
Jeff Thompson85db6d72013-09-12 12:41:18 -0700101 << (data.getMetaInfo().getFinalBlockID().getValue().size() > 0 ?
102 toHex(*data.getMetaInfo().getFinalBlockID().getValue()).c_str() : "<none>") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700103
104 cout << "signature.digestAlgorithm: "
105 << (data.getSignature().getDigestAlgorithm().size() > 0 ? toHex(data.getSignature().getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
106 cout << "signature.witness: "
107 << (data.getSignature().getWitness().size() > 0 ? toHex(data.getSignature().getWitness()).c_str() : "<none>") << endl;
Jeff Thompson535751b2013-08-08 17:29:12 -0700108 cout << "signature.signature: "
109 << (data.getSignature().getSignature().size() > 0 ? toHex(data.getSignature().getSignature()).c_str() : "<none>") << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700110 cout << "signature.publisherPublicKeyDigest: "
111 << (data.getSignature().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest().size() > 0 ?
112 toHex(data.getSignature().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
113 cout << "signature.keyLocator: ";
114 if ((int)data.getSignature().getKeyLocator().getType() >= 0) {
115 if (data.getSignature().getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
116 cout << "Key: " << toHex(data.getSignature().getKeyLocator().getKeyData()) << endl;
117 else if (data.getSignature().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
118 cout << "Certificate: " << toHex(data.getSignature().getKeyLocator().getKeyData()) << endl;
119 else if (data.getSignature().getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
120 cout << "KeyName: " << data.getSignature().getKeyLocator().getKeyName().to_uri() << endl;
121 cout << "metaInfo.keyLocator: ";
122 if ((int)data.getSignature().getKeyLocator().getKeyNameType() >= 0) {
123 bool showKeyNameData = true;
124 if (data.getSignature().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
125 cout << "PublisherPublicKeyDigest: ";
126 else if (data.getSignature().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
127 cout << "PublisherCertificateDigest: ";
128 else if (data.getSignature().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
129 cout << "PublisherIssuerKeyDigest: ";
130 else if (data.getSignature().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
131 cout << "PublisherIssuerCertificateDigest: ";
132 else {
133 cout << "<unrecognized ndn_KeyNameType " << data.getSignature().getKeyLocator().getKeyNameType() << ">" << endl;
134 showKeyNameData = false;
135 }
136 if (showKeyNameData)
137 cout << toHex(data.getSignature().getKeyLocator().getKeyData()) << endl;
138 }
139 else
140 cout << "<no key digest>" << endl;
141 }
142 else
143 cout << "<unrecognized ndn_KeyLocatorType " << data.getSignature().getKeyLocator().getType() << ">" << endl;
144 }
145 else
146 cout << "<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}