github.com/sagernet/netlink@v0.0.0-20240612041022-b9a21c07ac6a/nl/xfrm_state_linux_test.go (about) 1 package nl 2 3 import ( 4 "bytes" 5 "crypto/rand" 6 "encoding/binary" 7 "testing" 8 ) 9 10 func (msg *XfrmUsersaId) write(b []byte) { 11 native := NativeEndian() 12 msg.Daddr.write(b[0:SizeofXfrmAddress]) 13 native.PutUint32(b[SizeofXfrmAddress:SizeofXfrmAddress+4], msg.Spi) 14 native.PutUint16(b[SizeofXfrmAddress+4:SizeofXfrmAddress+6], msg.Family) 15 b[SizeofXfrmAddress+6] = msg.Proto 16 b[SizeofXfrmAddress+7] = msg.Pad 17 } 18 19 func (msg *XfrmUsersaId) serializeSafe() []byte { 20 b := make([]byte, SizeofXfrmUsersaId) 21 msg.write(b) 22 return b 23 } 24 25 func deserializeXfrmUsersaIdSafe(b []byte) *XfrmUsersaId { 26 var msg = XfrmUsersaId{} 27 binary.Read(bytes.NewReader(b[0:SizeofXfrmUsersaId]), NativeEndian(), &msg) 28 return &msg 29 } 30 31 func TestXfrmUsersaIdDeserializeSerialize(t *testing.T) { 32 var orig = make([]byte, SizeofXfrmUsersaId) 33 rand.Read(orig) 34 safemsg := deserializeXfrmUsersaIdSafe(orig) 35 msg := DeserializeXfrmUsersaId(orig) 36 testDeserializeSerialize(t, orig, safemsg, msg) 37 } 38 39 func (msg *XfrmStats) write(b []byte) { 40 native := NativeEndian() 41 native.PutUint32(b[0:4], msg.ReplayWindow) 42 native.PutUint32(b[4:8], msg.Replay) 43 native.PutUint32(b[8:12], msg.IntegrityFailed) 44 } 45 46 func (msg *XfrmStats) serializeSafe() []byte { 47 b := make([]byte, SizeofXfrmStats) 48 msg.write(b) 49 return b 50 } 51 52 func deserializeXfrmStatsSafe(b []byte) *XfrmStats { 53 var msg = XfrmStats{} 54 binary.Read(bytes.NewReader(b[0:SizeofXfrmStats]), NativeEndian(), &msg) 55 return &msg 56 } 57 58 func TestXfrmStatsDeserializeSerialize(t *testing.T) { 59 var orig = make([]byte, SizeofXfrmStats) 60 rand.Read(orig) 61 safemsg := deserializeXfrmStatsSafe(orig) 62 msg := DeserializeXfrmStats(orig) 63 testDeserializeSerialize(t, orig, safemsg, msg) 64 } 65 66 func (msg *XfrmUsersaInfo) write(b []byte) { 67 const IdEnd = SizeofXfrmSelector + SizeofXfrmId 68 const AddressEnd = IdEnd + SizeofXfrmAddress 69 const CfgEnd = AddressEnd + SizeofXfrmLifetimeCfg 70 const CurEnd = CfgEnd + SizeofXfrmLifetimeCur 71 const StatsEnd = CurEnd + SizeofXfrmStats 72 native := NativeEndian() 73 msg.Sel.write(b[0:SizeofXfrmSelector]) 74 msg.Id.write(b[SizeofXfrmSelector:IdEnd]) 75 msg.Saddr.write(b[IdEnd:AddressEnd]) 76 msg.Lft.write(b[AddressEnd:CfgEnd]) 77 msg.Curlft.write(b[CfgEnd:CurEnd]) 78 msg.Stats.write(b[CurEnd:StatsEnd]) 79 native.PutUint32(b[StatsEnd:StatsEnd+4], msg.Seq) 80 native.PutUint32(b[StatsEnd+4:StatsEnd+8], msg.Reqid) 81 native.PutUint16(b[StatsEnd+8:StatsEnd+10], msg.Family) 82 b[StatsEnd+10] = msg.Mode 83 b[StatsEnd+11] = msg.ReplayWindow 84 b[StatsEnd+12] = msg.Flags 85 copy(b[StatsEnd+13:StatsEnd+20], msg.Pad[:]) 86 } 87 88 func (msg *XfrmUsersaInfo) serializeSafe() []byte { 89 b := make([]byte, SizeofXfrmUsersaInfo) 90 msg.write(b) 91 return b 92 } 93 94 func deserializeXfrmUsersaInfoSafe(b []byte) *XfrmUsersaInfo { 95 var msg = XfrmUsersaInfo{} 96 binary.Read(bytes.NewReader(b[0:SizeofXfrmUsersaInfo]), NativeEndian(), &msg) 97 return &msg 98 } 99 100 func TestXfrmUsersaInfoDeserializeSerialize(t *testing.T) { 101 var orig = make([]byte, SizeofXfrmUsersaInfo) 102 rand.Read(orig) 103 safemsg := deserializeXfrmUsersaInfoSafe(orig) 104 msg := DeserializeXfrmUsersaInfo(orig) 105 testDeserializeSerialize(t, orig, safemsg, msg) 106 } 107 108 func (msg *XfrmAlgo) write(b []byte) { 109 native := NativeEndian() 110 copy(b[0:64], msg.AlgName[:]) 111 native.PutUint32(b[64:68], msg.AlgKeyLen) 112 copy(b[68:msg.Len()], msg.AlgKey[:]) 113 } 114 115 func (msg *XfrmAlgo) serializeSafe() []byte { 116 b := make([]byte, msg.Len()) 117 msg.write(b) 118 return b 119 } 120 121 func (msg *XfrmUserSpiInfo) write(b []byte) { 122 native := NativeEndian() 123 msg.XfrmUsersaInfo.write(b[0:SizeofXfrmUsersaInfo]) 124 native.PutUint32(b[SizeofXfrmUsersaInfo:SizeofXfrmUsersaInfo+4], msg.Min) 125 native.PutUint32(b[SizeofXfrmUsersaInfo+4:SizeofXfrmUsersaInfo+8], msg.Max) 126 } 127 128 func (msg *XfrmUserSpiInfo) serializeSafe() []byte { 129 b := make([]byte, SizeofXfrmUserSpiInfo) 130 msg.write(b) 131 return b 132 } 133 134 func deserializeXfrmUserSpiInfoSafe(b []byte) *XfrmUserSpiInfo { 135 var msg = XfrmUserSpiInfo{} 136 binary.Read(bytes.NewReader(b[0:SizeofXfrmUserSpiInfo]), NativeEndian(), &msg) 137 return &msg 138 } 139 140 func TestXfrmUserSpiInfoDeserializeSerialize(t *testing.T) { 141 var orig = make([]byte, SizeofXfrmUserSpiInfo) 142 rand.Read(orig) 143 safemsg := deserializeXfrmUserSpiInfoSafe(orig) 144 msg := DeserializeXfrmUserSpiInfo(orig) 145 testDeserializeSerialize(t, orig, safemsg, msg) 146 } 147 148 func deserializeXfrmAlgoSafe(b []byte) *XfrmAlgo { 149 var msg = XfrmAlgo{} 150 copy(msg.AlgName[:], b[0:64]) 151 binary.Read(bytes.NewReader(b[64:68]), NativeEndian(), &msg.AlgKeyLen) 152 msg.AlgKey = b[68:msg.Len()] 153 return &msg 154 } 155 156 func TestXfrmAlgoDeserializeSerialize(t *testing.T) { 157 native := NativeEndian() 158 // use a 32 byte key len 159 var orig = make([]byte, SizeofXfrmAlgo+32) 160 rand.Read(orig) 161 // set the key len to 256 bits 162 var KeyLen uint32 = 0x00000100 163 // Little Endian Big Endian 164 // orig[64] = 0 orig[64] = 0 165 // orig[65] = 1 orig[65] = 0 166 // orig[66] = 0 orig[66] = 1 167 // orig[67] = 0 orig[67] = 0 168 native.PutUint32(orig[64:68], KeyLen) 169 safemsg := deserializeXfrmAlgoSafe(orig) 170 msg := DeserializeXfrmAlgo(orig) 171 testDeserializeSerialize(t, orig, safemsg, msg) 172 } 173 174 func (msg *XfrmAlgoAuth) write(b []byte) { 175 native := NativeEndian() 176 copy(b[0:64], msg.AlgName[:]) 177 native.PutUint32(b[64:68], msg.AlgKeyLen) 178 native.PutUint32(b[68:72], msg.AlgTruncLen) 179 copy(b[72:msg.Len()], msg.AlgKey[:]) 180 } 181 182 func (msg *XfrmAlgoAuth) serializeSafe() []byte { 183 b := make([]byte, msg.Len()) 184 msg.write(b) 185 return b 186 } 187 188 func deserializeXfrmAlgoAuthSafe(b []byte) *XfrmAlgoAuth { 189 var msg = XfrmAlgoAuth{} 190 copy(msg.AlgName[:], b[0:64]) 191 binary.Read(bytes.NewReader(b[64:68]), NativeEndian(), &msg.AlgKeyLen) 192 binary.Read(bytes.NewReader(b[68:72]), NativeEndian(), &msg.AlgTruncLen) 193 msg.AlgKey = b[72:msg.Len()] 194 return &msg 195 } 196 197 func TestXfrmAlgoAuthDeserializeSerialize(t *testing.T) { 198 native := NativeEndian() 199 // use a 32 byte key len 200 var orig = make([]byte, SizeofXfrmAlgoAuth+32) 201 rand.Read(orig) 202 // set the key len to 256 bits 203 var KeyLen uint32 = 0x00000100 204 // Little Endian Big Endian 205 // orig[64] = 0 orig[64] = 0 206 // orig[65] = 1 orig[65] = 0 207 // orig[66] = 0 orig[66] = 1 208 // orig[67] = 0 orig[67] = 0 209 native.PutUint32(orig[64:68], KeyLen) 210 safemsg := deserializeXfrmAlgoAuthSafe(orig) 211 msg := DeserializeXfrmAlgoAuth(orig) 212 testDeserializeSerialize(t, orig, safemsg, msg) 213 } 214 215 func (msg *XfrmEncapTmpl) write(b []byte) { 216 native := NativeEndian() 217 native.PutUint16(b[0:2], msg.EncapType) 218 native.PutUint16(b[2:4], msg.EncapSport) 219 native.PutUint16(b[4:6], msg.EncapDport) 220 copy(b[6:8], msg.Pad[:]) 221 msg.EncapOa.write(b[8:SizeofXfrmAddress]) 222 } 223 224 func (msg *XfrmEncapTmpl) serializeSafe() []byte { 225 b := make([]byte, SizeofXfrmEncapTmpl) 226 msg.write(b) 227 return b 228 } 229 230 func deserializeXfrmEncapTmplSafe(b []byte) *XfrmEncapTmpl { 231 var msg = XfrmEncapTmpl{} 232 binary.Read(bytes.NewReader(b[0:SizeofXfrmEncapTmpl]), NativeEndian(), &msg) 233 return &msg 234 } 235 236 func TestXfrmEncapTmplDeserializeSerialize(t *testing.T) { 237 var orig = make([]byte, SizeofXfrmEncapTmpl) 238 rand.Read(orig) 239 safemsg := deserializeXfrmEncapTmplSafe(orig) 240 msg := DeserializeXfrmEncapTmpl(orig) 241 testDeserializeSerialize(t, orig, safemsg, msg) 242 } 243 244 func (msg *XfrmMark) write(b []byte) { 245 native := NativeEndian() 246 native.PutUint32(b[0:4], msg.Value) 247 native.PutUint32(b[4:8], msg.Mask) 248 } 249 250 func (msg *XfrmMark) serializeSafe() []byte { 251 b := make([]byte, SizeofXfrmMark) 252 msg.write(b) 253 return b 254 } 255 256 func deserializeXfrmMarkSafe(b []byte) *XfrmMark { 257 var msg = XfrmMark{} 258 binary.Read(bytes.NewReader(b[0:SizeofXfrmMark]), NativeEndian(), &msg) 259 return &msg 260 } 261 262 func TestXfrmMarkDeserializeSerialize(t *testing.T) { 263 var orig = make([]byte, SizeofXfrmMark) 264 rand.Read(orig) 265 safemsg := deserializeXfrmMarkSafe(orig) 266 msg := DeserializeXfrmMark(orig) 267 testDeserializeSerialize(t, orig, safemsg, msg) 268 } 269 270 func (msg *XfrmAlgoAEAD) write(b []byte) { 271 native := NativeEndian() 272 copy(b[0:64], msg.AlgName[:]) 273 native.PutUint32(b[64:68], msg.AlgKeyLen) 274 native.PutUint32(b[68:72], msg.AlgICVLen) 275 copy(b[72:msg.Len()], msg.AlgKey[:]) 276 } 277 278 func (msg *XfrmAlgoAEAD) serializeSafe() []byte { 279 b := make([]byte, msg.Len()) 280 msg.write(b) 281 return b 282 } 283 284 func deserializeXfrmAlgoAEADSafe(b []byte) *XfrmAlgoAEAD { 285 var msg = XfrmAlgoAEAD{} 286 copy(msg.AlgName[:], b[0:64]) 287 binary.Read(bytes.NewReader(b[64:68]), NativeEndian(), &msg.AlgKeyLen) 288 binary.Read(bytes.NewReader(b[68:72]), NativeEndian(), &msg.AlgICVLen) 289 msg.AlgKey = b[72:msg.Len()] 290 return &msg 291 } 292 293 func TestXfrmXfrmAlgoAeadDeserializeSerialize(t *testing.T) { 294 native := NativeEndian() 295 // use a 32 byte key len 296 var orig = make([]byte, SizeofXfrmAlgoAEAD+36) 297 rand.Read(orig) 298 // set the key len to (256 + 32) bits 299 var KeyLen uint32 = 0x00000120 300 native.PutUint32(orig[64:68], KeyLen) 301 safemsg := deserializeXfrmAlgoAEADSafe(orig) 302 msg := DeserializeXfrmAlgoAEAD(orig) 303 testDeserializeSerialize(t, orig, safemsg, msg) 304 }