# Xo 0.17 release notes


## Introduction

Xo 0.17 makes public key crypto and bulk TLS much faster and fixes a
macOS XProtect false positive.

## Runtime

- Faults on Linux unwind without `/proc` (and under valgrind): the
  auxiliary vector is read from memory.
- Native standard input from a FIFO sees its end of input on macOS.
- Processes have 256 static words for the runtime's own state
  ([decision 0237](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0237-static-words-256.md)).
- Security and CoreFoundation load lazily on macOS: start up went from
  28.5M to 14.4M instructions on LLVM.

## Compiler

- Add with carry chains on arm64, up to 8 pairs an instruction
  ([decision 0231](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0231-crypto-intrinsics.md)).
- Large constant integer lists are kept as data: the HTTP client went
  from 2.51 to 2.12 MB on LLVM.

## Standard library

- P-256, X25519 and RSA use the carry chains: RSA 4096 server
  handshakes take 45.6% fewer instructions on arm64 and 43.3% on LLVM,
  RSA 2048 32.9% and 29.9%.
- P-384 and P-521 signing use fixed base tables made on first use (0.37
  to 0.45 of the time); ML-KEM takes 8 to 12% fewer instructions on
  arm64.
- AES-GCM: GHASH folds four blocks per reduction and CTR runs 64 byte
  chunks. Bulk TLS beats Mbed TLS on both backends (AES-128, TLS 1.2:
  arm64 13.6, LLVM 11.8, Mbed 14.0 million instructions per MiB).

## Ports

- macOS: binaries from Xo's own linker no longer match an XProtect
  signature (a program hung waiting for assessment); all 179 test
  programs scan clean.

