decrypt a MACsec frame for this Secure Association
(self, orig_pkt, assoclen=None)
| 178 | return hdr |
| 179 | |
| 180 | def decrypt(self, orig_pkt, assoclen=None): |
| 181 | """decrypt a MACsec frame for this Secure Association""" |
| 182 | hdr = copy.deepcopy(orig_pkt) |
| 183 | del hdr[MACsec].payload |
| 184 | pktlen = len(orig_pkt) |
| 185 | if self.send_sci: |
| 186 | hdrlen = NOSCI_LEN + SCI_LEN |
| 187 | else: |
| 188 | hdrlen = NOSCI_LEN |
| 189 | if assoclen is None or not self.do_encrypt: |
| 190 | if self.do_encrypt: |
| 191 | assoclen = hdrlen |
| 192 | else: |
| 193 | assoclen = pktlen - self.icvlen |
| 194 | iv = self.make_iv(hdr) |
| 195 | assoc, ct, icv = MACsecSA.split_pkt(orig_pkt, assoclen, self.icvlen) |
| 196 | decryptor = Cipher( |
| 197 | algorithms.AES(self.key), |
| 198 | modes.GCM(iv, icv), |
| 199 | backend=default_backend() |
| 200 | ).decryptor() |
| 201 | decryptor.authenticate_additional_data(assoc) |
| 202 | pt = assoc[hdrlen:assoclen] |
| 203 | pt += decryptor.update(ct) |
| 204 | pt += decryptor.finalize() |
| 205 | hdr[MACsec].type = struct.unpack('!H', pt[0:2])[0] |
| 206 | hdr[MACsec].payload = Raw(pt[2:]) |
| 207 | return hdr |
| 208 | |
| 209 | |
| 210 | class MACsec(Packet): |