blob: 0b80c0b99bfa37a7f9b2bf50033553fdf259558d [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;
17
Jeff Thompson56ec9e22013-08-02 11:34:07 -070018unsigned char Data1[] = {
190x04, 0x82, // NDN Data
Jeff Thompson5cae5e52013-07-10 19:41:20 -070020 0x02, 0xaa, // Signature
21 0x03, 0xb2, // SignatureBits
22 0x08, 0x85, 0x20, 0xea, 0xb5, 0xb0, 0x63, 0xda, 0x94, 0xe9, 0x68, 0x7a,
23 0x8e, 0x65, 0x60, 0xe0, 0xc6, 0x43, 0x96, 0xd9, 0x69, 0xb4, 0x40, 0x72, 0x52, 0x00, 0x2c, 0x8e, 0x2a, 0xf5,
24 0x47, 0x12, 0x59, 0x93, 0xda, 0xed, 0x82, 0xd0, 0xf8, 0xe6, 0x65, 0x09, 0x87, 0x84, 0x54, 0xc7, 0xce, 0x9a,
25 0x93, 0x0d, 0x47, 0xf1, 0xf9, 0x3b, 0x98, 0x78, 0x2c, 0x22, 0x21, 0xd9, 0x2b, 0xda, 0x03, 0x30, 0x84, 0xf3,
26 0xc5, 0x52, 0x64, 0x2b, 0x1d, 0xde, 0x50, 0xe0, 0xee, 0xca, 0xa2, 0x73, 0x7a, 0x93, 0x30, 0xa8, 0x47, 0x7f,
27 0x6f, 0x41, 0xb0, 0xc8, 0x6e, 0x89, 0x1c, 0xcc, 0xf9, 0x01, 0x44, 0xc3, 0x08, 0xcf, 0x77, 0x47, 0xfc, 0xed,
28 0x48, 0xf0, 0x4c, 0xe9, 0xc2, 0x3b, 0x7d, 0xef, 0x6e, 0xa4, 0x80, 0x40, 0x9e, 0x43, 0xb6, 0x77, 0x7a, 0x1d,
29 0x51, 0xed, 0x98, 0x33, 0x93, 0xdd, 0x88, 0x01, 0x0e, 0xd3,
30 0x00,
31 0x00,
32 0xf2, 0xfa, 0x9d, 0x6e, 0x64, 0x6e, 0x00, 0xfa, 0x9d, 0x61, 0x62, 0x63, 0x00, 0x00, // Name
33 0x01, 0xa2, // SignedInfo
34 0x03, 0xe2, // PublisherPublicKeyDigest
35 0x02, 0x85, 0xb5, 0x50, 0x6b, 0x1a,
36 0xba, 0x3d, 0xa7, 0x76, 0x1b, 0x0f, 0x8d, 0x61, 0xa4, 0xaa, 0x7e, 0x3b, 0x6d, 0x15, 0xb4, 0x26, 0xfe, 0xb5,
37 0xbd, 0xa8, 0x23, 0x89, 0xac, 0xa7, 0x65, 0xa3, 0xb8, 0x1c,
38 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070039 0x02, 0xba, // Timestamp
40 0xb5, 0x05, 0x1d, 0xde, 0xe9, 0x5b, 0xdb,
41 0x00,
Jeff Thompson5cae5e52013-07-10 19:41:20 -070042 0x01, 0xe2, // KeyLocator
43 0x01, 0xda, // Key
44 0x0a, 0x95, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
45 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
46 0x81, 0x00, 0xe1, 0x7d, 0x30, 0xa7, 0xd8, 0x28, 0xab, 0x1b, 0x84, 0x0b, 0x17, 0x54, 0x2d, 0xca, 0xf6, 0x20,
47 0x7a, 0xfd, 0x22, 0x1e, 0x08, 0x6b, 0x2a, 0x60, 0xd1, 0x6c, 0xb7, 0xf5, 0x44, 0x48, 0xba, 0x9f, 0x3f, 0x08,
48 0xbc, 0xd0, 0x99, 0xdb, 0x21, 0xdd, 0x16, 0x2a, 0x77, 0x9e, 0x61, 0xaa, 0x89, 0xee, 0xe5, 0x54, 0xd3, 0xa4,
49 0x7d, 0xe2, 0x30, 0xbc, 0x7a, 0xc5, 0x90, 0xd5, 0x24, 0x06, 0x7c, 0x38, 0x98, 0xbb, 0xa6, 0xf5, 0xdc, 0x43,
50 0x60, 0xb8, 0x45, 0xed, 0xa4, 0x8c, 0xbd, 0x9c, 0xf1, 0x26, 0xa7, 0x23, 0x44, 0x5f, 0x0e, 0x19, 0x52, 0xd7,
51 0x32, 0x5a, 0x75, 0xfa, 0xf5, 0x56, 0x14, 0x4f, 0x9a, 0x98, 0xaf, 0x71, 0x86, 0xb0, 0x27, 0x86, 0x85, 0xb8,
52 0xe2, 0xc0, 0x8b, 0xea, 0x87, 0x17, 0x1b, 0x4d, 0xee, 0x58, 0x5c, 0x18, 0x28, 0x29, 0x5b, 0x53, 0x95, 0xeb,
53 0x4a, 0x17, 0x77, 0x9f, 0x02, 0x03, 0x01, 0x00, 0x01,
54 0x00,
55 0x00,
56 0x00,
57 0x01, 0x9a, // Content
58 0xc5, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
59 0x00,
600x00,
611
62};
63
Jeff Thompson1656e6a2013-08-29 18:01:48 -070064static void dumpData(const Data& data)
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070065{
66 cout << "name: " << data.getName().to_uri() << endl;
67 if (data.getContent().size() > 0) {
68 cout << "content (raw): ";
69 for (unsigned int i = 0; i < data.getContent().size(); ++i)
Jeff Thompson18db5a52013-09-12 13:24:43 -070070 cout << (*data.getContent())[i];
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070071 cout<< endl;
Jeff Thompson18db5a52013-09-12 13:24:43 -070072 cout << "content (hex): " << toHex(*data.getContent()) << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -070073 }
74 else
75 cout << "content: <empty>" << endl;
Jeff Thompsonfec716d2013-09-11 13:54:36 -070076
Jeff Thompsonfec716d2013-09-11 13:54:36 -070077 cout << "metaInfo.timestamp: ";
78 if (data.getMetaInfo().getTimestampMilliseconds() >= 0) {
79 time_t seconds = data.getMetaInfo().getTimestampMilliseconds() / 1000.0;
80 cout << data.getMetaInfo().getTimestampMilliseconds() << " milliseconds, UTC time: " << asctime(gmtime(&seconds));
81 }
82 else
83 cout << "<none>" << endl;
84 if (!(data.getMetaInfo().getType() < 0 || data.getMetaInfo().getType() == ndn_ContentType_DATA)) {
85 cout << "metaInfo.type: ";
86 if (data.getMetaInfo().getType() == ndn_ContentType_ENCR)
87 cout << "ENCR" << endl;
88 else if (data.getMetaInfo().getType() == ndn_ContentType_GONE)
89 cout << "GONE" << endl;
90 else if (data.getMetaInfo().getType() == ndn_ContentType_KEY)
91 cout << "KEY" << endl;
92 else if (data.getMetaInfo().getType() == ndn_ContentType_LINK)
93 cout << "LINK" << endl;
94 else if (data.getMetaInfo().getType() == ndn_ContentType_NACK)
95 cout << "NACK" << endl;
96 }
97 cout << "metaInfo.freshnessSeconds: ";
98 if (data.getMetaInfo().getFreshnessSeconds() >= 0)
99 cout << data.getMetaInfo().getFreshnessSeconds() << endl;
100 else
101 cout << "<none>" << endl;
102 cout << "metaInfo.finalBlockID: "
Jeff Thompson85db6d72013-09-12 12:41:18 -0700103 << (data.getMetaInfo().getFinalBlockID().getValue().size() > 0 ?
104 toHex(*data.getMetaInfo().getFinalBlockID().getValue()).c_str() : "<none>") << endl;
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700105
Jeff Thompson20af0732013-09-12 17:01:45 -0700106 const Sha256WithRsaSignature *signature = dynamic_cast<const Sha256WithRsaSignature*>(data.getSignature());
107 if (signature) {
108 cout << "signature.digestAlgorithm: "
109 << (signature->getDigestAlgorithm().size() > 0 ? toHex(*signature->getDigestAlgorithm()).c_str() : "default (sha-256)") << endl;
110 cout << "signature.witness: "
111 << (signature->getWitness().size() > 0 ? toHex(*signature->getWitness()).c_str() : "<none>") << endl;
112 cout << "signature.signature: "
113 << (signature->getSignature().size() > 0 ? toHex(*signature->getSignature()).c_str() : "<none>") << endl;
114 cout << "signature.publisherPublicKeyDigest: "
115 << (signature->getPublisherPublicKeyDigest().getPublisherPublicKeyDigest().size() > 0 ?
116 toHex(*signature->getPublisherPublicKeyDigest().getPublisherPublicKeyDigest()).c_str() : "<none>") << endl;
117 cout << "signature.keyLocator: ";
118 if ((int)signature->getKeyLocator().getType() >= 0) {
119 if (signature->getKeyLocator().getType() == ndn_KeyLocatorType_KEY)
120 cout << "Key: " << toHex(*signature->getKeyLocator().getKeyData()) << endl;
121 else if (signature->getKeyLocator().getType() == ndn_KeyLocatorType_CERTIFICATE)
122 cout << "Certificate: " << toHex(*signature->getKeyLocator().getKeyData()) << endl;
123 else if (signature->getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) {
124 cout << "KeyName: " << signature->getKeyLocator().getKeyName().to_uri() << endl;
125 cout << "metaInfo.keyLocator: ";
126 if ((int)signature->getKeyLocator().getKeyNameType() >= 0) {
127 bool showKeyNameData = true;
128 if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST)
129 cout << "PublisherPublicKeyDigest: ";
130 else if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST)
131 cout << "PublisherCertificateDigest: ";
132 else if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST)
133 cout << "PublisherIssuerKeyDigest: ";
134 else if (signature->getKeyLocator().getKeyNameType() == ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST)
135 cout << "PublisherIssuerCertificateDigest: ";
136 else {
137 cout << "<unrecognized ndn_KeyNameType " << signature->getKeyLocator().getKeyNameType() << ">" << endl;
138 showKeyNameData = false;
139 }
140 if (showKeyNameData)
141 cout << toHex(*signature->getKeyLocator().getKeyData()) << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700142 }
Jeff Thompson20af0732013-09-12 17:01:45 -0700143 else
144 cout << "<no key digest>" << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700145 }
146 else
Jeff Thompson20af0732013-09-12 17:01:45 -0700147 cout << "<unrecognized ndn_KeyLocatorType " << signature->getKeyLocator().getType() << ">" << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700148 }
149 else
Jeff Thompson20af0732013-09-12 17:01:45 -0700150 cout << "<none>" << endl;
Jeff Thompsonf4585af2013-09-11 14:56:59 -0700151 }
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700152}
153
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700154int main(int argc, char** argv)
155{
156 try {
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700157 Data data;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700158 data.wireDecode(Data1, sizeof(Data1));
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700159 cout << "Decoded Data:" << endl;
160 dumpData(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700161 cout << "Decoded Data signature verification: " << (KeyChain::selfVerifyData(Data1, sizeof(Data1)) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700162
Jeff Thompsonc2b7b142013-09-12 15:29:04 -0700163 Blob encoding = data.wireEncode();
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700164
Jeff Thompson56ec9e22013-08-02 11:34:07 -0700165 Data reDecodedData;
Jeff Thompson67e9e0a2013-08-02 19:16:19 -0700166 reDecodedData.wireDecode(*encoding);
Jeff Thompson61c4ecf2013-08-08 15:56:46 -0700167 cout << endl << "Re-decoded Data:" << endl;
168 dumpData(reDecodedData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700169 cout << "Re-decoded Data signature verification: " << (KeyChain::selfVerifyData(&encoding->front(), encoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700170
171 Data freshData(Name("/ndn/abc"));
Jeff Thompsonecc1a822013-08-09 10:53:48 -0700172 const unsigned char freshContent[] = "SUCCESS!";
173 freshData.setContent(freshContent, sizeof(freshContent) - 1);
Jeff Thompsonfec716d2013-09-11 13:54:36 -0700174 freshData.getMetaInfo().setTimestampMilliseconds(time(NULL) * 1000.0);
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700175
176 KeyChain::defaultSign(freshData);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700177 cout << endl << "Freshly-signed Data:" << endl;
Jeff Thompsonb81192e2013-08-09 09:34:51 -0700178 dumpData(freshData);
Jeff Thompsonc2b7b142013-09-12 15:29:04 -0700179 Blob freshEncoding = freshData.wireEncode();
Jeff Thompson1e90d8c2013-08-12 16:09:25 -0700180 cout << "Freshly-signed Data signature verification: " << (KeyChain::selfVerifyData(&freshEncoding->front(), freshEncoding->size()) ? "VERIFIED" : "FAILED") << endl;
Jeff Thompson1656e6a2013-08-29 18:01:48 -0700181 } catch (exception& e) {
Jeff Thompson5cae5e52013-07-10 19:41:20 -0700182 cout << "exception: " << e.what() << endl;
183 }
184 return 0;
185}