blob: 90010b3f204d297a1952d9639db2fddf7919912c [file] [log] [blame]
Jeff Thompsona5dc3512013-10-17 10:26:19 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
3 * Copyright (C) 2013 Regents of the University of California.
4 * @author: Yingdi Yu <yingdi@cs.ucla.edu>
5 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
6 * See COPYING for copyright and distribution information.
7 */
8
9#include <float.h>
Jeff Thompson415da1e2013-10-17 16:52:59 -070010// We can use ndnboost::iostreams because this is internal and will not conflict with the application if it uses boost::iostreams.
Jeff Thompson2d47db72013-10-17 15:19:52 -070011#include <ndnboost/iostreams/stream.hpp>
12#include <ndnboost/iostreams/device/array.hpp>
Jeff Thompsona5dc3512013-10-17 10:26:19 -070013#include <ndn-cpp/sha256-with-rsa-signature.hpp>
Jeff Thompson415da1e2013-10-17 16:52:59 -070014#include "../../encoding/der/der.hpp"
Jeff Thompsona5dc3512013-10-17 10:26:19 -070015#include "../../encoding/der/visitor/certificate-data-visitor.hpp"
Jeff Thompson415da1e2013-10-17 16:52:59 -070016#if 0
Jeff Thompsona5dc3512013-10-17 10:26:19 -070017#include "../../encoding/der/visitor/print-visitor.hpp"
18#endif
19#include "../../util/logging.hpp"
Jeff Thompson68192a32013-10-17 17:34:17 -070020#include "../../util/blob-stream.hpp"
Jeff Thompsona5dc3512013-10-17 10:26:19 -070021#include "../../c/util/time.h"
22#include <ndn-cpp/security/certificate/certificate.hpp>
23
24INIT_LOGGER("ndn.security.Certificate");
25
26using namespace std;
27using namespace ndn::ptr_lib;
28
29namespace ndn {
30
31Certificate::Certificate()
32 : notBefore_(DBL_MAX)
33 , notAfter_(-DBL_MAX)
34{}
35
36Certificate::Certificate(const Data& data)
37// Use the copy constructor. It clones the signature object.
38: Data(data)
39{
40 // _LOG_DEBUG("Finish local copy: " << getContent().getContent().size());
41
42 decode();
43}
44
45Certificate::~Certificate()
46{
47 //TODO:
48}
49
50bool
51Certificate::isTooEarly()
52{
Jeff Thompson9a8e82f2013-10-17 14:13:43 -070053 MillisecondsSince1970 now = ndn_getNowMilliseconds();
Jeff Thompsona5dc3512013-10-17 10:26:19 -070054 if(now < notBefore_)
55 return true;
56 else
57 return false;
58}
59
60bool
61Certificate::isTooLate()
62{
Jeff Thompson9a8e82f2013-10-17 14:13:43 -070063 MillisecondsSince1970 now = ndn_getNowMilliseconds();
Jeff Thompsona5dc3512013-10-17 10:26:19 -070064 if(now > notAfter_)
65 return true;
66 else
67 return false;
68}
69
Jeff Thompsona5dc3512013-10-17 10:26:19 -070070void
71Certificate::encode()
72{
Jeff Thompson415da1e2013-10-17 16:52:59 -070073 shared_ptr<der::DerSequence> root(new der::DerSequence());
Jeff Thompsona5dc3512013-10-17 10:26:19 -070074
Jeff Thompson415da1e2013-10-17 16:52:59 -070075 shared_ptr<der::DerSequence> validity(new der::DerSequence());
76 shared_ptr<der::DerGtime> notBefore(new der::DerGtime(notBefore_));
77 shared_ptr<der::DerGtime> notAfter(new der::DerGtime(notAfter_));
Jeff Thompsona5dc3512013-10-17 10:26:19 -070078 validity->addChild(notBefore);
79 validity->addChild(notAfter);
80 root->addChild(validity);
81
Jeff Thompson415da1e2013-10-17 16:52:59 -070082 shared_ptr<der::DerSequence> subjectList(new der::DerSequence());
83 SubjectDescriptionList::iterator it = subjectDescriptionList_.begin();
84 for(; it != subjectDescriptionList_.end(); it++)
Jeff Thompsona5dc3512013-10-17 10:26:19 -070085 {
Jeff Thompson415da1e2013-10-17 16:52:59 -070086 shared_ptr<der::DerNode> child = it->toDer();
Jeff Thompsona5dc3512013-10-17 10:26:19 -070087 subjectList->addChild(child);
88 }
89 root->addChild(subjectList);
90
Jeff Thompson415da1e2013-10-17 16:52:59 -070091 root->addChild(key_.toDer());
Jeff Thompsona5dc3512013-10-17 10:26:19 -070092
Jeff Thompson415da1e2013-10-17 16:52:59 -070093 if(!extensionList_.empty())
Jeff Thompsona5dc3512013-10-17 10:26:19 -070094 {
Jeff Thompson415da1e2013-10-17 16:52:59 -070095 shared_ptr<der::DerSequence> extnList(new der::DerSequence());
96 ExtensionList::iterator it = extensionList_.begin();
97 for(; it != extensionList_.end(); it++)
98 extnList->addChild(it->toDer());
Jeff Thompsona5dc3512013-10-17 10:26:19 -070099 root->addChild(extnList);
100 }
101
102 blob_stream blobStream;
Jeff Thompson68192a32013-10-17 17:34:17 -0700103 der::OutputIterator& start = reinterpret_cast<der::OutputIterator&>(blobStream);
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700104
105 root->encode(start);
106
Jeff Thompson68192a32013-10-17 17:34:17 -0700107 shared_ptr<std::vector<uint8_t> > blob = blobStream.buf();
108 setContent(blob);
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700109}
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700110
111void
112Certificate::decode()
113{
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700114 Blob blob = getContent();
115
Jeff Thompson2d47db72013-10-17 15:19:52 -0700116 ndnboost::iostreams::stream<ndnboost::iostreams::array_source> is((const char*)blob.buf(), blob.size());
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700117
Jeff Thompson415da1e2013-10-17 16:52:59 -0700118 shared_ptr<der::DerNode> node = der::DerNode::parse(reinterpret_cast<der::InputIterator&>(is));
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700119
120 // der::PrintVisitor printVisitor;
121 // node->accept(printVisitor, string(""));
122
123 der::CertificateDataVisitor certDataVisitor;
124 node->accept(certDataVisitor, this);
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700125}
126
127#if 0
128void
129Certificate::printCertificate()
130{
131 cout << "Validity:" << endl;
132 cout << notBefore_ << endl;
133 cout << notAfter_ << endl;
134
135 cout << "Subject Info:" << endl;
136 vector<CertificateSubDescrypt>::iterator it = m_subjectList.begin();
137 for(; it < m_subjectList.end(); it++){
138 cout << it->getOidStr() << "\t" << it->getValue() << endl;
139 }
140
141 boost::iostreams::stream
142 <boost::iostreams::array_source> is(key_.getKeyBlob().buf (), m_key.getKeyBlob().size ());
143
Jeff Thompson415da1e2013-10-17 16:52:59 -0700144 shared_ptr<der::DerNode> keyRoot = der::DerNode::parse(reinterpret_cast<InputIterator&> (is));
Jeff Thompsona5dc3512013-10-17 10:26:19 -0700145
146 der::PrintVisitor printVisitor;
147 keyRoot->accept(printVisitor, string(""));
148}
149#endif
150
151}