blob: d7e75f8f489c23d9827f5084f4f59251a48658ad [file] [log] [blame]
Yingdi Yu43e71612013-10-30 22:19:31 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2013, Regents of the University of California
4 * Yingdi Yu
5 *
6 * BSD license, See the LICENSE file for more information
7 *
8 * Author: Yingdi Yu <yingdi@cs.ucla.edu>
9 */
10
11#include "sync-intro-certificate.h"
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080012#include <ndn-cpp/security/security-exception.hpp>
13
14#include <boost/date_time/posix_time/posix_time.hpp>
Yingdi Yu43e71612013-10-30 22:19:31 -070015
16using namespace ndn;
Yingdi Yu43e71612013-10-30 22:19:31 -070017using namespace std;
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080018using namespace boost;
Yingdi Yu43e71612013-10-30 22:19:31 -070019
20SyncIntroCertificate::SyncIntroCertificate ()
21 : Certificate()
22{}
23
24SyncIntroCertificate::SyncIntroCertificate (const Name& nameSpace,
25 const Name& keyName,
26 const Name& signerName,
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080027 const MillisecondsSince1970& notBefore,
28 const MillisecondsSince1970& notAfter,
29 const PublicKey& key,
Yingdi Yu43e71612013-10-30 22:19:31 -070030 const IntroType& introType)
31 : m_keyName(keyName)
32 , m_introType(introType)
33{
34 Name certificateName = nameSpace;
35 certificateName.append("WOT").append(keyName).append("INTRO-CERT").append(signerName);
36 switch(introType)
37 {
38 case PRODUCER:
39 certificateName.append("PRODUCER");
40 break;
41 case INTRODUCER:
42 certificateName.append("INTRODUCER");
43 break;
44 default:
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080045 throw SecurityException("Wrong Introduction Type!");
Yingdi Yu43e71612013-10-30 22:19:31 -070046 }
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080047
48 posix_time::time_duration now = posix_time::microsec_clock::universal_time () - posix_time::ptime(gregorian::date (1970, boost::gregorian::Jan, 1));
49 uint64_t version = (now.total_seconds () << 12) | (0xFFF & (now.fractional_seconds () / 244));
50 certificateName.appendVersion(version);
Yingdi Yu43e71612013-10-30 22:19:31 -070051
Yingdi Yu8600a092013-11-01 16:12:31 -070052 Data::setName(certificateName);
Yingdi Yu43e71612013-10-30 22:19:31 -070053 setNotBefore(notBefore);
54 setNotAfter(notAfter);
55 setPublicKeyInfo(key);
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080056 addSubjectDescription(CertificateSubjectDescription("2.5.4.41", keyName.toUri()));
Yingdi Yu8600a092013-11-01 16:12:31 -070057 encode();
Yingdi Yu43e71612013-10-30 22:19:31 -070058}
59
60SyncIntroCertificate::SyncIntroCertificate (const Name& nameSpace,
61 const IdentityCertificate& identityCertificate,
62 const Name& signerName,
63 const IntroType& introType)
64 : m_introType(introType)
65{
66 m_keyName = identityCertificate.getPublicKeyName();
67
68 Name certificateName = nameSpace;
69 certificateName.append("WOT").append(m_keyName).append("INTRO-CERT").append(signerName);
70 switch(introType)
71 {
72 case PRODUCER:
73 certificateName.append("PRODUCER");
74 break;
75 case INTRODUCER:
76 certificateName.append("INTRODUCER");
77 break;
78 default:
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080079 throw SecurityException("Wrong Introduction Type!");
Yingdi Yu43e71612013-10-30 22:19:31 -070080 }
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080081 posix_time::time_duration now = posix_time::microsec_clock::universal_time () - posix_time::ptime(gregorian::date (1970, boost::gregorian::Jan, 1));
82 uint64_t version = (now.total_seconds () << 12) | (0xFFF & (now.fractional_seconds () / 244));
83 certificateName.appendVersion(version);
Yingdi Yu43e71612013-10-30 22:19:31 -070084
85 setName(certificateName);
86 setNotBefore(identityCertificate.getNotBefore());
87 setNotAfter(identityCertificate.getNotAfter());
88 setPublicKeyInfo(identityCertificate.getPublicKeyInfo());
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080089 addSubjectDescription(CertificateSubjectDescription("2.5.4.41", m_keyName.toUri()));
Yingdi Yu43e71612013-10-30 22:19:31 -070090}
91
92SyncIntroCertificate::SyncIntroCertificate (const Data& data)
93 : Certificate(data)
94{
95 Name certificateName = getName();
96 int i = 0;
97 int keyNameStart = 0;
98 int keyNameEnd = 0;
99 for(; i < certificateName.size(); i++)
100 {
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800101 if(certificateName.get(i).toEscapedString() == string("WOT"))
Yingdi Yu43e71612013-10-30 22:19:31 -0700102 {
103 keyNameStart = i + 1;
104 break;
105 }
106 }
107
108 if(i >= certificateName.size())
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800109 throw SecurityException("Wrong SyncIntroCertificate Name!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700110
111 for(; i< certificateName.size(); i++)
112 {
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800113 if(certificateName.get(i).toEscapedString() == string("INTRO-CERT"))
Yingdi Yu43e71612013-10-30 22:19:31 -0700114 {
115 keyNameEnd = i;
116 break;
117 }
118 }
119
120 if(i >= certificateName.size())
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800121 throw SecurityException("Wrong SyncIntroCertificate Name!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700122
Yingdi Yu7bfcd652013-11-12 13:15:33 -0800123 m_keyName = certificateName.getSubName(keyNameStart, keyNameEnd - keyNameStart);
Yingdi Yu43e71612013-10-30 22:19:31 -0700124
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800125 string typeComponent = certificateName.get(certificateName.size() - 2).toEscapedString();
Yingdi Yu43e71612013-10-30 22:19:31 -0700126 if(typeComponent == string("PRODUCER"))
127 m_introType = PRODUCER;
128 else if(typeComponent == string("INTRODUCER"))
129 m_introType = INTRODUCER;
130 else
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800131 throw SecurityException("Wrong SyncIntroCertificate Name!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700132}
133
134SyncIntroCertificate::SyncIntroCertificate (const SyncIntroCertificate& chronosIntroCertificate)
135 : Certificate(chronosIntroCertificate)
136 , m_keyName(chronosIntroCertificate.m_keyName)
137 , m_introType(chronosIntroCertificate.m_introType)
138{}
139
140Data &
141SyncIntroCertificate::setName (const Name& certificateName)
142{
143 int i = 0;
144 int keyNameStart = 0;
145 int keyNameEnd = 0;
146 for(; i < certificateName.size(); i++)
147 {
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800148 if(certificateName.get(i).toEscapedString() == string("WOT"))
Yingdi Yu43e71612013-10-30 22:19:31 -0700149 {
150 keyNameStart = i + 1;
151 break;
152 }
153 }
154
155 if(i >= certificateName.size())
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800156 throw SecurityException("Wrong SyncIntroCertificate Name!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700157
158 for(; i< certificateName.size(); i++)
159 {
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800160 if(certificateName.get(i).toEscapedString() == string("INTRO-CERT"))
Yingdi Yu43e71612013-10-30 22:19:31 -0700161 {
162 keyNameEnd = i;
163 break;
164 }
165 }
166
167 if(i >= certificateName.size())
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800168 throw SecurityException("Wrong SyncIntroCertificate Name!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700169
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800170 m_keyName = certificateName.getSubName(keyNameStart, keyNameEnd - keyNameStart);
Yingdi Yu43e71612013-10-30 22:19:31 -0700171
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800172 string typeComponent = certificateName.get(certificateName.size() - 2).toEscapedString();
Yingdi Yu43e71612013-10-30 22:19:31 -0700173 if(typeComponent == string("PRODUCER"))
174 m_introType = PRODUCER;
175 else if(typeComponent == string("INTRODUCER"))
176 m_introType = INTRODUCER;
177 else
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800178 throw SecurityException("Wrong SyncIntroCertificate Name!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700179
180 return *this;
181}
182
183bool
184SyncIntroCertificate::isSyncIntroCertificate(const Certificate& certificate)
185{
186 const Name& certificateName = certificate.getName();
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800187 string introType = certificateName.get(certificateName.size() - 2).toEscapedString();
Yingdi Yu43e71612013-10-30 22:19:31 -0700188 if(introType != string("PRODUCER") && introType != string("INTRODUCER"))
189 return false;
190
191 int i = 0;
192 bool findWot = false;
193 bool findIntroCert = false;
194 for(; i < certificateName.size(); i++)
195 {
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800196 if(certificateName.get(i).toEscapedString() == string("WOT"))
Yingdi Yu43e71612013-10-30 22:19:31 -0700197 {
198 findWot = true;
199 break;
200 }
201 }
202
203 if(!findWot)
204 return false;
205
206 for(; i < certificateName.size(); i++)
207 {
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800208 if(certificateName.get(i).toEscapedString() == string("INTRO-CERT"))
Yingdi Yu43e71612013-10-30 22:19:31 -0700209 {
210 findIntroCert = true;
211 break;
212 }
213 }
214 if(!findIntroCert)
215 return false;
216
217 if(i < certificateName.size() - 2)
218 return true;
219
220 return false;
221}