)]}'
{
  "log": [
    {
      "commit": "fa779b1bce2331d286bfc8f70276fdad72ae9fa5",
      "tree": "4e9a61e89174908e093de810e870d8d449a5d697",
      "parents": [
        "08c989f364576d3f0df3277cbb871bc3a62aad51"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 30 10:27:01 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 30 10:27:01 2026 +0100"
      },
      "message": "[libc] Allow out-of-range months in mktime()\n\nPOSIX specifies that the values of members of the broken-down time\nstructure are \"not restricted to the ranges\", and defines the way in\nwhich out-of-range values are to be handled.\n\nFor most fields, the arithmetic is already purely linear and so\nout-of-range values are handled automatically.  Out-of-range months\nare an exception: these are used as array indices and so must be\nnormalised before use.\n\nRestructure mktime() to make it more immediately visible when values\nare being read from and written back to the broken-down time\nstructure, add the required normalisation for the month number, and\nadd test cases to cover out-of-range months.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "08c989f364576d3f0df3277cbb871bc3a62aad51",
      "tree": "3b2f992643f6e03e1ddd82b114f90f2a66da3c9a",
      "parents": [
        "9c70e9b27e1999d3af8193e5660f6ca345d8b872"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 29 17:41:45 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 29 17:45:43 2026 +0100"
      },
      "message": "[crypto] Add confidentiality flag for cipher algorithms\n\nAdd a flag that indicates whether or not a cipher is capable of\nproviding confidentiality.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9c70e9b27e1999d3af8193e5660f6ca345d8b872",
      "tree": "e04325eb0feb8a41d2391688bb23611e08c5e589",
      "parents": [
        "4e155e11d5b964f55767e1d86907de5add4fc916"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 28 13:07:23 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 29 11:25:28 2026 +0100"
      },
      "message": "[malloc] Add zfree() to zero and then free a memory block\n\nFor memory that may contain secrets, it is good practice to zero the\nmemory before returning it to the heap.\n\nAdd a zfree() function that can be used to zero and then free any\nmemory allocated using malloc(), and use it in place of free() for any\nexisting code that is obviously managing secrets held in dynamically\nallocated memory.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "4e155e11d5b964f55767e1d86907de5add4fc916",
      "tree": "5674b6c14dbd244c702ec1169eaf7b2287ba09a9",
      "parents": [
        "3ca799eb269c5df414c74b3ae7465ec726fb6372"
      ],
      "author": {
        "name": "Guanghua Zhang",
        "email": "guanghua.zhang@intel.com",
        "time": "Tue Jul 28 20:33:00 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 28 20:35:29 2026 +0100"
      },
      "message": "[intelxl] Add support for Intel E610 and E835 adapters\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "3ca799eb269c5df414c74b3ae7465ec726fb6372",
      "tree": "d19152cf7876f3885999777ab192b2c0334ccdf0",
      "parents": [
        "8362661f9abe777947873b8d557574c847ce7460"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 27 15:14:57 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 27 15:29:54 2026 +0100"
      },
      "message": "[mime] Fix the use of MIME images without an explicit encoding\n\nThe Content-Transfer-Encoding header is optional: if not present then\nthe default \"7bit\" encoding should be assumed.  iPXE already includes\nlogic to set a default encoding name, but the default encoding name\nthen fails to match against any entries in the known encodings list\nsince it is terminated with a NUL (rather than with the semicolon or\nwhitespace character that would terminate the encoding name found\nwithin a Content-Transfer-Encoding header).\n\nFix by removing the default encoding name and instead treating a NULL\nencoding name as indicating that the default encoding should be used,\nand add a test case that omits the Content-Transfer-Encoding header.\n\nReported-by: Huzaifa Ali Zar \u003czar@amazon.com\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "8362661f9abe777947873b8d557574c847ce7460",
      "tree": "8cb8ad5c012f75d8f549b4e6728ed4698aca3372",
      "parents": [
        "ebca9ed2b2e62ee579100142ee61f5ba77a3c712"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 27 14:58:37 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 27 15:14:23 2026 +0100"
      },
      "message": "[test] Simplify the use of inline text for test images\n\nWhen specifying the content of a test image (e.g. a MIME archive file)\nusing C string literals, there is no easy way to indicate that the\nterminating NUL should be excluded from the byte array.\n\nProvide BINFILE(), TEXTFILE(), and FILE_ARRAY() helper macros that can\nbe used to simplify the initialisation of a byte array passed as\neither a raw byte value list or a string literal.  For example:\n\n  #define TEST_CASE( name, file ) do {                        \\\n      static uint8_t name ## _bytes FILE_ARRAY ( file );      \\\n      ...                                                     \\\n      } while ( 0 )\n\n  TEST_CASE ( test1, BINFILE ( 0x68, 0x65, 0x6c, 0x6c, 0x6f ) );\n\n  TEST_CASE ( test2, TEXTFILE ( \"hello\" ) );\n\nBoth of the above TEST_CASE() lines will end up producing a five-byte\narray:\n\n  static uint8_t test1_bytes[] \u003d { 0x68, 0x65, 0x6c, 0x6c, 0x6f };\n\n  static uint8_t test2_bytes[5] \u003d \"hello\";\n\nThis allows us to remove the stray NUL that otherwise appears at the\nend of any test images that are specified using string literals.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "ebca9ed2b2e62ee579100142ee61f5ba77a3c712",
      "tree": "a4e9bf378cc13b8ee7435528e053d99a63a96173",
      "parents": [
        "bb4b3b1c195e0f0ec63a716531ff7d7cbc326f13"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 21 13:28:23 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 21 13:35:25 2026 +0100"
      },
      "message": "[dns] Pass a non-null peer socket address to xfer_open_socket()\n\nCommit 3662065 (\"[dns] Use all configured DNS servers\") changed the\nlogic from opening a single defined nameserver address to opening an\nunspecified peer socket address and then specifying the full peer\naddress for each transmitted packet.\n\nThe peer socket address was left unspecified by passing a null pointer\nto xfer_open_socket().  This is supported by the UDP socket opener,\nbut technically violates the internal API (which allows the local\nsocket address to be a null pointer, but not the peer socket address).\nIn particular, in a debug build using DEBUG\u003dopen, the debug code will\nitself dereference the peer address pointer.\n\nFix by embedding the name server socket address within the DNS request\nstructure, and passing this to xfer_open_socket().\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "bb4b3b1c195e0f0ec63a716531ff7d7cbc326f13",
      "tree": "fb8e93cfa1767946e306380eaeb29539ade3b032",
      "parents": [
        "05e6256ceadd9c5608456cb0543fa6e53ee830a8"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 21 12:34:16 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 21 12:40:40 2026 +0100"
      },
      "message": "[xfer] Do not attempt to find an opener for a null URI scheme\n\nWith no current working URI, even a fully resolved URI may not have a\nscheme.  Attempting to open such a URI will currently result in\nxfer_uri_opener() calling strcasecmp() with a null pointer.  On a\nsystem that guards against null pointer dereferences, this will result\nin a segfault (or the equivalent, such as a Synchronous Exception on\narm64 UEFI).\n\nFix by checking that the URI is absolute (i.e. has a scheme) before\ncalling xfer_uri_opener(), as is already done elsewhere.\n\nReported-by: Matt Fleming \u003cmatt@readmodwrite.com\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "05e6256ceadd9c5608456cb0543fa6e53ee830a8",
      "tree": "b673c64a75fb2b92a9810dc44b5228be8222d566",
      "parents": [
        "9d6b3600ce025943c5c46f6dddabaca09d6f5df1"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jul 19 15:08:57 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jul 19 15:30:10 2026 +0100"
      },
      "message": "[tls] Parse ServerKeyExchange record immediately\n\nAs of commit 433a8f5 (\"[tls] Retain a reference in the key schedule to\nthe bound identity\"), the act of binding the server identity is\nlogically separated from the act of validating the server identity.\nWe may therefore bind the server identity (by verifying the signature\nover the Diffie-Hellman parameters) and agree the ephemeral shared\nsecret immediately upon receiving the ServerKeyExchange record, rather\nthan deferring the verification until we have a validated identity.\n\nThis provides a closer match to the flow required for TLS version 1.3,\nwhere the ephemeral shared secret is used for all messages after\nServerHello, and so must always be agreed prior to validation.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9d6b3600ce025943c5c46f6dddabaca09d6f5df1",
      "tree": "e112f08510fd473db974b68aa7c4c149ab501967",
      "parents": [
        "e30422e49f54170374cf38941207bc8a4f2de463"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 17 11:55:04 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 17 11:58:52 2026 +0100"
      },
      "message": "[image] Allow download progress messages to be silenced\n\nAdd a \"--quiet\" option to each image-acquiring command that currently\naccepts a \"--timeout\" option, to allow the displaying of the download\nURI and the progress dots to be inhibited.\n\nThis is particularly useful with \"data:\" URIs to inhibit the echoing\nof the full data URI contents:\n\n    iPXE\u003e imgfetch -n hw data:,hello%20world\n    data:,hello%20world... ok\n    iPXE\u003e\n\nvs.\n\n    iPXE\u003e imgfetch -q -n hw data:,hello%20world\n    iPXE\u003e\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "e30422e49f54170374cf38941207bc8a4f2de463",
      "tree": "45c2f18c7d48817bd9519ea533a3280d8bdb724b",
      "parents": [
        "081d235ae2ec99e3ef2b8b7847ee1930896e77cf"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 15:01:57 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 16:33:45 2026 +0100"
      },
      "message": "[dmesg] Add an in-memory ring buffer console\n\nAdd a trivial ring buffer console that can be used to extract the most\nrecent 8kB of (non-UI) console output as the ${dmesg} setting.\n\nThis allows previous console output to be displayed after the screen\nhas been cleared, such as when a background picture has been loaded.\nFor example:\n\n    #!ipxe\n    console -p http://boot.ipxe.org/ipxe.png\n    show -q dmesg\n\nIt also allows console output to be captured and sent as part of an\nHTTP POST, to allow for remote diagnostics.  For example:\n\n    #!ipxe\n    params\n    param dmesg ${dmesg:base64}\n    imgfetch http://192.168.0.1/api/diags##params\n\nThe recorded console output may be cleared if necessary by clearing\nthe setting:\n\n    clear builtin/dmesg\n\nThe name ${dmesg} is chosen as being unlikely to collide with any\nexisting variables used in end-user scripts.  A separate \"dmesg\"\ncommand is not provided, but could easily be added if useful.\n\nNote that iPXE supports recursive variable expansion in shell\ncommands.  Typing an interactive command such as \"echo ${dmesg}\" or\n\"param dmesg ${dmesg}\" is therefore a great way to exercise the memory\nallocator to the point of exhaustion.  Use \"show -q dmesg\" to show the\nring buffer contents.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "081d235ae2ec99e3ef2b8b7847ee1930896e77cf",
      "tree": "c459e9b9459a67590065f8c037d69b9e0849105b",
      "parents": [
        "fd2b1e99514ea27b5a2f79e7c6c03c618b4f91c7"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 16:31:33 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 16:33:43 2026 +0100"
      },
      "message": "[uri] Escape the \"+\" character within HTTP form parameters\n\nWithin application/x-www-form-urlencoded values, a \"+\" character needs\nto be escaped to avoid its being interpreted as a space.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "fd2b1e99514ea27b5a2f79e7c6c03c618b4f91c7",
      "tree": "b54f0843b09f19e716b3dd2c61d41ddcf755a51d",
      "parents": [
        "c208006f785be7b9168e4c3d0b9c5a1bd91f4e88"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 15:46:57 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 15:47:49 2026 +0100"
      },
      "message": "[settings] Add \"--quiet\" option to \"show\" command\n\nAllow the \"show -q\" command to be used to display a setting\u0027s value\nwithout also showing its origin and type metadata.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "c208006f785be7b9168e4c3d0b9c5a1bd91f4e88",
      "tree": "2140a207a74f8dfe4871c172df2f8fdcd7314049",
      "parents": [
        "0d3d223a87d4faa665672cb194d7b591fb25b671"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 12:55:53 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 16 13:05:09 2026 +0100"
      },
      "message": "[uri] Add support for \"data:\" URIs\n\nAdd support for \"data:\" URIs as defined in RFC 2397.  These can be\nused to construct image content under control of an iPXE script.  For\nexample:\n\n  # Inject the message \"Hello from iPXE\" as /etc/motd\n  initrd -n motd data:,Hello%20from%20iPXE%0A /etc/motd\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "0d3d223a87d4faa665672cb194d7b591fb25b671",
      "tree": "ce9a99c833fc7e7f8958df84473e22614da19814",
      "parents": [
        "917584e2e3cdb919b43145fb9f97901d8423cd84"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 15 23:28:38 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 15 23:32:13 2026 +0100"
      },
      "message": "[blob] Add an abstraction of an openable data blob\n\nWithin the iPXE data transfer interface model, openers are fully\nasynchronous and may not deliver any data until after the opener has\nreturned.\n\nProvide a trivial openable data blob object (as a generalisation of\nthe \"hello world\" data transfer interface example code) that will\nsimply deliver a single fixed blob of data to its parent interface and\nthen close itself.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "917584e2e3cdb919b43145fb9f97901d8423cd84",
      "tree": "54ffa4a8394016f3dff2f70ce7efb1be457a19b1",
      "parents": [
        "345abfba19eb7713b8d92331c143e2eaeb5fce71"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 14 13:47:36 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 14 13:47:36 2026 +0100"
      },
      "message": "[cloud] Add support for Alibaba Cloud IMDSv2\n\nThe design of IMDSv2 within Alibaba Cloud is identical to AWS IMDSv2,\nwith the header names changed from \"X-aws-ec2-*\" to \"X-aliyun-ecs-*\".\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "345abfba19eb7713b8d92331c143e2eaeb5fce71",
      "tree": "89e10d7334a671a18f4d1f3af3272cdadf1a71ef",
      "parents": [
        "9e2bf0e940c0fd79c2484910b520c1addc264521"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 14 13:10:19 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 14 13:10:19 2026 +0100"
      },
      "message": "[cloud] Add support for AWS IMDSv2\n\nUse an HTTP PUT request to fetch a session token, and pass this token\nvalue as a header when fetching the user-data script.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9e2bf0e940c0fd79c2484910b520c1addc264521",
      "tree": "b80567a116ff92d0c639e71ef2ee386e9d2a4c2b",
      "parents": [
        "dcdba1814239cd891090fb3aea009c736987d66a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 14 12:45:32 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 14 13:09:01 2026 +0100"
      },
      "message": "[cmdline] Add \"imgset\" command\n\nA commonly requested feature is to allow a setting to be populated\nwith the contents of an HTTP response.  This currently requires a\nsomewhat ugly workaround of having the HTTP endpoint generate an iPXE\nexecutable script fragment that includes the \"#!ipxe\" shebang and the\nrelevant \"set\" command.\n\nFor HTTP endpoints that are under the end user\u0027s control, this\nworkaround is viable (though still ugly).  For HTTP endpoints that are\noutside the user\u0027s control (such as the AWS metadata endpoints), this\nworkaround cannot be used.\n\nAdd an \"imgset\" command that can be used to store downloaded content\ndirectly into a setting.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "dcdba1814239cd891090fb3aea009c736987d66a",
      "tree": "0cb6bc4df61eb668b5cd7814d2743177b1d6412d",
      "parents": [
        "9043dc4d86a5f70418f9b81bc324a9a53cf29c67"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 15:39:00 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 16:43:54 2026 +0100"
      },
      "message": "[http] Allow issuing requests with an explicitly specified HTTP method\n\nThe design of IMDSv2 within both AWS and Alibaba Cloud requires the\nclient to obtain a temporary token via an HTTP PUT request.  There is\nno authentication on this request and there is no associated request\nbody: the requirement to use PUT exists solely to reduce the attack\nsurface for SSRF attacks (since vulnerable servers are much more\nlikely to be able to be tricked into issuing a GET request than a PUT\nrequest).\n\niPXE can currently issue requests using HTTP GET (if the request body\nis empty) or HTTP POST (if the request body includes form parameters).\nThere is no support for issuing a PUT request, or for allowing a\nscript to explicitly specify the HTTP method.\n\nAdd a \"--method\" option to the \"params\" command to allow an arbitrary\nrequest method name to be specified, and use this as the HTTP request\nmethod.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9043dc4d86a5f70418f9b81bc324a9a53cf29c67",
      "tree": "8a22dfa298fc51f366bde0ffa7df86220b4368d4",
      "parents": [
        "b82269a5454da4250f342674a37dd552e0e7a9d1"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 16:15:25 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 16:15:56 2026 +0100"
      },
      "message": "[http] Show parameter headers in debug output\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "b82269a5454da4250f342674a37dd552e0e7a9d1",
      "tree": "bff577deda2ebe4549907cf3682487e895ff7fcf",
      "parents": [
        "892481abc40da35dfdf867678ee480e7711eb614"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 15:32:43 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 15:38:02 2026 +0100"
      },
      "message": "[params] Avoid calling strcmp() with a NULL parameter list name\n\nIf a named parameter block is created and then a URI is parsed that\nattempts to use a nonexistent unnamed parameter block (or vice versa),\nthen the code in find_parameters() will currently call strcmp() with a\nNULL argument, resulting in a read-only access to undefined memory.\n\nFix by calling strcmp() only for non-NULL names.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "892481abc40da35dfdf867678ee480e7711eb614",
      "tree": "1885644f0efc14c7b3aa02a236ed25aaf35aedc0",
      "parents": [
        "1b89319ece42676a5f98357d47a6e7c6ea1c7e8e"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 11:51:14 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 12:45:47 2026 +0100"
      },
      "message": "[mime] Add support for MIME multipart images\n\nSome public clouds (such as AWS and Alibaba Cloud) allow for only a\nsingle user metadata blob.  The official iPXE cloud images will\nattempt to download and boot from this user metadata, expecting it to\ncontain an iPXE script.\n\nThis works, but causes conflicts when another consumer (such as\ncloud-init) also wants to use the same metadata blob.  There are\nworkarounds (such as publishing the cloud-init script at an\nalternative URI outside of the instance metadata service, and using\nthe iPXE script to direct cloud-init to use the alternative URI via\nkernel command-line arguments), but these are cumbersome and may\nweaken security since the alternative URI cannot provide the same\nlevel of guaranteed access restrictions.\n\nThere is support within cloud-init for parsing a multipart MIME\narchive, which may contain additional shell scripts, JSON data, etc,\nalongside the cloud-init configuration itself.  This is the standard\nand documented method that cloud-init has chosen to solve the issue of\nobtaining multiple data sources from a single user metadata blob.\n\nAdd support for multipart MIME as an archive image format from which\niPXE will extract the first body part that has the \"text/x-ipxe\" MIME\ntype.  This allows the iPXE boot script to be placed alongside\ncloud-init configuration within a single user metadata blob.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "1b89319ece42676a5f98357d47a6e7c6ea1c7e8e",
      "tree": "5d286016a4f43533fb37acf32a5a88e1e5315d20",
      "parents": [
        "5ba5ace5488e5a45530cb13e5b1ba34926aa7b32"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 10:38:48 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 12:00:05 2026 +0100"
      },
      "message": "[test] Generalise archive extraction self-tests\n\nThe zlib and gzip test definitions are almost identical.  Create a\nsingle definition of an archive test to reduce duplication.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "5ba5ace5488e5a45530cb13e5b1ba34926aa7b32",
      "tree": "619e76466d73a07d4c524fb80ef72da26e88a86e",
      "parents": [
        "84ac70ef8e8663213159bf1128633cfd08cfd9b0"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 10:11:06 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 13 12:00:05 2026 +0100"
      },
      "message": "[libc] Add strcasestr()\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "84ac70ef8e8663213159bf1128633cfd08cfd9b0",
      "tree": "3be721008fd062b9e42b3e894ebf5efce4a180f0",
      "parents": [
        "58ee55b3c13a3f53423091419f88bcb02fb5a035"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 16:29:52 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 16:29:52 2026 +0100"
      },
      "message": "[hermon] Add missing write barrier after initiating reset\n\nEnsure that the reset register write does not get reordered behind the\nfirst PCI configuration space read that checks to see if the reset has\ncompleted.\n\nDebugged-by: Jaroslav Svoboda \u003cmulti.flexi@seznam.cz\u003e\nTested-by: Jaroslav Svoboda \u003cmulti.flexi@seznam.cz\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "58ee55b3c13a3f53423091419f88bcb02fb5a035",
      "tree": "943911288f6f76777f84ff3111b3cc03fba7a9e3",
      "parents": [
        "c91655e65dc69903b1dd187ec940f4e73bf8290c"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 12:35:27 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 16:01:24 2026 +0100"
      },
      "message": "[image] Make text-based image data usable by string functions\n\nUsing standard string functions for parsing text-based image formats\nis currently cumbersome since there is no guaranteed NUL terminator,\nand so code must laboriously keep track of the remaining image length\nand use only those string functions that accept a length limit.\n\nEnsure that the byte immediately following the image data is always a\nNUL, thereby allowing all string functions to be used when parsing\nimages.  Provide a \"const char *text\" pointer aliased to the image\ndata, to make it explicit that image data may always be treated as a\nNUL-terminated string.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "c91655e65dc69903b1dd187ec940f4e73bf8290c",
      "tree": "5af7c932ce499185f66b34e8cfac3140c5c68590",
      "parents": [
        "fbc33effcf1cf05050801741bbb0806a2889de55"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 15:19:44 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 15:22:25 2026 +0100"
      },
      "message": "[xferbuf] Provide an image-backed data transfer buffer\n\nDefine and use a data transfer buffer that is directly backed by an\nimage, rather than downloading into a umalloc()-based data transfer\nbuffer and then transferring ownership to the image.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "fbc33effcf1cf05050801741bbb0806a2889de55",
      "tree": "67a7d08badd47eb7a3fe2a671e3c2da87103305c",
      "parents": [
        "b556be189c0bd9259507fa63d1ba87865f786fd3"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 11:50:35 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 12:46:05 2026 +0100"
      },
      "message": "[libc] Add strchrnul()\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "b556be189c0bd9259507fa63d1ba87865f786fd3",
      "tree": "5ff568619f3e648e7f54bb2ef5fbbe1e81f92e28",
      "parents": [
        "433a8f552f007255d3a0fa13aa7963e0281c9981"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 10:35:03 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 10 10:36:34 2026 +0100"
      },
      "message": "[hermon] Check for failure from pci_ioremap()\n\nReported-by: Jaroslav Svoboda \u003cmulti.flexi@seznam.cz\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "433a8f552f007255d3a0fa13aa7963e0281c9981",
      "tree": "8ef1e61cf66cdfe3a76991651f7ed80aead928ef",
      "parents": [
        "6ba010eaada9c089c92804969f9181d88d7ccc7c"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 23:27:05 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 09 12:09:55 2026 +0100"
      },
      "message": "[tls] Retain a reference in the key schedule to the bound identity\n\nChange the \"bound\" field from being a boolean flag to being a\nreference to the server identity (i.e. the certificate) to which the\nshared secret has been bound.\n\nThis reduces the chances for future bugs that could be caused by\npotentially losing track of which identity has been bound, and also\nprovides a natural way to extend the field to be able to represent an\nidentity that has not yet been validated (as will be required for TLS\nversion 1.3 key exchange).\n\nAdd a check that the bound identity has been validated at the point of\nsending our client Finished handshake.  We must defer sending the\nclient Finished until validation has completed, to prevent the server\nfrom sending application traffic until we are ready to receive it, and\nso this provides a natural point at which we know that the bound\nidentity must have been validated.\n\nSince the validity check is now deferred until the point of sending\nthe client Finished, and since commit 6ba010e (\"[tls] Reject incorrect\nserver names before completing validation\") already ensures that the\ncertificate must have the correct name, there is no need to extract\nand store the certificate\u0027s public key separately after validation has\ncompleted.\n\nWe also update the session key (and related parameters) only if the\nbound identity has been validated.  This creates an invariant that if\na server certificate is stored in the session then it is always\nguaranteed to be valid, which simplifies reasoning about session\nresumption flows.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "6ba010eaada9c089c92804969f9181d88d7ccc7c",
      "tree": "26dc2da8ba035bd6197f73863a79b7c156106a21",
      "parents": [
        "2a2d2b908054cdaa1db54832e9d18539fdd32668"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 14:44:55 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 14:44:55 2026 +0100"
      },
      "message": "[tls] Reject incorrect server names before completing validation\n\nWe currently verify the certificate name only after completing\nvalidation of the certificate chain.  Perform this check instead at\nthe point of parsing the Certificate record, to create an invariant\nthat the recorded server certificate always has the correct name (even\nif not yet validated).\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "2a2d2b908054cdaa1db54832e9d18539fdd32668",
      "tree": "90270d50653bc1b340939d0dd19e65ddc7f6e0d7",
      "parents": [
        "6a96034bc42855801f401ce2442e33ba73d87983"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 11:50:20 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 12:05:07 2026 +0100"
      },
      "message": "[tls] Guard against resuming from an empty resumption master secret\n\nThere should be no circumstance that leads to a session being resumed\nwithout having a valid session resumption secret that was stored by a\nsuccessfully established previous connection.\n\nAs an additional layer of defence in depth, clear the \"keyed\" and\n\"bound\" flags in the key schedule if it is ever resumed from an empty\nsession resumption secret.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "6a96034bc42855801f401ce2442e33ba73d87983",
      "tree": "96618ff05ceaa138c87a952e7ccc8738e58b13b5",
      "parents": [
        "792849763633f62ff9cbeec4ea22939b53d1c2fa"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 12:02:51 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 12:05:05 2026 +0100"
      },
      "message": "[tls] Poison initial resumption master secret\n\nThere should be no circumstance that leads to a session being resumed\nwithout having a valid session resumption secret that was stored by a\nsuccessfully established previous connection.\n\nAs an additional layer of defence in depth, poison the initial session\nresumption master secret so that a predictable all-zero secret can\nnever be used accidentally in future.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "792849763633f62ff9cbeec4ea22939b53d1c2fa",
      "tree": "d856eb0a440457c3daedd5d315bdaf7d36bbc6a0",
      "parents": [
        "6e89b5c4bf8d7a8ece01b533c60a57f194169f97"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 11:14:50 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jul 08 11:36:38 2026 +0100"
      },
      "message": "[tls] Poison initial key derivation function master secret\n\nA freshly initialised key derivation function master secret has the\n\"keyed\" flag clear and so cannot accidentally be used to establish a\nfull TLS connection.\n\nAs an additional layer of defence in depth, poison the initial key\nderivation master secret so that a predictable all-zero secret can\nnever be used accidentally in future.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "6e89b5c4bf8d7a8ece01b533c60a57f194169f97",
      "tree": "71275db4ebc4e4ab34fd0ea5749e41d2d6e6ca95",
      "parents": [
        "cbfa5ef6d32200e0263de9687fafbe1fa46754a5"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 07 15:19:02 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jul 07 16:04:39 2026 +0100"
      },
      "message": "[tls] Track and check key schedule state\n\nTLS already allows for several different paths to the establishment of\na shared secret channel.  The shared secret may be generated by the\nclient and encrypted using RSA key transport, or negotiated as a\nDiffie-Hellman shared secret (via FFDHE or ECDHE), or mutually agreed\nto be restored from a previously saved session resumption secret.\n\nTLS version 1.3 defines several new paths to exist alongside these:\nephemeral key exchange is moved to the ClientHello and ServerHello\nmessages, server identity is verified using a CertificateVerify\nmessage (instead of a signed ServerKeyExchange or an encrypted\nClientKeyExchange), and session resumption is handled via a new\npre-shared key mechanism.\n\nWhile TLS version 1.3 in isolation is substantially simpler and\ncleaner than earlier versions, the requirement to support both new and\nold versions in the same code comes with a significant complexity\ncost.\n\nGuard against the possibility of future bugs by defining two\nproperties for the key schedule:\n\n- a \"keyed\" flag indicating that the key schedule actually holds some\n  shared secret key material (e.g. from ECDHE)\n\n- a \"bound\" flag indicating that the shared secret key material in the\n  key schedule has been bound to the identity represented by the\n  server\u0027s certificate\n\nThese flags are updated when relevant key schedule events happen, and\nvalidated before processing the server\u0027s Finished message.  If we\nsomehow end up receiving a Finished message without having established\nand authenticated a shared secret, this check prevents us from marking\nthe connection as ready for application data.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "cbfa5ef6d32200e0263de9687fafbe1fa46754a5",
      "tree": "0dfb60e30c7be66452c05c42eb87c0ddb444f998",
      "parents": [
        "2476e43bcf304f61704bb41bfde67dfd862cd091"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 06 13:43:05 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 06 13:43:05 2026 +0100"
      },
      "message": "[tls] Guard against a premature server Finished\n\nA malicious server that immediately sends a Finished record (without\never having sent a ServerHello) will currently cause tls_prf() to get\nstuck in an infinite loop attempting to generate pseudorandom data\nusing the null digest algorithm.\n\nFix by checking that the key schedule digest size is non-zero\n(i.e. that the digest is not the null digest) before attempting to\nprocess the Finished record.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "2476e43bcf304f61704bb41bfde67dfd862cd091",
      "tree": "b0c1b0b3c81c76833beeced0a894eafe978d487f",
      "parents": [
        "ca51c16232cfb02e1d2e23e8e876b1dca945a390"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 06 12:14:34 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 06 12:15:30 2026 +0100"
      },
      "message": "[tls] Send closure alert only when we are initiating the closure\n\nWhen the TLS connection is closed by the underlying socket, the\nclosure alert will not be able to be sent.  This currently results in\na harmless but mildly irritating error message when debugging is\nenabled.\n\nFix by sending the closure alert only when we are actively choosing to\nclose the connection.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "ca51c16232cfb02e1d2e23e8e876b1dca945a390",
      "tree": "db93d089d7774f157db181028519a18dd046413c",
      "parents": [
        "9548f9eae6458216c361cf10c7b1d113a46776ee"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 06 11:38:55 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jul 06 11:43:19 2026 +0100"
      },
      "message": "[tls] Handle key exchange within key schedule\n\nEphemeral key exchange is currently handled as part of sending the\nClientKeyExchange handshake record, with almost entirely separate\nimplementations for DHE and ECDHE.\n\nCreate wrappers around the underlying key exchange algorithm to handle\nthe TLS-specific aspects (such as padding and stripping leading zeros\nfor DHE), and use these for both DHE and ECDHE key exchange.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9548f9eae6458216c361cf10c7b1d113a46776ee",
      "tree": "8c58b61f689a103ffff613e766d269dc58147cce",
      "parents": [
        "9604031edf3be729ce684d7c99e638ecb1d5d83a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 03 16:48:10 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 03 16:48:10 2026 +0100"
      },
      "message": "[cloud] Use \"param\" command to provide Google metadata request header\n\nRequests for metadata within Google Compute Engine require a custom\nHTTP header \"Metadata-Flavor: Google\" to guard against Server-Side\nRequest Forgery (SSRF) attacks.\n\nSupport for this was originally implemented in 2017 using a custom\nHTTP request header generator that added this header to any requests\nmade to metadata.google.com.\n\nIn commit 96bb6ba (\"[params] Allow for arbitrary HTTP request headers\nto be specified\"), iPXE gained the ability to generate arbitrary HTTP\nheaders via the \"param\" command.\n\nRemove the custom HTTP request header generator, enable the \"param\"\ncommand for cloud builds, and update the embedded script for Google\nCompute Engine to construct the required Metadata-Flavor header.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9604031edf3be729ce684d7c99e638ecb1d5d83a",
      "tree": "d3013b88fad94e372ba5b55db2fe7718b6e55908",
      "parents": [
        "8fc456031549c1c76f25b512d7d47bcfe489a847"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 03 14:00:09 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jul 03 14:50:31 2026 +0100"
      },
      "message": "[tls] Restructure to use a single key derivation function master secret\n\nCalls to the key derivation function tls_prf() currently have to pass\nthe relevant secret (i.e. the pre-master secret or the master secret)\nas a parameter.\n\nRestructure to more closely match the design of the TLS version 1.3\nkey schedule, which maintains a single running secret (which we choose\nto name the \"key derivation function master secret\") that is always\nimplicitly used as the secret for key expansion.\n\nThe secret value is currently used by tls_prf() only as the key to\nhmac_init().  We can therefore use hmac_key() to reduce the secret to\na fixed-length value.  (The TLS master secret is already a fixed 48\nbytes, but the pre-master secret may be any length.)\n\nThe fixed length of the secret is dependent upon the protocol version\nand the cipher suite digest algorithm.  For TLS version 1.2, the\nlength is the HMAC key size for the digest algorithm.  For TLS version\n1.1, which uses separate invocations of HMAC-MD5 and HMAC-SHA1, the\nlength is the sum of the HMAC-MD5 and HMAC-SHA1 key sizes.  (For TLS\nversion 1.3, the length will be the HKDF key size, i.e. the output\nsize of the digest algorithm.)\n\nTo avoid introducing some very messy memory allocation code paths, we\ncontinue to use a fixed size of 48 bytes for the resumption master\nsecret stored in the TLS session.  This is sufficient to hold the\n48-byte raw master secret for TLS version 1.2 and earlier, and will\nalso be sufficient to hold the HKDF Derive-Secret output for the\nlongest supported digest algorithm (SHA-384) in TLS version 1.3.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "8fc456031549c1c76f25b512d7d47bcfe489a847",
      "tree": "c99419b7791bb9e964803566a83235c332cd24b1",
      "parents": [
        "a392b4f6d87f0ddffa00828be34a7f0131fec983"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 15:09:28 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 15:09:28 2026 +0100"
      },
      "message": "[tls] Treat session secret as \"resumption master secret\"\n\nWhen resuming a session in TLS versions 1.2 and earlier, the master\nsecret is simply reused.  The value stored in the session is therefore\nthe same as the master secret used in the connection.\n\nFor TLS version 1.3, there is a separate concept of a \"resumption\nmaster secret\" that is derived from the original connection\u0027s master\nsecret, and from which the resumed connection\u0027s new master secret will\nbe derived.\n\nRename the session master_secret to resumption_master_secret to\nclarify this separation.\n\nResume use of the master secret (i.e. copy the secret from the session\nto the connection) only after the cipher suite has been selected, to\nreduce differences with the expected flow for TLS version 1.3.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "a392b4f6d87f0ddffa00828be34a7f0131fec983",
      "tree": "a20c3b6a3101718f249e8172818b4b8a54e3effd",
      "parents": [
        "dbda839b62c2a7051980453f7ac893adc7b3b504"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 13:09:44 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 13:09:44 2026 +0100"
      },
      "message": "[virtio] Allow for long delays in processing transmit queue submissions\n\nWhen using QEMU with the KVM accelerator, MMIO writes to the queue\ndoorbell register are likely to hit an ioeventfd region.  KVM will\nsignal readiness on the ioeventfd file descriptor (which will\neventually wake up the QEMU userspace process to handle the MMIO\nwrite) and then immediately resume execution of the iPXE guest.\n\nThis can result in high latencies in processing submitted descriptors.\nWith the small transmit queue fill level used by iPXE, this can easily\noverrun the transmit queue and result in large numbers of dropped\ntransmissions.\n\nIncrease the transmit queue fill level to utilise the whole queue if\nneeded, and use the transmission deferral mechanism to avoid dropping\npackets when high latencies occur during operation.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "dbda839b62c2a7051980453f7ac893adc7b3b504",
      "tree": "8ba8a80eea745835501b3a5b068e605d9229d4e7",
      "parents": [
        "1f771254433174f626e91a068d71fff267ba7e05"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 13:00:28 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 13:00:28 2026 +0100"
      },
      "message": "[virtio] Fix queue size calculations\n\nThe queue size calculations currently do not take into account the\nfact that each packet requires a pair of descriptors.  If the device\nhappens to present an extremely small queue (16 descriptors for Q0, 32\ndescriptors for Q1) then this will result in the driver submitting\ndescriptors beyond the queue\u0027s descriptor count.  This does not result\nin any invalid memory accesses (since the descriptor ring length is\nrounded up to a 4kB boundary), but does result in an unusable network\ndevice.\n\nFix by scaling the packet count and descriptor count values as\nrequired.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "1f771254433174f626e91a068d71fff267ba7e05",
      "tree": "ff63c482f3c1bbafd4718237273f14b46245e339",
      "parents": [
        "1e4b4da5a822a582774537228f10ba1355f687f1"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 30 13:15:24 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 12:04:08 2026 +0100"
      },
      "message": "[tls] Move handshake digest within the scope of the key schedule\n\nThe digest algorithm selected by the cipher suite is used for both\ncalculating the handshake digest and as the tls_prf() key derivation\nfunction digest algorithm.  (In TLS version 1.3, it will similarly be\nused as the HKDF digest algorithm.)\n\nMove the digest algorithm selection within the key schedule, to\nclarify that the scope of this digest algorithm is wider than solely\nbeing used to calculate the handshake digest.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "1e4b4da5a822a582774537228f10ba1355f687f1",
      "tree": "b5a43799a940f60118b72f79bc28c2d7589d1e6f",
      "parents": [
        "37225fa9cd6c2491f779cd9d37f2ddd1b6700bad"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 30 13:13:04 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 11:43:04 2026 +0100"
      },
      "message": "[tls] Clarify TLS key schedule function names\n\nThe term \"key\" has a large number of uses in the context of TLS.\nReduce opportunities for confusion by renaming tls_key_init() and\ntls_key_reset() to less generic names.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "37225fa9cd6c2491f779cd9d37f2ddd1b6700bad",
      "tree": "0142695603867bc0f689e43c516e50cfb814c66f",
      "parents": [
        "eaef9a0742b0b4527d3111000b99e1eb770db468"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 30 14:58:33 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 11:43:04 2026 +0100"
      },
      "message": "[crypto] Define a structure for holding hybrid MD5+SHA1 HMAC keys\n\nThe hybrid PRF used in TLS version 1.1 and earlier does not use HMAC\nwith the hybrid MD5+SHA1 algorithm: it uses separate invocations of\nHMAC-MD5 and HMAC-SHA1.\n\nUsing hmac_keysize(\u0026md5_sha1_algorithm) would produce a size too small\nto hold the combined HMAC-MD5 and HMAC-SHA1 keys.  One option would be\nto set the (currently unused) MD5+SHA1 block size to 128, thereby\nensuring that hmac_keysize() would happen to return a length large\nenough to hold both HMAC keys.  This would avoid the need to\nspecial-case the MD5+SHA1 algorithm when calculating the required HMAC\nkey size for the PRF, but would inevitably cause confusion in future.\n\nSet the MD5+SHA1 block size to 64 (since both algorithms have the same\nunderlying block size, and this would therefore produce the \"correct\"\nresult if anything were ever to use HMAC directly with the hybrid\nMD5+SHA1 algorithm), and define a separate structure for holding the\nseparated HMAC keys used by the PRF in TLS version 1.1 and earlier.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "eaef9a0742b0b4527d3111000b99e1eb770db468",
      "tree": "321cd2d9151488404f2ece2c64572336f6ef8fe9",
      "parents": [
        "50e8a57bab04d7629821cb1f9793e53f76390f78"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 11:39:31 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 11:43:01 2026 +0100"
      },
      "message": "[crypto] Make maximum TLS version a configurable option\n\nThe minimum supported TLS version is already configurable via\nTLS_VERSION_MIN in config/crypto.h, but changing the maximum TLS\nversion currently requires editing the source code proper.  This makes\nit cumbersome to test older TLS versions, and therefore increases the\nchances that support for older versions will end up breaking as new\nfeatures are added.\n\nMove TLS_VERSION_MAX from include/ipxe/tls.h to config/crypto.h to\nease the process of testing older TLS versions.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "50e8a57bab04d7629821cb1f9793e53f76390f78",
      "tree": "895e631b7e2fd76f34babff149a1e22b58feb0ed",
      "parents": [
        "895db73fbde54ac2aea5c64fba8049cf206f574f"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 11:19:40 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jul 02 11:24:50 2026 +0100"
      },
      "message": "[crypto] Re-add missing digestInfo prefix for MD5+SHA1\n\nCommit efa9515 (\"[tls] Split out hybrid MD5+SHA1 algorithm used in TLS\nversion 1.1\") accidentally removed the empty RSA digestInfo prefix\nrequired for verifying DHE and ECDHE ServerKeyExchange messages when\nusing TLS version 1.1.  (Non-ephemeral cipher suites using RSA key\ntransport would still work, since the digestInfo is required only for\nsignatures, not for encryption/decryption.)\n\nFix by restoring the dummy digestInfo prefix for MD5+SHA1.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "895db73fbde54ac2aea5c64fba8049cf206f574f",
      "tree": "12a8d3e0009ef3cb8a479f099b2a27246e8797f2",
      "parents": [
        "bbd7821bd42da5456ee068a471ef73d525ea26a1"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 30 10:38:37 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 30 10:47:19 2026 +0100"
      },
      "message": "[build] Use dynamic keyboard map by default in UEFI builds\n\nAs described in commit 05cb930 (\"[build] Extend default configuration\nfor non-BIOS builds\"), the default configuration for EFI needs to\nallow for the unfortunate fact that users will not be able to rebuild\nthe Secure Boot binaries for themselves.\n\nThe keyboard map currently defaults to \"us\" (i.e. no keyboard\nremapping) on all platforms.  Switch to using the \"dynamic\" keyboard\nmap by default for EFI platforms.\n\nDo not use the \"dynamic\" keyboard map by default on Linux platforms\n(where the input character read by iPXE has already passed through the\nhost\u0027s keyboard mapping) or on RISC-V SBI (where input is expected to\ncome via a serial port rather than a directly attached keyboard).\n\nRequested-by: Simon Fonteneau \u003cblog@lesfourmisduweb.org\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "bbd7821bd42da5456ee068a471ef73d525ea26a1",
      "tree": "88aa7668cd368fa7a365acec44590543c49e86e6",
      "parents": [
        "f39cf1cd5c0221b9069a094bcb71039a2e9f8111"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 29 16:37:53 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 29 16:43:12 2026 +0100"
      },
      "message": "[crypto] Allow for the construction of fixed-size HMAC keys\n\nAn HMAC key can always be reduced to the block size of the underlying\ndigest algorithm.  Provide hmac_key() that can be used to perform this\nreduction, and hmac_init_key() as a way to initialise an HMAC digest\noperation from a previously reduced key.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "f39cf1cd5c0221b9069a094bcb71039a2e9f8111",
      "tree": "65fb4f2b03c6e66e62eda23572327fdfae052c3e",
      "parents": [
        "e5d0c804eea7c2fbe680b1ecd66435a94a9819e3"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 29 12:37:08 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 29 12:37:08 2026 +0100"
      },
      "message": "[s390x] Add time source based on the architectural Time-of-Day clock\n\nThe S/390 architecture provides instructions to read the Time-of-Day\n(TOD) clock, which increments at a well-defined rate regardless of the\nunderlying physical clock speed, and has an epoch that starts from\nzero at the beginning of the 20th century.\n\nUse this clock to provide both interval timing (i.e. udelay() and\ncurrticks()) and the wall-clock time source.  For short interval\ntiming, we choose to save on code size by treating one millisecond as\n1024 microseconds.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "e5d0c804eea7c2fbe680b1ecd66435a94a9819e3",
      "tree": "02ec0fb756d4c867701270c2abe0da66eb5a3a48",
      "parents": [
        "9f088838bce5ae97f5af432e6de86c2fd4d6793c"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 28 20:06:46 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 28 20:09:23 2026 +0100"
      },
      "message": "[s390x] Add support for the PRNO TRNG as an entropy source\n\nThe \"prno\" instruction available on newer CPUs provides a hardware\nTrue Random Number Generator (TRNG) that can be used as an entropy\nsource, similar to the x86 \"rdrand\" instruction.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "9f088838bce5ae97f5af432e6de86c2fd4d6793c",
      "tree": "943fdac153739f3785a5995677dafff3020ab130",
      "parents": [
        "902014c57abb31ed963ece5c4e86c06da3f72c2a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 28 20:04:53 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 28 20:05:55 2026 +0100"
      },
      "message": "[s390x] Provide a mechanism for checking installed CPU facilities\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "902014c57abb31ed963ece5c4e86c06da3f72c2a",
      "tree": "4a47ce34044e3e5cd5e33d7416f08d3755554629",
      "parents": [
        "cc01b6c3abd726ebb7d23475bb066aed02e4843c"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 13:44:08 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 13:45:44 2026 +0100"
      },
      "message": "[crypto] Remove redundant DHE algorithm\n\nRemove the now-unused implementation of DHE that requires explicit\ngroup parameters, since we now use a standalone key exchange algorithm\nabstraction instead.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "cc01b6c3abd726ebb7d23475bb066aed02e4843c",
      "tree": "5bf0db3cbde9b9a119c96b6d49023d4efc7fd996",
      "parents": [
        "e50c7cb4deaaf0f74bb8ab1c9ca1503d0bb4ee78"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 13:39:47 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 13:39:47 2026 +0100"
      },
      "message": "[tls] Use generic key exchange algorithm abstraction for DHE\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "e50c7cb4deaaf0f74bb8ab1c9ca1503d0bb4ee78",
      "tree": "981bb5fc003978a925cb6b921699d78b046ebbba",
      "parents": [
        "dd6411065e2cdea230f5145b0cc6bff24f85b5c0"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 12:37:24 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 12:37:24 2026 +0100"
      },
      "message": "[crypto] Allocate FFDHE temporary space on demand\n\nNow that key exchange algorithms are allowed to fail to construct a\nshared public key, we can allocate the temporary working space for\nFFDHE calculations on demand rather than using a static buffer.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "dd6411065e2cdea230f5145b0cc6bff24f85b5c0",
      "tree": "c327e90cb09fe775744c3d6ef92617b09e6e5b9a",
      "parents": [
        "0a9225653090fe4d1079f27dc8639e6915d2c4d1"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 10:04:56 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 12:13:26 2026 +0100"
      },
      "message": "[crypto] Allow construction of shared public key to return an error\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "0a9225653090fe4d1079f27dc8639e6915d2c4d1",
      "tree": "40d022fcd84bd56f7275a3c595c5a06d69b0e1e6",
      "parents": [
        "327378a764064b5edbc8bbebbb95980234892d04"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 12:03:54 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 25 12:13:26 2026 +0100"
      },
      "message": "[crypto] Correct maximum length of FFDHE prime modulus\n\nCommit 70d63be (\"[crypto] Add RFC 3526 FFDHE key exchange algorithms\")\ndefined FFDHE_LEN as a fixed value (rather than deriving it from the\nstored length of the Euler constant) and accidentally expressed it as\na bit length rather than a byte length, resulting in substantial\namounts of wasted space.\n\nFix the maximum length of the modulus and add static assertions to\nensure that the two constants are exactly the required size for this\nlength.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "327378a764064b5edbc8bbebbb95980234892d04",
      "tree": "96cbc2ec766f36ef6fa99a74713247a78bf7109b",
      "parents": [
        "449d2acf3d3a41ff1d6e3a74c2f122b70601dd94"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 23 12:46:55 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 23 13:24:22 2026 +0100"
      },
      "message": "[crypto] Generalise implementation of Merkle-Damgård hash algorithms\n\nAll of our current digest algorithms (MD4, MD5, SHA-1, and the SHA-2\nfamily) use a Merkle-Damgård construction, with only the compression\nfunction, the initial digest values, the field sizes, and the\nendianness differing between algorithms.\n\nProvide a common implementation for Merkle-Damgård hash algorithms to\nreduce code size.  Values are now held as host-endian quantities, with\nany swapping performed byte-by-byte as data is accumulated (using a\ncompile-time constant that is XORed with the byte index).\n\nFor the SHA family of algorithms, the values w[] are now calculated\niteratively as we progress through the main loop: this substantially\nreduces the stack space required for the compression function.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "449d2acf3d3a41ff1d6e3a74c2f122b70601dd94",
      "tree": "cff131a642d92a981ac27c8f68b0b4df03759320",
      "parents": [
        "56347b2612c3a278ad17ed50e2f7d064ac14ac80"
      ],
      "author": {
        "name": "Animesh Bhatt",
        "email": "animeshb@marvell.com",
        "time": "Mon Jun 22 14:48:28 2026 +0530"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 23 11:00:49 2026 +0100"
      },
      "message": "[aqc1xx] Free outstanding receive I/O buffers on close\n\natl_close() freed the descriptor rings but left the posted receive I/O\nbuffers allocated, leaking them and tripping an assertion on the next\nopen.  Free any outstanding receive I/O buffers in atl_close().\n\nSigned-off-by: Animesh Bhatt \u003canimeshb@marvell.com\u003e\n"
    },
    {
      "commit": "56347b2612c3a278ad17ed50e2f7d064ac14ac80",
      "tree": "350ca1f836ba1941d24dcee6a9f5c352b89735a0",
      "parents": [
        "0daeb3e645fd94491149107521f9f354e6a509db"
      ],
      "author": {
        "name": "Animesh Bhatt",
        "email": "animeshb@marvell.com",
        "time": "Mon Jun 22 14:42:08 2026 +0530"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 23 11:00:36 2026 +0100"
      },
      "message": "[aqc1xx] Set netdev-\u003edma for operation with an IOMMU\n\nOn AQC113 adapters with an IOMMU (e.g. Intel VT-d) enabled, no packets\nare received and DHCP fails: the driver never set netdev-\u003edma, leaving\nthe transmit buffers unmapped for DMA.  This worked without an IOMMU\nbecause the physical address equals the device address, but with an\nIOMMU the unmapped DMA access faults and stalls the receive path.  Set\nnetdev-\u003edma and a 64-bit DMA mask so that transmit buffers are mapped\nthrough the firmware IOMMU, as done by the other iPXE drivers.\n\nSigned-off-by: Animesh Bhatt \u003canimeshb@marvell.com\u003e\n"
    },
    {
      "commit": "0daeb3e645fd94491149107521f9f354e6a509db",
      "tree": "d12238b2a8ec49756182bbb6d74b21c0cf72ba74",
      "parents": [
        "781b8d616f3d9ffef0d046b6a7e77d54843da6b7"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 23 09:50:37 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 23 10:28:37 2026 +0100"
      },
      "message": "[http] Remove knowledge of MD5 digest context internal structure\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "781b8d616f3d9ffef0d046b6a7e77d54843da6b7",
      "tree": "b53124d187d72209db64946da970bfece761c65c",
      "parents": [
        "d75a9670be28b6294f28cc3ddfe597a44878ddaa"
      ],
      "author": {
        "name": "Joseph Wong",
        "email": "joseph.wong@broadcom.com",
        "time": "Mon Jun 22 10:11:56 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 22 10:11:56 2026 +0100"
      },
      "message": "[bnxt] Prevent out-of-bounds memory access\n\nAdd boundary checks to prevent out-of-bounds memory accesses in RX and\nHWRM paths.\n\nSigned-off-by: Joseph Wong \u003cjoseph.wong@broadcom.com\u003e\n"
    },
    {
      "commit": "d75a9670be28b6294f28cc3ddfe597a44878ddaa",
      "tree": "524af1d531185a7ae80e13842cb153a65c2b7a47",
      "parents": [
        "a2eba23aceb2a05ddb96c3661596784fb1698b96"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 18:09:56 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 20 15:53:39 2026 +0100"
      },
      "message": "[tls] Centralise pseudorandom data generation\n\nTLS version 1.3 has a formal key schedule based on HKDF, and requires\nthe client to be able to recall ephemeral secrets at multiple points\nwithin the connection lifecycle.  For example: the ephemeral private\nkey for X25519 key exchange may be required when constructing\nClientHello (for a TLS version 1.3 key share) or when constructing\nClientKeyExchange (if subsequently falling back to use TLS version\n1.2), and again when parsing a ServerHello key share or a\nServerKeyExchange.\n\nSome ephemeral private keys may be large (e.g. for ffdhe4096).  Avoid\nthe need to store these large (and variably sized) private keys by\ninstead instantiating a standalone HKDF instance that we seed with\nper-connection random data and subsequently use to generate ephemeral\nprivate keys on demand.  (Note that this instance is unrelated to the\nHKDF instance defined in the formal key schedule for TLS: we are\nchoosing to reuse HKDF for this purpose simply because supporting TLS\nversion 1.3 will already require HKDF support to be present.)\n\nWe use the key exchange algorithm name (e.g. \"x25519\") as additional\ninformation to ensure separation between keys used for different\npurposes.  Since the initial random seed is generated afresh for each\nconnection, and since there can meaningfully be only one ephemeral\nprivate key per key exchange algorithm per connection, this is\nsufficient to ensure separation.\n\nHaving instantiated this HKDF, we then also use it to generate the\nclient random bytes (with the label \"client random\"), to generate the\nrandom portion of the pre-master secret for classic RSA key exchange\n(with the label \"classic pre-master\"), and to generate the random\nportion of record IVs (using the authentication header structure,\nwhich is already guaranteed to be unique per record within a\nconnection).  Doing this allows us to eliminate all other calls to the\nRNG, and removes some potential failure paths.\n\nWe reset the HKDF on a connection restart and on connection close, to\npreserve the property of forward secrecy.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "a2eba23aceb2a05ddb96c3661596784fb1698b96",
      "tree": "10263d09398d3c815ecfbf900c321e120ba409d0",
      "parents": [
        "846686325c6681b648f02a2275e6eef1991c979e"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 20 10:00:44 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 20 14:43:36 2026 +0100"
      },
      "message": "[crypto] Allow for input keying material to overlap output\n\nCalling hkdf_extract() with no salt and with the input keying material\nprovided in the same buffer that will hold the output pseudorandom key\nis a valid potential use case.  This will currently fail silently\nsince the input keying material would be overwritten by the\nconstructed all-zero salt before being consumed.\n\nFix by using a local buffer for the all-zero salt, rather than\nconstructing the salt in the output buffer.\n\nDocument the permitted behaviour in terms of overlapping input and\noutput buffers for both hkdf_extract() and hkdf_expand(), and extend\nthe test cases to verify this behaviour.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "846686325c6681b648f02a2275e6eef1991c979e",
      "tree": "e15dc038f79f7bc6731decfa5e4a958790012de4",
      "parents": [
        "2420211e7f0d81680e010b7b16aa42d365214271"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 14:53:03 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 14:54:03 2026 +0100"
      },
      "message": "[crypto] Use private data field for public-key algorithms\n\nFollowing the example of commit 25072c1 (\"[crypto] Use private data\nfield for key exchange algorithms\"), extend the definition of a\npublic-key algorithm to include an opaque private data field, and use\nthis to eliminate the wrapper functions for PKCS#1 and RSA-PSS.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "2420211e7f0d81680e010b7b16aa42d365214271",
      "tree": "01ed6559a75523acdefc7036bb722b4fa0a9dac5",
      "parents": [
        "21babfc392a9664ad11285f5a36e4d19d45905a6"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 14:11:46 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 14:11:46 2026 +0100"
      },
      "message": "[crypto] Allow cipher_setiv() to return an error\n\nGCM ciphers can accept initialisation vectors of any length.  Move the\nresponsibility for checking the initialisation vector length from the\ncaller into the implementation of cipher_setiv().\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "21babfc392a9664ad11285f5a36e4d19d45905a6",
      "tree": "d7cbe7409d974d365fc23e69362290bcbd84f5dc",
      "parents": [
        "d7e89f46b4b23a2492611cb629bd96bafbfb8d64"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 13:26:00 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Fri Jun 19 13:26:00 2026 +0100"
      },
      "message": "[crypto] Use private data field for cipher algorithms\n\nFollowing the example of commit 25072c1 (\"[crypto] Use private data\nfield for key exchange algorithms\"), extend the definition of a cipher\nalgorithm to include an opaque private data field, and use this to\neliminate the wrapper functions generated for the various block cipher\nmodes of operation by ECB_CIPHER(), CBC_CIPHER(), and GCM_CIPHER().\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "d7e89f46b4b23a2492611cb629bd96bafbfb8d64",
      "tree": "3b64deb5d9ad5ee72bb5a6be963f5e7df7327e95",
      "parents": [
        "69e95ae7a51d73b85fef3a2d1af9e0fc08e8ab00"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 15:54:19 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 15:54:19 2026 +0100"
      },
      "message": "[crypto] Use private data field for digest algorithms\n\nFollowing the example of commit 25072c1 (\"[crypto] Use private data\nfield for key exchange algorithms\"), extend the definition of a digest\nalgorithm to include an opaque private data field.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "69e95ae7a51d73b85fef3a2d1af9e0fc08e8ab00",
      "tree": "b5ffcd56a085b6ee5dd6129d8e59b19d0582181d",
      "parents": [
        "af0e5d529b860caf31c785df3e6e3d65c45e2d9f"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 14:21:08 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 14:31:29 2026 +0100"
      },
      "message": "[crypto] Generalise notion of uncompressed elliptic curve points\n\nWith algorithm private data pointers now available, the general\nmechanism for key exchange using uncompressed elliptic curve points\ncan be separated from the Weierstrass curve implementation.\n\nGeneralise the mechanism for performing elliptic curve key exchange\nusing uncompressed affine co-ordinates.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "af0e5d529b860caf31c785df3e6e3d65c45e2d9f",
      "tree": "80e692f0d36aa0ca926ce47011b028d60facb167",
      "parents": [
        "38fc660d8b11d8236dc9d02f9c8f8a1f55237090"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 13:18:18 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 13:18:18 2026 +0100"
      },
      "message": "[crypto] Use private data field for elliptic curve algorithms\n\nFollowing the example of commit 25072c1 (\"[crypto] Use private data\nfield for key exchange algorithms\"), extend the definition of an\nelliptic curve to include an opaque private data field, and use this\nto eliminate the wrapper functions generated by WEIERSTRASS_CURVE().\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "38fc660d8b11d8236dc9d02f9c8f8a1f55237090",
      "tree": "024b560fe86f872e0a452afee4cdb2711e22f0e6",
      "parents": [
        "bbb6477be3e05c5027dca5f8fcba22c74559383a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 12:11:31 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Thu Jun 18 12:15:04 2026 +0100"
      },
      "message": "[crypto] Use verbs in key exchange method names\n\nAlmost all cryptographic algorithm method names are currently verbs\n(e.g. pubkey_sign(), cipher_encrypt(), digest_update(), etc).\n\nRename the two key exchange methods to also use verbs, for the sake of\nconsistency and to better match the TLS usage of \"key_share\".\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "bbb6477be3e05c5027dca5f8fcba22c74559383a",
      "tree": "2619ecf8b094ef5f26bce36179f8bc5e08774587",
      "parents": [
        "241c36a6a2bafc25e68aa0cd8e4dc0b6daa3d491"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 15:13:34 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 16:35:22 2026 +0100"
      },
      "message": "[tls] Accept only explicitly supported FFDHE groups\n\nWe do not currently perform any validation on the DHE field prime or\ngenerator.  RFC 7919 defines a family of known-safe finite fields, and\nTLS version 1.3 completely removes the ability to provide an explicit\nfield prime and generator.\n\nVerify that the field prime and generator correspond to one of the\nexplicitly configured groups.\n\nThis may break connections to the (now very rare) TLS servers that use\ncustom FFDHE groups and that choose to use DHE rather than ECDHE (or\nthat do not support ECDHE).  We already advertise ECDHE cipher suites\nas preferred over DHE cipher suites, and advertise all ECDHE groups as\npreferred over all FFDHE groups.  It is therefore very unlikely that\nthis change will cause any issues in practice.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "241c36a6a2bafc25e68aa0cd8e4dc0b6daa3d491",
      "tree": "42384ee2700cca25a76a48c956082854b7c6af2e",
      "parents": [
        "daee5deba8975a5a3448464b9ba715d46abf77ea"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 15:11:43 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 16:06:56 2026 +0100"
      },
      "message": "[crypto] Add TLS named groups for FFDHE key exchange algorithms\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "daee5deba8975a5a3448464b9ba715d46abf77ea",
      "tree": "a8372a01898584aaacdcc68e17918f63f8b09fd6",
      "parents": [
        "416920c6566dca4ddf2951001bdef9c8aaf52a26"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 15:06:15 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 16:06:53 2026 +0100"
      },
      "message": "[tls] Allow for the existence of anonymous named groups\n\nThe RFC 3526 FFDHE groups may plausibly be used by TLS servers, but do\nnot have IANA-assigned codes.\n\nAllow for the existence of TLS named groups that have no code value\n(and can therefore be identified only by matching the group parameter\nvalues).\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "416920c6566dca4ddf2951001bdef9c8aaf52a26",
      "tree": "0c89598e18d082f05e640e29a8d02bb2e80864e9",
      "parents": [
        "c43c2829ec89e92971d78a63575e7d4b8737be11"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 15:38:01 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 15:43:54 2026 +0100"
      },
      "message": "[tls] Prefer X25519 as a key exchange mechanism\n\nIn TLS version 1.3, the expected flow is that the client offers at\nleast one key share in the initial ClientHello, so that key exchange\ncan take place as soon as the ServerHello is received (without\nrequiring a HelloRetryRequest and a second round trip).\n\nWe cannot viably offer key shares for all supported groups, since the\nFFDHE groups have large public key values.  The most likely approach\nwill be that we offer a single key share for our most preferred group.\n\nExperiments suggest that X25519 is currently the most widely supported\nkey exchange group.  Make this the most preferred group to maximise\nthe chance that a (future) TLS version 1.3 handshake will avoid the\nextra round trip for a HelloRetryRequest.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "c43c2829ec89e92971d78a63575e7d4b8737be11",
      "tree": "f7eabbb23476ff6e084e7a3c3f761a61f965eeac",
      "parents": [
        "25072c19053fe87993486e411eb85d059856f1fc"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 12:30:52 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 13:38:58 2026 +0100"
      },
      "message": "[crypto] Provide a mechanism to check FFDHE group parameters\n\nProvide is_ffdhe() and ffdhe_has_params() as a way to check if a key\nexchange algorithm happens to match against an explicit pair of prime\nmodulus and generator values.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "25072c19053fe87993486e411eb85d059856f1fc",
      "tree": "d638601a71b5bd840d465e0756158f023b2b7a61",
      "parents": [
        "70d63bec9418dd9f4b9dce46fd0f04b6cb00c0fe"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 10:48:18 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 13:38:50 2026 +0100"
      },
      "message": "[crypto] Use private data field for key exchange algorithms\n\nFor historical reasons, TLS versions 1.2 and earlier identify FFDHE\ngroups by specifying the raw group prime and generator (the \"dh_p\" and\n\"dh_g\" fields in ServerDHParams), rather than using a numeric code to\nidentify a named group.\n\nThis adds complexity to the process of identifying the internal key\nexchange algorithm.  One option would be to extend the definition of\nstruct tls_key_exchange_algorithm to include the identifying values\nfor the field prime and generator, but this is undesirable since the\nfield prime values may be large, and these values are already\navailable (indirectly) in ffdhe.c.\n\nExtend our definition of a key exchange algorithm to include an opaque\nprivate data field.  This allows us to remove the wrapper functions\ncurrently created by FFDHE_GROUP() and WEIERSTRASS_CURVE(), and opens\nup the option of accessing the existing FFDHE field prime and\ngenerator values from within the TLS layer.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "70d63bec9418dd9f4b9dce46fd0f04b6cb00c0fe",
      "tree": "5b4ab195c629d4b9f75f6f69969f796f3bf48159",
      "parents": [
        "cd873a2b5d2f3ff81d16908d932e8517dc6b7daa"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 13:33:54 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Wed Jun 17 13:38:50 2026 +0100"
      },
      "message": "[crypto] Add RFC 3526 FFDHE key exchange algorithms\n\nThe family of finite fields defined in RFC 7919 is almost identical to\nthat defined in RFC 3526, with the difference being that the older\nstandard uses the constant \"pi\" rather than \"e\".\n\nExtend the definition of an FFDHE group to include a pointer to the\ngroup constant, add the value of \"pi\", and define the modp2048,\nmodp3072, and modp4096 FFDHE groups.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "cd873a2b5d2f3ff81d16908d932e8517dc6b7daa",
      "tree": "450ac16bae632172ec72272c8b6140f28a127666",
      "parents": [
        "73d437859d5288e2e772f1345cad5367858202da"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 16:07:09 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 16:07:09 2026 +0100"
      },
      "message": "[crypto] Use inline assembly for bigint_grow() and bigint_shrink()\n\nThe bigint_grow() and bigint_shrink() functions are used on the fast\npath for big integer calculations (e.g. within the X25519 Montgomery\nladder step).  Use inline assembly implementations of these functions\non all architectures.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "73d437859d5288e2e772f1345cad5367858202da",
      "tree": "030b893f502548af074c6aec6ca64098dda8afb0",
      "parents": [
        "1a0ebb9ba5d51f55cb6e641b00219b9f84c9dd92"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 14:40:36 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 14:40:36 2026 +0100"
      },
      "message": "[s390x] Use XOR-in-place to zero small fixed-length blocks\n\nThe XOR instruction has a storage-and-storage format \"xc\" that can be\nused to zero small blocks of memory without needing to set up the four\nregisters required for \"mvcle\".\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "1a0ebb9ba5d51f55cb6e641b00219b9f84c9dd92",
      "tree": "6717506ed9bf6549b9733478d2d50d2b4b19a59a",
      "parents": [
        "fe070bf2de1a854329e1546cd4479c64f4ab428e"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 14:20:41 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 14:21:08 2026 +0100"
      },
      "message": "[tls] Rename \"named curve\" to \"named group\"\n\nRFC 7919 renames the NamedCurve enumeration to NamedGroup, reflecting\nits extended usage to handle key exchange groups that are not\nconstructed using elliptic curves.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "fe070bf2de1a854329e1546cd4479c64f4ab428e",
      "tree": "d36edeef1e8403ef88d01c58d81254d90b95f6e4",
      "parents": [
        "22564dd26b33cd605b00799d27ad8ffabd99f79a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 13:04:01 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 16 13:17:31 2026 +0100"
      },
      "message": "[virtio] Ignore capabilities that describe inaccessible PCI BARs\n\nIn some configurations, newer versions of QEMU will end up placing the\nmodern interface\u0027s BAR4 above 4GB, rendering it inaccessible in a\n32-bit build of iPXE.  We will currently detect the existence of the\nmodern interface and attempt to use it, but fail at the point of\nattempting to map the PCI BARs.\n\nFix by ignoring any virtio capabilities that describe an inaccessible\nPCI BAR, and thereby allowing iPXE to fall back to using the legacy\ninterface if the modern interface\u0027s BAR cannot be used.\n\nReported-by: Jan ONDREJ (SAL) \u003condrejj@salstar.sk\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "22564dd26b33cd605b00799d27ad8ffabd99f79a",
      "tree": "394b0760b15c89b8946f2c582f31c3935237c982",
      "parents": [
        "807d933cea92a63e169df62eb107bd9750e435d9"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 15 16:11:12 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 15 16:12:34 2026 +0100"
      },
      "message": "[settings] Allow system time to be modified via builtin/unixtime\n\nAllow the system time offset to be modified by writing a new time\nvalue to builtin/unixtime, e.g.:\n\n  set builtin/unixtime 0x10d1a884\n\nAs with the NTP client, this does not attempt to write to the\nunderlying clock source (e.g. the RTC clock).  Only the internal\nsystem time offset is updated.\n\nAny system time offset may be reset by clearing the setting:\n\n  clear builtin/unixtime\n\nThis will reset the system time offset to zero and so can be used to\nundo the effect of a previous \"set builtin/unixtime\" or \"ntp\" command.\n\nRequested-by: Christian I. Nilsson \u003cChristianN@2PintSoftware.com\u003e\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "807d933cea92a63e169df62eb107bd9750e435d9",
      "tree": "c41c2d9c847fa5cdec0ca967926e1bf1624409f1",
      "parents": [
        "06f36026d6c18b70d7ae6e0fb512e81b9312390d"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 15 16:02:12 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 15 16:02:12 2026 +0100"
      },
      "message": "[settings] Allow for writable built-in settings\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "06f36026d6c18b70d7ae6e0fb512e81b9312390d",
      "tree": "e10217e625c7cb8ac097f369623b6c0940790877",
      "parents": [
        "13a83f4ab30bd75831261e6b197903244f1ad753"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 15 14:20:16 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Mon Jun 15 14:20:16 2026 +0100"
      },
      "message": "[scsi] Use data-transfer buffers for data-in and data-out\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "13a83f4ab30bd75831261e6b197903244f1ad753",
      "tree": "7342dcad40a0a067c136b8660710ae7f9d3aaaf0",
      "parents": [
        "51e8ffc4f896096f5a05f9284fe2c03e15a05a75"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 14 17:15:55 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 14 17:18:05 2026 +0100"
      },
      "message": "[s390x] Add optimised TCP/IP checksumming\n\nAdd an S/390 assembly language implementation of TCP/IP checksumming,\nusing the hardware \"cksm\" instruction to first calculate the 32-bit\none\u0027s complement checksum and then folding down to 16 bits.\n\nUse an inline function since the whole checksum calculation (including\nfolding) requires only six instructions.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "51e8ffc4f896096f5a05f9284fe2c03e15a05a75",
      "tree": "ec35d62dda23551a17bac0a036271ae684f2a576",
      "parents": [
        "aa105c2dc06275dc9832a61a5a215bd6f0945106"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 14 13:39:22 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 14 13:39:22 2026 +0100"
      },
      "message": "[ci] Add s390x self-tests\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "aa105c2dc06275dc9832a61a5a215bd6f0945106",
      "tree": "5167876300fa277df9cdee88c521afcc40034bff",
      "parents": [
        "730c122c1dca346094294b084922a7e0d6df131c"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:27:26 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sun Jun 14 01:05:31 2026 +0100"
      },
      "message": "[s390x] Add support for the IBM s390x CPU architecture\n\nAdd support for building iPXE as a 64-bit s390x binary for the Linux\nuserspace platform.  For example:\n\n  make CROSS\u003ds390x-linux-gnu- bin-s390x-linux/tests.linux\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "730c122c1dca346094294b084922a7e0d6df131c",
      "tree": "4a29087064d0affb9e18c8571c9412dcdd0ba946",
      "parents": [
        "85700526ec64f81d9083d99bcddb4e51beeb31a1"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:15:57 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:22:49 2026 +0100"
      },
      "message": "[test] Fix RFC 1071 checksum calculation for big-endian targets\n\nCalculation of the TCP/IP checksum is fundamentally endian-agnostic:\nthe checksum is designed to be symmetric so that both big-endian and\nlittle-endian systems can use native addition in any word size without\nany byte swapping.  The result is then stored into the checksum field\nin the packet header as a native-endian value.\n\nThe reference algorithm presented in RFC 1071 (and used in our test\nsuite) is implicitly little-endian: the trailing byte is on a 16-bit\nword boundary and is added to the least significant byte of the 16-bit\nchecksum value.\n\nFix by shifting the trailing byte by 8 bits on big-endian targets.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "85700526ec64f81d9083d99bcddb4e51beeb31a1",
      "tree": "5e2e9dcfc373117e29ad2eddb5ce129fe5cb79c0",
      "parents": [
        "e6e9ae98043b9bcbe1a63ad3ee49dfc4175a9ab6"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:12:40 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:12:40 2026 +0100"
      },
      "message": "[linux] Fix console output on big-endian targets\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "e6e9ae98043b9bcbe1a63ad3ee49dfc4175a9ab6",
      "tree": "b6be44ab88e2bd116c20a593f3ea0305c909ee5d",
      "parents": [
        "6476f7c7c5a824032488fa87bf7840cd3d989e4a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:07:41 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:11:29 2026 +0100"
      },
      "message": "[efi] Fix parsing of EFI signature lists on big-endian targets\n\nThough UEFI is fundamentally little-endian, the EFI signature list\nimage format is available even on non-EFI platforms (and is covered by\nthe unit test suite).\n\nAdd le32_to_cpu() macros as needed to allow EFI signature lists to be\nparsed correctly on big-endian targets.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "6476f7c7c5a824032488fa87bf7840cd3d989e4a",
      "tree": "e59e1cca571e704591284fbcf7ea9c834a4fb369",
      "parents": [
        "bfdbd1c4e023afb1ca2dc1c65c2a82076a330c57"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:03:33 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:03:33 2026 +0100"
      },
      "message": "[peerdist] Fix segment identifier constant on big-endian targets\n\nThe \"MS_P2P_CACHING\" constant (used as part of the HMAC digest\ncalculation for the segment identifier) is a UTF-16LE string.  On a\nbig-endian target, a wide-character string literal will have the wrong\nendianness.\n\nFix by using a byte array rather than a wide-character string.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "bfdbd1c4e023afb1ca2dc1c65c2a82076a330c57",
      "tree": "a58d18d2ac5ee0b872e4e631ddcab1ba73c4fc60",
      "parents": [
        "e68ca57f46efdeebbf72893b35aab2b18a34d2e7"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:01:35 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 16:02:05 2026 +0100"
      },
      "message": "[build] Fix building for big-endian targets\n\nFix build errors that arise when building for a big-endian target such\nas s390x.  (Runtime endianness errors may remain: this fixes only\nthose errors that are detected at build time.)\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "e68ca57f46efdeebbf72893b35aab2b18a34d2e7",
      "tree": "e09f4b51c1c5c55279a9d43c1889f117de776621",
      "parents": [
        "05a459f795a260e6161c8f06d4ba9b00327d81c8"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 15:28:52 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 13 15:53:19 2026 +0100"
      },
      "message": "[crypto] Use generic implementations of slow-path big integer functions\n\nIn the original big integer implementation, big integers were entirely\nopaque to the caller and only the architecture-dependent code knew any\ndetails of the internal structure.\n\nThis has long since ceased to be the case: for the sake of arithmetic\nefficiency, many portions of the codebase now presume that big\nintegers are represented as an array of elements, with each element\nbeing a native-endian unsigned value (with the precise type being\nchosen by the architecture-specific header file) and with the least\nsignificant element being first in the array.\n\nThe functions bigint_init(), bigint_done(), bigint_is_zero(),\nbigint_is_geq(), and bigint_max_bit_set() are never used on fast code\npaths, and most architectures use a generic C implementation of these\nfunctions.\n\nProvide generic implementations of these slow-path functions to be\nused on all architectures.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "05a459f795a260e6161c8f06d4ba9b00327d81c8",
      "tree": "989e8d50d19958cedbbab70389e110bb31cf8b8f",
      "parents": [
        "95ffbf4745553e8a207922389929e1943c0237c0"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 15:10:04 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 15:10:04 2026 +0100"
      },
      "message": "[iscsi] Ensure SCSI sense data is present before parsing\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "95ffbf4745553e8a207922389929e1943c0237c0",
      "tree": "ca226bda71fe201d3c85144f1095470190cb8665",
      "parents": [
        "6dcb3b1e674102b0e98aaf5b4ab28c5c57d87e5a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 13:38:03 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 14:00:18 2026 +0100"
      },
      "message": "[crypto] Add RFC 7919 FFDHE key exchange algorithms\n\nWe currently support fully parameterized finite field Diffie-Hellman\nkey exchange, where the peer provides not only its public key but also\nthe (fully arbitrary) selection of the field prime and generator.\n\nRFC 7919 defines a family of finite fields all constructed from the\nnatural logarithm constant \"e\", intended to be used as well-known\nfields where the peer simply names the field (e.g. \"ffdhe2048\") rather\nthan providing the raw prime and generator values.\n\nAdd support for this family of finite fields as key exchange\nalgorithms, to allow for protocols such as TLS version 1.3 where\nparameterized fields are not permitted.\n\nWe choose to support only up to ffdhe4096, since this is sufficient to\nexceed the security strength of our RNG (128 bits).\n\nSupport for ffdhe6144 and ffdhe8192 could trivially be added by simply\nextending the \"euler\" constant and adding the relevant FFDHE_GROUP()\ndeclarations.  Doing so would approximately double the space\nrequirements for both read-only data (from 0.5kB to 1kB) and for\nuninitialised data (from 3.5kB to 7kB).\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "6dcb3b1e674102b0e98aaf5b4ab28c5c57d87e5a",
      "tree": "739453e0aacab479c6578f32bbd9a5832c046d7f",
      "parents": [
        "f2ade220f90e9f90e0231ef3ef12573b2857091a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 13:35:01 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 13:55:49 2026 +0100"
      },
      "message": "[test] Allow for large values in key exchange self-tests\n\nAllow for the existence of key exchange algorithms where the public\nkeys and shared secrets may be too large for a stack allocation.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "f2ade220f90e9f90e0231ef3ef12573b2857091a",
      "tree": "53ff9b4792d3f1ef4601f8750990894b919e0cb4",
      "parents": [
        "36e8cc28c71bc651369fd616f936c225ef32df0a"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 13:34:04 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Tue Jun 09 13:51:13 2026 +0100"
      },
      "message": "[test] Verify test vector lengths for key exchange self-tests\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    },
    {
      "commit": "36e8cc28c71bc651369fd616f936c225ef32df0a",
      "tree": "c67bf9b9133e6b65c347599ee0f6b1ceb035f669",
      "parents": [
        "5e427326ead3e3f7fb2002df33aa43a7195a0713"
      ],
      "author": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 06 16:51:20 2026 +0100"
      },
      "committer": {
        "name": "Michael Brown",
        "email": "mcb30@ipxe.org",
        "time": "Sat Jun 06 16:53:04 2026 +0100"
      },
      "message": "[crypto] Remove redundant ECDHE algorithm\n\nRemove the now-unused implementation of ECDHE that requires an\nunderlying elliptic curve abstraction, since we now use a standalone\nkey exchange algorithm abstraction instead.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n"
    }
  ],
  "next": "5e427326ead3e3f7fb2002df33aa43a7195a0713"
}
