(self)
| 7174 | |
| 7175 | @support.requires_linux_version(4, 9) # see gh-73510 |
| 7176 | def test_aead_aes_gcm(self): |
| 7177 | kernel_version = support._get_kernel_version("Linux") |
| 7178 | if kernel_version is not None: |
| 7179 | if kernel_version >= (6, 16) and kernel_version < (6, 18): |
| 7180 | # See https://github.com/python/cpython/issues/139310. |
| 7181 | self.skipTest("upstream Linux kernel issue") |
| 7182 | |
| 7183 | key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c') |
| 7184 | iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2') |
| 7185 | plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069') |
| 7186 | assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f') |
| 7187 | expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354') |
| 7188 | expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd') |
| 7189 | |
| 7190 | taglen = len(expected_tag) |
| 7191 | assoclen = len(assoc) |
| 7192 | |
| 7193 | with self.create_alg('aead', 'gcm(aes)') as algo: |
| 7194 | algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key) |
| 7195 | algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE, |
| 7196 | None, taglen) |
| 7197 | |
| 7198 | # send assoc, plain and tag buffer in separate steps |
| 7199 | op, _ = algo.accept() |
| 7200 | with op: |
| 7201 | op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv, |
| 7202 | assoclen=assoclen, flags=socket.MSG_MORE) |
| 7203 | op.sendall(assoc, socket.MSG_MORE) |
| 7204 | op.sendall(plain) |
| 7205 | res = op.recv(assoclen + len(plain) + taglen) |
| 7206 | self.assertEqual(expected_ct, res[assoclen:-taglen]) |
| 7207 | self.assertEqual(expected_tag, res[-taglen:]) |
| 7208 | |
| 7209 | # now with msg |
| 7210 | op, _ = algo.accept() |
| 7211 | with op: |
| 7212 | msg = assoc + plain |
| 7213 | op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv, |
| 7214 | assoclen=assoclen) |
| 7215 | res = op.recv(assoclen + len(plain) + taglen) |
| 7216 | self.assertEqual(expected_ct, res[assoclen:-taglen]) |
| 7217 | self.assertEqual(expected_tag, res[-taglen:]) |
| 7218 | |
| 7219 | # create anc data manually |
| 7220 | pack_uint32 = struct.Struct('I').pack |
| 7221 | op, _ = algo.accept() |
| 7222 | with op: |
| 7223 | msg = assoc + plain |
| 7224 | op.sendmsg( |
| 7225 | [msg], |
| 7226 | ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)], |
| 7227 | [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv], |
| 7228 | [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)], |
| 7229 | ) |
| 7230 | ) |
| 7231 | res = op.recv(len(msg) + taglen) |
| 7232 | self.assertEqual(expected_ct, res[assoclen:-taglen]) |
| 7233 | self.assertEqual(expected_tag, res[-taglen:]) |
nothing calls this directly
no test coverage detected