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