Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 1 | ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 2 | # |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 3 | # Copyright (c) 2011-2013, Regents of the University of California |
| 4 | # Alexander Afanasyev |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 5 | # |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 6 | # GNU 3.0 license, See the LICENSE file for more information |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 7 | # |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 8 | # Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu> |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 9 | # |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 10 | |
| 11 | # |
| 12 | # Based on PyCCN code, copyrighted and licensed as follows |
| 13 | # |
| 14 | # Copyright (c) 2011-2013, Regents of the University of California |
| 15 | # BSD license, See the COPYING file for more information |
| 16 | # Written by: Derek Kulinski <takeda@takeda.tk> |
| 17 | # Jeff Burke <jburke@ucla.edu> |
| 18 | # |
| 19 | |
| 20 | import ns.ndnSIM |
| 21 | from Name import Name |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 22 | from SignedInfo import SignedInfo |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 23 | |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 24 | class DataError (Exception): |
| 25 | pass |
| 26 | |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 27 | class Data (object): |
| 28 | _data = None |
| 29 | |
| 30 | def __init__(self, |
| 31 | name = None, content = None, signed_info = None, |
| 32 | data = None): |
| 33 | if data: |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 34 | if isinstance (data, Data): |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 35 | self._data = data._data |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 36 | elif isinstance (data, ns.ndnSIM.ndn.Data): |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 37 | self._data = data |
| 38 | else: |
| 39 | raise TypeError ("Invalid type supplied for 'data' parameter [%s]" % type (data)) |
Alexander Afanasyev | 7ff81b7 | 2013-08-08 21:43:16 -0700 | [diff] [blame] | 40 | |
| 41 | self.signedInfo = SignedInfo () |
| 42 | # timestamp |
| 43 | self.signedInfo.freshnessSeconds = self._data.GetFreshness ().ToDouble (ns.core.Time.S) |
| 44 | if self._data.GetKeyLocator (): |
| 45 | self.signedInfo.keyLocator = Name (name = self._data.GetKeyLocator ()) |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 46 | else: |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 47 | self._data = ns.ndnSIM.ndn.Data () |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 48 | |
| 49 | self.name = name |
| 50 | self.content = content |
| 51 | self.signedInfo = signed_info or SignedInfo () |
| 52 | |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 53 | @staticmethod |
| 54 | def fromWire (wire): |
Alexander Afanasyev | 40bc46d | 2013-08-08 01:27:12 -0700 | [diff] [blame] | 55 | return Data (data = ns.ndnSIM.ndn.Wire.ToDataStr (bytes (wire))) |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 56 | |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 57 | def sign (self, key): |
| 58 | """There is no actual signing in ndnSIM for now, but we will assign signature bits based on key""" |
| 59 | self._data.SetSignature (key.fakeKey) |
| 60 | |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 61 | def toWire (self): |
| 62 | if self._data.GetSignature () == 0: |
| 63 | raise DataError ("Data packet has not been signed, cannot create wire format") |
| 64 | |
Alexander Afanasyev | 40bc46d | 2013-08-08 01:27:12 -0700 | [diff] [blame] | 65 | return ns.ndnSIM.ndn.Wire.FromDataStr (self._data) |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 66 | |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 67 | def verify_signature (self, key): |
| 68 | """There is no actual signing in ndnSIM for now, but we will check if signature matches the key""" |
Alexander Afanasyev | 36f1053 | 2013-08-08 11:25:14 -0700 | [diff] [blame] | 69 | return True |
| 70 | # return self._data.GetSignature () == key.fakeKey |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 71 | |
| 72 | def __getattr__ (self, name): |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 73 | if name == "_data": |
| 74 | return object.__getattr__ (self, name) |
| 75 | |
| 76 | elif name == "signedInfo": |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 77 | return object.__getattr__ (self, name) |
| 78 | elif name == "name": |
| 79 | return Name (self._data.GetName ()) |
| 80 | elif name == "scope": |
| 81 | return self._data.GetScope () |
| 82 | elif name == "interestLifetime": |
| 83 | return self._data.GetInterestLifetime ().ToDouble (ns.core.Time.S) |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 84 | elif name == "content": |
Alexander Afanasyev | 40bc46d | 2013-08-08 01:27:12 -0700 | [diff] [blame] | 85 | pkt = self._data.GetPayload () |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 86 | return ns.ndnSIM.ndn.PacketToBuffer (pkt) |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 87 | else: |
| 88 | return self._data.__getattribute__ (name) |
| 89 | |
| 90 | def __setattr__(self, name, value): |
| 91 | if name == "_data": |
| 92 | return object.__setattr__ (self, name, value) |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 93 | |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 94 | elif name == 'signedInfo': |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 95 | if value is None: |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 96 | return |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 97 | if isinstance (value, SignedInfo): |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 98 | object.__setattr__ (self, name, value) |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 99 | |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 100 | if value.timestamp: |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 101 | # ? |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 102 | pass |
| 103 | if value.freshnessSeconds: |
Alexander Afanasyev | 05d4094 | 2013-08-09 12:43:26 -0700 | [diff] [blame^] | 104 | self._data.SetFreshness (ns.core.Seconds (value.freshnessSeconds)) |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 105 | if value.keyLocator: |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 106 | self._data.SetKeyLocator (value._name) |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 107 | else: |
| 108 | raise TypeError ("signedInfo can be assigned either None or SignedInfo object, [%s] supplied" % type (value)) |
| 109 | elif name == "name": |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 110 | if value is None: |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 111 | return self._data.SetName (ns.ndnSIM.ndn.Name ()) |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 112 | elif isinstance (value, Name): |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 113 | return self._data.SetName (value._name) |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 114 | elif isinstance (value, ns.ndnSIM.ndn.Name): |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 115 | return self._data.SetName (value) |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 116 | elif isinstance (value, str): |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 117 | return self._data.SetName (ns.ndnSIM.ndn.Name (value)) |
| 118 | else: |
| 119 | raise ValueError ("Invalid name parameter") |
| 120 | elif name == "content": |
Alexander Afanasyev | fce5bbd | 2013-08-07 18:50:00 -0700 | [diff] [blame] | 121 | if value is None: |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 122 | pkt = ns.network.Packet () |
| 123 | self._data.SetPayload (pkt) |
| 124 | else: |
Alexander Afanasyev | f6f9ef2 | 2013-07-26 11:34:00 -0700 | [diff] [blame] | 125 | pkt = ns.ndnSIM.ndn.BufferToPacket (bytes (value)) |
Alexander Afanasyev | 39f5316 | 2013-07-18 16:24:31 -0700 | [diff] [blame] | 126 | self._data.SetPayload (pkt) |
| 127 | else: |
| 128 | raise NameError ("Unknown attribute [%s]" % name) |
| 129 | |
| 130 | def __repr__(self): |
Alexander Afanasyev | 40bc46d | 2013-08-08 01:27:12 -0700 | [diff] [blame] | 131 | return "ndn.Data(%s; %s)" % str (self._data, self.signedInfo) |