A Discrete-Event Network Simulator
API
onion-routing.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 
3 /*
4 * Copyright (c) 2020 DLTLT
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Author: Niki Hrovatin <niki.hrovatin@famnit.upr.si>
20 */
21 
22 #ifndef ONION_ROUTING_H
23 #define ONION_ROUTING_H
24 
25 #include "ns3/core-module.h"
26 #include "ns3/ipv4-l3-protocol.h"
27 #include "ns3/ipv6-l3-protocol.h"
28 
29 namespace ns3 {
30 
49 struct orLayer
50 {
51  uint8_t *nextHopIP;
52  uint8_t *innerLayer;
53  uint16_t innerLayerLen;
54 };
55 
90 class OnionRouting : public Object
91 {
92 public:
98  static TypeId GetTypeId (void);
99 
104  enum OnionErrno {
110  };
111 
121  OnionRouting (uint16_t sealPadding, const uint16_t protocolNumber);
122 
143  void BuildOnion (uint8_t *cipher, uint8_t **route, uint8_t **keys, uint16_t routeLen);
166  void BuildOnion (uint8_t *cipher, uint8_t **route, uint8_t **keys, uint16_t routeLen,
167  uint8_t *endContent, uint16_t endContentLen);
189  void BuildOnion (uint8_t *cipher, uint8_t **route, uint8_t **keys, uint8_t **layerContent,
190  uint16_t layerContentLen, uint16_t routeLen);
212  void BuildOnion (uint8_t *cipher, uint8_t **route, uint8_t **keys, uint8_t **layerContent,
213  uint16_t layerContentLen, uint16_t routeLen, uint8_t *endContent,
214  uint16_t endContentLen); //setup creation of the onion
215 
232  void CreateOnion (uint8_t *cipher, uint8_t **route, uint8_t **keys, uint16_t index,
233  uint16_t routeLen, uint8_t **layerContent, uint16_t layerContentLen,
234  uint8_t *endContent, uint16_t endContentLen); //create the onion
235 
249  orLayer *PeelOnion (uint8_t *onion, uint16_t onionLen, uint8_t *publicKey,
250  uint8_t *secretKey); //peel one layer of the onion
251 
263  virtual void EncryptLayer (uint8_t *ciphertext, uint8_t *plaintext, int len,
264  uint8_t *key) const = 0;
265 
278  virtual void DecryptLayer (uint8_t *plaintext, uint8_t *ciphertext, uint16_t len,
279  uint8_t *publicKey, uint8_t *secretKey) const = 0;
280 
293  uint16_t OnionLength (uint16_t routeLen, uint16_t layerContentLen, uint16_t endContentLen);
294 
304  void AddressToStream (uint8_t *ip);
305 
314  enum OnionErrno GetErrno (void);
315 
316  uint16_t
317  m_sealPadding;
318  uint16_t m_addressSize;
319  std::stringstream m_onionStream;
320  mutable enum OnionErrno m_errno;
321 };
322 
340 {
341 public:
347  static TypeId GetTypeId (void);
348 
357  OnionRoutingDummyEncryption (uint16_t sealPadding, const uint16_t protocolNumber);
358 
366  void GenerateNewKey (void);
367 
375  uint8_t *GetEncryptionKey (void);
376 
377  virtual void EncryptLayer (uint8_t *ciphertext, uint8_t *message, int len, uint8_t *key) const;
378  virtual void DecryptLayer (uint8_t *innerLayer, uint8_t *onion, uint16_t onionLen, uint8_t *pk,
379  uint8_t *sk) const;
380 
381  uint8_t m_encryptionkey[4];
382 };
383 
384 } // namespace ns3
385 
386 #endif /* ONION_ROUTING_H */
ns3::OnionRouting::GetTypeId
static TypeId GetTypeId(void)
Definition: onion-routing.cc:17
ns3::OnionRoutingDummyEncryption::GetEncryptionKey
uint8_t * GetEncryptionKey(void)
Return the current encryption key.
Definition: onion-routing.cc:331
ns3::OnionRouting
Abstract class for creation and decryption of Onion messages.
Definition: onion-routing.h:29
ns3
Definition: sensornode-helper.cc:26
ns3::orLayer::nextHopIP
uint8_t * nextHopIP
ip address given in the serialized form
Definition: onion-routing.h:23
ns3::OnionRouting::OnionLength
uint16_t OnionLength(uint16_t routeLen, uint16_t contentLen)
Definition: onion-routing.cc:180
ns3::OnionRoutingDummyEncryption::GenerateNewKey
void GenerateNewKey(void)
Generate a new dummy encryption key of 4Bytes using the uniform random generator.
Definition: onion-routing.cc:323
ns3::OnionRouting::PeelOnion
orLayer * PeelOnion(uint8_t *onion, uint16_t onionLen, uint8_t *pk, uint8_t *sk)
Definition: onion-routing.cc:158
ns3::OnionRouting::m_errno
enum OnionErrno m_errno
error status while using the onion class
Definition: onion-routing.h:320
ns3::OnionRouting::DecryptLayer
virtual void DecryptLayer(uint8_t *innerLayer, uint8_t *onion, uint16_t onionLen, uint8_t *pk, uint8_t *sk) const =0
ns3::OnionRouting::ERROR_ROUTE_TO_SHORT
@ ERROR_ROUTE_TO_SHORT
Definition: onion-routing.h:107
ns3::OnionRouting::CreateOnion
int CreateOnion(uint8_t *cipher, uint8_t **route, uint16_t index, uint16_t routeLen, uint8_t **keys, uint8_t *content, uint16_t contentLen)
Definition: onion-routing.cc:103
ns3::OnionRouting::OnionErrno
OnionErrno
Enumeration of the possible errors using the class onion-routing.
Definition: onion-routing.h:104
ns3::OnionRouting::m_sealPadding
uint16_t m_sealPadding
size increase of the ciphertext in bytes, intorduced by the encryption method
Definition: onion-routing.h:50
ns3::OnionRouting::m_addressSize
uint16_t m_addressSize
size in bytes of the used address type (4-Ipv4, 16-Ipv6)
Definition: onion-routing.h:52
ns3::orLayer
structure holding details resulting from layer decryption of an onion message
Definition: onion-routing.h:22
ns3::OnionRouting::ERROR_DECRYPTION
@ ERROR_DECRYPTION
Definition: onion-routing.h:109
ns3::orLayer::innerLayer
uint8_t * innerLayer
inner content of the onion message without the next hop address
Definition: onion-routing.h:24
ns3::OnionRouting::GetErrno
enum OnionErrno GetErrno(void)
Return the last error code of the OnionErrno enum.
Definition: onion-routing.cc:292
ns3::OnionRouting::ERROR_PROT_NUMBER
@ ERROR_PROT_NUMBER
Definition: onion-routing.h:106
ns3::OnionRoutingDummyEncryption::m_encryptionkey
uint8_t m_encryptionkey[4]
the current encryption key
Definition: onion-routing.h:381
ns3::OnionRouting::AddressToStream
void AddressToStream(uint8_t *ip)
Definition: onion-routing.cc:200
ns3::orLayer::innerLayerLen
uint16_t innerLayerLen
length of the inner content of the onion message
Definition: onion-routing.h:25
ns3::OnionRoutingDummyEncryption::GetTypeId
static TypeId GetTypeId(void)
Register this type.
Definition: onion-routing.cc:313
ns3::OnionRoutingDummyEncryption::DecryptLayer
virtual void DecryptLayer(uint8_t *innerLayer, uint8_t *onion, uint16_t onionLen, uint8_t *pk, uint8_t *sk) const
Definition: onion-routing.cc:349
ns3::OnionRouting::BuildOnion
int BuildOnion(uint8_t *cipher, uint8_t **route, uint16_t routeLen, uint8_t **keys, uint8_t *content, uint16_t contentLen)
Definition: onion-routing.cc:63
ns3::OnionRouting::EncryptLayer
virtual void EncryptLayer(uint8_t *ciphertext, uint8_t *message, int len, uint8_t *key) const =0
ns3::OnionRouting::ERROR_ENCRYPTION
@ ERROR_ENCRYPTION
Definition: onion-routing.h:108
ns3::OnionRouting::ERROR_NOTERROR
@ ERROR_NOTERROR
Definition: onion-routing.h:105
ns3::OnionRoutingDummyEncryption
class that implements the
Definition: onion-routing.h:339
ns3::OnionRoutingDummyEncryption::EncryptLayer
virtual void EncryptLayer(uint8_t *ciphertext, uint8_t *message, int len, uint8_t *key) const
Definition: onion-routing.cc:338
ns3::OnionRouting::m_onionStream
std::stringstream m_onionStream
stringstream used to LOG onion construction
Definition: onion-routing.h:56
ns3::OnionRouting::OnionRouting
OnionRouting()
Definition: onion-routing.cc:27
ns3::OnionRoutingDummyEncryption::OnionRoutingDummyEncryption
OnionRoutingDummyEncryption(uint16_t sealPadding, const uint16_t protocolNumber)
Constructor – Setup parameters for the creation of onions and check that sealPadding is greter than 4...
Definition: onion-routing.cc:303