blob: ad10650602fa563f238333b8ac2d7dcdf3d75ddc [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"
11#include "../ndn-cpp/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: ";
114 if (data.getSignedInfo().getKeyLocator().getType() >= 0) {
115 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: ";
122 bool showKeyNameData = true;
123 if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
124 cout << "PublisherPublicKeyDigest: ";
125 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
126 cout << "PublisherCertificateDigest: ";
127 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
128 cout << "PublisherIssuerKeyDigest: ";
129 else if (data.getSignedInfo().getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
130 cout << "PublisherIssuerCertificateDigest: ";
131 else {
132 cout << "<unrecognized ndn_KeyNameType " << data.getSignedInfo().getKeyLocator().getKeyNameType() << ">" << endl;
133 showKeyNameData = false;
134 }
135 if (showKeyNameData)
136 cout << toHex(data.getSignedInfo().getKeyLocator().getKeyData()) << endl;
137 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700138 else
139 cout << "<unrecognized ndn_KeyLocatorType " << data.getSignedInfo().getKeyLocator().getType() << ">" << endl;
140 }
141 else
142 cout << "<none>" << endl;
143}
144
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700145int main(int argc, char** argv)
146{
147 try {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700148 Data data;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700149 data.wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700150 cout << "Decoded Data:" << endl;
151 dumpData(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700152 cout << "Decoded Data signature verification: " << (KeyChain::selfVerifyData(Data1, sizeof(Data1)) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700153
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700154 ptr_lib::shared_ptr<vector<unsigned char> > encoding = data.wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700155
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700156 Data reDecodedData;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700157 reDecodedData.wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700158 cout << endl << "Re-decoded Data:" << endl;
159 dumpData(reDecodedData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700160 cout << "Re-decoded Data signature verification: " << (KeyChain::selfVerifyData(&encoding->front(), encoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700161
162 Data freshData(Name("/ndn/abc"));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700163 const unsigned char freshContent[] = "SUCCESS!";
164 freshData.setContent(freshContent, sizeof(freshContent) - 1);
Jeff Thompsonade5b1e2013-08-09 12:16:45 -0700165 freshData.getSignedInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700166
167 KeyChain::defaultSign(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700168 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700169 dumpData(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700170 ptr_lib::shared_ptr<vector<unsigned char> > freshEncoding = freshData.wireEncode();
171 cout << "Freshly-signed Data signature verification: " << (KeyChain::selfVerifyData(&freshEncoding->front(), freshEncoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700172 } catch (exception &e) {
173 cout << "exception: " << e.what() << endl;
174 }
175 return 0;
176}