summaryrefslogtreecommitdiffstats
path: root/src/vnet/ip
AgeCommit message (Collapse)AuthorFilesLines
2017-10-29session: fix coverity warningsFlorin Coras1-3/+8
Change-Id: Ib87eccb853cafceea5f5513f6bb51c2364449afa Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-28session: rules tablesFlorin Coras2-0/+118
This introduces 5-tuple lookup tables that may be used to implement custom session layer actions at connection establishment time (session layer perspective). The rules table build mask-match-action lookup trees that for a given 5-tuple key return the action for the first longest match. If rules overlap, ordering is established by tuple longest match with the following descending priority: remote ip, local ip, remote port, local port. At this time, the only match action supported is to forward packets to the application identified by the action. Change-Id: Icbade6fac720fa3979820d50cd7d6137f8b635c3 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-25L3 proxy FIB source for container networkingAndrew Yourtchenko1-0/+79
Change-Id: I4164c4c19c8dbfd73e6ddf94a12056325cc093b9 Signed-off-by: Neale Ranns <nranns@cisco.com> Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
2017-10-24Add extern to *_main global variable declarations in header files.Dave Wallace4-2/+6
- Global variables declared in header files without the use of the 'extern' keword will result in multiple instances of the variable to be created by the compiler -- one for each different source file in which the the header file is included. This results in wasted memory allocated in the BSS segments as well as potentially introducing bugs in the application. Change-Id: I6ef1790b60a0bd9dd3994f8510723decf258b0cc Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
2017-10-19Remove unused 'not_last' parameter from ip_add_del_routeMarek Gradzki1-3/+0
Vat supports setting value for the parameter, but 'not_last' is ignored by ip_add_del_route handler, so can be removed. This patch - updates ip.api, - removes vat handlers - updates vpp_papi_provider.py (also mpls_route_add_del with unused not_last) Change-Id: Ife15de123db4bc8247103a29b90bce1988e46534 Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
2017-10-18VPP-930: add missing ntohl to send_ip6_fib_details(...)Dave Barach1-1/+1
Change-Id: I0c1671f3eaf2dad084e3ac9fb124c9ed78273f50 Signed-off-by: Dave Barach <dave@barachs.net>
2017-10-16udp: refactor udp codeFlorin Coras2-12/+46
Change-Id: I44d5c9df7c49b8d4d5677c6d319033b2da3e6b80 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-15ip: avoid arp assert if out of buffers (VPP-1030)Florin Coras1-0/+4
Change-Id: Ia31b978c6c1619c3e0075a84fcbbb6ccbf1c0076 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-15Revert "Enforce FIB table creation before use"Florin Coras2-3/+37
This reverts commit f9342023c19887da656133e2688a90d70383b0c5. Reverting to unblock master. No idea why jjb +1ed this patch! On closer inspection it looks like it -1ed it and subsequently changed opinion. CSIT tests should be fixed before re-merging. Change-Id: I26608912a962c52083073e16c7c9d2cc44a3cc8d Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-14Source Lookup progammable via APINeale Ranns2-0/+9
Change-Id: I5d5d4f22b6369d504455a644f73076d772fbcfb4 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-10-13Enforce FIB table creation before useNeale Ranns2-37/+3
last i the serise of the use of the FIB table create/delete API. VPP now forces the tables to have been explicitly creted before they are used. Change-Id: Ifde3b1bbb76697a01ab71bce4f5264e6d1725467 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-10-13VPP-1027: DNS name resolverDave Barach1-0/+3
This patch is a plausible first-cut, suitable for initial testing by vcl (host stack client library). Main features; - recursive name resolution - multiple ip4/ip6 name servers - cache size limit enforcement - currently limited to 65K - ttl / aging - static mapping support - show / clear / debug CLI commands Binary APIs provided for the following: - add/delete name servers - enable/disable the name cache - resolve a name To Do list: - Respond to ip4/ip6 client DNS requests (vs. binary API requests) - Perf / scale tuning - map pending transaction ids to pool indices, so the cache can (greatly) exceed 65K entries - Security improvements - Use unpredictable dns transaction IDs, related to previous item - Make sure that response-packet src ip addresses match the server - Add binary APIs - deliver raw response data to clients - control recursive name resolution - Documentation Change-Id: I48c373d5c05d7108ccd814d4055caf8c75ca10b7 Signed-off-by: Dave Barach <dave@barachs.net>
2017-10-10session: add support for application namespacingFlorin Coras4-0/+162
Applications are now provided the option to select the namespace they are to be attached to and the scope of their attachement. Application namespaces are meant to: 1) constrain the scope of communication through the network by association with source interfaces and/or fib tables that provide the source ips to be used and limit the scope of routing 2) provide a namespace local scope to session layer communication, as opposed to the global scope provided by 1). That is, sessions can be established without assistance from transport and network layers. Albeit, zero/local-host ip addresses must still be provided in session establishment messages due to existing application idiosyncrasies. This mode of communication uses shared-memory fifos (cut-through sessions) exclusively. If applications request no namespace, they are assigned to the default one, which at its turn uses the default fib. Applications can request access to both local and global scopes for a namespace. If no scope is specified, session layer defaults to the global one. When a sw_if_index is provided for a namespace, zero-ip (INADDR_ANY) binds are converted to binds to the requested interface. Change-Id: Ia0f660bbf7eec7f89673f75b4821fc7c3d58e3d1 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-10punt and drop features:Neale Ranns11-147/+1501
- new IPv4 and IPv6 feature arcs on the punt and drop nodes - new features: - redirect punted traffic to an interface and nexthop - police punted traffic. Change-Id: I53be8bf4e06545add8a3619e462de5ffedd0a95c Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-10-09IP neighbour move incorrectly placed jump labelNeale Ranns1-2/+2
Change-Id: I19fdf13a4848306ee3841d822b832cba96c5bce5 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-10-09vppapigen: support per-file (major,minor,patch) version stampsDave Barach1-0/+2
Add one of these statements to foo.api: vl_api_version 1.2.3 to generate a version tuple stanza in foo.api.h: /****** Version tuple *****/ vl_api_version_tuple(foo, 1, 2, 3) Change-Id: Ic514439e4677999daa8463a94f948f76b132ff15 Signed-off-by: Dave Barach <dave@barachs.net> Signed-off-by: Ole Troan <ot@cisco.com>
2017-10-09NAT: hairpinning rework (VPP-1003)Matus Fabian1-1/+9
Change-Id: I7c6911cd6ac366fe62675fd0ff8b0246a25ea1db Signed-off-by: Matus Fabian <matfabia@cisco.com>
2017-10-05Distributed Virtual Router SupportNeale Ranns2-0/+6
A distributed virtual router works by attmpeting to switch a packet, but on failing to find a local consumer (i.e. the packet is destined to a locally attached host) then the packet is sent unmodified 'upstream' to where the rest of the 'distributed' router is present. When L3 switching a packet this means the L2 header must not be modifed. This patch adds a 'l2-bridge' object to the L3 FIB which re-injects packets from the L3 path back into the L2 path - use with extreme caution. Change-Id: I069724eb45956647d7980cbe40a80a788ee6ee82 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-10-04[aarch64] Fixes CLI crashes on dpaa2 platform.Christophe Fontaine5-9/+9
- always use 'va_args' as pointer in all format_* functions - u32 for all 'indent' params as it's declaration was inconsistent Change-Id: Ic5799309a6b104c9b50fec309cba789c8da99e79 Signed-off-by: Christophe Fontaine <christophe.fontaine@enea.com>
2017-10-03Repair vlib API socket serverDave Barach3-9/+26
- Teach vpp_api_test to send/receive API messages over sockets - Add memfd-based shared memory - Add api messages to create memfd-based shared memory segments - vpp_api_test supports both socket and shared memory segment connections - vpp_api_test pivot from socket to shared memory API messaging - add socket client support to libvlibclient.so - dead client reaper sends ping messages, container-friendly - dead client reaper falls back to kill (<pid>, 0) live checking if e.g. a python app goes silent for tens of seconds - handle ping messages in python client support code - teach show api ring about pairwise shared-memory segments - fix ip probing of already resolved destinations (VPP-998) We'll need this work to implement proper host-stack client isolation Change-Id: Ic23b65f75c854d0393d9a2e9d6b122a9551be769 Signed-off-by: Dave Barach <dave@barachs.net> Signed-off-by: Dave Wallace <dwallacelf@gmail.com> Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-10-03Propagate duplicate IF addr add/del error up to API.Jon Loeliger1-1/+11
Identify and complain when the same IP prefix is assigned to two different SW interfaces: vpp# set int ip address TenGigabitEthernet6/0/0 1.2.3.4/32 vpp# set int ip address TenGigabitEthernet6/0/1 1.2.3.4/32 set interface ip address: Prefix 1.2.3.4/32 already found on interface TenGigabitEthernet6/0/0 Change-Id: I1aee1b6a7ddd00d3109a53d8e1b6ce97bf45e372 Signed-off-by: Jon Loeliger <jdl@netgate.com>
2017-09-26Add thread-safe event signaller, use RPC where requiredDave Barach1-2/+2
Update ping code to use the new function Change-Id: Ieb753b23f8402cbe5667c22747896784c8ece937 Signed-off-by: Florin Coras <fcoras@cisco.com> Signed-off-by: Dave Barach <dave@barachs.net>
2017-09-22IP-MAC,ND:wildcard events,fix sending multiple eventsEyal Bari2-20/+61
wildcard ND events publisher was sending the last event mutiple times Change-Id: I6c30f2de03fa825e79df9005a3cfaaf68ff7ea2f Signed-off-by: Eyal Bari <ebari@cisco.com>
2017-09-20tcp: add option to punt trafficPierre Pfister1-24/+42
Until now, if the stack didn't find a connection for a packet, it sent back a reset. With the punt option enabled, packets are now enqueued to error-punt where they can be handed off to the host os. Change-Id: I12dea8694b8bd24c92b0d601412928aa7b8046cb Signed-off-by: Florin Coras <fcoras@cisco.com> Signed-off-by: Pierre Pfister <ppfister@cisco.com>
2017-09-20Add ip6-local feature arcPierre Pfister3-7/+99
ip4-local feature arc existed but not ip6-local one. This patch also adds node name to the 'show ip local' command and fixes a minor include issue in vnet/ip/ip4.h file. Change-Id: I9bb8a7159917d58f89afcce974680de20d946a70 Signed-off-by: Pierre Pfister <ppfister@cisco.com>
2017-09-19Treat label=0 as an invalid next-hop-via-labelNeale Ranns1-1/+7
Change-Id: I831226111d26f5c8a795e0773e23fddcddfb1613 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-09-15dpdk: cli to check for buffer leakageFlorin Coras1-0/+1
Use buffer pre_data and existing buffer trace trajectory code to find out dpdk buffer leakages. Change-Id: I26a5d8bd2f23d01cb6070ffc3ddcc6d3d863b575 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-09-13Add a name to the creation of an IP and MPLS tableNeale Ranns4-20/+32
Change-Id: I4b4648831551519b2ffb6f93255d28a4b8726c22 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-09-11replace uint32_t with u32Neale Ranns3-7/+7
Change-Id: I6cab79c266837a8731adcf78c9e093dfa6be0ead Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-09-11arp/glean: fix hash computationFlorin Coras1-1/+2
Change-Id: Ifef8a9328bb865f6ddb041bafe3699153f89755a Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-09-11FIB table add/delete APINeale Ranns9-250/+453
part 2; - this adds the code to create an IP and MPLS table via the API. - but the enforcement that the table must be created before it is used is still missing, this is so that CSIT can pass. Change-Id: Id124d884ade6cb7da947225200e3bb193454c555 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-09-09move unix_file_* code to vppinfraDamjan Marion2-5/+5
This will allow us to use this code in client libraries without vlib. Change-Id: I8557b752496841ba588aa36b6082cbe2cd1867fe Signed-off-by: Damjan Marion <damarion@cisco.com>
2017-09-08PUNT: Missing include for readv()Marco Varlese1-0/+1
The missing header include was generating a compile-time error; src/vnet/ip/punt.c:460:10: error: implicit declaration of function 'readv' Change-Id: I3f74294e7824ea3602b8d416c86fdada1aac1906 Signed-off-by: Marco Varlese <marco.varlese@suse.com>
2017-09-05PUNT socket: External control plane processes connected via UNIX domain sockets.Ole Troan3-11/+555
An external (to VPP) process can register (over the VPP binary API) to receive control plane packets over a UNIX domain socket. The packets are prepended with a packet descriptor containing meta-data (if_index of interface, etc). Currently only UDP is supported. The socket supports sending of packets/frames as well. The sent packet is prepended with a descriptor, telling VPP to route the packet (via ip4-lookup, ip6-lookup) or as an pre-formed Ethernet frame that is sent directly to interface-output. The intended use case for this is for an external DHCP client or a RIP implementation. New configuration option: punt { socket <socket path> } To register use the punt_socket API message. TODO: - Add support for pre-routing. I.e send L3 packet to given TX interface, but do ARP/ND (ip[46]-rewrite) - Add test scripts - Support for abstract names (starting with \0) - Add rate limiting (COP) - Support for other protocols, e.g. IPv6 ND Change-Id: I4a0afc8020deebb3d9d74686dde694ee5bcb8d0f Signed-off-by: Ole Troan <ot@cisco.com>
2017-08-31Fix vent_data memory leak in function run_ping_ip46_address (VPP-966)dongjuan1-0/+1
Change-Id: I05d0c8310aa86480a3d283f45e115284c4b4ebd5 Signed-off-by: dongjuan <dong.juan1@zte.com.cn>
2017-08-22ping: remove unnecesary x86 intrinsics #includeDamjan Marion1-1/+0
This include file is present only on x86 so it breaks non-x86 builds. Change-Id: I6406b0b36f207b684535961545e95dbba707d267 Signed-off-by: Damjan Marion <damarion@cisco.com>
2017-08-19Fixed ip add bug for ip6 with review commentspragash1-4/+4
Change-Id: Ie1fba1a32020775444c7b1ed800e8559b54691ff Signed-off-by: pragash <pxv3620@rit.edu>
2017-08-16ip4: cleanup ip localFlorin Coras1-153/+85
Change-Id: I4f751b0181f25ec6c4abd3a9c7b0386d80743b3a Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-08-16tcp: fix v6 sessionsroot1-54/+64
Change-Id: Ia6dd5e948b17b2f3866fe70838eabb09e35415e1 Signed-off-by: Dave Barach <dbarach@cisco.com> Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-08-16NAT64: Fallback to 3-tuple key for non TCP/UDP sessions (VPP-884)Matus Fabian2-0/+123
Change-Id: I4cafc8291725feb499355092bd429433e649b5b2 Signed-off-by: Matus Fabian <matfabia@cisco.com>
2017-08-15IPv6 local-address for P2P ethernet interfacesPavel Kotucek1-1/+2
Change-Id: I87d3cb5754843f38593e92f60a39af2e5241d1cf Signed-off-by: Pavel Kotucek <pkotucek@cisco.com>
2017-08-14FIB table add/delete API onlyNeale Ranns2-0/+28
commit only the addition of the .api definition and their invocation through VAT so CSIT can use it Change-Id: Id510f14b1ce007fe5e92120507ea34100652fc64 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-08-11Fix tcp multi buffer segments retransmissionFlorin Coras1-5/+7
- Fix tcp/udp sw checksum computation - Fix allocation of multi buffer tcp segments for retransmits - Send FIN only if/when tx fifo is empty Change-Id: I2e43a14b87a72c9e547b4339b9a51811cf5732c4 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-08-09Allow multiple MPLS output labels to be passed on the CLINeale Ranns1-3/+10
Change-Id: Ib5af105e32b6b0df86923e189ab6bf6ee59de5b9 Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-08-08L2 over MPLSNeale Ranns5-35/+41
[support for VPWS/VPLS] - switch to using dpo_proto_t rather than fib_protocol_t in fib_paths so that we can describe L2 paths - VLIB nodes to handle pop/push of MPLS labels to L2 Change-Id: Id050d06a11fd2c9c1c81ce5a0654e6c5ae6afa6e Signed-off-by: Neale Ranns <nranns@cisco.com>
2017-08-02Fix vpp crash sending arp or probing neighb (VPP-917)Pavel Kotucek2-0/+29
VPP crash when trying to send arp message or to probe neighbor over interface with IP address but without hw address (local0 and tunnels - vxlan, gre, ...) Change-Id: I08a1c97d3ea913fc11b2886cf73b2ccc31356664 Signed-off-by: Pavel Kotucek <pkotucek@cisco.com>
2017-08-02Fix ip checksum offload, move badly-placed ASSERTDave Barach1-0/+2
Change-Id: I5e04d618c4b4987edc64f6d82fd0a81b8362dbb0 Signed-off-by: Dave Barach <dbarach@cisco.com>
2017-08-02Fix tcp tx buffer allocationFlorin Coras1-2/+0
- Make tcp output buffer allocation macro an inline function - Use per ip version per thread tx frames for retransmits and timer events - Fix / parameterize tcp data structure preallocation - Add a couple of gdb-callable show commands - Fix local endpoint cleanup Change-Id: I67b47b7570aa14cb4634b6fd93c57cd2eacbfa29 Signed-off-by: Florin Coras <fcoras@cisco.com> Signed-off-by: Dave Barach <dave@barachs.net>
2017-08-02Make ip csum configurable in vlib buffer functionsFlorin Coras2-2/+4
Also fixes csum computation for lisp control plane 4o6 encapsulated control messages. Change-Id: I991e0b5c0d16dc51e0b5bdc79e1d752270b34765 Signed-off-by: Florin Coras <fcoras@cisco.com>
2017-08-01FIB path weight incorrect in dump (VPP-922)Neale Ranns1-3/+5
Change-Id: I655f41878ca3595681d0255782b0faba01c9824b Signed-off-by: Neale Ranns <nranns@cisco.com>
an>, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b, }; static const u8 tc2_ciphertext256[] = { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 }; static const u8 tc2_tag256[] = { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 }; static const u8 tc2_plaintext[16] = { 0, }; static const u8 tc2_tag128[] = { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }; static const u8 tc2_ciphertext128[] = { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 }; static const u8 tc3_key128[] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }; static const u8 tc3_iv[] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88 }; static const u8 tc3_plaintext[] = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }; static const u8 tc3_ciphertext128[] = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 }; static const u8 tc3_tag128[] = { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }; static const u8 tc3_key256[] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }; static const u8 tc3_ciphertext256[] = { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad }; static const u8 tc3_tag256[] = { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd, 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c }; static const u8 tc4_plaintext[] = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39, }; static const u8 tc4_aad[] = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 }; static const u8 tc4_ciphertext128[] = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, 0x3d, 0x58, 0xe0, 0x91 }; static const u8 tc4_tag128[] = { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }; static const u8 tc4_ciphertext256[] = { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62 }; static const u8 tc4_tag256[] = { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }; static const u8 inc_key[] = { 0x97, 0x3e, 0x43, 0x70, 0x84, 0x71, 0xd4, 0xe2, 0x45, 0xd1, 0xcb, 0x79, 0xe8, 0xd7, 0x5f, 0x3b, 0x97, 0x3e, 0x43, 0x70, 0x84, 0x71, 0xd4, 0xe2, 0x45, 0xd1, 0xcb, 0x79, 0xe8, 0xd7, 0x5f, 0x3b }; static const u8 inc_iv[] = { 0xe2, 0xe4, 0x3f, 0x29, 0xfe, 0xd4, 0xbc, 0x31, 0x56, 0xa7, 0x97, 0xf5 }; static const struct { const u16 n_bytes; const u64 tag_gcm_128[2]; const u64 tag_gcm_256[2]; const u64 tag_gmac_128[2]; const u64 tag_gmac_256[2]; const u8 tag256[16]; } inc_test_cases[] = { { .n_bytes = 0, .tag_gcm_128 = { 0x95f4b8cc824294eb, 0xbf964ccf94b47f96 }, .tag_gcm_256 = { 0x206b456eaa81a3c8, 0xa308160d180e080d }, .tag_gmac_128 = { 0x95f4b8cc824294eb, 0xbf964ccf94b47f96 }, .tag_gmac_256 = { 0x206b456eaa81a3c8, 0xa308160d180e080d }, }, { .n_bytes = 1, .tag_gcm_128 = { 0xe89aa5be94fa1db4, 0x70d82ed02542a560 }, .tag_gcm_256 = { 0xcb0659b38e60d3a7, 0x9758b874959187ff }, .tag_gmac_128 = { 0xf9be1e7db073c565, 0x3b8a0ecc7a91f09d }, .tag_gmac_256 = { 0x1e302e97ab394130, 0xef29621c33bdb710 }, }, { .n_bytes = 7, .tag_gcm_128 = { 0xf4af7cbe57bd2078, 0x063dd60abbe51049 }, .tag_gcm_256 = { 0x7d231388fe8a19be, 0x59be3e7205269abd }, .tag_gmac_128 = { 0x27d0a47980eed1c6, 0xe6163485e73d02b3 }, .tag_gmac_256 = { 0x61ce281b47729f6c, 0x128a6bc0880e5d84 }, }, { .n_bytes = 8, .tag_gcm_128 = { 0xf45b40961422abc4, 0x0a932b98c4999694 }, .tag_gcm_256 = { 0xf7f945beed586ee2, 0x67239433a7bd3f23 }, .tag_gmac_128 = { 0x3a25d38572abe3b1, 0x220798aca96d594a }, .tag_gmac_256 = { 0x2e0e6d58d1ab41ca, 0x09bbc83e3b7b5e11 }, }, { .n_bytes = 9, .tag_gcm_128 = { 0x791b0a879d236364, 0xde9553e3ed1b763f }, .tag_gcm_256 = { 0x24c13ed7b46813cd, 0xe646ce24ea4b281e }, .tag_gmac_128 = { 0x0e521672b23a4fc7, 0x16f129224dec5fd8 }, .tag_gmac_256 = { 0x8b9c603789c34043, 0x0a8b626928c9fb6f }, }, { .n_bytes = 15, .tag_gcm_128 = { 0xb277ef05e2be1cc0, 0x2922fba5e321c81e }, .tag_gcm_256 = { 0xc3ca9f633fa803dc, 0x96e60b0c3347d744 }, .tag_gmac_128 = { 0xab99e6327c8e1493, 0x09a9a153045ba43f }, .tag_gmac_256 = { 0xfc9ec2d6a1ad492b, 0xf0b0ba877663732d }, }, { .n_bytes = 16, .tag_gcm_128 = { 0x3e3438e8f932ebe3, 0x958e270d56ae588e }, .tag_gcm_256 = { 0x6ac53524effc8171, 0xccab3a16a0b5813c }, .tag_gmac_128 = { 0x0eb4a09c6c7db16b, 0x1cdb5573a27a2e4a }, .tag_gmac_256 = { 0x71752018b31eae33, 0xdc4bd36d44b9fd5d }, }, { .n_bytes = 31, .tag_gcm_128 = { 0x1f4d4a7a056e4bca, 0x97ac76121dccb4e0 }, .tag_gcm_256 = { 0x609aea9aec919ab6, 0x1eba3c4998e7abb9 }, .tag_gmac_128 = { 0x289280f9e8879c68, 0xe6b0e36afc0d2ae1 }, .tag_gmac_256 = { 0x0b3f61762ba4ed43, 0x293f596a76d63b37 }, }, { .n_bytes = 32, .tag_gcm_128 = { 0xc4b64505d045818f, 0x72bfd499f0f983b4 }, .tag_gcm_256 = { 0x3f003fb179b2c480, 0x883876d4904700c2 }, .tag_gmac_128 = { 0x3dd10ab954d807f0, 0x5ae32ee41675051e }, .tag_gmac_256 = { 0x1a80ab830fc736c0, 0x51db27630adae337 }, }, { .n_bytes = 47, .tag_gcm_128 = { 0x3aedb0c6c14f2ea1, 0xe4626626bae641cd }, .tag_gcm_256 = { 0x9c91b87dfd302880, 0x05bb594dde5abb9c }, .tag_gmac_128 = { 0xe0fe54f2bdadeba8, 0x6f8f40edb569701f }, .tag_gmac_256 = { 0x26c5632c7abbdb3f, 0xc18ccc24df8bb239 }, }, { .n_bytes = 48, .tag_gcm_128 = { 0xdbceb2aed0dbbe27, 0xfef0013e8ebe6ef1 }, .tag_gcm_256 = { 0x98ad025f30b58ffa, 0xabc8a99857034e42 }, .tag_gmac_128 = { 0x269518e8584b7f6c, 0x1c9f41410a81799c }, .tag_gmac_256 = { 0x144807ce7aa8eb61, 0x611a8355b4377dc6 }, }, { .n_bytes = 63, .tag_gcm_128 = { 0x1769ccf523a2046e, 0x7328e18749a559b4 }, .tag_gcm_256 = { 0xcdf2f28efa9689ce, 0x636676f6aedea9de }, .tag_gmac_128 = { 0x4d47537060defce8, 0x0d4819c20ba8e889 }, .tag_gmac_256 = { 0x7b60615e7bfc9a7a, 0x610633296eb30b94 }, }, { .n_bytes = 64, .tag_gcm_128 = { 0xa5602f73865b6a77, 0x78317e461ff9b560 }, .tag_gcm_256 = { 0x5c17a6dcd1f23b65, 0x25331c378256a93e }, .tag_gmac_128 = { 0x39d941ed85d81ab0, 0xe358a61078628d63 }, .tag_gmac_256 = { 0x5276fbdd333f380d, 0xb0dc63e68f137e74 }, }, { .n_bytes = 79, .tag_gcm_128 = { 0x5d32cd75f2e82d84, 0xbc15801c1fe285bd }, .tag_gcm_256 = { 0xb2b2855f4b1ecf70, 0xa524adc1609c757b }, .tag_gmac_128 = { 0xa147493f08a8738e, 0xbf07da9f4a88944f }, .tag_gmac_256 = { 0xfee15e0d4b936bc7, 0x1dc88398c6b168bc }, }, { .n_bytes = 80, .tag_gcm_128 = { 0xa303b7247b9b00df, 0xe72d6d7063d48b72 }, .tag_gcm_256 = { 0x7abfffc9ecfa00ec, 0x9c5ffcd753ee4568 }, .tag_gmac_128 = { 0xc3e61bf9f370b40e, 0x66b1c4a6df3b19d7 }, .tag_gmac_256 = { 0x0cc7b09a7d602352, 0x29e8a64447a764d2 }, }, { .n_bytes = 95, .tag_gcm_128 = { 0xf0fb35c36eac3025, 0xa13463307fc48907 }, .tag_gcm_256 = { 0x283a73a05bd0e3c2, 0x794a181dd07a0fb7 }, .tag_gmac_128 = { 0x26f3546060d9f958, 0xc1367fca8869ab40 }, .tag_gmac_256 = { 0xa046e1705100c711, 0xbcf9d6a06f360260 }, }, { .n_bytes = 96, .tag_gcm_128 = { 0x974bb3c1c258bfb5, 0xcf057344bccb0596 }, .tag_gcm_256 = { 0x18920d75fcfb702e, 0x18e5f14ba429b7be }, .tag_gmac_128 = { 0xf43cca4837ad00b8, 0xb1a1585d51838352 }, .tag_gmac_256 = { 0xce3427dc5123b31f, 0xdcc6e49fa0f6587e }, }, { .n_bytes = 111, .tag_gcm_128 = { 0x5d73baa8eef0ced3, 0x79339e31d5d813de }, .tag_gcm_256 = { 0x4cefa311c9c39a86, 0xe809ee78930ef736 }, .tag_gmac_128 = { 0x452003e6d535a523, 0x723f08581012c62e }, .tag_gmac_256 = { 0x6ce2e1661db942ca, 0xccd700c9c6d03cfd }, }, { .n_bytes = 112, .tag_gcm_128 = { 0x189aa61ce15a0d11, 0xc907e6bccbdbb8f9 }, .tag_gcm_256 = { 0xa41c96c843b791b4, 0x0f9f60953f03e5fc }, .tag_gmac_128 = { 0x44c75b94dbf8539f, 0xcdebe3ed9c68c840 }, .tag_gmac_256 = { 0x21a289dd39eadd19, 0x749a038e1ea0711c }, }, { .n_bytes = 127, .tag_gcm_128 = { 0xc6ea87bfe82d73f6, 0x9d85dbf8072bb051 }, .tag_gcm_256 = { 0xd5e436b2ddfac9fa, 0x54d7d13fa214703a }, .tag_gmac_128 = { 0xdc5374b7d7d221c4, 0xa8cf4e11958b9dff }, .tag_gmac_256 = { 0xc7ad0bba9de54f6a, 0x38ed037fe0924dee }, }, { .n_bytes = 128, .tag_gcm_128 = { 0x357d4954b7c2b440, 0xb3b07ce0cd143149 }, .tag_gcm_256 = { 0x5555d09cb247322d, 0xeb9d1cea38b68951 }, .tag_gmac_128 = { 0x6a77579181663dde, 0xe359157bd4246d3f }, .tag_gmac_256 = { 0x9fe930d50d661e37, 0xba4a0f3c3a6b63cf }, }, { .n_bytes = 143, .tag_gcm_128 = { 0x358f897d4783966f, 0x6fa44993a9ed54c4 }, .tag_gcm_256 = { 0x60e91f959f2ccdbe, 0x116c56fdaa107deb }, .tag_gmac_128 = { 0x121d26aba8aaee0d, 0xc37cda9c43f51008 }, .tag_gmac_256 = { 0x06918b1cd20e0abc, 0x42938b1d8e745dcd }, }, { .n_bytes = 144, .tag_gcm_128 = { 0x8a9efe3df387e069, 0xc0a3f2f7547c704b }, .tag_gcm_256 = { 0x217d59f53bfbc314, 0x2d8f088d05532b0d }, .tag_gmac_128 = { 0x382949d56e0e8f05, 0x4e87fb8f83f095a7 }, .tag_gmac_256 = { 0x75e07060883db37d, 0x5fde7b9bda37d680 }, }, { .n_bytes = 159, .tag_gcm_128 = { 0x297252081cc8db1e, 0x6357143fa7f756c8 }, .tag_gcm_256 = { 0x7e8fca9d1b17e003, 0x7bf7dad063b9a5c9 }, .tag_gmac_128 = { 0x5d0524b130e97547, 0xd6befd8591072437 }, .tag_gmac_256 = { 0xf5f631d391b635fc, 0xe8f7b6808544f312 }, }, { .n_bytes = 160, .tag_gcm_128 = { 0x90e034ee0f08a871, 0x002f483eefa24ec9 }, .tag_gcm_256 = { 0xed24df02e455d6d3, 0x7a7d318ed132cb7f }, .tag_gmac_128 = { 0xc75f87215ae12a2f, 0xf264e5381d5b0412 }, .tag_gmac_256 = { 0x1ad3e294fd55b0a6, 0xa1a551e59fd12e2f }, }, { .n_bytes = 175, .tag_gcm_128 = { 0x8f663955c8e4249e, 0xd9d8d8d7352b18d9 }, .tag_gcm_256 = { 0xd9af34eae74a35e1, 0xc22e74b34267e5df }, .tag_gmac_128 = { 0xb54a2e8b186a55db, 0x980f586c6da8afce }, .tag_gmac_256 = { 0x9cceb31baad18ff1, 0xce97588909ece8af }, }, { .n_bytes = 176, .tag_gcm_128 = { 0x258ec0df82f003bd, 0x571496e92c966695 }, .tag_gcm_256 = { 0xa1925cda1fa1dd2c, 0x914038618faecf99 }, .tag_gmac_128 = { 0xfc384b412bdb05ef, 0x73968cf3b464a997 }, .tag_gmac_256 = { 0x50d9ce4be242e176, 0x5fb78e9404c9226d }, }, { .n_bytes = 191, .tag_gcm_128 = { 0x796a90a3edaab614, 0x4bf34c2c6333c736 }, .tag_gcm_256 = { 0x4ffd3a84b346c6d5, 0x9d4c84c7ac5a191c }, .tag_gmac_128 = { 0x16c11c6bfad5973e, 0xa0825b9c827137c8 }, .tag_gmac_256 = { 0x82c144c209c22758, 0x7428b4ac38a65c56 }, }, { .n_bytes = 192, .tag_gcm_128 = { 0x2a44492af2e06a75, 0xbe4eab62aacfc2d3 }, .tag_gcm_256 = { 0xb7d4971a8061092d, 0x94da543669369e41 }, .tag_gmac_128 = { 0xed462726c984b596, 0xd61b317d979f5df8 }, .tag_gmac_256 = { 0x554dc7f30981dbf6, 0x94447d0fbf9f2c8b }, }, { .n_bytes = 207, .tag_gcm_128 = { 0xcfac9f67252713c8, 0xd638cf6b74c6acf6 }, .tag_gcm_256 = { 0x57a4a9d299663925, 0xa802f8453e8bcc5b }, .tag_gmac_128 = { 0xef03f3cdcb0ea819, 0xeea8f0f7f805c306 }, .tag_gmac_256 = { 0x3d8cd7d92cf0a212, 0x12c1ddddab7e752c }, }, { .n_bytes = 208, .tag_gcm_128 = { 0x5467633795b92cf5, 0x6b45fb93e19f9341 }, .tag_gcm_256 = { 0xaeced4090d4d20bc, 0xd20161cd2617613e }, .tag_gmac_128 = { 0x02bb88dbe681ab69, 0xaf973bfd0b924144 }, .tag_gmac_256 = { 0x313020fc5283b45e, 0x1757616d4cf17c7f }, }, { .n_bytes = 223, .tag_gcm_128 = { 0x2f9c725903c07adf, 0xe01712c7d6d5055d }, .tag_gcm_256 = { 0xeae53a9b0d03a4f9, 0x42b2375d569d384e }, .tag_gmac_128 = { 0x6ea092dd400ec00d, 0x23237fa0bd0c1977 }, .tag_gmac_256 = { 0xa02e0f41f12f0053, 0xfba53430aa616219 }, }, { .n_bytes = 224, .tag_gcm_128 = { 0x73e40772334901a9, 0xddf6075b357cb307 }, .tag_gcm_256 = { 0x2eb3450f9462c968, 0xa9fb95f281c117e9 }, .tag_gmac_128 = { 0x33762525c12dfd1d, 0xcb3d8d0402c23ebf }, .tag_gmac_256 = { 0x30c6d05fb98c2a84, 0xaa2c9f6303383d3a }, }, { .n_bytes = 239, .tag_gcm_128 = { 0x184d15fd2e2c63a6, 0x3dfe238b88dd2924 }, .tag_gcm_256 = { 0x18deafee39975b36, 0xc07761cf4fc16c06 }, .tag_gmac_128 = { 0x10a48f2bc4e64f87, 0x85eec49ae83d4256 }, .tag_gmac_256 = { 0x5ac87f47f32770eb, 0x31706ca888dd6d44 }, }, { .n_bytes = 240, .tag_gcm_128 = { 0x153134f11cfa06ec, 0xd987642cc3688a34 }, .tag_gcm_256 = { 0x3eb66b6dc0bba824, 0x274c4648d515c844 }, .tag_gmac_128 = { 0x9e5afe891c7c7dcb, 0xa2b3fa1c026343e2 }, .tag_gmac_256 = { 0xe9120e4e9ff4b1e1, 0xb88bf68336342598 }, }, { .n_bytes = 255, .tag_gcm_128 = { 0x2b5e78936d1ace73, 0x15b766bfee18d348 }, .tag_gcm_256 = { 0xeb3741a345395c97, 0x02e11e0478e4cc5a }, .tag_gmac_128 = { 0xf7daf525751192df, 0x1b1641c3362905ac }, .tag_gmac_256 = { 0x0b16a2bb842caaca, 0x996732fedaa6b829 }, }, { .n_bytes = 256, .tag_gcm_128 = { 0x6d4507e0c354e80a, 0x2345eccddd0bd71e }, .tag_gcm_256 = { 0xa582b8122d699b63, 0xb16db944f6b073f3 }, .tag_gmac_128 = { 0xc58bb57544c07b40, 0x1a8dd3d8124cdf39 }, .tag_gmac_256 = { 0xb0f6db0da52e1dc2, 0xbd3a86a577ed208a }, }, { .n_bytes = 319, .tag_gcm_128 = { 0x2cd41fdf6f659a6b, 0x2486849d7666d76e }, .tag_gcm_256 = { 0xb7e416c8a716cb4d, 0xc7abe0d755b48845 }, .tag_gmac_128 = { 0xad83725394d4a36b, 0x5fdd42e941cad49b }, .tag_gmac_256 = { 0xbb0b73609b90f7eb, 0xe4d382b8b9b7d43e }, }, { .n_bytes = 320, .tag_gcm_128 = { 0x064cfe34b7d9f89c, 0xb6c7263f66c89b47 }, .tag_gcm_256 = { 0x1254c9ae84d8ff50, 0x9faeab423099dc9a }, .tag_gmac_128 = { 0xd91d60ce71d24533, 0xb1cdfd3b3200b171 }, .tag_gmac_256 = { 0x921de9e3d353559c, 0x3509d2775817a1de }, }, { .n_bytes = 383, .tag_gcm_128 = { 0x14788c7531d682e1, 0x8af79effe807a4dc }, .tag_gcm_256 = { 0x947754a0844b4a4d, 0x9eb3849d93d5048e }, .tag_gmac_128 = { 0xfa84d3a18ea6f895, 0x9a45c729797a8ac4 }, .tag_gmac_256 = { 0xe8e61e134e40359a, 0xe8e404d4b523607c }, }, { .n_bytes = 384, .tag_gcm_128 = { 0xfba3fcfd9022e9a7, 0x257ba59f12055d70 }, .tag_gcm_256 = { 0x7c6ca4e7fba2bc35, 0x1c590be09b3d549b }, .tag_gmac_128 = { 0x4ca0f087d812e48f, 0xd1d39c4338d57a04 }, .tag_gmac_256 = { 0xb0a2257cdec364c7, 0x6a4308976fda4e5d }, }, { .n_bytes = 447, .tag_gcm_128 = { 0x8fde1490c60f09bf, 0xd2932f04c202c5e4 }, .tag_gcm_256 = { 0x1845a80cbdcf2e62, 0xc7c49c9864bca732 }, .tag_gmac_128 = { 0x35aa90d2deb41b9c, 0x516ab85a3f17b71e }, .tag_gmac_256 = { 0x1db78f8b7b34d9e7, 0xd168177351e601fe }, }, { .n_bytes = 448, .tag_gcm_128 = { 0xd0a7b75f734a1a7c, 0xc7689b7c571a09bf }, .tag_gcm_256 = { 0xef3a9118c347118d, 0x282a7736060d7bb5 }, .tag_gmac_128 = { 0xce2dab9fede53934, 0x27f3d2bb2af9dd2e }, .tag_gmac_256 = { 0xca3b0cba7b772549, 0x3104ded0d6df7123 }, }, { .n_bytes = 511, .tag_gcm_128 = { 0x6fb5d366fa97b2d2, 0xed2d955fcc78e556 }, .tag_gcm_256 = { 0xc2bc52eca9348b7c, 0x0ec18a2eb637446f }, .tag_gmac_128 = { 0xe3012a4897edd5b5, 0xfe18c3ec617a7e88 }, .tag_gmac_256 = { 0x00e050eecf184591, 0xba24484f84867f4f }, }, { .n_bytes = 512, .tag_gcm_128 = { 0x25138f7fe88b54bd, 0xcc078b619c0e83a2 }, .tag_gcm_256 = { 0x63313c5ebe68fa92, 0xccc78784896cdcc3 }, .tag_gmac_128 = { 0xc688fe54c5595ec0, 0x5b8a687343c3ef03 }, .tag_gmac_256 = { 0x807c9f8e1c198242, 0xb1e0befc0b9b8193 }, }, { .n_bytes = 575, .tag_gcm_128 = { 0x0ce8e0b7332a7076, 0xe4aa7ab60dd0946a }, .tag_gcm_256 = { 0x585cff3cf78504d4, 0x45f3a9532ea40e8b }, .tag_gmac_128 = { 0xc06ca34dbad542b4, 0x840508722ff031dc }, .tag_gmac_256 = { 0xa46e22748f195488, 0x43817a5d4d17408a }, }, { .n_bytes = 576, .tag_gcm_128 = { 0x45360be81e8323bd, 0x10892d9804b75bb5 }, .tag_gcm_256 = { 0x66208ae5d809036e, 0x603d0af49475de88 }, .tag_gmac_128 = { 0xb4f2b1d05fd3a4ec, 0x6a15b7a05c3a5436 }, .tag_gmac_256 = { 0x8d78b8f7c7daf6ff, 0x925b2a92acb7356a }, }, { .n_bytes = 577, .tag_gcm_128 = { 0xc7e5cd17251fd138, 0xecfb0e05110303df }, .tag_gcm_256 = { 0x2939d12c85ea8cf8, 0xea063fba37c92eb5 }, .tag_gmac_128 = { 0x1fa02b370bec64a0, 0x8c759ca95a8cea85 }, .tag_gmac_256 = { 0x6a602c2b1fff6617, 0x17e06d829bd24a8d }, }, { .n_bytes = 639, .tag_gcm_128 = { 0xc679ef7a01e8f14c, 0x281e3b9a9f715cb9 }, .tag_gcm_256 = { 0x13abd2d67e162f98, 0xf637d467046af949 }, .tag_gmac_128 = { 0x05037392550b7ae2, 0x5095b4629ba46d40 }, .tag_gmac_256 = { 0xd8e8045772299aa7, 0x564d72fb58ea9808 }, }, { .n_bytes = 640, .tag_gcm_128 = { 0xff1a2c922cdd1336, 0xcaa02eab8691bf51 }, .tag_gcm_256 = { 0xd57e16f169d79da5, 0x3e2b47264f8efe9c }, .tag_gmac_128 = { 0xb32750b403bf66f8, 0x1b03ef08da0b9d80 }, .tag_gmac_256 = { 0x80ac3f38e2aacbfa, 0xd4ea7eb88213b629 }, }, { .n_bytes = 703, .tag_gcm_128 = { 0xefd0804f0155b8f1, 0xb1849ed867269569 }, .tag_gcm_256 = { 0xf66c5ecbd1a06fa4, 0x55ef36f3fdbe763a }, .tag_gmac_128 = { 0x725813463d977e5b, 0xd52aaabb923cfabb }, .tag_gmac_256 = { 0x4add8f86736adc52, 0xf6dabb4596975fd7 }, }, { .n_bytes = 704, .tag_gcm_128 = { 0x583b29260ea8e49f, 0xfaa93b0db98f9274 }, .tag_gcm_256 = { 0x0b777f2cd9e2f0ef, 0x01510fc85a99382e }, .tag_gmac_128 = { 0x89df280b0ec65cf3, 0xa3b3c05a87d2908b }, .tag_gmac_256 = { 0x9d510cb7732920fc, 0x16b672e611ae2f0a }, }, { .n_bytes = 767, .tag_gcm_128 = { 0x671ec58ab6d4a210, 0x0845fbe603169eff }, .tag_gcm_256 = { 0xb3913f7eb9bbdbbb, 0x4cb17aa290f6ab11 }, .tag_gmac_128 = { 0x3036046580a81443, 0xe18d34bb706e632b }, .tag_gmac_256 = { 0x4e82bc959349466c, 0x01210641d62bbdda }, }, { .n_bytes = 768, .tag_gcm_128 = { 0x66993b5de915fc6e, 0x4aaf0b8441040267 }, .tag_gcm_256 = { 0x958ed0a6c1bf11e0, 0xc29d9f4a8ce8bdc6 }, .tag_gmac_128 = { 0x02674435b179fddc, 0xe016a6a0540bb9be }, .tag_gmac_256 = { 0xf562c523b24bf164, 0x257cb21a7b602579 }, }, { .n_bytes = 831, .tag_gcm_128 = { 0x4914f7980699f93c, 0xc2e44fdba6a839e7 }, .tag_gcm_256 = { 0xa8fab43ecd572a25, 0x3cd465e491195b81 }, .tag_gmac_128 = { 0xa6d725516e956d5d, 0x630768e80ac3de3d }, .tag_gmac_256 = { 0xb4746cdde367c9e2, 0x3ea53280901a0375 }, }, { .n_bytes = 832, .tag_gcm_128 = { 0xac9a519f06fb8c70, 0xdc1a6544ed2cfcf7 }, .tag_gcm_256 = { 0x54877a7ccd02c592, 0x1a09a4474d903b56 }, .tag_gmac_128 = { 0xd24937cc8b938b05, 0x8d17d73a7909bbd7 }, .tag_gmac_256 = { 0x9d62f65eaba46b95, 0xef7f624f71ba7695 }, }, { .n_bytes = 895, .tag_gcm_128 = { 0x3d365bf4d44c1071, 0x07ac3129079f2013 }, .tag_gcm_256 = { 0x608543d4fe6526a1, 0xc78a987b87c8d96c }, .tag_gmac_128 = { 0xc71cf903f7a557c5, 0x06788583ad2122a5 }, .tag_gmac_256 = { 0x7cdaa511565b289a, 0xf818a4c85a8bd575 }, }, { .n_bytes = 896, .tag_gcm_128 = { 0x97000fafd1359a0b, 0xfc226d534866b495 }, .tag_gcm_256 = { 0x1850ee7af3133326, 0xf198d539eee4b1f5 }, .tag_gmac_128 = { 0x7138da25a1114bdf, 0x4deedee9ec8ed265 }, .tag_gmac_256 = { 0x249e9e7ec6d879c7, 0x7abfa88b8072fb54 }, }, { .n_bytes = 959, .tag_gcm_128 = { 0x17200025564902f2, 0x3f2c3b711ba4086d }, .tag_gcm_256 = { 0x3d0bf3e8b24e296d, 0x42fe0f54e33deb6d }, .tag_gmac_128 = { 0x8baae9b6f3bd797a, 0x177e0b6c577f2436 }, .tag_gmac_256 = { 0x853f961c965f472c, 0x8adc4113b3cf933a }, }, { .n_bytes = 960, .tag_gcm_128 = { 0x2a30ca7325e7a81b, 0xacbc71832bdceb63 }, .tag_gcm_256 = { 0x037786319dc22ed7, 0x6730acf359ec3b6e }, .tag_gmac_128 = { 0x702dd2fbc0ec5bd2, 0x61e7618d42914e06 }, .tag_gmac_256 = { 0x52b3152d961cbb82, 0x6ab088b034f6e3e7 }, }, { .n_bytes = 1023, .tag_gcm_128 = { 0x8e8789e6c4c90855, 0x4ec5503d7f953df6 }, .tag_gcm_256 = { 0xdb0afebe6c085f53, 0x4eb6f07b63b8a020 }, .tag_gmac_128 = { 0x6e9b48e5ad508180, 0xdc86430db2bad514 }, .tag_gmac_256 = { 0xbb52b4fbf236b741, 0x47ae63bc836dfba3 }, }, { .n_bytes = 1024, .tag_gcm_128 = { 0x94e1ccbea0f24089, 0xf51b53b600363bd2 }, .tag_gcm_256 = { 0x70f3eb3d562f0b34, 0xffd09e1a25d5bef3 }, .tag_gmac_128 = { 0x65a2b560392ecee3, 0x30079a9a9dbbd3a3 }, .tag_gmac_256 = { 0x4d361736c43090e6, 0x135810df49dcc981 }, }, { .n_bytes = 1025, .tag_gcm_128 = { 0x830a99737df5a71a, 0xd9ea6e87c63d3aae }, .tag_gcm_256 = { 0xa3fc30e0254a5ee2, 0x52e59adc9a75be40 }, .tag_gmac_128 = { 0xb217556427fc09ab, 0xc32fd72ec886730d }, .tag_gmac_256 = { 0xeab5a9a02cb0869e, 0xd59e51684bc2839c }, }, { .n_bytes = 1039, .tag_gcm_128 = { 0x238f229130e92934, 0x52752fc860bca067 }, .tag_gcm_256 = { 0xae2754bcaed68191, 0xe0770d1e9a7a67f3 }, .tag_gmac_128 = { 0xe030ad2beb01d85d, 0xf10c78b1b64c27af }, .tag_gmac_256 = { 0x081b45e126248e85, 0xca0789f30e1c47a1 }, }, { .n_bytes = 1040, .tag_gcm_128 = { 0x4eebcf7391d66c6f, 0x107d8bef4a93d9c6 }, .tag_gcm_256 = { 0xbeb02ae5466964f3, 0x8eb90364c5f9e4cb }, .tag_gmac_128 = { 0x451deb85fbf27da5, 0xe47e8c91106dadda }, .tag_gmac_256 = { 0x85f0a72f3497699d, 0xe6fce0193cc6c9d1 }, }, { .n_bytes = 1041, .tag_gcm_128 = { 0xbbddfb0304411d71, 0xe573f63553d7ede4 }, .tag_gcm_256 = { 0x68e42d2959af0b24, 0x35ac8e73c749e7f4 }, .tag_gmac_128 = { 0x98d022b9896b68f8, 0x98dfde2a17b2869b }, .tag_gmac_256 = { 0xb8dac6add35d0d9b, 0x1c55973c6dd769af }, }, { .n_bytes = 1536, .tag_gcm_128 = { 0x7d8933fd922418bd, 0xc88c2f289c5d3d83 }, .tag_gcm_256 = { 0x966c103eb6ee69f2, 0x2f6b070b5c0fc66f }, .tag_gmac_128 = { 0x3b70f6154246e758, 0xd485c0edf236b6e2 }, .tag_gmac_256 = { 0xfefe1832387b9768, 0xc876712098256ca3 }, }, { .n_bytes = 2047, .tag_gcm_128 = { 0x15c6bbcb0d835fd4, 0xc33afd1328c1deb1 }, .tag_gcm_256 = { 0xcde3edeea228ada6, 0x8276721a8662e708 }, .tag_gmac_128 = { 0xb556b0e42419759e, 0x23b0365cf956a3ad }, .tag_gmac_256 = { 0x8df762cbbe4b2a04, 0x6841bc61e5702419 }, }, { .n_bytes = 2048, .tag_gcm_128 = { 0xc5ddbeb8765e3aac, 0x1bad7349fd9f2b50 }, .tag_gcm_256 = { 0xa2a623dde251a98d, 0xaf905fbd16f6a7d9 }, .tag_gmac_128 = { 0xe20f1e533df2b3d0, 0x5d170bdbcc278a63 }, .tag_gmac_256 = { 0x9663185c4342cd4a, 0x82d3c5a3a4998fc6 }, }, { .n_bytes = 2064, .tag_gcm_128 = { 0x12b76ea0a6ee9cbc, 0xdaecfae7c815aa58 }, .tag_gcm_256 = { 0xb5bb2f76028713dd, 0xc8f3a1448b3bd050 }, .tag_gmac_128 = { 0x019445c168c42f9b, 0xdf33e251bd9a27fe }, .tag_gmac_256 = { 0xbbabd0cefc4d6a42, 0xb138675ca66ba54f }, }, { .n_bytes = 2065, .tag_gcm_128 = { 0x8758c5168ffc3fd7, 0x554f1df7cfa3b976 }, .tag_gcm_256 = { 0xc9808cf0fd21aede, 0xe26921f3fd308006 }, .tag_gmac_128 = { 0x44a57e7a32031596, 0x75476d5542faa57b }, .tag_gmac_256 = { 0xea0e81807fa79a4a, 0x889cca80746fb8d5 }, }, { .n_bytes = 4095, .tag_gcm_128 = { 0x06db87757f541dc9, 0x823c619c6b88ef80 }, .tag_gcm_256 = { 0xdf0861a56a7fe7b0, 0xe077a5c735cc21b2 }, .tag_gmac_128 = { 0x43cb482bea0449e9, 0x70d668af983c9a6c }, .tag_gmac_256 = { 0x5fc304ad7be1d19a, 0x81bf2f4111de0b06 }, }, { .n_bytes = 4096, .tag_gcm_128 = { 0xe4afdad642876152, 0xf78cfcfcb92520b6 }, .tag_gcm_256 = { 0x7552cda8d91bdab1, 0x4bf57b7567d59e89 }, .tag_gmac_128 = { 0xac5240f8e9c49cfc, 0x2a3c9d0999aded50 }, .tag_gmac_256 = { 0x9fb6cd8f10f7b6c5, 0x16e442c147869222 }, }, { .n_bytes = 4112, .tag_gcm_128 = { 0x2a34db8f06bcf0ee, 0x7a4a2456fa340c33 }, .tag_gcm_256 = { 0x4b6c0c5b5c943f5e, 0x6d1669e849ce061a }, .tag_gmac_128 = { 0x143bfc9ab07d9bb5, 0xf0aa7510a9039349 }, .tag_gmac_256 = { 0x8a97bdd033775ba0, 0x5901a5160739be25 }, }, { .n_bytes = 4113, .tag_gcm_128 = { 0x296acfcbcbf529af, 0xe3e2cfb1bc5855c8 }, .tag_gcm_256 = { 0x181f6f9068ea477e, 0x1e05bfd01ee3e173 }, .tag_gmac_128 = { 0x0d81fcb0829e3c8b, 0x68016225b5fa7745 }, .tag_gmac_256 = { 0xa2421ac50d65c6b5, 0x84bd16fa55486af8 }, }, { .n_bytes = 16382, .tag_gcm_128 = { 0xd39fd367e00a103d, 0xf873a278b32d207f }, .tag_gcm_256 = { 0xa8da09a851ae6c88, 0x2ef17f0da7f191f1 }, .tag_gmac_128 = { 0xd4a22896f44c1c14, 0x69a5d02715c90ea4 }, .tag_gmac_256 = { 0x64788ca5e11722b6, 0x63d74a4b24538762 }, }, { .n_bytes = 16383, .tag_gcm_128 = { 0x2162b91aad49eebc, 0x28c7efe93e639c75 }, .tag_gcm_256 = { 0xc5baee5e40004087, 0xf6b26211facc66a5 }, .tag_gmac_128 = { 0x3ec003d690d3d846, 0x204baef851d8ad7d }, .tag_gmac_256 = { 0xdb51d6f5dddf16bb, 0x529f3825cf78dbd5 }, }, { .n_bytes = 16384, .tag_gcm_128 = { 0x2272e778c4c5c9ef, 0x84c50021e75ddbab }, .tag_gcm_256 = { 0x6c32f1c5666b1f4c, 0x91142a86ae5241b2 }, .tag_gmac_128 = { 0x43dadd5ecee9674b, 0xa30fea9ae8091c6c }, .tag_gmac_256 = { 0xc360b76ac1887181, 0xcb732f29ea86edeb }, }, { .n_bytes = 16385, .tag_gcm_128 = { 0xe2a47837578b4056, 0xf96e7233cbeb1ce1 }, .tag_gcm_256 = { 0xfa3aa4ebe36fb390, 0x6a2cf1671f4f1a01 }, .tag_gmac_128 = { 0xfd0b7312c4975687, 0xdd3096b1c850e80a }, .tag_gmac_256 = { 0xaf2cae4642a5536a, 0xb27aff5cc8bd354c }, }, { .n_bytes = 16386, .tag_gcm_128 = { 0xe1b4c0e5825304ae, 0x48c5dd82aa114320 }, .tag_gcm_256 = { 0x76c3612118f47fa8, 0xdd0a47b132ecad3a }, .tag_gmac_128 = { 0x346bc841a7f5b642, 0x6fb1b96391c66b40 }, .tag_gmac_256 = { 0x2f1a1b6a000e18b2, 0xf7cba25e02551d43 }, }, }; #define MAX_TEST_DATA_LEN 32768 static const struct { char *name; const u8 *pt, *key128, *key256, *ct128, *ct256, *tag128, *tag256, *aad, *iv; u32 data_len, tag128_len, tag256_len, aad_len; } test_cases[] = { /* test cases */ { .name = "GCM Spec. TC1", .iv = tc1_iv, .key128 = tc1_key128, .key256 = tc1_key256, .tag128 = tc1_tag128, .tag128_len = sizeof (tc1_tag128), .tag256 = tc1_tag256, .tag256_len = sizeof (tc1_tag256), }, { .name = "GCM Spec. TC2", .pt = tc2_plaintext, .data_len = sizeof (tc2_plaintext), .iv = tc1_iv, .key128 = tc1_key128, .key256 = tc1_key256, .ct128 = tc2_ciphertext128, .ct256 = tc2_ciphertext256, .tag128 = tc2_tag128, .tag128_len = sizeof (tc2_tag128), .tag256 = tc2_tag256, .tag256_len = sizeof (tc2_tag256), }, { .name = "GCM Spec. TC3", .pt = tc3_plaintext, .data_len = sizeof (tc3_plaintext), .iv = tc3_iv, .key128 = tc3_key128, .key256 = tc3_key256, .ct128 = tc3_ciphertext128, .ct256 = tc3_ciphertext256, .tag128 = tc3_tag128, .tag128_len = sizeof (tc3_tag128), .tag256 = tc3_tag256, .tag256_len = sizeof (tc3_tag256), }, { .name = "GCM Spec. TC4", .pt = tc4_plaintext, .data_len = sizeof (tc4_plaintext), .aad = tc4_aad, .aad_len = sizeof (tc4_aad), .iv = tc3_iv, .key128 = tc3_key128, .key256 = tc3_key256, .ct128 = tc4_ciphertext128, .ct256 = tc4_ciphertext256, .tag128 = tc4_tag128, .tag128_len = sizeof (tc4_tag128), .tag256 = tc4_tag256, .tag256_len = sizeof (tc4_tag256), } }; #define perftest_aesXXX_enc_var_sz(a) \ void __test_perf_fn perftest_aes##a##_enc_var_sz (test_perf_t *tp) \ { \ u32 n = tp->n_ops; \ aes_gcm_key_data_t *kd = test_mem_alloc (sizeof (*kd)); \ u8 *dst = test_mem_alloc (n + 16); \ u8 *src = test_mem_alloc_and_fill_inc_u8 (n + 16, 0, 0); \ u8 *tag = test_mem_alloc (16); \ u8 *key = test_mem_alloc_and_fill_inc_u8 (32, 192, 0); \ u8 *iv = test_mem_alloc_and_fill_inc_u8 (16, 128, 0); \ \ clib_aes_gcm_key_expand (kd, key, AES_KEY_##a); \ \ test_perf_event_enable (tp); \ clib_aes##a##_gcm_enc (kd, src, n, 0, 0, iv, 16, dst, tag); \ test_perf_event_disable (tp); \ } #define perftest_aesXXX_dec_var_sz(a) \ void __test_perf_fn perftest_aes##a##_dec_var_sz (test_perf_t *tp) \ { \ u32 n = tp->n_ops; \ aes_gcm_key_data_t *kd = test_mem_alloc (sizeof (*kd)); \ u8 *dst = test_mem_alloc (n + 16); \ u8 *src = test_mem_alloc_and_fill_inc_u8 (n + 16, 0, 0); \ u8 *tag = test_mem_alloc (16); \ u8 *key = test_mem_alloc_and_fill_inc_u8 (32, 192, 0); \ u8 *iv = test_mem_alloc_and_fill_inc_u8 (16, 128, 0); \ int *rv = test_mem_alloc (16); \ \ clib_aes_gcm_key_expand (kd, key, AES_KEY_##a); \ \ test_perf_event_enable (tp); \ rv[0] = clib_aes##a##_gcm_dec (kd, src, n, 0, 0, iv, tag, 16, dst); \ test_perf_event_disable (tp); \ } static clib_error_t * test_clib_aes128_gcm_enc (clib_error_t *err) { aes_gcm_key_data_t kd; u8 pt[MAX_TEST_DATA_LEN]; u8 ct[MAX_TEST_DATA_LEN]; u8 tag[16]; FOREACH_ARRAY_ELT (tc, test_cases) { clib_aes_gcm_key_expand (&kd, tc->key128, AES_KEY_128); clib_aes128_gcm_enc (&kd, tc->pt, tc->data_len, tc->aad, tc->aad_len, tc->iv, tc->tag128_len, ct, tag); if (memcmp (tc->tag128, tag, tc->tag128_len) != 0) return clib_error_return (err, "%s: invalid tag", tc->name); if (tc->data_len && memcmp (tc->ct128, ct, tc->data_len) != 0) return clib_error_return (err, "%s: invalid ciphertext", tc->name); } for (int i = 0; i < sizeof (pt); i++) pt[i] = i; clib_aes_gcm_key_expand (&kd, inc_key, AES_KEY_128); FOREACH_ARRAY_ELT (tc, inc_test_cases) { clib_aes128_gcm_enc (&kd, pt, tc->n_bytes, 0, 0, inc_iv, 16, ct, tag); if (memcmp (tc->tag_gcm_128, tag, 16) != 0) return clib_error_return (err, "incremental %u bytes: invalid tag", tc->n_bytes); } return err; } perftest_aesXXX_enc_var_sz (128); REGISTER_TEST (clib_aes128_gcm_enc) = { .name = "clib_aes128_gcm_enc", .fn = test_clib_aes128_gcm_enc, .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)", .n_ops = 1424, .fn = perftest_aes128_enc_var_sz }, { .name = "variable size (per byte)", .n_ops = 1 << 20, .fn = perftest_aes128_enc_var_sz }), }; static clib_error_t * test_clib_aes256_gcm_enc (clib_error_t *err) { aes_gcm_key_data_t kd; u8 pt[MAX_TEST_DATA_LEN]; u8 ct[MAX_TEST_DATA_LEN]; u8 tag[16]; FOREACH_ARRAY_ELT (tc, test_cases) { clib_aes_gcm_key_expand (&kd, tc->key256, AES_KEY_256); clib_aes256_gcm_enc (&kd, tc->pt, tc->data_len, tc->aad, tc->aad_len, tc->iv, tc->tag256_len, ct, tag); if (memcmp (tc->tag256, tag, tc->tag256_len) != 0) return clib_error_return (err, "%s: invalid tag", tc->name); if (tc->data_len && memcmp (tc->ct256, ct, tc->data_len) != 0) return clib_error_return (err, "%s: invalid ciphertext", tc->name); } for (int i = 0; i < sizeof (pt); i++) pt[i] = i; clib_aes_gcm_key_expand (&kd, inc_key, AES_KEY_256); FOREACH_ARRAY_ELT (tc, inc_test_cases) { clib_aes256_gcm_enc (&kd, pt, tc->n_bytes, 0, 0, inc_iv, 16, ct, tag); if (memcmp (tc->tag_gcm_256, tag, 16) != 0) return clib_error_return (err, "incremental %u bytes: invalid tag", tc->n_bytes); } return err; } perftest_aesXXX_enc_var_sz (256); REGISTER_TEST (clib_aes256_gcm_enc) = { .name = "clib_aes256_gcm_enc", .fn = test_clib_aes256_gcm_enc, .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)", .n_ops = 1424, .fn = perftest_aes256_enc_var_sz }, { .name = "variable size (per byte)", .n_ops = 1 << 20, .fn = perftest_aes256_enc_var_sz }), }; static clib_error_t * test_clib_aes128_gcm_dec (clib_error_t *err) { aes_gcm_key_data_t kd; u8 pt[MAX_TEST_DATA_LEN]; u8 ct[MAX_TEST_DATA_LEN]; u8 tag[16]; int rv; FOREACH_ARRAY_ELT (tc, test_cases) { clib_aes_gcm_key_expand (&kd, tc->key128, AES_KEY_128); rv = clib_aes128_gcm_dec (&kd, tc->ct128, tc->data_len, tc->aad, tc->aad_len, tc->iv, tc->tag128, tc->tag128_len, pt); if (!rv) return clib_error_return (err, "%s: invalid tag", tc->name); if (tc->data_len && memcmp (tc->pt, pt, tc->data_len) != 0) return clib_error_return (err, "%s: invalid ciphertext", tc->name); } for (int i = 0; i < sizeof (pt); i++) pt[i] = i; clib_aes_gcm_key_expand (&kd, inc_key, AES_KEY_128); clib_aes128_gcm_enc (&kd, pt, sizeof (ct), 0, 0, inc_iv, 16, ct, tag); FOREACH_ARRAY_ELT (tc, inc_test_cases) { if (!clib_aes128_gcm_dec (&kd, ct, tc->n_bytes, 0, 0, inc_iv, (u8 *) tc->tag_gcm_128, 16, pt)) return clib_error_return (err, "incremental %u bytes: invalid tag", tc->n_bytes); } return err; } perftest_aesXXX_dec_var_sz (128); REGISTER_TEST (clib_aes128_gcm_dec) = { .name = "clib_aes128_gcm_dec", .fn = test_clib_aes128_gcm_dec, .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)", .n_ops = 1424, .fn = perftest_aes128_dec_var_sz }, { .name = "variable size (per byte)", .n_ops = 1 << 20, .fn = perftest_aes128_dec_var_sz }), }; static clib_error_t * test_clib_aes256_gcm_dec (clib_error_t *err) { aes_gcm_key_data_t kd; u8 pt[MAX_TEST_DATA_LEN]; u8 ct[MAX_TEST_DATA_LEN]; u8 tag[16]; int rv; FOREACH_ARRAY_ELT (tc, test_cases) { clib_aes_gcm_key_expand (&kd, tc->key256, AES_KEY_256); rv = clib_aes256_gcm_dec (&kd, tc->ct256, tc->data_len, tc->aad, tc->aad_len, tc->iv, tc->tag256, tc->tag256_len, pt); if (!rv) return clib_error_return (err, "%s: invalid tag", tc->name); if (tc->data_len && memcmp (tc->pt, pt, tc->data_len) != 0) return clib_error_return (err, "%s: invalid ciphertext", tc->name); } for (int i = 0; i < sizeof (pt); i++) pt[i] = i; clib_aes_gcm_key_expand (&kd, inc_key, AES_KEY_128); clib_aes128_gcm_enc (&kd, pt, sizeof (ct), 0, 0, inc_iv, 16, ct, tag); FOREACH_ARRAY_ELT (tc, inc_test_cases) { if (!clib_aes128_gcm_dec (&kd, ct, tc->n_bytes, 0, 0, inc_iv, (u8 *) tc->tag_gcm_128, 16, pt)) return clib_error_return (err, "incremental %u bytes: invalid tag", tc->n_bytes); } return err; } perftest_aesXXX_dec_var_sz (256); REGISTER_TEST (clib_aes256_gcm_dec) = { .name = "clib_aes256_gcm_dec", .fn = test_clib_aes256_gcm_dec, .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)", .n_ops = 1424, .fn = perftest_aes256_dec_var_sz }, { .name = "variable size (per byte)", .n_ops = 1 << 20, .fn = perftest_aes256_dec_var_sz }), }; static const u8 gmac1_key[] = { 0x77, 0xbe, 0x63, 0x70, 0x89, 0x71, 0xc4, 0xe2, 0x40, 0xd1, 0xcb, 0x79, 0xe8, 0xd7, 0x7f, 0xeb }; static const u8 gmac1_iv[] = { 0xe0, 0xe0, 0x0f, 0x19, 0xfe, 0xd7, 0xba, 0x01, 0x36, 0xa7, 0x97, 0xf3 }; static const u8 gmac1_aad[] = { 0x7a, 0x43, 0xec, 0x1d, 0x9c, 0x0a, 0x5a, 0x78, 0xa0, 0xb1, 0x65, 0x33, 0xa6, 0x21, 0x3c, 0xab }; static const u8 gmac1_tag[] = { 0x20, 0x9f, 0xcc, 0x8d, 0x36, 0x75, 0xed, 0x93, 0x8e, 0x9c, 0x71, 0x66, 0x70, 0x9d, 0xd9, 0x46 }; static const u8 gmac2_key[] = { 0x20, 0xb5, 0xb6, 0xb8, 0x54, 0xe1, 0x87, 0xb0, 0x58, 0xa8, 0x4d, 0x57, 0xbc, 0x15, 0x38, 0xb6 }; static const u8 gmac2_iv[] = { 0x94, 0xc1, 0x93, 0x5a, 0xfc, 0x06, 0x1c, 0xbf, 0x25, 0x4b, 0x93, 0x6f }; static const u8 gmac2_aad[] = { 0xca, 0x41, 0x8e, 0x71, 0xdb, 0xf8, 0x10, 0x03, 0x81, 0x74, 0xea, 0xa3, 0x71, 0x9b, 0x3f, 0xcb, 0x80, 0x53, 0x1c, 0x71, 0x10, 0xad, 0x91, 0x92, 0xd1, 0x05, 0xee, 0xaa, 0xfa, 0x15, 0xb8, 0x19, 0xac, 0x00, 0x56, 0x68, 0x75, 0x2b, 0x34, 0x4e, 0xd1, 0xb2, 0x2f, 0xaf, 0x77, 0x04, 0x8b, 0xaf, 0x03, 0xdb, 0xdd, 0xb3, 0xb4, 0x7d, 0x6b, 0x00, 0xe9, 0x5c, 0x4f, 0x00, 0x5e, 0x0c, 0xc9, 0xb7, 0x62, 0x7c, 0xca, 0xfd, 0x3f, 0x21, 0xb3, 0x31, 0x2a, 0xa8, 0xd9, 0x1d, 0x3f, 0xa0, 0x89, 0x3f, 0xe5, 0xbf, 0xf7, 0xd4, 0x4c, 0xa4, 0x6f, 0x23, 0xaf, 0xe0 }; static const u8 gmac2_tag[] = { 0xb3, 0x72, 0x86, 0xeb, 0xaf, 0x4a, 0x54, 0xe0, 0xff, 0xc2, 0xa1, 0xde, 0xaf, 0xc9, 0xf6, 0xdb }; static const struct { char *name; const u8 *key128, *key256, *tag128, *tag256, *aad, *iv; u32 tag128_len, tag256_len, aad_len; } gmac_test_cases[] = { /* test cases */ { .name = "GMAC1", .iv = gmac1_iv, .key128 = gmac1_key, .tag128 = gmac1_tag, .tag128_len = sizeof (gmac1_tag), .aad = gmac1_aad, .aad_len = sizeof (gmac1_aad), }, { .name = "GMAC2", .iv = gmac2_iv, .key128 = gmac2_key, .tag128 = gmac2_tag, .tag128_len = sizeof (gmac2_tag), .aad = gmac2_aad, .aad_len = sizeof (gmac2_aad), }, }; static clib_error_t * test_clib_aes128_gmac (clib_error_t *err) { u8 data[MAX_TEST_DATA_LEN]; aes_gcm_key_data_t kd; u8 tag[16]; FOREACH_ARRAY_ELT (tc, gmac_test_cases) { clib_aes_gcm_key_expand (&kd, tc->key128, AES_KEY_128); clib_aes128_gmac (&kd, tc->aad, tc->aad_len, tc->iv, tc->tag128_len, tag); if (memcmp (tc->tag128, tag, tc->tag128_len) != 0) return clib_error_return (err, "%s: invalid tag", tc->name); } for (int i = 0; i < sizeof (data); i++) data[i] = i; clib_aes_gcm_key_expand (&kd, inc_key, AES_KEY_128); FOREACH_ARRAY_ELT (tc, inc_test_cases) { clib_aes128_gmac (&kd, data, tc->n_bytes, inc_iv, 16, tag); if (memcmp (tc->tag_gmac_128, tag, 16) != 0) return clib_error_return (err, "incremental %u bytes: invalid tag", tc->n_bytes); } return err; } void __test_perf_fn perftest_gmac256_fixed_512byte (test_perf_t *tp) { uword n = tp->n_ops; aes_gcm_key_data_t *kd = test_mem_alloc (sizeof (aes_gcm_key_data_t)); u8 *ivs = test_mem_alloc_and_fill_inc_u8 (n * 12, 0, 0); u8 *tags = test_mem_alloc_and_fill_inc_u8 (8 + n * 16, 0, 0); u8 *data = test_mem_alloc_and_fill_inc_u8 (512, 0, 0); test_perf_event_enable (tp); clib_aes_gcm_key_expand (kd, inc_key, AES_KEY_128); for (int i = 0; i < n; i++) clib_aes128_gmac (kd, data, 512, ivs + n * 12, 16, tags + n * 16); test_perf_event_disable (tp); } REGISTER_TEST (clib_aes128_gmac) = { .name = "clib_aes128_gmac", .fn = test_clib_aes128_gmac, .perf_tests = PERF_TESTS ({ .name = "fixed (512 byte)", .n_ops = 256, .fn = perftest_gmac256_fixed_512byte }), }; static clib_error_t * test_clib_aes256_gmac (clib_error_t *err) { u8 data[MAX_TEST_DATA_LEN]; aes_gcm_key_data_t kd; u8 tag[16]; #if 0 FOREACH_ARRAY_ELT (tc, gmac_test_cases) { clib_aes_gcm_key_expand (&kd, tc->key256, AES_KEY_256); clib_aes256_gmac (&kd, tc->aad, tc->aad_len, tc->iv, tc->tag256_len, tag); if (memcmp (tc->tag256, tag, tc->tag256_len) != 0) return clib_error_return (err, "%s: invalid tag", tc->name); } #endif for (int i = 0; i < sizeof (data); i++) data[i] = i; clib_aes_gcm_key_expand (&kd, inc_key, AES_KEY_256); FOREACH_ARRAY_ELT (tc, inc_test_cases) { clib_aes256_gmac (&kd, data, tc->n_bytes, inc_iv, 16, tag); if (memcmp (tc->tag_gmac_256, tag, 16) != 0) return clib_error_return (err, "incremental %u bytes: invalid tag", tc->n_bytes); } return err; } REGISTER_TEST (clib_aes256_gmac) = { .name = "clib_aes256_gmac", .fn = test_clib_aes256_gmac, }; #endif