blob: 0b4aa26695bb47c0d7ddf0102da4c02495ec99cd [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 Thompson61c4ecf2013-08-08 15:56:46 -070062static void dumpData(const Data &data)
63{
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;
74
75 cout << "signature.digestAlgorithm: "
76 << (data.getSignature().getDigestAlgorithm().size() > 0 ? toHex(data.getSignature().getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
77 cout << "signature.witness: "
78 << (data.getSignature().getWitness().size() > 0 ? toHex(data.getSignature().getWitness()).c_str() : "<none>") << endl;
Jeff Thompson535751b2013-08-08 17:29:12 -070079 cout << "signature.signature: "
80 << (data.getSignature().getSignature().size() > 0 ? toHex(data.getSignature().getSignature()).c_str() : "<none>") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070081
82 cout << "signedInfo.publisherPublicKeyDigest: "
83 << (data.getSignedInfo().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest().size() > 0 ?
84 toHex(data.getSignedInfo().getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -070085 cout << "signedInfo.timestamp: ";
Jeff Thompsonade5b1e2013-08-09 12:16:45 -070086 if (data.getSignedInfo().getTimestampMilliseconds() >= 0) {
Jeff Thompson0d2dc3e2013-08-19 17:10:53 -070087 time_t seconds = data.getSignedInfo().getTimestampMilliseconds() / 1000.0;
88 cout << data.getSignedInfo().getTimestampMilliseconds() << " milliseconds, UTC time: " << asctime(gmtime(&seconds));
Jeff Thompsonade5b1e2013-08-09 12:16:45 -070089 }
Jeff Thompsonb81192e2013-08-09 09:34:51 -070090 else
91 cout << "<none>" << endl;
Jeff Thompsondebd8ee2013-08-16 19:44:58 -070092 if (!(data.getSignedInfo().getType() < 0 || data.getSignedInfo().getType() == ndn_ContentType_DATA)) {
93 cout << "signedInfo.type: ";
94 if (data.getSignedInfo().getType() == ndn_ContentType_ENCR)
95 cout << "ENCR" << endl;
96 else if (data.getSignedInfo().getType() == ndn_ContentType_GONE)
97 cout << "GONE" << endl;
98 else if (data.getSignedInfo().getType() == ndn_ContentType_KEY)
99 cout << "KEY" << endl;
100 else if (data.getSignedInfo().getType() == ndn_ContentType_LINK)
101 cout << "LINK" << endl;
102 else if (data.getSignedInfo().getType() == ndn_ContentType_NACK)
103 cout << "NACK" << endl;
104 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700105 cout << "signedInfo.freshnessSeconds: ";
106 if (data.getSignedInfo().getFreshnessSeconds() >= 0)
107 cout << data.getSignedInfo().getFreshnessSeconds() << endl;
108 else
109 cout << "<none>" << endl;
110 cout << "signedInfo.finalBlockID: "
111 << (data.getSignedInfo().getFinalBlockID().size() > 0 ?
112 toHex(data.getSignedInfo().getFinalBlockID()).c_str() : "<none>") << endl;
113 cout << "signedInfo.keyLocator: ";
Jeff Thompson1cf72e92013-08-23 20:38:39 -0700114 if ((int)data.getSignedInfo().getKeyLocator().getType() >= 0) {
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700115 if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
Jeff Thompson63d02692013-08-16 12:09:07 -0700116 cout << "Key: " << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700117 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
Jeff Thompson63d02692013-08-16 12:09:07 -0700118 cout << "Certificate: " << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson7329a132013-08-16 15:57:37 -0700119 else if (data.getSignedInfo().getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
120 cout << "KeyName: " << data.getSignedInfo().getKeyLocator().getKeyName().to_uri() << endl;
121 cout << "signedInfo.keyLocator: ";
Jeff Thompson1cf72e92013-08-23 20:38:39 -0700122 if ((int)data.getSignedInfo().getKeyLocator().getKeyNameType() >= 0) {
123 bool showKeyNameData = true;
124 if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
125 cout << "PublisherPublicKeyDigest: ";
126 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
127 cout << "PublisherCertificateDigest: ";
128 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
129 cout << "PublisherIssuerKeyDigest: ";
130 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
131 cout << "PublisherIssuerCertificateDigest: ";
132 else {
133 cout << "<unrecognized ndn_KeyNameType " << data.getSignedInfo().getKeyLocator().getKeyNameType() << ">" << endl;
134 showKeyNameData = false;
135 }
136 if (showKeyNameData)
137 cout << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
Jeff Thompson7329a132013-08-16 15:57:37 -0700138 }
Jeff Thompson1cf72e92013-08-23 20:38:39 -0700139 else
140 cout << "<no key digest>" << endl;
Jeff Thompson7329a132013-08-16 15:57:37 -0700141 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700142 else
143 cout << "<unrecognized ndn_KeyLocatorType " << data.getSignedInfo().getKeyLocator().getType() << ">" << endl;
144 }
145 else
146 cout << "<none>" << endl;
147}
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 Thompsonade5b1e2013-08-09 12:16:45 -0700169 freshData.getSignedInfo().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 Thompson5cae5e52013-07-10 19:41:20 -0700176 } catch (exception &e) {
177 cout << "exception: " << e.what() << endl;
178 }
179 return 0;
180}