blob: 616b4b0fdc3224f299fde9c8b2f9c6607b928d80 [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)
Jeff Thompson18db5a52013-09-12 13:24:43 -070068 cout << (*data.getContent())[i];
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070069 cout<< endl;
Jeff Thompson18db5a52013-09-12 13:24:43 -070070 cout << "content (hex): " << toHex(*data.getContent()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070071 }
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: "
Jeff Thompson4545d712013-09-12 14:40:12 -0700105 << (data.getSignature().getDigestAlgorithm().size() > 0 ? toHex(*data.getSignature().getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700106 cout << "signature.witness: "
Jeff Thompson4545d712013-09-12 14:40:12 -0700107 << (data.getSignature().getWitness().size() > 0 ? toHex(*data.getSignature().getWitness()).c_str() : "<none>") << endl;
Jeff Thompson535751b2013-08-08 17:29:12 -0700108 cout << "signature.signature: "
Jeff Thompson4545d712013-09-12 14:40:12 -0700109 << (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 ?
Jeff Thompson03616c92013-09-12 14:30:01 -0700112 toHex(*data.getSignature().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700113 cout << "signature.keyLocator: ";
114 if ((int)data.getSignature().getKeyLocator().getType() >= 0) {
115 if (data.getSignature().getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
Jeff Thompson4c9c0452013-09-12 14:10:11 -0700116 cout << "Key: " << toHex(*data.getSignature().getKeyLocator().getKeyData()) << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700117 else if (data.getSignature().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
Jeff Thompson4c9c0452013-09-12 14:10:11 -0700118 cout << "Certificate: " << toHex(*data.getSignature().getKeyLocator().getKeyData()) << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700119 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)
Jeff Thompson4c9c0452013-09-12 14:10:11 -0700137 cout << toHex(*data.getSignature().getKeyLocator().getKeyData()) << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700138 }
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 Thompsonc2b7b142013-09-12 15:29:04 -0700158 Blob 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 Thompsonc2b7b142013-09-12 15:29:04 -0700174 Blob freshEncoding = freshData.wireEncode();
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700175 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}