{"id":2241,"date":"2017-09-29T00:25:42","date_gmt":"2017-09-29T07:25:42","guid":{"rendered":"https:\/\/blog.mozilla.org\/security\/?p=2241"},"modified":"2017-10-02T05:29:11","modified_gmt":"2017-10-02T12:29:11","slug":"improving-aes-gcm-performance","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/","title":{"rendered":"Improving AES-GCM Performance"},"content":{"rendered":"<p>AES-GCM is a NIST standardised <a href=\"https:\/\/en.wikipedia.org\/wiki\/Authenticated_encryption\">authenticated encryption algorithm<\/a> (FIPS 800-38D). Since its standardisation in 2008 its usage increased to a point where it is the prevalent encryption used with TLS. With 88% it is by far the<a href=\"https:\/\/mzl.la\/2fAv8YZ\"> most widely used TLS cipher<\/a> in Firefox.<\/p>\n<div id=\"attachment_2242\" style=\"width: 696px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58.png\"><img aria-describedby=\"caption-attachment-2242\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2242\" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58-252x119.png\" alt=\"\" width=\"686\" height=\"324\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58-252x119.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58-768x364.png 768w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58-600x284.png 600w\" sizes=\"(max-width: 686px) 100vw, 686px\" \/><\/a><p id=\"caption-attachment-2242\" class=\"wp-caption-text\">Firefox telemetry on symmetric ciphers in TLS<\/p><\/div>\n<p>Unfortunately the AES-GCM implementation used in Firefox (provided by NSS) until now did not take advantage of full hardware acceleration on all platforms; it used a slower software-only implementation on Mac, Linux 32-bit, or any device that doesn&#8217;t have all of the<a href=\"https:\/\/en.wikipedia.org\/wiki\/Advanced_Vector_Extensions\"> AVX<\/a>,<a href=\"https:\/\/en.wikipedia.org\/wiki\/CLMUL_instruction_set\"> PCLMUL<\/a>, and <a href=\"https:\/\/en.wikipedia.org\/wiki\/AES_instruction_set\">AES-NI hardware instructions<\/a>. Based on hardware telemetry information, only 30% of Firefox 55 users get full hardware acceleration (as well as the resulting resistance to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Side-channel_attack\">side channel analysis<\/a>). In this post I describe how I made AES-GCM in NSS and thus Firefox 56 significantly faster, more side-channel resistant, and more energy efficient on most platforms using hardware support.<\/p>\n<p>To evaluate \u00a0the actual impact on Firefox users, I tested the practical speed of our encryption by downloading a large file from a secure site using various hardware configurations: \u00a0Downloading a file on a mid-2015 MacBook Pro Retina with Firefox 55 spends 17% of its CPU usage in <strong>ssl3_AESGCM<\/strong>, the routine that performs the decryption. On a Windows laptop with an AMD C-70 (without the \u00a0AES-NI instruction) Firefox CPU usage is 60% and the download speed is capped at 3.5MB\/s. This doesn&#8217;t seem to be only an academic issue: Particularly for battery-operated devices, the energy consumption difference would be noticeable.<\/p>\n<h2>Improving GCM performance<\/h2>\n<p>Speeding up the GCM multiplication function is the first obvious step to improve AES-GCM performance. A<a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=868948\"> bug<\/a> was opened on integration of the original AES-GCM code to provide an alternative to the textbook implementation of <b>gcm_HashMult<\/b>. This code is not only slow but has <a href=\"https:\/\/en.wikipedia.org\/wiki\/Timing_attack\">timing side channels<\/a> as you can see in the following excerpt from the<a href=\"https:\/\/searchfox.org\/mozilla-central\/rev\/d67ef71097da4d1aa344c9d9c672e49a7228e765\/security\/nss\/lib\/freebl\/mpi\/mp_gf2m.c#337\"> binary multiplication<\/a> algorithm:<\/p>\n<pre>    for (ib = 1; ib &lt; b_used; ib++) {\r\n      b_i = *pb++;\r\n\r\n      \/* Inner product: \u00a0Digits of a *\/\r\n      if (b_i)\r\n        s_bmul_d_add(MP_DIGITS(a), a_used, b_i, MP_DIGITS(c) + ib);\r\n      else\r\n        MP_DIGIT(c, ib + a_used) = b_i;\r\n    }<\/pre>\n<p>We can improve on two fronts here. First NSS should use the PCLMUL hardware instruction to speed up the ghash multiplication if possible. Second if PCLMUL is not available, NSS should use a fast constant-time implementation.<\/p>\n<p><a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=868948\">Bug 868948<\/a> has several attempts of speeding up the software implementation without introducing timing side-channels. Unfortunately the fastest code that was proposed uses table lookups and is therefore not constant-time (accessing memory locations in the same cache line still <a href=\"https:\/\/cryptojedi.org\/peter\/data\/chesrump-20130822.pdf\">leaks timing information<\/a>). Thanks to<a href=\"https:\/\/www.bearssl.org\/constanttime.html\"> Thomas Pornin<\/a> I re-implemented the binary multiplication in a way that doesn&#8217;t leak any timing information and is still faster than any other proposed C code (see <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=868948\">Bug 868948<\/a> or openssl\/boringssl for other software implementations). Check out Thomas&#8217; <a href=\"https:\/\/www.bearssl.org\/constanttime.html\">excellent write-up<\/a> for details.<\/p>\n<p>If PCLMUL is available on the CPU, using it is the way to go. All modern compilers support <a href=\"https:\/\/software.intel.com\/sites\/landingpage\/IntrinsicsGuide\/#text=aes&amp;expand=641\">intrinsics<\/a>, which allow us to write &#8220;inline assembly&#8221; in C that runs on all platforms without having to write assembly code files. A hardware accelerated implementation of the ghash multiplication can be<a href=\"https:\/\/searchfox.org\/nss\/rev\/40ab32e6acb227e7ede4734573e448ff43d179d5\/lib\/freebl\/gcm.c#314\"> easily implemented<\/a> with<a href=\"https:\/\/software.intel.com\/sites\/landingpage\/IntrinsicsGuide\/#text=clmul&amp;expand=641\"> _mm_clmulepi64_si128<\/a>.<\/p>\n<p>On Mac and Linux the new 32-bit and 64-bit software ghash functions (faster and constant-time) are used on the respective platforms if PCLMUL or AVX is not available. Since Windows doesn&#8217;t support 128-bit integers (outside of registers) NSS falls back to the slower 32-bit ghash code \u2013 which is still more than 25% faster than the previous ghash implementation.<\/p>\n<h2>Improving AES performance<\/h2>\n<p>To speed up AES, NSS requires hardware acceleration on Mac as well as on Linux 32-bit and any machine that doesn&#8217;t support AVX (or has it disabled). When NSS can&#8217;t use the specialised AES code it falls back to a table-based implementation that is again not constant-time (in addition to being slow). There are currently no plans of rewriting the existing fallback code. AES is impossible to implement efficiently in software without introducing side channels. Implementing AES with intrinsics on the other hand is a breeze.<\/p>\n<pre>    m = _mm_xor_si128(m, cx-&gt;keySchedule[0]);\r\n\u00a0\u00a0\u00a0 for (i = 1; i &lt; cx-&gt;Nr; ++i) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 m = _mm_aesenc_si128(m, cx-&gt;keySchedule[i]);\r\n    }\r\n    m = _mm_aesenclast_si128(m, cx-&gt;keySchedule[cx-&gt;Nr]);\r\n    _mm_storeu_si128((__m128i *)output, m);<\/pre>\n<p>Key expansion is a little bit more involved (for 192 and 256 bit), but is<a href=\"https:\/\/searchfox.org\/nss\/rev\/40ab32e6acb227e7ede4734573e448ff43d179d5\/lib\/freebl\/rijndael.c#393\"> written<\/a> in about 100 lines as well.<\/p>\n<p>Mac sees the biggest improvement here. Previously, only Windows and 64-bit Linux used AES-NI, and now all desktop x86 and x64 platforms use it when available.<\/p>\n<h2>Looking at the numbers<\/h2>\n<p>To measure the performance gain of the new AES-GCM code I encrypted a 479MB file with a 128-bit key (the most widely used key size for AES-GCM). Note that these numbers are supposed to show a trend and heavily depend on the used machine and system load at the time.<\/p>\n<p>Linux measurements are done on an Intel Core i7-4790, Windows measurements on a Surface Pro 2 with an Intel Core i5-4300U, and Mac mid 2015 Core i7-4980HQ. For all following graphs lower is better.<\/p>\n<div id=\"attachment_2247\" style=\"width: 627px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux64-encrypt.png\"><img aria-describedby=\"caption-attachment-2247\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2247 \" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux64-encrypt-252x156.png\" alt=\"\" width=\"617\" height=\"382\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux64-encrypt-252x156.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux64-encrypt-600x372.png 600w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux64-encrypt.png 665w\" sizes=\"(max-width: 617px) 100vw, 617px\" \/><\/a><p id=\"caption-attachment-2247\" class=\"wp-caption-text\">Linux 64 AES-GCM 128 encryption performance improvements<\/p><\/div>\n<div id=\"attachment_2246\" style=\"width: 624px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux32-encrypt.png\"><img aria-describedby=\"caption-attachment-2246\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2246 \" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux32-encrypt-252x156.png\" alt=\"\" width=\"614\" height=\"380\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux32-encrypt-252x156.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux32-encrypt-600x372.png 600w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/linux32-encrypt.png 657w\" sizes=\"(max-width: 614px) 100vw, 614px\" \/><\/a><p id=\"caption-attachment-2246\" class=\"wp-caption-text\">Linux 32 AES-GCM 128 encryption performance improvements<\/p><\/div>\n<p>Performance of AES-GCM 128 \u00a0on any 64-bit Linux machine without hardware support for the AES, PCLMUL, or AVX instructions is at least twice as fast now. If the AES and PCLMUL instructions are available, the new code only needs 33% of the time the old code took.<\/p>\n<p>The speed-up for 32-bit Linux is more significant as it didn&#8217;t previously have any hardware accelerated code. With full hardware acceleration the new code is more than 5 times faster than before. Even in the worst case \u2013 when PCLMUL is not available \u2013 the speedup is still more than 50%.<\/p>\n<p>The story is similar on Windows, although NSS already had fast code for 32-bit Windows users.<\/p>\n<div id=\"attachment_2245\" style=\"width: 647px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win64-encrypt.png\"><img aria-describedby=\"caption-attachment-2245\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2245 \" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win64-encrypt-252x156.png\" alt=\"\" width=\"637\" height=\"394\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win64-encrypt-252x156.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win64-encrypt.png 600w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/><\/a><p id=\"caption-attachment-2245\" class=\"wp-caption-text\">Windows 64 AES-GCM 128 encryption performance improvements<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_2244\" style=\"width: 627px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win32-encrypt.png\"><img aria-describedby=\"caption-attachment-2244\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2244 \" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win32-encrypt-252x156.png\" alt=\"\" width=\"617\" height=\"382\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win32-encrypt-252x156.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/win32-encrypt.png 600w\" sizes=\"(max-width: 617px) 100vw, 617px\" \/><\/a><p id=\"caption-attachment-2244\" class=\"wp-caption-text\">Windows 32 AES-GCM 128 encryption performance improvements<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Performance improvements on Mac (64-bit only) range from 60% in the best case to 44% when AES-NI or PCLMUL is not available.<\/p>\n<div id=\"attachment_2243\" style=\"width: 622px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/mac-encrypt.png\"><img aria-describedby=\"caption-attachment-2243\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2243 \" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/mac-encrypt-252x156.png\" alt=\"\" width=\"612\" height=\"379\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/mac-encrypt-252x156.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/mac-encrypt.png 600w\" sizes=\"(max-width: 612px) 100vw, 612px\" \/><\/a><p id=\"caption-attachment-2243\" class=\"wp-caption-text\">Mac OSX AES-GCM 128 encryption performance improvements<\/p><\/div>\n<h3>The numbers in Firefox<\/h3>\n<p>NSS 3.32 (Firefox 56) ships with the new accelerated AES-GCM code. It provides significantly reduced CPU usage for most TLS connections or higher download rates \u2013 \u00a0meaning better energy efficiency, too. NSS 3.32 is more intelligent in detecting the CPU&#8217;s capabilities and using hardware acceleration whenever possible. Assuming that all intrinsics and mathematical operations (other than division) are constant-time on the CPU, the new code doesn&#8217;t have any timing side-channels.<\/p>\n<p>On the very basic laptop with the AMD C-70 download rates increased from ~3MB\/s to ~6MB\/s, and this is a device that has no hardware acceleration support.<\/p>\n<p>To see the performance improvement we can look at the case where AVX is not available (which is the case for about 2\/3 of the Firefox population). Assuming that at least AES-NI and PCLMUL is supported by the CPU we see the CPU usage drop from<a href=\"https:\/\/perfht.ml\/2rrqbWS\"> 15%<\/a> to<a href=\"https:\/\/perfht.ml\/2sa3aoA\"> 3%<\/a>.<\/p>\n<div id=\"attachment_2251\" style=\"width: 632px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/perfht.ml\/2rrqbWS\"><img aria-describedby=\"caption-attachment-2251\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2251\" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/331-mac-252x139.png\" alt=\"\" width=\"622\" height=\"343\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/331-mac-252x139.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/331-mac-768x423.png 768w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/331-mac-600x331.png 600w\" sizes=\"(max-width: 622px) 100vw, 622px\" \/><\/a><p id=\"caption-attachment-2251\" class=\"wp-caption-text\">AES_Decrypt CPU usage with NSS 3.31 without AVX hardware support<\/p><\/div>\n<div id=\"attachment_2250\" style=\"width: 625px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/perfht.ml\/2sa3aoA\"><img aria-describedby=\"caption-attachment-2250\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2250\" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/332-mac-252x139.png\" alt=\"\" width=\"615\" height=\"339\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/332-mac-252x139.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/332-mac-768x424.png 768w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/332-mac-600x332.png 600w\" sizes=\"(max-width: 615px) 100vw, 615px\" \/><\/a><p id=\"caption-attachment-2250\" class=\"wp-caption-text\">AES_Decrypt CPU usage with NSS 3.32 without AVX hardware support<\/p><\/div>\n<p>The most immediate effect can be seen on Mac. AES_Decrypt<a href=\"http:\/\/bit.ly\/2rGm8S0\"> NSS 3.31 used 9% CPU<\/a> while in<a href=\"http:\/\/bit.ly\/2rGvGfz\"> NSS 3.32 it uses only 4%<\/a>.<\/p>\n<div id=\"attachment_2249\" style=\"width: 629px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bit.ly\/2rGvGfz\"><img aria-describedby=\"caption-attachment-2249\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2249 \" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.42.18-252x139.png\" alt=\"\" width=\"619\" height=\"341\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.42.18-252x139.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.42.18-768x423.png 768w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.42.18-600x331.png 600w\" sizes=\"(max-width: 619px) 100vw, 619px\" \/><\/a><p id=\"caption-attachment-2249\" class=\"wp-caption-text\">AES_Decrypt CPU usage with NSS 3.31 on Mac OSX<\/p><\/div>\n<div id=\"attachment_2248\" style=\"width: 659px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bit.ly\/2rGm8S0\"><img aria-describedby=\"caption-attachment-2248\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-2248\" src=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.43.04-252x139.png\" alt=\"\" width=\"649\" height=\"358\" srcset=\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.43.04-252x139.png 252w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.43.04-768x423.png 768w, https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-14.43.04-600x331.png 600w\" sizes=\"(max-width: 649px) 100vw, 649px\" \/><\/a><p id=\"caption-attachment-2248\" class=\"wp-caption-text\">AES_Decrypt CPU usage with NSS 3.32 on Mac OSX<\/p><\/div>\n<p>The most significant performance improvements are summarise din the following table depicting the time in seconds to decrypt a ~500MB file with AES-GCM 128; lower is better.<\/p>\n<table style=\"height: 43px;\" width=\"487\">\n<tbody>\n<tr>\n<td><\/td>\n<td style=\"text-align: center;\">Linux 32-bit<\/td>\n<td style=\"text-align: center;\">Mac<\/td>\n<td style=\"text-align: center;\">No AVX support<\/td>\n<\/tr>\n<tr>\n<td>NSS 3.31 (Firefox 55)<\/td>\n<td style=\"text-align: center;\">20.3<\/td>\n<td style=\"text-align: center;\">11.5<\/td>\n<td style=\"text-align: center;\">21.3<\/td>\n<\/tr>\n<tr>\n<td>NSS 3.32 (Firefox 56)<\/td>\n<td style=\"text-align: center;\">3.4<\/td>\n<td style=\"text-align: center;\">4.6<\/td>\n<td style=\"text-align: center;\">3.5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These improvements to AES-GCM in NSS make Firefox 56 significantly faster, more side-channel resistant, and more energy efficient on most platforms using hardware support.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AES-GCM is a NIST standardised authenticated encryption algorithm (FIPS 800-38D). Since its standardisation in 2008 its usage increased to a point where it is the prevalent encryption used with TLS. &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/\">Read more<\/a><\/p>\n","protected":false},"author":1491,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,69,45499],"tags":[301293,301292,311,45514],"coauthors":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Improving AES-GCM Performance - Mozilla Security Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Franziskus Kiefer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/\",\"url\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/\",\"name\":\"Improving AES-GCM Performance - Mozilla Security Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/security\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58-252x119.png\",\"datePublished\":\"2017-09-29T07:25:42+00:00\",\"dateModified\":\"2017-10-02T12:29:11+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/security\/#\/schema\/person\/7ddeb268bc593d4449006cd59bf2120f\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58.png\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58.png\",\"width\":2848,\"height\":1350},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/security\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Improving AES-GCM Performance\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/security\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/security\/\",\"name\":\"Mozilla Security Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/security\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.mozilla.org\/security\/#\/schema\/person\/7ddeb268bc593d4449006cd59bf2120f\",\"name\":\"Franziskus Kiefer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/security\/#\/schema\/person\/image\/d0fe3f220874ed0c79a270226b01cebb\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2ec1752ca59c824e501bef7fd6beb596?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2ec1752ca59c824e501bef7fd6beb596?s=96&d=identicon&r=g\",\"caption\":\"Franziskus Kiefer\"},\"sameAs\":[\"https:\/\/franziskuskiefer.de\",\"https:\/\/x.com\/_franziskus_\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Improving AES-GCM Performance - Mozilla Security Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/","twitter_misc":{"Written by":"Franziskus Kiefer","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/","url":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/","name":"Improving AES-GCM Performance - Mozilla Security Blog","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/security\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58-252x119.png","datePublished":"2017-09-29T07:25:42+00:00","dateModified":"2017-10-02T12:29:11+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/security\/#\/schema\/person\/7ddeb268bc593d4449006cd59bf2120f"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#primaryimage","url":"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58.png","contentUrl":"https:\/\/blog.mozilla.org\/security\/files\/2017\/09\/Screen-Shot-2017-09-28-at-09.47.58.png","width":2848,"height":1350},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/security\/2017\/09\/29\/improving-aes-gcm-performance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/security\/"},{"@type":"ListItem","position":2,"name":"Improving AES-GCM Performance"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/security\/#website","url":"https:\/\/blog.mozilla.org\/security\/","name":"Mozilla Security Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/security\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.mozilla.org\/security\/#\/schema\/person\/7ddeb268bc593d4449006cd59bf2120f","name":"Franziskus Kiefer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/security\/#\/schema\/person\/image\/d0fe3f220874ed0c79a270226b01cebb","url":"https:\/\/secure.gravatar.com\/avatar\/2ec1752ca59c824e501bef7fd6beb596?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2ec1752ca59c824e501bef7fd6beb596?s=96&d=identicon&r=g","caption":"Franziskus Kiefer"},"sameAs":["https:\/\/franziskuskiefer.de","https:\/\/x.com\/_franziskus_"]}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/posts\/2241"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/users\/1491"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/comments?post=2241"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/posts\/2241\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/media?parent=2241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/categories?post=2241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/tags?post=2241"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mozilla.org\/security\/wp-json\/wp\/v2\/coauthors?post=2241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}