blob: a88bde0f1f8444c73e1ccdd8244a6f1884768543 [file] [log] [blame]
Jeff Thompson5cae5e52013-07-10 19:41:20 -07001/**
Jeff Thompson7687dc02013-09-13 11:54:07 -07002 * Copyright (C) 2013 Regents of the University of California.
3 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
Jeff Thompson5cae5e52013-07-10 19:41:20 -07004 * See COPYING for copyright and distribution information.
5 */
6
7#include <cstdlib>
8#include <sstream>
9#include <iostream>
Jeff Thompsonade5b1e2013-08-09 12:16:45 -070010#include <time.h>
Jeff Thompson17882b42013-08-23 16:23:22 -070011#include "../ndn-cpp/data.hpp"
Jeff Thompson7a67cb62013-08-26 11:43:18 -070012#include "../ndn-cpp/security/key-chain.hpp"
Jeff Thompson20af0732013-09-12 17:01:45 -070013#include "../ndn-cpp/sha256-with-rsa-signature.hpp"
Jeff Thompson5cae5e52013-07-10 19:41:20 -070014
15using namespace std;
16using namespace ndn;
Jeff Thompson51755b32013-09-18 16:46:56 -070017using namespace ptr_lib;
Jeff Thompsondb008cc2013-09-17 16:35:07 -070018using namespace func_lib;
19#if HAVE_STD_FUNCTION
20// In the std library, the placeholders are in a different namespace than boost.
21using namespace func_lib::placeholders;
22#endif
Jeff Thompson5cae5e52013-07-10 19:41:20 -070023
Jeff Thompson56ec9e22013-08-02 11:34:07 -070024unsigned char Data1[] = {
250x04, 0x82, // NDN Data
Jeff Thompson5cae5e52013-07-10 19:41:20 -070026 0x02, 0xaa, // Signature
27 0x03, 0xb2, // SignatureBits
28 0x08, 0x85, 0x20, 0xea, 0xb5, 0xb0, 0x63, 0xda, 0x94, 0xe9, 0x68, 0x7a,
29 0x8e, 0x65, 0x60, 0xe0, 0xc6, 0x43, 0x96, 0xd9, 0x69, 0xb4, 0x40, 0x72, 0x52, 0x00, 0x2c, 0x8e, 0x2a, 0xf5,
30 0x47, 0x12, 0x59, 0x93, 0xda, 0xed, 0x82, 0xd0, 0xf8, 0xe6, 0x65, 0x09, 0x87, 0x84, 0x54, 0xc7, 0xce, 0x9a,
31 0x93, 0x0d, 0x47, 0xf1, 0xf9, 0x3b, 0x98, 0x78, 0x2c, 0x22, 0x21, 0xd9, 0x2b, 0xda, 0x03, 0x30, 0x84, 0xf3,
32 0xc5, 0x52, 0x64, 0x2b, 0x1d, 0xde, 0x50, 0xe0, 0xee, 0xca, 0xa2, 0x73, 0x7a, 0x93, 0x30, 0xa8, 0x47, 0x7f,
33 0x6f, 0x41, 0xb0, 0xc8, 0x6e, 0x89, 0x1c, 0xcc, 0xf9, 0x01, 0x44, 0xc3, 0x08, 0xcf, 0x77, 0x47, 0xfc, 0xed,
34 0x48, 0xf0, 0x4c, 0xe9, 0xc2, 0x3b, 0x7d, 0xef, 0x6e, 0xa4, 0x80, 0x40, 0x9e, 0x43, 0xb6, 0x77, 0x7a, 0x1d,
35 0x51, 0xed, 0x98, 0x33, 0x93, 0xdd, 0x88, 0x01, 0x0e, 0xd3,
36 0x00,
37 0x00,
38 0xf2, 0xfa, 0x9d, 0x6e, 0x64, 0x6e, 0x00, 0xfa, 0x9d, 0x61, 0x62, 0x63, 0x00, 0x00, // Name
39 0x01, 0xa2, // SignedInfo
40 0x03, 0xe2, // PublisherPublicKeyDigest
41 0x02, 0x85, 0xb5, 0x50, 0x6b, 0x1a,
42 0xba, 0x3d, 0xa7, 0x76, 0x1b, 0x0f, 0x8d, 0x61, 0xa4, 0xaa, 0x7e, 0x3b, 0x6d, 0x15, 0xb4, 0x26, 0xfe, 0xb5,
43 0xbd, 0xa8, 0x23, 0x89, 0xac, 0xa7, 0x65, 0xa3, 0xb8, 0x1c,
44 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070045 0x02, 0xba, // Timestamp
46 0xb5, 0x05, 0x1d, 0xde, 0xe9, 0x5b, 0xdb,
47 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070048 0x01, 0xe2, // KeyLocator
49 0x01, 0xda, // Key
50 0x0a, 0x95, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
51 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
52 0x81, 0x00, 0xe1, 0x7d, 0x30, 0xa7, 0xd8, 0x28, 0xab, 0x1b, 0x84, 0x0b, 0x17, 0x54, 0x2d, 0xca, 0xf6, 0x20,
53 0x7a, 0xfd, 0x22, 0x1e, 0x08, 0x6b, 0x2a, 0x60, 0xd1, 0x6c, 0xb7, 0xf5, 0x44, 0x48, 0xba, 0x9f, 0x3f, 0x08,
54 0xbc, 0xd0, 0x99, 0xdb, 0x21, 0xdd, 0x16, 0x2a, 0x77, 0x9e, 0x61, 0xaa, 0x89, 0xee, 0xe5, 0x54, 0xd3, 0xa4,
55 0x7d, 0xe2, 0x30, 0xbc, 0x7a, 0xc5, 0x90, 0xd5, 0x24, 0x06, 0x7c, 0x38, 0x98, 0xbb, 0xa6, 0xf5, 0xdc, 0x43,
56 0x60, 0xb8, 0x45, 0xed, 0xa4, 0x8c, 0xbd, 0x9c, 0xf1, 0x26, 0xa7, 0x23, 0x44, 0x5f, 0x0e, 0x19, 0x52, 0xd7,
57 0x32, 0x5a, 0x75, 0xfa, 0xf5, 0x56, 0x14, 0x4f, 0x9a, 0x98, 0xaf, 0x71, 0x86, 0xb0, 0x27, 0x86, 0x85, 0xb8,
58 0xe2, 0xc0, 0x8b, 0xea, 0x87, 0x17, 0x1b, 0x4d, 0xee, 0x58, 0x5c, 0x18, 0x28, 0x29, 0x5b, 0x53, 0x95, 0xeb,
59 0x4a, 0x17, 0x77, 0x9f, 0x02, 0x03, 0x01, 0x00, 0x01,
60 0x00,
61 0x00,
62 0x00,
63 0x01, 0x9a, // Content
64 0xc5, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
65 0x00,
660x00,
671
68};
69
Jeff Thompson1656e6a2013-08-29 18:01:48 -070070static void dumpData(const Data& data)
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070071{
72 cout << "name: " << data.getName().to_uri() << endl;
73 if (data.getContent().size() > 0) {
74 cout << "content (raw): ";
75 for (unsigned int i = 0; i < data.getContent().size(); ++i)
Jeff Thompson18db5a52013-09-12 13:24:43 -070076 cout << (*data.getContent())[i];
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070077 cout<< endl;
Jeff Thompson18db5a52013-09-12 13:24:43 -070078 cout << "content (hex): " << toHex(*data.getContent()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070079 }
80 else
81 cout << "content: <empty>" << endl;
Jeff Thompsonfec716d2013-09-11 13:54:36 -070082
Jeff Thompsonfec716d2013-09-11 13:54:36 -070083 cout << "metaInfo.timestamp: ";
84 if (data.getMetaInfo().getTimestampMilliseconds() >= 0) {
85 time_t seconds = data.getMetaInfo().getTimestampMilliseconds() / 1000.0;
86 cout << data.getMetaInfo().getTimestampMilliseconds() << " milliseconds, UTC time: " << asctime(gmtime(&seconds));
87 }
88 else
89 cout << "<none>" << endl;
90 if (!(data.getMetaInfo().getType() < 0 || data.getMetaInfo().getType() == ndn_ContentType_DATA)) {
91 cout << "metaInfo.type: ";
92 if (data.getMetaInfo().getType() == ndn_ContentType_ENCR)
93 cout << "ENCR" << endl;
94 else if (data.getMetaInfo().getType() == ndn_ContentType_GONE)
95 cout << "GONE" << endl;
96 else if (data.getMetaInfo().getType() == ndn_ContentType_KEY)
97 cout << "KEY" << endl;
98 else if (data.getMetaInfo().getType() == ndn_ContentType_LINK)
99 cout << "LINK" << endl;
100 else if (data.getMetaInfo().getType() == ndn_ContentType_NACK)
101 cout << "NACK" << endl;
102 }
103 cout << "metaInfo.freshnessSeconds: ";
104 if (data.getMetaInfo().getFreshnessSeconds() >= 0)
105 cout << data.getMetaInfo().getFreshnessSeconds() << endl;
106 else
107 cout << "<none>" << endl;
108 cout << "metaInfo.finalBlockID: "
Jeff Thompson85db6d72013-09-12 12:41:18 -0700109 << (data.getMetaInfo().getFinalBlockID().getValue().size() > 0 ?
110 toHex(*data.getMetaInfo().getFinalBlockID().getValue()).c_str() : "<none>") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700111
Jeff Thompson20af0732013-09-12 17:01:45 -0700112 const Sha256WithRsaSignature *signature = dynamic_cast<const Sha256WithRsaSignature*>(data.getSignature());
113 if (signature) {
114 cout << "signature.digestAlgorithm: "
115 << (signature->getDigestAlgorithm().size() > 0 ? toHex(*signature->getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
116 cout << "signature.witness: "
117 << (signature->getWitness().size() > 0 ? toHex(*signature->getWitness()).c_str() : "<none>") << endl;
118 cout << "signature.signature: "
119 << (signature->getSignature().size() > 0 ? toHex(*signature->getSignature()).c_str() : "<none>") << endl;
120 cout << "signature.publisherPublicKeyDigest: "
121 << (signature->getPublisherPublicKeyDigest().getPublisherPublicKeyDigest().size() > 0 ?
122 toHex(*signature->getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
123 cout << "signature.keyLocator: ";
124 if ((int)signature->getKeyLocator().getType() >= 0) {
125 if (signature->getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
126 cout << "Key: " << toHex(*signature->getKeyLocator().getKeyData()) << endl;
127 else if (signature->getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
128 cout << "Certificate: " << toHex(*signature->getKeyLocator().getKeyData()) << endl;
129 else if (signature->getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
130 cout << "KeyName: " << signature->getKeyLocator().getKeyName().to_uri() << endl;
Jeff Thompsondb008cc2013-09-17 16:35:07 -0700131 cout << "signature.keyLocator: ";
Jeff Thompson20af0732013-09-12 17:01:45 -0700132 if ((int)signature->getKeyLocator().getKeyNameType() >= 0) {
133 bool showKeyNameData = true;
134 if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
135 cout << "PublisherPublicKeyDigest: ";
136 else if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
137 cout << "PublisherCertificateDigest: ";
138 else if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
139 cout << "PublisherIssuerKeyDigest: ";
140 else if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
141 cout << "PublisherIssuerCertificateDigest: ";
142 else {
143 cout << "<unrecognized ndn_KeyNameType " << signature->getKeyLocator().getKeyNameType() << ">" << endl;
144 showKeyNameData = false;
145 }
146 if (showKeyNameData)
Jeff Thompsondb008cc2013-09-17 16:35:07 -0700147 cout << (signature->getKeyLocator().getKeyData().size() > 0 ?
148 toHex(*signature->getKeyLocator().getKeyData()).c_str() : "<none>") << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700149 }
Jeff Thompson20af0732013-09-12 17:01:45 -0700150 else
151 cout << "<no key digest>" << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700152 }
153 else
Jeff Thompson20af0732013-09-12 17:01:45 -0700154 cout << "<unrecognized ndn_KeyLocatorType " << signature->getKeyLocator().getType() << ">" << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700155 }
156 else
Jeff Thompson20af0732013-09-12 17:01:45 -0700157 cout << "<none>" << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700158 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700159}
160
Jeff Thompson51755b32013-09-18 16:46:56 -0700161static void onVerified(const char *prefix, const shared_ptr<Data>& data)
Jeff Thompsondb008cc2013-09-17 16:35:07 -0700162{
163 cout << prefix << " signature verification: VERIFIED" << endl;
164}
165
166static void onVerifyFailed(const char *prefix)
167{
168 cout << prefix << " signature verification: FAILED" << endl;
169}
170
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700171int main(int argc, char** argv)
172{
173 try {
Jeff Thompson51755b32013-09-18 16:46:56 -0700174 shared_ptr<Data> data(new Data());
Jeff Thompson707b77d2013-09-17 17:42:49 -0700175 data->wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700176 cout << "Decoded Data:" << endl;
Jeff Thompson707b77d2013-09-17 17:42:49 -0700177 dumpData(*data);
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700178
Jeff Thompson707b77d2013-09-17 17:42:49 -0700179 Blob encoding = data->wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700180
Jeff Thompson51755b32013-09-18 16:46:56 -0700181 shared_ptr<Data> reDecodedData(new Data());
Jeff Thompson707b77d2013-09-17 17:42:49 -0700182 reDecodedData->wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700183 cout << endl << "Re-decoded Data:" << endl;
Jeff Thompson707b77d2013-09-17 17:42:49 -0700184 dumpData(*reDecodedData);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700185
Jeff Thompson51755b32013-09-18 16:46:56 -0700186 shared_ptr<Data> freshData(new Data(Name("/ndn/abc")));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700187 const unsigned char freshContent[] = "SUCCESS!";
Jeff Thompson707b77d2013-09-17 17:42:49 -0700188 freshData->setContent(freshContent, sizeof(freshContent) - 1);
189 freshData->getMetaInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700190
Jeff Thompson51755b32013-09-18 16:46:56 -0700191 shared_ptr<PrivateKeyStorage> privateKeyStorage(new PrivateKeyStorage());
192 shared_ptr<IdentityManager> identityManager(new IdentityManager(privateKeyStorage));
Jeff Thompsondb008cc2013-09-17 16:35:07 -0700193 KeyChain keyChain(identityManager);
194
Jeff Thompson707b77d2013-09-17 17:42:49 -0700195 keyChain.signData(*freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700196 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompson707b77d2013-09-17 17:42:49 -0700197 dumpData(*freshData);
198 Blob freshEncoding = freshData->wireEncode();
Jeff Thompsondb008cc2013-09-17 16:35:07 -0700199
200 // Do verification at the end because it uses callbacks.
201 cout << endl;
202 keyChain.verifyData(data, bind(&onVerified, "Decoded Data", _1), bind(&onVerifyFailed, "Decoded Data"));
203 keyChain.verifyData(reDecodedData, bind(&onVerified, "Re-decoded Data", _1), bind(&onVerifyFailed, "Re-decoded Data"));
204 keyChain.verifyData(freshData, bind(&onVerified, "Freshly-signed Data", _1), bind(&onVerifyFailed, "Freshly-signed Data"));
205 } catch (std::exception& e) {
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700206 cout << "exception: " << e.what() << endl;
207 }
208 return 0;
209}