Hex Artifact Content
Not logged in

Artifact a9a3d525480e4d9890fc66d9804f301af193ca75:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 35 20 4d 61 69 64 53 61 66 65 2e 6e 65 74 20 6c  5 MaidSafe.net l
0020: 69 6d 69 74 65 64 2e 0a 2f 2f 0a 2f 2f 20 54 68  imited..//.// Th
0030: 69 73 20 53 41 46 45 20 4e 65 74 77 6f 72 6b 20  is SAFE Network 
0040: 53 6f 66 74 77 61 72 65 20 69 73 20 6c 69 63 65  Software is lice
0050: 6e 73 65 64 20 74 6f 20 79 6f 75 20 75 6e 64 65  nsed to you unde
0060: 72 20 28 31 29 20 74 68 65 20 4d 61 69 64 53 61  r (1) the MaidSa
0070: 66 65 2e 6e 65 74 20 43 6f 6d 6d 65 72 63 69 61  fe.net Commercia
0080: 6c 20 4c 69 63 65 6e 73 65 2c 0a 2f 2f 20 76 65  l License,.// ve
0090: 72 73 69 6f 6e 20 31 2e 30 20 6f 72 20 6c 61 74  rsion 1.0 or lat
00a0: 65 72 2c 20 6f 72 20 28 32 29 20 54 68 65 20 47  er, or (2) The G
00b0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
00c0: 63 65 6e 73 65 20 28 47 50 4c 29 2c 20 76 65 72  cense (GPL), ver
00d0: 73 69 6f 6e 20 33 2c 20 64 65 70 65 6e 64 69 6e  sion 3, dependin
00e0: 67 20 6f 6e 20 77 68 69 63 68 0a 2f 2f 20 6c 69  g on which.// li
00f0: 63 65 6e 63 65 20 79 6f 75 20 61 63 63 65 70 74  cence you accept
0100: 65 64 20 6f 6e 20 69 6e 69 74 69 61 6c 20 61 63  ed on initial ac
0110: 63 65 73 73 20 74 6f 20 74 68 65 20 53 6f 66 74  cess to the Soft
0120: 77 61 72 65 20 28 74 68 65 20 22 4c 69 63 65 6e  ware (the "Licen
0130: 63 65 73 22 29 2e 0a 2f 2f 0a 2f 2f 20 42 79 20  ces")..//.// By 
0140: 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 63 6f 64  contributing cod
0150: 65 20 74 6f 20 74 68 65 20 53 41 46 45 20 4e 65  e to the SAFE Ne
0160: 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 2c 20  twork Software, 
0170: 6f 72 20 74 6f 20 74 68 69 73 20 70 72 6f 6a 65  or to this proje
0180: 63 74 20 67 65 6e 65 72 61 6c 6c 79 2c 20 79 6f  ct generally, yo
0190: 75 20 61 67 72 65 65 20 74 6f 20 62 65 0a 2f 2f  u agree to be.//
01a0: 20 62 6f 75 6e 64 20 62 79 20 74 68 65 20 74 65   bound by the te
01b0: 72 6d 73 20 6f 66 20 74 68 65 20 4d 61 69 64 53  rms of the MaidS
01c0: 61 66 65 20 43 6f 6e 74 72 69 62 75 74 6f 72 20  afe Contributor 
01d0: 41 67 72 65 65 6d 65 6e 74 2e 20 20 54 68 69 73  Agreement.  This
01e0: 2c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  , along with the
01f0: 20 4c 69 63 65 6e 73 65 73 20 63 61 6e 20 62 65   Licenses can be
0200: 0a 2f 2f 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  .// found in the
0210: 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   root directory 
0220: 6f 66 20 74 68 69 73 20 70 72 6f 6a 65 63 74 20  of this project 
0230: 61 74 20 4c 49 43 45 4e 53 45 2c 20 43 4f 50 59  at LICENSE, COPY
0240: 49 4e 47 20 61 6e 64 20 43 4f 4e 54 52 49 42 55  ING and CONTRIBU
0250: 54 4f 52 2e 0a 2f 2f 0a 2f 2f 20 55 6e 6c 65 73  TOR..//.// Unles
0260: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70  s required by ap
0270: 70 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20  plicable law or 
0280: 61 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69  agreed to in wri
0290: 74 69 6e 67 2c 20 74 68 65 20 53 41 46 45 20 4e  ting, the SAFE N
02a0: 65 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 20  etwork Software 
02b0: 64 69 73 74 72 69 62 75 74 65 64 0a 2f 2f 20 75  distributed.// u
02c0: 6e 64 65 72 20 74 68 65 20 47 50 4c 20 4c 69 63  nder the GPL Lic
02d0: 65 6e 63 65 20 69 73 20 64 69 73 74 72 69 62 75  ence is distribu
02e0: 74 65 64 20 6f 6e 20 61 6e 20 22 41 53 20 49 53  ted on an "AS IS
02f0: 22 20 42 41 53 49 53 2c 20 57 49 54 48 4f 55 54  " BASIS, WITHOUT
0300: 20 57 41 52 52 41 4e 54 49 45 53 20 4f 52 20 43   WARRANTIES OR C
0310: 4f 4e 44 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59  ONDITIONS OF ANY
0320: 0a 2f 2f 20 4b 49 4e 44 2c 20 65 69 74 68 65 72  .// KIND, either
0330: 20 65 78 70 72 65 73 73 20 6f 72 20 69 6d 70 6c   express or impl
0340: 69 65 64 2e 0a 2f 2f 0a 2f 2f 20 50 6c 65 61 73  ied..//.// Pleas
0350: 65 20 72 65 76 69 65 77 20 74 68 65 20 4c 69 63  e review the Lic
0360: 65 6e 63 65 73 20 66 6f 72 20 74 68 65 20 73 70  ences for the sp
0370: 65 63 69 66 69 63 20 6c 61 6e 67 75 61 67 65 20  ecific language 
0380: 67 6f 76 65 72 6e 69 6e 67 20 70 65 72 6d 69 73  governing permis
0390: 73 69 6f 6e 73 20 61 6e 64 20 6c 69 6d 69 74 61  sions and limita
03a0: 74 69 6f 6e 73 0a 2f 2f 20 72 65 6c 61 74 69 6e  tions.// relatin
03b0: 67 20 74 6f 20 75 73 65 20 6f 66 20 74 68 65 20  g to use of the 
03c0: 53 41 46 45 20 4e 65 74 77 6f 72 6b 20 53 6f 66  SAFE Network Sof
03d0: 74 77 61 72 65 2e 0a 0a 75 73 65 20 63 6f 72 65  tware...use core
03e0: 3a 3a 69 64 3a 3a 7b 49 64 54 79 70 65 2c 20 52  ::id::{IdType, R
03f0: 65 76 6f 63 61 74 69 6f 6e 49 64 54 79 70 65 7d  evocationIdType}
0400: 3b 0a 75 73 65 20 72 6f 75 74 69 6e 67 3a 3a 58  ;.use routing::X
0410: 6f 72 4e 61 6d 65 3b 0a 75 73 65 20 72 75 73 74  orName;.use rust
0420: 5f 73 6f 64 69 75 6d 3a 3a 63 72 79 70 74 6f 3a  _sodium::crypto:
0430: 3a 7b 62 6f 78 5f 2c 20 73 69 67 6e 7d 3b 0a 75  :{box_, sign};.u
0440: 73 65 20 72 75 73 74 5f 73 6f 64 69 75 6d 3a 3a  se rust_sodium::
0450: 63 72 79 70 74 6f 3a 3a 68 61 73 68 3a 3a 73 68  crypto::hash::sh
0460: 61 32 35 36 3b 0a 0a 2f 2f 2f 20 60 50 75 62 6c  a256;../// `Publ
0470: 69 63 49 64 54 79 70 65 60 0a 2f 2f 2f 0a 2f 2f  icIdType`.///.//
0480: 2f 20 23 45 78 61 6d 70 6c 65 73 0a 2f 2f 2f 0a  / #Examples.///.
0490: 2f 2f 2f 20 60 60 60 0a 2f 2f 2f 20 75 73 65 20  /// ```./// use 
04a0: 3a 3a 73 61 66 65 5f 63 6f 72 65 3a 3a 63 6f 72  ::safe_core::cor
04b0: 65 3a 3a 69 64 3a 3a 7b 49 64 54 79 70 65 2c 20  e::id::{IdType, 
04c0: 52 65 76 6f 63 61 74 69 6f 6e 49 64 54 79 70 65  RevocationIdType
04d0: 2c 20 4d 61 69 64 54 79 70 65 54 61 67 73 2c 20  , MaidTypeTags, 
04e0: 50 75 62 6c 69 63 49 64 54 79 70 65 7d 3b 0a 2f  PublicIdType};./
04f0: 2f 2f 0a 2f 2f 2f 20 6c 65 74 20 72 65 76 6f 63  //./// let revoc
0500: 61 74 69 6f 6e 5f 6d 61 69 64 20 3d 20 52 65 76  ation_maid = Rev
0510: 6f 63 61 74 69 6f 6e 49 64 54 79 70 65 3a 3a 6e  ocationIdType::n
0520: 65 77 3a 3a 3c 4d 61 69 64 54 79 70 65 54 61 67  ew::<MaidTypeTag
0530: 73 3e 28 4e 6f 6e 65 29 3b 0a 2f 2f 2f 20 6c 65  s>(None);./// le
0540: 74 20 6d 61 69 64 20 3d 20 49 64 54 79 70 65 3a  t maid = IdType:
0550: 3a 6e 65 77 28 26 72 65 76 6f 63 61 74 69 6f 6e  :new(&revocation
0560: 5f 6d 61 69 64 2c 20 4e 6f 6e 65 29 3b 0a 2f 2f  _maid, None);.//
0570: 2f 20 6c 65 74 20 5f 70 75 62 6c 69 63 5f 6d 61  / let _public_ma
0580: 69 64 20 20 3d 20 50 75 62 6c 69 63 49 64 54 79  id  = PublicIdTy
0590: 70 65 3a 3a 6e 65 77 28 26 6d 61 69 64 2c 20 26  pe::new(&maid, &
05a0: 72 65 76 6f 63 61 74 69 6f 6e 5f 6d 61 69 64 29  revocation_maid)
05b0: 3b 0a 2f 2f 2f 20 60 60 60 0a 23 5b 64 65 72 69  ;./// ```.#[deri
05c0: 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c  ve(Clone, Debug,
05d0: 20 45 71 2c 20 50 61 72 74 69 61 6c 45 71 2c 20   Eq, PartialEq, 
05e0: 53 65 72 69 61 6c 69 7a 65 2c 20 44 65 73 65 72  Serialize, Deser
05f0: 69 61 6c 69 7a 65 29 5d 0a 70 75 62 20 73 74 72  ialize)].pub str
0600: 75 63 74 20 50 75 62 6c 69 63 49 64 54 79 70 65  uct PublicIdType
0610: 20 7b 0a 20 20 20 20 74 79 70 65 5f 74 61 67 3a   {.    type_tag:
0620: 20 75 36 34 2c 0a 20 20 20 20 70 75 62 6c 69 63   u64,.    public
0630: 5f 6b 65 79 73 3a 20 28 73 69 67 6e 3a 3a 50 75  _keys: (sign::Pu
0640: 62 6c 69 63 4b 65 79 2c 20 62 6f 78 5f 3a 3a 50  blicKey, box_::P
0650: 75 62 6c 69 63 4b 65 79 29 2c 0a 20 20 20 20 72  ublicKey),.    r
0660: 65 76 6f 63 61 74 69 6f 6e 5f 70 75 62 6c 69 63  evocation_public
0670: 5f 6b 65 79 3a 20 73 69 67 6e 3a 3a 50 75 62 6c  _key: sign::Publ
0680: 69 63 4b 65 79 2c 0a 20 20 20 20 73 69 67 6e 61  icKey,.    signa
0690: 74 75 72 65 3a 20 73 69 67 6e 3a 3a 53 69 67 6e  ture: sign::Sign
06a0: 61 74 75 72 65 2c 0a 7d 0a 0a 69 6d 70 6c 20 50  ature,.}..impl P
06b0: 75 62 6c 69 63 49 64 54 79 70 65 20 7b 0a 20 20  ublicIdType {.  
06c0: 20 20 2f 2f 2f 20 41 6e 20 69 6e 73 74 61 6e 73    /// An instans
06d0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 50 75 62  tance of the Pub
06e0: 6c 69 63 49 64 54 79 70 65 20 63 61 6e 20 62 65  licIdType can be
06f0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
0700: 68 65 20 6e 65 77 28 29 0a 20 20 20 20 70 75 62  he new().    pub
0710: 20 66 6e 20 6e 65 77 28 69 64 5f 74 79 70 65 3a   fn new(id_type:
0720: 20 26 49 64 54 79 70 65 2c 20 72 65 76 6f 63 61   &IdType, revoca
0730: 74 69 6f 6e 5f 69 64 3a 20 26 52 65 76 6f 63 61  tion_id: &Revoca
0740: 74 69 6f 6e 49 64 54 79 70 65 29 20 2d 3e 20 50  tionIdType) -> P
0750: 75 62 6c 69 63 49 64 54 79 70 65 20 7b 0a 20 20  ublicIdType {.  
0760: 20 20 20 20 20 20 6c 65 74 20 74 79 70 65 5f 74        let type_t
0770: 61 67 20 3d 20 72 65 76 6f 63 61 74 69 6f 6e 5f  ag = revocation_
0780: 69 64 2e 74 79 70 65 5f 74 61 67 73 28 29 2e 32  id.type_tags().2
0790: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70 75  ;.        let pu
07a0: 62 6c 69 63 5f 6b 65 79 73 20 3d 20 69 64 5f 74  blic_keys = id_t
07b0: 79 70 65 2e 70 75 62 6c 69 63 5f 6b 65 79 73 28  ype.public_keys(
07c0: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 72  );.        let r
07d0: 65 76 6f 63 61 74 69 6f 6e 5f 70 75 62 6c 69 63  evocation_public
07e0: 5f 6b 65 79 20 3d 20 72 65 76 6f 63 61 74 69 6f  _key = revocatio
07f0: 6e 5f 69 64 2e 70 75 62 6c 69 63 5f 6b 65 79 28  n_id.public_key(
0800: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 63  );.        let c
0810: 6f 6d 62 69 6e 65 64 5f 69 74 65 72 20 3d 20 28  ombined_iter = (
0820: 70 75 62 6c 69 63 5f 6b 65 79 73 2e 30 29 0a 20  public_keys.0). 
0830: 20 20 20 20 20 20 20 20 20 20 20 2e 30 0a 20 20             .0.  
0840: 20 20 20 20 20 20 20 20 20 20 2e 69 6e 74 6f 5f            .into_
0850: 69 74 65 72 28 29 0a 20 20 20 20 20 20 20 20 20  iter().         
0860: 20 20 20 2e 63 68 61 69 6e 28 28 70 75 62 6c 69     .chain((publi
0870: 63 5f 6b 65 79 73 2e 31 29 0a 20 20 20 20 20 20  c_keys.1).      
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 2e 30 0a 20 20 20 20 20 20 20 20 20 20 20 20   .0.            
08a0: 20 20 20 20 20 20 20 20 20 20 20 2e 69 6e 74 6f             .into
08b0: 5f 69 74 65 72 28 29 0a 20 20 20 20 20 20 20 20  _iter().        
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
08d0: 63 68 61 69 6e 28 72 65 76 6f 63 61 74 69 6f 6e  chain(revocation
08e0: 5f 70 75 62 6c 69 63 5f 6b 65 79 2e 30 2e 69 6e  _public_key.0.in
08f0: 74 6f 5f 69 74 65 72 28 29 29 29 3b 0a 20 20 20  to_iter()));.   
0900: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 63 6f 6d       let mut com
0910: 62 69 6e 65 64 3a 20 56 65 63 3c 75 38 3e 20 3d  bined: Vec<u8> =
0920: 20 56 65 63 3a 3a 6e 65 77 28 29 3b 0a 20 20 20   Vec::new();.   
0930: 20 20 20 20 20 66 6f 72 20 69 74 65 72 20 69 6e       for iter in
0940: 20 63 6f 6d 62 69 6e 65 64 5f 69 74 65 72 20 7b   combined_iter {
0950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d  .            com
0960: 62 69 6e 65 64 2e 70 75 73 68 28 2a 69 74 65 72  bined.push(*iter
0970: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0980: 20 20 20 20 20 66 6f 72 20 69 20 69 6e 20 74 79       for i in ty
0990: 70 65 5f 74 61 67 2e 74 6f 5f 73 74 72 69 6e 67  pe_tag.to_string
09a0: 28 29 2e 69 6e 74 6f 5f 62 79 74 65 73 28 29 20  ().into_bytes() 
09b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
09c0: 6d 62 69 6e 65 64 2e 70 75 73 68 28 69 29 3b 0a  mbined.push(i);.
09d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
09e0: 20 20 6c 65 74 20 6d 65 73 73 61 67 65 5f 6c 65    let message_le
09f0: 6e 67 74 68 20 3d 20 63 6f 6d 62 69 6e 65 64 2e  ngth = combined.
0a00: 6c 65 6e 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  len();..        
0a10: 6c 65 74 20 73 69 67 6e 61 74 75 72 65 20 3d 20  let signature = 
0a20: 72 65 76 6f 63 61 74 69 6f 6e 5f 69 64 0a 20 20  revocation_id.  
0a30: 20 20 20 20 20 20 20 20 20 20 2e 73 69 67 6e 28            .sign(
0a40: 26 63 6f 6d 62 69 6e 65 64 29 0a 20 20 20 20 20  &combined).     
0a50: 20 20 20 20 20 20 20 2e 69 6e 74 6f 5f 69 74 65         .into_ite
0a60: 72 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r().            
0a70: 2e 73 6b 69 70 28 6d 65 73 73 61 67 65 5f 6c 65  .skip(message_le
0a80: 6e 67 74 68 29 0a 20 20 20 20 20 20 20 20 20 20  ngth).          
0a90: 20 20 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56 65 63    .collect::<Vec
0aa0: 3c 5f 3e 3e 28 29 3b 0a 20 20 20 20 20 20 20 20  <_>>();.        
0ab0: 6c 65 74 20 6d 75 74 20 73 69 67 6e 61 74 75 72  let mut signatur
0ac0: 65 5f 61 72 72 20 3d 20 5b 30 3b 20 73 69 67 6e  e_arr = [0; sign
0ad0: 3a 3a 53 49 47 4e 41 54 55 52 45 42 59 54 45 53  ::SIGNATUREBYTES
0ae0: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ];..        for 
0af0: 69 74 20 69 6e 20 73 69 67 6e 61 74 75 72 65 0a  it in signature.
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 2e 69 6e 74 6f 5f 69 74 65 72 28 29 0a 20 20 20  .into_iter().   
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 74 61               .ta
0b30: 6b 65 28 73 69 67 6e 3a 3a 53 49 47 4e 41 54 55  ke(sign::SIGNATU
0b40: 52 45 42 59 54 45 53 29 0a 20 20 20 20 20 20 20  REBYTES).       
0b50: 20 20 20 20 20 20 20 20 20 2e 65 6e 75 6d 65 72           .enumer
0b60: 61 74 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ate() {.        
0b70: 20 20 20 20 73 69 67 6e 61 74 75 72 65 5f 61 72      signature_ar
0b80: 72 5b 69 74 2e 30 5d 20 3d 20 69 74 2e 31 3b 0a  r[it.0] = it.1;.
0b90: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
0ba0: 20 20 20 50 75 62 6c 69 63 49 64 54 79 70 65 20     PublicIdType 
0bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 79  {.            ty
0bc0: 70 65 5f 74 61 67 3a 20 74 79 70 65 5f 74 61 67  pe_tag: type_tag
0bd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ,.            pu
0be0: 62 6c 69 63 5f 6b 65 79 73 3a 20 2a 70 75 62 6c  blic_keys: *publ
0bf0: 69 63 5f 6b 65 79 73 2c 0a 20 20 20 20 20 20 20  ic_keys,.       
0c00: 20 20 20 20 20 72 65 76 6f 63 61 74 69 6f 6e 5f       revocation_
0c10: 70 75 62 6c 69 63 5f 6b 65 79 3a 20 2a 72 65 76  public_key: *rev
0c20: 6f 63 61 74 69 6f 6e 5f 69 64 2e 70 75 62 6c 69  ocation_id.publi
0c30: 63 5f 6b 65 79 28 29 2c 0a 20 20 20 20 20 20 20  c_key(),.       
0c40: 20 20 20 20 20 73 69 67 6e 61 74 75 72 65 3a 20       signature: 
0c50: 73 69 67 6e 3a 3a 53 69 67 6e 61 74 75 72 65 28  sign::Signature(
0c60: 73 69 67 6e 61 74 75 72 65 5f 61 72 72 29 2c 0a  signature_arr),.
0c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
0c80: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73  .    /// Returns
0c90: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 70 75   the name.    pu
0ca0: 62 20 66 6e 20 6e 61 6d 65 28 26 73 65 6c 66 29  b fn name(&self)
0cb0: 20 2d 3e 20 58 6f 72 4e 61 6d 65 20 7b 0a 20 20   -> XorName {.  
0cc0: 20 20 20 20 20 20 6c 65 74 20 63 6f 6d 62 69 6e        let combin
0cd0: 65 64 5f 69 74 65 72 20 3d 20 28 73 65 6c 66 2e  ed_iter = (self.
0ce0: 70 75 62 6c 69 63 5f 6b 65 79 73 2e 30 29 0a 20  public_keys.0). 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 2e 30 0a 20 20             .0.  
0d00: 20 20 20 20 20 20 20 20 20 20 2e 69 6e 74 6f 5f            .into_
0d10: 69 74 65 72 28 29 0a 20 20 20 20 20 20 20 20 20  iter().         
0d20: 20 20 20 2e 63 68 61 69 6e 28 28 73 65 6c 66 2e     .chain((self.
0d30: 70 75 62 6c 69 63 5f 6b 65 79 73 2e 31 29 2e 30  public_keys.1).0
0d40: 2e 69 6e 74 6f 5f 69 74 65 72 28 29 29 3b 0a 20  .into_iter());. 
0d50: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 63         let mut c
0d60: 6f 6d 62 69 6e 65 64 3a 20 56 65 63 3c 75 38 3e  ombined: Vec<u8>
0d70: 20 3d 20 56 65 63 3a 3a 6e 65 77 28 29 3b 0a 20   = Vec::new();. 
0d80: 20 20 20 20 20 20 20 66 6f 72 20 69 74 65 72 20         for iter 
0d90: 69 6e 20 63 6f 6d 62 69 6e 65 64 5f 69 74 65 72  in combined_iter
0da0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
0db0: 6f 6d 62 69 6e 65 64 2e 70 75 73 68 28 2a 69 74  ombined.push(*it
0dc0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
0dd0: 20 20 20 20 20 20 20 66 6f 72 20 69 20 69 6e 20         for i in 
0de0: 73 65 6c 66 2e 74 79 70 65 5f 74 61 67 2e 74 6f  self.type_tag.to
0df0: 5f 73 74 72 69 6e 67 28 29 2e 69 6e 74 6f 5f 62  _string().into_b
0e00: 79 74 65 73 28 29 20 7b 0a 20 20 20 20 20 20 20  ytes() {.       
0e10: 20 20 20 20 20 63 6f 6d 62 69 6e 65 64 2e 70 75       combined.pu
0e20: 73 68 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  sh(i);.        }
0e30: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69 20 69  .        for i i
0e40: 6e 20 30 2e 2e 73 69 67 6e 3a 3a 53 49 47 4e 41  n 0..sign::SIGNA
0e50: 54 55 52 45 42 59 54 45 53 20 7b 0a 20 20 20 20  TUREBYTES {.    
0e60: 20 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 65 64          combined
0e70: 2e 70 75 73 68 28 73 65 6c 66 2e 73 69 67 6e 61  .push(self.signa
0e80: 74 75 72 65 2e 30 5b 69 5d 29 3b 0a 20 20 20 20  ture.0[i]);.    
0e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 58 6f      }.        Xo
0ea0: 72 4e 61 6d 65 28 73 68 61 32 35 36 3a 3a 68 61  rName(sha256::ha
0eb0: 73 68 28 26 63 6f 6d 62 69 6e 65 64 29 2e 30 29  sh(&combined).0)
0ec0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
0ed0: 52 65 74 75 72 6e 73 20 74 68 65 20 50 75 62 6c  Returns the Publ
0ee0: 69 63 4b 65 79 73 0a 20 20 20 20 70 75 62 20 66  icKeys.    pub f
0ef0: 6e 20 70 75 62 6c 69 63 5f 6b 65 79 73 28 26 73  n public_keys(&s
0f00: 65 6c 66 29 20 2d 3e 20 26 28 73 69 67 6e 3a 3a  elf) -> &(sign::
0f10: 50 75 62 6c 69 63 4b 65 79 2c 20 62 6f 78 5f 3a  PublicKey, box_:
0f20: 3a 50 75 62 6c 69 63 4b 65 79 29 20 7b 0a 20 20  :PublicKey) {.  
0f30: 20 20 20 20 20 20 26 73 65 6c 66 2e 70 75 62 6c        &self.publ
0f40: 69 63 5f 6b 65 79 73 0a 20 20 20 20 7d 0a 0a 20  ic_keys.    }.. 
0f50: 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 72     /// Returns r
0f60: 65 76 6f 63 61 74 69 6f 6e 20 70 75 62 6c 69 63  evocation public
0f70: 20 6b 65 79 0a 20 20 20 20 70 75 62 20 66 6e 20   key.    pub fn 
0f80: 72 65 76 6f 63 61 74 69 6f 6e 5f 70 75 62 6c 69  revocation_publi
0f90: 63 5f 6b 65 79 28 26 73 65 6c 66 29 20 2d 3e 20  c_key(&self) -> 
0fa0: 26 73 69 67 6e 3a 3a 50 75 62 6c 69 63 4b 65 79  &sign::PublicKey
0fb0: 20 7b 0a 20 20 20 20 20 20 20 20 26 73 65 6c 66   {.        &self
0fc0: 2e 72 65 76 6f 63 61 74 69 6f 6e 5f 70 75 62 6c  .revocation_publ
0fd0: 69 63 5f 6b 65 79 0a 20 20 20 20 7d 0a 0a 20 20  ic_key.    }..  
0fe0: 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68    /// Returns th
0ff0: 65 20 53 69 67 6e 61 74 75 72 65 20 6f 66 20 50  e Signature of P
1000: 75 62 6c 69 63 49 64 54 79 70 65 0a 20 20 20 20  ublicIdType.    
1010: 70 75 62 20 66 6e 20 73 69 67 6e 61 74 75 72 65  pub fn signature
1020: 28 26 73 65 6c 66 29 20 2d 3e 20 26 73 69 67 6e  (&self) -> &sign
1030: 3a 3a 53 69 67 6e 61 74 75 72 65 20 7b 0a 20 20  ::Signature {.  
1040: 20 20 20 20 20 20 26 73 65 6c 66 2e 73 69 67 6e        &self.sign
1050: 61 74 75 72 65 0a 20 20 20 20 7d 0a 7d 0a 0a 23  ature.    }.}..#
1060: 5b 63 66 67 28 74 65 73 74 29 5d 0a 6d 6f 64 20  [cfg(test)].mod 
1070: 74 65 73 74 20 7b 0a 20 20 20 20 75 73 65 20 73  test {.    use s
1080: 75 70 65 72 3a 3a 2a 3b 0a 20 20 20 20 75 73 65  uper::*;.    use
1090: 20 63 6f 72 65 3a 3a 69 64 3a 3a 7b 49 64 54 79   core::id::{IdTy
10a0: 70 65 2c 20 4d 61 69 64 54 79 70 65 54 61 67 73  pe, MaidTypeTags
10b0: 2c 20 4d 70 69 64 54 79 70 65 54 61 67 73 2c 20  , MpidTypeTags, 
10c0: 52 61 6e 64 6f 6d 2c 20 52 65 76 6f 63 61 74 69  Random, Revocati
10d0: 6f 6e 49 64 54 79 70 65 7d 3b 0a 20 20 20 20 75  onIdType};.    u
10e0: 73 65 20 6d 61 69 64 73 61 66 65 5f 75 74 69 6c  se maidsafe_util
10f0: 69 74 69 65 73 3a 3a 73 65 72 69 61 6c 69 73 61  ities::serialisa
1100: 74 69 6f 6e 3a 3a 7b 64 65 73 65 72 69 61 6c 69  tion::{deseriali
1110: 73 65 2c 20 73 65 72 69 61 6c 69 73 65 7d 3b 0a  se, serialise};.
1120: 20 20 20 20 75 73 65 20 72 75 73 74 5f 73 6f 64      use rust_sod
1130: 69 75 6d 3a 3a 63 72 79 70 74 6f 3a 3a 73 69 67  ium::crypto::sig
1140: 6e 3b 0a 0a 20 20 20 20 69 6d 70 6c 20 52 61 6e  n;..    impl Ran
1150: 64 6f 6d 20 66 6f 72 20 50 75 62 6c 69 63 49 64  dom for PublicId
1160: 54 79 70 65 20 7b 0a 20 20 20 20 20 20 20 20 66  Type {.        f
1170: 6e 20 67 65 6e 65 72 61 74 65 5f 72 61 6e 64 6f  n generate_rando
1180: 6d 28 29 20 2d 3e 20 50 75 62 6c 69 63 49 64 54  m() -> PublicIdT
1190: 79 70 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ype {.          
11a0: 20 20 6c 65 74 20 72 65 76 6f 63 61 74 69 6f 6e    let revocation
11b0: 5f 6d 61 69 64 20 3d 20 52 65 76 6f 63 61 74 69  _maid = Revocati
11c0: 6f 6e 49 64 54 79 70 65 3a 3a 6e 65 77 3a 3a 3c  onIdType::new::<
11d0: 4d 61 69 64 54 79 70 65 54 61 67 73 3e 28 4e 6f  MaidTypeTags>(No
11e0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ne);.           
11f0: 20 6c 65 74 20 6d 61 69 64 20 3d 20 49 64 54 79   let maid = IdTy
1200: 70 65 3a 3a 6e 65 77 28 26 72 65 76 6f 63 61 74  pe::new(&revocat
1210: 69 6f 6e 5f 6d 61 69 64 2c 20 4e 6f 6e 65 29 3b  ion_maid, None);
1220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 75 62  .            Pub
1230: 6c 69 63 49 64 54 79 70 65 3a 3a 6e 65 77 28 26  licIdType::new(&
1240: 6d 61 69 64 2c 20 26 72 65 76 6f 63 61 74 69 6f  maid, &revocatio
1250: 6e 5f 6d 61 69 64 29 0a 20 20 20 20 20 20 20 20  n_maid).        
1260: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 74  }.    }..    #[t
1270: 65 73 74 5d 0a 20 20 20 20 66 6e 20 63 72 65 61  est].    fn crea
1280: 74 65 5f 70 75 62 6c 69 63 5f 6d 70 69 64 28 29  te_public_mpid()
1290: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 72   {.        let r
12a0: 65 76 6f 63 61 74 69 6f 6e 5f 6d 70 69 64 20 3d  evocation_mpid =
12b0: 20 52 65 76 6f 63 61 74 69 6f 6e 49 64 54 79 70   RevocationIdTyp
12c0: 65 3a 3a 6e 65 77 3a 3a 3c 4d 70 69 64 54 79 70  e::new::<MpidTyp
12d0: 65 54 61 67 73 3e 28 4e 6f 6e 65 29 3b 0a 20 20  eTags>(None);.  
12e0: 20 20 20 20 20 20 6c 65 74 20 6d 70 69 64 20 3d        let mpid =
12f0: 20 49 64 54 79 70 65 3a 3a 6e 65 77 28 26 72 65   IdType::new(&re
1300: 76 6f 63 61 74 69 6f 6e 5f 6d 70 69 64 2c 20 4e  vocation_mpid, N
1310: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  one);.        le
1320: 74 20 5f 20 3d 20 50 75 62 6c 69 63 49 64 54 79  t _ = PublicIdTy
1330: 70 65 3a 3a 6e 65 77 28 26 6d 70 69 64 2c 20 26  pe::new(&mpid, &
1340: 72 65 76 6f 63 61 74 69 6f 6e 5f 6d 70 69 64 29  revocation_mpid)
1350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 74  ;.    }..    #[t
1360: 65 73 74 5d 0a 20 20 20 20 66 6e 20 73 65 72 69  est].    fn seri
1370: 61 6c 69 73 61 74 69 6f 6e 5f 70 75 62 6c 69 63  alisation_public
1380: 5f 6d 61 69 64 28 29 20 7b 0a 20 20 20 20 20 20  _maid() {.      
1390: 20 20 6c 65 74 20 6f 62 6a 5f 62 65 66 6f 72 65    let obj_before
13a0: 3a 20 50 75 62 6c 69 63 49 64 54 79 70 65 20 3d  : PublicIdType =
13b0: 20 52 61 6e 64 6f 6d 3a 3a 67 65 6e 65 72 61 74   Random::generat
13c0: 65 5f 72 61 6e 64 6f 6d 28 29 3b 0a 0a 20 20 20  e_random();..   
13d0: 20 20 20 20 20 6c 65 74 20 73 65 72 69 61 6c 69       let seriali
13e0: 73 65 64 5f 6f 62 6a 20 3d 20 75 6e 77 72 61 70  sed_obj = unwrap
13f0: 21 28 73 65 72 69 61 6c 69 73 65 28 26 6f 62 6a  !(serialise(&obj
1400: 5f 62 65 66 6f 72 65 29 29 3b 0a 20 20 20 20 20  _before));.     
1410: 20 20 20 6c 65 74 20 6f 62 6a 5f 61 66 74 65 72     let obj_after
1420: 3a 20 50 75 62 6c 69 63 49 64 54 79 70 65 20 3d  : PublicIdType =
1430: 20 75 6e 77 72 61 70 21 28 64 65 73 65 72 69 61   unwrap!(deseria
1440: 6c 69 73 65 28 26 73 65 72 69 61 6c 69 73 65 64  lise(&serialised
1450: 5f 6f 62 6a 29 29 3b 0a 0a 20 20 20 20 20 20 20  _obj));..       
1460: 20 61 73 73 65 72 74 5f 65 71 21 28 6f 62 6a 5f   assert_eq!(obj_
1470: 62 65 66 6f 72 65 2c 20 6f 62 6a 5f 61 66 74 65  before, obj_afte
1480: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  r);.    }..    #
1490: 5b 74 65 73 74 5d 0a 20 20 20 20 66 6e 20 65 71  [test].    fn eq
14a0: 75 61 6c 69 74 79 5f 61 73 73 65 72 74 69 6f 6e  uality_assertion
14b0: 5f 70 75 62 6c 69 63 5f 6d 61 69 64 28 29 20 7b  _public_maid() {
14c0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70 75 62  .        let pub
14d0: 6c 69 63 5f 6d 61 69 64 5f 66 69 72 73 74 20 3d  lic_maid_first =
14e0: 20 50 75 62 6c 69 63 49 64 54 79 70 65 3a 3a 67   PublicIdType::g
14f0: 65 6e 65 72 61 74 65 5f 72 61 6e 64 6f 6d 28 29  enerate_random()
1500: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70 75  ;.        let pu
1510: 62 6c 69 63 5f 6d 61 69 64 5f 73 65 63 6f 6e 64  blic_maid_second
1520: 20 3d 20 70 75 62 6c 69 63 5f 6d 61 69 64 5f 66   = public_maid_f
1530: 69 72 73 74 2e 63 6c 6f 6e 65 28 29 3b 0a 20 20  irst.clone();.  
1540: 20 20 20 20 20 20 6c 65 74 20 70 75 62 6c 69 63        let public
1550: 5f 6d 61 69 64 5f 74 68 69 72 64 20 3d 20 50 75  _maid_third = Pu
1560: 62 6c 69 63 49 64 54 79 70 65 3a 3a 67 65 6e 65  blicIdType::gene
1570: 72 61 74 65 5f 72 61 6e 64 6f 6d 28 29 3b 0a 20  rate_random();. 
1580: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
1590: 21 28 70 75 62 6c 69 63 5f 6d 61 69 64 5f 66 69  !(public_maid_fi
15a0: 72 73 74 2c 20 70 75 62 6c 69 63 5f 6d 61 69 64  rst, public_maid
15b0: 5f 73 65 63 6f 6e 64 29 3b 0a 20 20 20 20 20 20  _second);.      
15c0: 20 20 61 73 73 65 72 74 21 28 70 75 62 6c 69 63    assert!(public
15d0: 5f 6d 61 69 64 5f 66 69 72 73 74 20 21 3d 20 70  _maid_first != p
15e0: 75 62 6c 69 63 5f 6d 61 69 64 5f 74 68 69 72 64  ublic_maid_third
15f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b  );.    }..    #[
1600: 74 65 73 74 5d 0a 20 20 20 20 66 6e 20 69 6e 76  test].    fn inv
1610: 61 72 69 61 6e 74 5f 63 68 65 63 6b 28 29 20 7b  ariant_check() {
1620: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 72 65 76  .        let rev
1630: 6f 63 61 74 69 6f 6e 5f 6d 61 69 64 20 3d 20 52  ocation_maid = R
1640: 65 76 6f 63 61 74 69 6f 6e 49 64 54 79 70 65 3a  evocationIdType:
1650: 3a 6e 65 77 3a 3a 3c 4d 61 69 64 54 79 70 65 54  :new::<MaidTypeT
1660: 61 67 73 3e 28 4e 6f 6e 65 29 3b 0a 20 20 20 20  ags>(None);.    
1670: 20 20 20 20 6c 65 74 20 6d 61 69 64 20 3d 20 49      let maid = I
1680: 64 54 79 70 65 3a 3a 6e 65 77 28 26 72 65 76 6f  dType::new(&revo
1690: 63 61 74 69 6f 6e 5f 6d 61 69 64 2c 20 4e 6f 6e  cation_maid, Non
16a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  e);.        let 
16b0: 70 75 62 6c 69 63 5f 6d 61 69 64 20 3d 20 50 75  public_maid = Pu
16c0: 62 6c 69 63 49 64 54 79 70 65 3a 3a 6e 65 77 28  blicIdType::new(
16d0: 26 6d 61 69 64 2c 20 26 72 65 76 6f 63 61 74 69  &maid, &revocati
16e0: 6f 6e 5f 6d 61 69 64 29 3b 0a 20 20 20 20 20 20  on_maid);.      
16f0: 20 20 6c 65 74 20 74 79 70 65 5f 74 61 67 20 3d    let type_tag =
1700: 20 70 75 62 6c 69 63 5f 6d 61 69 64 2e 74 79 70   public_maid.typ
1710: 65 5f 74 61 67 3b 0a 20 20 20 20 20 20 20 20 6c  e_tag;.        l
1720: 65 74 20 70 75 62 6c 69 63 5f 69 64 5f 6b 65 79  et public_id_key
1730: 73 20 3d 20 70 75 62 6c 69 63 5f 6d 61 69 64 2e  s = public_maid.
1740: 70 75 62 6c 69 63 5f 6b 65 79 73 3b 0a 20 20 20  public_keys;.   
1750: 20 20 20 20 20 6c 65 74 20 70 75 62 6c 69 63 5f       let public_
1760: 72 65 76 6f 63 61 74 69 6f 6e 5f 6b 65 79 20 3d  revocation_key =
1770: 20 70 75 62 6c 69 63 5f 6d 61 69 64 2e 72 65 76   public_maid.rev
1780: 6f 63 61 74 69 6f 6e 5f 70 75 62 6c 69 63 5f 6b  ocation_public_k
1790: 65 79 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ey;.        let 
17a0: 63 6f 6d 62 69 6e 65 64 5f 6b 65 79 73 20 3d 20  combined_keys = 
17b0: 28 70 75 62 6c 69 63 5f 69 64 5f 6b 65 79 73 2e  (public_id_keys.
17c0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e  0).            .
17d0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 69  0.            .i
17e0: 6e 74 6f 5f 69 74 65 72 28 29 0a 20 20 20 20 20  nto_iter().     
17f0: 20 20 20 20 20 20 20 2e 63 68 61 69 6e 28 28 70         .chain((p
1800: 75 62 6c 69 63 5f 69 64 5f 6b 65 79 73 2e 31 29  ublic_id_keys.1)
1810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1820: 20 20 20 20 20 20 20 20 2e 30 0a 20 20 20 20 20          .0.     
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 2e 69 6e 74 6f 5f 69 74 65 72 28 29 0a 20    .into_iter(). 
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 2e 63 68 61 69 6e 28 70 75 62        .chain(pub
1870: 6c 69 63 5f 72 65 76 6f 63 61 74 69 6f 6e 5f 6b  lic_revocation_k
1880: 65 79 2e 30 2e 69 6e 74 6f 5f 69 74 65 72 28 29  ey.0.into_iter()
1890: 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ));.        let 
18a0: 6d 75 74 20 63 6f 6d 62 69 6e 65 64 20 3d 20 56  mut combined = V
18b0: 65 63 3a 3a 6e 65 77 28 29 3b 0a 0a 20 20 20 20  ec::new();..    
18c0: 20 20 20 20 66 6f 72 20 69 74 65 72 20 69 6e 20      for iter in 
18d0: 63 6f 6d 62 69 6e 65 64 5f 6b 65 79 73 20 7b 0a  combined_keys {.
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 62              comb
18f0: 69 6e 65 64 2e 70 75 73 68 28 2a 69 74 65 72 29  ined.push(*iter)
1900: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1910: 20 20 20 20 66 6f 72 20 69 20 69 6e 20 74 79 70      for i in typ
1920: 65 5f 74 61 67 2e 74 6f 5f 73 74 72 69 6e 67 28  e_tag.to_string(
1930: 29 2e 69 6e 74 6f 5f 62 79 74 65 73 28 29 20 7b  ).into_bytes() {
1940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d  .            com
1950: 62 69 6e 65 64 2e 70 75 73 68 28 69 29 3b 0a 20  bined.push(i);. 
1960: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1970: 20 20 6c 65 74 20 6d 65 73 73 61 67 65 5f 6c 65    let message_le
1980: 6e 67 74 68 20 3d 20 63 6f 6d 62 69 6e 65 64 2e  ngth = combined.
1990: 6c 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 6c  len();.        l
19a0: 65 74 20 73 69 67 6e 61 74 75 72 65 5f 76 65 63  et signature_vec
19b0: 20 3d 20 72 65 76 6f 63 61 74 69 6f 6e 5f 6d 61   = revocation_ma
19c0: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e  id.            .
19d0: 73 69 67 6e 28 26 63 6f 6d 62 69 6e 65 64 29 0a  sign(&combined).
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 2e 69 6e 74              .int
19f0: 6f 5f 69 74 65 72 28 29 0a 20 20 20 20 20 20 20  o_iter().       
1a00: 20 20 20 20 20 2e 73 6b 69 70 28 6d 65 73 73 61       .skip(messa
1a10: 67 65 5f 6c 65 6e 67 74 68 29 0a 20 20 20 20 20  ge_length).     
1a20: 20 20 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74 3a         .collect:
1a30: 3a 3c 56 65 63 3c 5f 3e 3e 28 29 3b 0a 0a 20 20  :<Vec<_>>();..  
1a40: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
1a50: 28 73 69 67 6e 61 74 75 72 65 5f 76 65 63 2e 6c  (signature_vec.l
1a60: 65 6e 28 29 2c 20 73 69 67 6e 3a 3a 53 49 47 4e  en(), sign::SIGN
1a70: 41 54 55 52 45 42 59 54 45 53 29 3b 0a 0a 20 20  ATUREBYTES);..  
1a80: 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 73 69        let mut si
1a90: 67 6e 61 74 75 72 65 5f 61 72 72 20 3d 20 5b 30  gnature_arr = [0
1aa0: 3b 20 73 69 67 6e 3a 3a 53 49 47 4e 41 54 55 52  ; sign::SIGNATUR
1ab0: 45 42 59 54 45 53 5d 3b 0a 0a 20 20 20 20 20 20  EBYTES];..      
1ac0: 20 20 66 6f 72 20 69 74 20 69 6e 20 73 69 67 6e    for it in sign
1ad0: 61 74 75 72 65 5f 76 65 63 0a 20 20 20 20 20 20  ature_vec.      
1ae0: 20 20 20 20 20 20 20 20 20 20 2e 69 6e 74 6f 5f            .into_
1af0: 69 74 65 72 28 29 0a 20 20 20 20 20 20 20 20 20  iter().         
1b00: 20 20 20 20 20 20 20 2e 74 61 6b 65 28 73 69 67         .take(sig
1b10: 6e 3a 3a 53 49 47 4e 41 54 55 52 45 42 59 54 45  n::SIGNATUREBYTE
1b20: 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
1b30: 20 20 20 2e 65 6e 75 6d 65 72 61 74 65 28 29 20     .enumerate() 
1b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
1b50: 67 6e 61 74 75 72 65 5f 61 72 72 5b 69 74 2e 30  gnature_arr[it.0
1b60: 5d 20 3d 20 69 74 2e 31 3b 0a 20 20 20 20 20 20  ] = it.1;.      
1b70: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6c 65 74    }..        let
1b80: 20 73 69 67 6e 61 74 75 72 65 20 3d 20 73 69 67   signature = sig
1b90: 6e 3a 3a 53 69 67 6e 61 74 75 72 65 28 73 69 67  n::Signature(sig
1ba0: 6e 61 74 75 72 65 5f 61 72 72 29 3b 0a 20 20 20  nature_arr);.   
1bb0: 20 20 20 20 20 61 73 73 65 72 74 21 28 26 73 69       assert!(&si
1bc0: 67 6e 61 74 75 72 65 2e 30 5b 2e 2e 5d 20 3d 3d  gnature.0[..] ==
1bd0: 20 26 70 75 62 6c 69 63 5f 6d 61 69 64 2e 73 69   &public_maid.si
1be0: 67 6e 61 74 75 72 65 28 29 2e 30 5b 2e 2e 5d 29  gnature().0[..])
1bf0: 3b 0a 20 20 20 20 7d 0a 7d 0a                    ;.    }.}.