diff --git a/WORKSPACE b/WORKSPACE
index a4c3dc9..d14256d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -412,3 +412,23 @@
         "https://github.com/sluongng/nogo-analyzer/archive/refs/tags/v0.0.2.tar.gz",
     ],
 )
+
+git_repository(
+    name = "boringssl",
+    commit = "d7278cebad5b8eda0901246f2215344cffece4f4",
+    remote = "https://boringssl.googlesource.com/boringssl",
+)
+
+load("//third_party/libtpms:external.bzl", "libtpms_external")
+
+libtpms_external(
+    name = "libtpms",
+    version = "93a827aeccd3ab2178281571b1545dcfffa2991b",
+)
+
+load("//third_party/swtpm:external.bzl", "swtpm_external")
+
+swtpm_external(
+    name = "swtpm",
+    version = "0c9a6c4a12a63b86ab472e69e95bd75853d4fa96",
+)
diff --git a/third_party/libtpms/BUILD.bazel b/third_party/libtpms/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/third_party/libtpms/BUILD.bazel
diff --git a/third_party/libtpms/external.bzl b/third_party/libtpms/external.bzl
new file mode 100644
index 0000000..d6052b4
--- /dev/null
+++ b/third_party/libtpms/external.bzl
@@ -0,0 +1,23 @@
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+def libtpms_external(name, version):
+    sums = {
+        # master at 2024/01/09 (0.10.0 prerelease).
+        "93a827aeccd3ab2178281571b1545dcfffa2991b": "e509e0ba109f77da517b5e58a9f093beb040525e6be51de06d1153c8278c70d1",
+    }
+
+    http_archive(
+        name = name,
+        patch_args = ["-p1"],
+        patches = [
+            "//third_party/libtpms/patches:0001-boringssl-compat-new-SHA-types.patch",
+            "//third_party/libtpms/patches:0002-boringssl-compat-removed-const_DES_cblock.patch",
+            "//third_party/libtpms/patches:0003-boringssl-compat-removed-EC_POINTs_mul.patch",
+            "//third_party/libtpms/patches:0004-boringssl-compat-removed-camellia-support.patch",
+            "//third_party/libtpms/patches:0005-boringssl-compat-remove-constant-time-flags-UNSAFE.patch",
+            "//third_party/libtpms/patches:0006-bazel-support-implement.patch",
+        ],
+        sha256 = sums[version],
+        strip_prefix = "libtpms-" + version,
+        urls = ["https://github.com/stefanberger/libtpms/archive/%s.tar.gz" % version],
+    )
diff --git a/third_party/libtpms/patches/0001-boringssl-compat-new-SHA-types.patch b/third_party/libtpms/patches/0001-boringssl-compat-new-SHA-types.patch
new file mode 100644
index 0000000..b4d25f4
--- /dev/null
+++ b/third_party/libtpms/patches/0001-boringssl-compat-new-SHA-types.patch
@@ -0,0 +1,57 @@
+From 51935c4f084265833951e5439b682913bfbac03a Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:58:10 +0200
+Subject: [PATCH 1/6] boringssl compat: new SHA types
+
+See: https://github.com/google/boringssl/commit/51011b4a262046a3d9a2eb5690e54af80377f15a
+---
+ src/tpm2/NVMarshal.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/src/tpm2/NVMarshal.c b/src/tpm2/NVMarshal.c
+index a4a9498..6d42a97 100644
+--- a/src/tpm2/NVMarshal.c
++++ b/src/tpm2/NVMarshal.c
+@@ -58,6 +58,9 @@
+ #define TPM_HAVE_TPM2_DECLARATIONS
+ #include "tpm_library_intern.h"
+ 
++#define SHA_LONG uint32_t
++#define SHA_LONG64 uint64_t
++
+ /*
+  * The TPM2 maintains a pcrAllocated shadow variable; the current active one is
+  * in gp.pcrAllocated and the one to be active after reboot is in NVRAM. So,
+@@ -1943,9 +1946,9 @@ tpmHashStateSHA512_Marshal(SHA512_CTX *data, BYTE **buffer, INT32 *size,
+     written += SHA_LONG64_Marshal(&data->Nl, buffer, size);
+     written += SHA_LONG64_Marshal(&data->Nh, buffer, size);
+ 
+-    array_size = sizeof(data->u.p);
++    array_size = sizeof(data->p);
+     written += UINT16_Marshal(&array_size, buffer, size);
+-    written += Array_Marshal(&data->u.p[0], array_size, buffer, size);
++    written += Array_Marshal(&data->p[0], array_size, buffer, size);
+ 
+     written += UINT32_Marshal(&data->num, buffer, size);
+     written += UINT32_Marshal(&data->md_len, buffer, size);
+@@ -2005,14 +2008,14 @@ tpmHashStateSHA512_Unmarshal(SHA512_CTX *data, BYTE **buffer, INT32 *size,
+         rc = UINT16_Unmarshal(&array_size, buffer, size);
+     }
+     if (rc == TPM_RC_SUCCESS &&
+-        array_size != sizeof(data->u.p)) {
++        array_size != sizeof(data->p)) {
+         TPMLIB_LogTPM2Error("HASH_STATE_SHA512: Bad array size for u.p; "
+                             "expected %zu, got %u\n",
+-                            sizeof(data->u.p), array_size);
++                            sizeof(data->p), array_size);
+         rc = TPM_RC_BAD_PARAMETER;
+     }
+     if (rc == TPM_RC_SUCCESS) {
+-        rc = Array_Unmarshal(&data->u.p[0], array_size, buffer, size);
++        rc = Array_Unmarshal(&data->p[0], array_size, buffer, size);
+     }
+     if (rc == TPM_RC_SUCCESS) {
+         rc = UINT32_Unmarshal(&data->num, buffer, size);
+-- 
+2.42.0
+
diff --git a/third_party/libtpms/patches/0002-boringssl-compat-removed-const_DES_cblock.patch b/third_party/libtpms/patches/0002-boringssl-compat-removed-const_DES_cblock.patch
new file mode 100644
index 0000000..555ded5
--- /dev/null
+++ b/third_party/libtpms/patches/0002-boringssl-compat-removed-const_DES_cblock.patch
@@ -0,0 +1,54 @@
+From 42c0bd4522b06361bdbbb1fec182bdc363db9982 Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:58:37 +0200
+Subject: [PATCH 2/6] boringssl compat: removed const_DES_cblock
+
+This was some kind of hack for GCC 2.8.1 that never made it into
+BoringSSL.
+---
+ src/tpm2/crypto/openssl/TpmToOsslDesSupport.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/tpm2/crypto/openssl/TpmToOsslDesSupport.c b/src/tpm2/crypto/openssl/TpmToOsslDesSupport.c
+index d27aad2..9f972d6 100644
+--- a/src/tpm2/crypto/openssl/TpmToOsslDesSupport.c
++++ b/src/tpm2/crypto/openssl/TpmToOsslDesSupport.c
+@@ -78,14 +78,14 @@ TDES_set_encrypt_key(
+ 		     tpmKeyScheduleTDES          *keySchedule
+ 		     )
+ {
+-    DES_set_key_unchecked((const_DES_cblock *)key, &keySchedule[0]);
+-    DES_set_key_unchecked((const_DES_cblock *)&key[8], &keySchedule[1]);
++    DES_set_key_unchecked((const DES_cblock *)key, &keySchedule[0]);
++    DES_set_key_unchecked((const DES_cblock *)&key[8], &keySchedule[1]);
+     // If is two-key, copy the schedule for K1 into K3, otherwise, compute the
+     // the schedule for K3
+     if(keySizeInBits == 128)
+ 	keySchedule[2] = keySchedule[0];
+     else
+-	DES_set_key_unchecked((const_DES_cblock *)&key[16],
++	DES_set_key_unchecked((const DES_cblock *)&key[16],
+ 			      &keySchedule[2]);
+ }
+ /* B.2.3.1.3.2. TDES_encyrpt() */
+@@ -97,7 +97,7 @@ void TDES_encrypt(
+ 		  tpmKeyScheduleTDES      *ks
+ 		  )
+ {
+-    DES_ecb3_encrypt((const_DES_cblock *)in, (DES_cblock *)out,
++    DES_ecb3_encrypt((const DES_cblock *)in, (DES_cblock *)out,
+ 		     &ks[0], &ks[1], &ks[2],
+ 		     DES_ENCRYPT);
+ }
+@@ -111,7 +111,7 @@ void TDES_decrypt(
+ 		  tpmKeyScheduleTDES   *ks
+ 		  )
+ {
+-    DES_ecb3_encrypt((const_DES_cblock *)in, (DES_cblock *)out,
++    DES_ecb3_encrypt((const DES_cblock *)in, (DES_cblock *)out,
+ 		     &ks[0], &ks[1], &ks[2],
+ 		     DES_DECRYPT);
+ }
+-- 
+2.42.0
+
diff --git a/third_party/libtpms/patches/0003-boringssl-compat-removed-EC_POINTs_mul.patch b/third_party/libtpms/patches/0003-boringssl-compat-removed-EC_POINTs_mul.patch
new file mode 100644
index 0000000..8b5669a
--- /dev/null
+++ b/third_party/libtpms/patches/0003-boringssl-compat-removed-EC_POINTs_mul.patch
@@ -0,0 +1,42 @@
+From 2cd6a191b0940d03d557941eda3395bdafbdb662 Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:59:11 +0200
+Subject: [PATCH 3/6] boringssl compat: removed EC_POINTs_mul
+
+This was deprecated in OpenSSL 3.0, we just need to 'fix' the ifdef
+guard to use the undeprecated APIs.
+---
+ src/tpm2/crypto/openssl/BnToOsslMath.c | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/src/tpm2/crypto/openssl/BnToOsslMath.c b/src/tpm2/crypto/openssl/BnToOsslMath.c
+index 1b9fb81..7d13ce8 100644
+--- a/src/tpm2/crypto/openssl/BnToOsslMath.c
++++ b/src/tpm2/crypto/openssl/BnToOsslMath.c
+@@ -622,7 +622,6 @@ LIB_EXPORT BOOL BnEccModMult2(bigPoint            R,  // OUT: computed point
+ 	EC_POINT_mul(E->G, pR, bnD, pQ, bnU, E->CTX);
+     else
+ 	{
+-#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ 	    EC_POINT *pR1 = EC_POINT_new(E->G);
+ 	    EC_POINT *pR2 = EC_POINT_new(E->G);
+ 	    int OK;
+@@ -635,15 +634,6 @@ LIB_EXPORT BOOL BnEccModMult2(bigPoint            R,  // OUT: computed point
+ 
+ 	    EC_POINT_clear_free(pR1);
+ 	    EC_POINT_clear_free(pR2);
+-#else
+-	    const EC_POINT* points[2];
+-	    const BIGNUM*   scalars[2];
+-	    points[0]  = pS;
+-	    points[1]  = pQ;
+-	    scalars[0] = bnD;
+-	    scalars[1] = bnU;
+-	    EC_POINTs_mul(E->G, pR, NULL, 2, points, scalars, E->CTX);
+-#endif
+ 	}
+     PointFromOssl(R, pR, E);
+     EC_POINT_clear_free(pR); // libtpms changed
+-- 
+2.42.0
+
diff --git a/third_party/libtpms/patches/0004-boringssl-compat-removed-camellia-support.patch b/third_party/libtpms/patches/0004-boringssl-compat-removed-camellia-support.patch
new file mode 100644
index 0000000..231d1d5
--- /dev/null
+++ b/third_party/libtpms/patches/0004-boringssl-compat-removed-camellia-support.patch
@@ -0,0 +1,33 @@
+From 00f0c95d643bc714f3361fa4f10dee3bf9f9384e Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:59:30 +0200
+Subject: [PATCH 4/6] boringssl compat: removed camellia support
+
+BoringSSL removed Camellia support out of principle, we don't care for
+it either and the TPM spec doesn't mandate it.
+---
+ src/tpm2/TpmProfile_Common.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/tpm2/TpmProfile_Common.h b/src/tpm2/TpmProfile_Common.h
+index a4bf462..78842a6 100644
+--- a/src/tpm2/TpmProfile_Common.h
++++ b/src/tpm2/TpmProfile_Common.h
+@@ -133,11 +133,11 @@
+ 
+ #define     SM4_128                     (NO  * ALG_SM4)
+ 
+-#define ALG_CAMELLIA                ALG_YES
++#define ALG_CAMELLIA                ALG_NO
+ 
+-#define     CAMELLIA_128                (YES * ALG_CAMELLIA)
++#define     CAMELLIA_128                (NO  * ALG_CAMELLIA)
+ #define     CAMELLIA_192                (NO  * ALG_CAMELLIA)
+-#define     CAMELLIA_256                (YES * ALG_CAMELLIA)
++#define     CAMELLIA_256                (NO  * ALG_CAMELLIA)
+ 
+ #define ALG_TDES                        ALG_YES /* libtpms enabled */
+ 
+-- 
+2.42.0
+
diff --git a/third_party/libtpms/patches/0005-boringssl-compat-remove-constant-time-flags-UNSAFE.patch b/third_party/libtpms/patches/0005-boringssl-compat-remove-constant-time-flags-UNSAFE.patch
new file mode 100644
index 0000000..795ee1e
--- /dev/null
+++ b/third_party/libtpms/patches/0005-boringssl-compat-remove-constant-time-flags-UNSAFE.patch
@@ -0,0 +1,176 @@
+From 98df8cd09ec7a5b91f05c665529ed6f579f231d9 Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 13:53:48 +0200
+Subject: [PATCH 5/6] boringssl compat: remove constant time flags (UNSAFE)
+
+OpenSSL has a quirky little API to mark bignums as 'secret' ie.
+'constant time' which is supposed to influence operations performed on
+them to be constant time.
+
+This API was tricky to use and caused security issues, so it was removed
+by BoringSSL.
+
+https://github.com/google/boringssl/commit/0a211dfe91588d2986a8735e1969dd9202a8b025
+
+Ideally we would replace all relevent BN_mod_exp calls with
+constant-time versions, but that's not trivial to do: the constant time
+versions of modular exponentiation and multiplicative inverse operations
+rely on Montgomery modular multiplication which seems to reduce the
+domain of the exponent to |0, N>. Unfortunately libtpms has plenty of
+eg. ModExp operations that work on exponents outside this range. OpenSSL
+seems to not have applied the constant time request to BN_mod_exp if
+that was the case, but BoringSSL refuses to perform constant time
+operations then.
+
+As I'm not a cryptographer and not able to fix this properly (or even
+fully reason about this), I'm just adding a big fat warning to be shown
+whenever potentially unsafe operations are now performed.
+---
+ src/monogon_unsafe.c                   | 28 ++++++++++++++++++++++++++
+ src/tpm2/crypto/openssl/BnToOsslMath.c | 10 +++++----
+ src/tpm2/crypto/openssl/ExpDCache.c    |  5 +++--
+ 3 files changed, 37 insertions(+), 6 deletions(-)
+ create mode 100644 src/monogon_unsafe.c
+
+diff --git a/src/monogon_unsafe.c b/src/monogon_unsafe.c
+new file mode 100644
+index 0000000..abaef79
+--- /dev/null
++++ b/src/monogon_unsafe.c
+@@ -0,0 +1,28 @@
++#include <stdio.h>
++#include <stdlib.h>
++
++// This library was built against BoringSSL without the BN constant time API,
++// thus all cryptographic operations are performed timing-unsafe which might
++// lead to side channel leaks. This is fine for Monogon's usecase (swtpm in
++// tests) but this code must not end up being used to secure any real systems.
++//
++// Note: I am not sure this code was safe from side channels in the first
++// place. See RsaPrivateKeyOp and compare with BoringSSL's
++// rsa_default_private_transform implementation... ~q3k
++
++static int _warned = 0;
++
++void monogon_warn_unsafe_library(void)
++{
++    if (getenv("MONOGON_LIBTPMS_ACKNOWLEDGE_UNSAFE") != NULL) {
++        return;
++    }
++    if (_warned) {
++        return;
++    }
++    _warned = 1;
++    fprintf(stderr, "--------------------------------------------------------------------------------\n");
++    fprintf(stderr, "WARNING: This fork of libtpms/swtpm contains UNSAFE cryptographic operations and\n");
++    fprintf(stderr, "         MUST NOT be used to secure sensitive data.\n");
++    fprintf(stderr, "--------------------------------------------------------------------------------\n");
++}
+diff --git a/src/tpm2/crypto/openssl/BnToOsslMath.c b/src/tpm2/crypto/openssl/BnToOsslMath.c
+index 7d13ce8..54d5916 100644
+--- a/src/tpm2/crypto/openssl/BnToOsslMath.c
++++ b/src/tpm2/crypto/openssl/BnToOsslMath.c
+@@ -83,6 +83,8 @@
+ //#include "Tpm.h"
+ #include "BnOssl.h"
+ 
++extern void monogon_warn_unsafe_library();
++
+ #ifdef MATH_LIB_OSSL
+ #  include "BnToOsslMath_fp.h"
+ 
+@@ -133,6 +135,7 @@ BOOL OsslToTpmBn(bigNum bn, const BIGNUM* osslBn)	// libtpms: added 'const'
+ // function prototype. Instead, use BnNewVariable().
+ BIGNUM* BigInitialized(BIGNUM* toInit, bigConst initializer)
+ {
++    monogon_warn_unsafe_library();
+ #if 1		// libtpms: added begin
+     BIGNUM *_toInit;
+     unsigned char buffer[LARGEST_NUMBER + 1];
+@@ -147,7 +150,6 @@ BIGNUM* BigInitialized(BIGNUM* toInit, bigConst initializer)
+ #if 1		// libtpms: added begin
+     BnToBytes(initializer, buffer, &buffer_len);	/* TPM to bin */
+     _toInit = BN_bin2bn(buffer, buffer_len, NULL);	/* bin to ossl */
+-    BN_set_flags(_toInit, BN_FLG_CONSTTIME);
+     BN_copy(toInit, _toInit);
+     BN_clear_free(_toInit);
+ #else		// libtpms: added end
+@@ -355,13 +357,13 @@ LIB_EXPORT BOOL BnGcd(bigNum   gcd,      // OUT: the common divisor
+ 		      bigConst number2   // IN:
+ 		      )
+ {
++    monogon_warn_unsafe_library();
+     OSSL_ENTER();
+     BIGNUM* bnGcd = BN_NEW();
+     BOOL    OK    = TRUE;
+     BIG_INITIALIZED(bn1, number1);
+     BIG_INITIALIZED(bn2, number2);
+     //
+-    BN_set_flags(bn1, BN_FLG_CONSTTIME); // number1 is secret prime number
+     GOTO_ERROR_UNLESS(BN_gcd(bnGcd, bn1, bn2, CTX));
+     GOTO_ERROR_UNLESS(OsslToTpmBn(gcd, bnGcd));
+     goto Exit;
+@@ -387,6 +389,7 @@ LIB_EXPORT BOOL BnModExp(bigNum   result,    // OUT: the result
+ 			 bigConst modulus    // IN:
+ 			 )
+ {
++    monogon_warn_unsafe_library();
+     OSSL_ENTER();
+     BIGNUM* bnResult = BN_NEW();
+     BOOL    OK       = TRUE;
+@@ -394,7 +397,6 @@ LIB_EXPORT BOOL BnModExp(bigNum   result,    // OUT: the result
+     BIG_INITIALIZED(bnE, exponent);
+     BIG_INITIALIZED(bnM, modulus);
+     //
+-    BN_set_flags(bnE, BN_FLG_CONSTTIME); // exponent may be private
+     GOTO_ERROR_UNLESS(BN_mod_exp(bnResult, bnN, bnE, bnM, CTX));
+     GOTO_ERROR_UNLESS(OsslToTpmBn(result, bnResult));
+     goto Exit;
+@@ -416,13 +418,13 @@ LIB_EXPORT BOOL BnModExp(bigNum   result,    // OUT: the result
+ //      FALSE(0)        failure in operation
+ LIB_EXPORT BOOL BnModInverse(bigNum result, bigConst number, bigConst modulus)
+ {
++    monogon_warn_unsafe_library();
+     OSSL_ENTER();
+     BIGNUM* bnResult = BN_NEW();
+     BOOL    OK       = TRUE;
+     BIG_INITIALIZED(bnN, number);
+     BIG_INITIALIZED(bnM, modulus);
+     //
+-    BN_set_flags(bnN, BN_FLG_CONSTTIME); // number may be private
+     GOTO_ERROR_UNLESS(BN_mod_inverse(bnResult, bnN, bnM, CTX) != NULL);
+     GOTO_ERROR_UNLESS(OsslToTpmBn(result, bnResult));
+     goto Exit;
+diff --git a/src/tpm2/crypto/openssl/ExpDCache.c b/src/tpm2/crypto/openssl/ExpDCache.c
+index 5aeaf14..133e9ed 100644
+--- a/src/tpm2/crypto/openssl/ExpDCache.c
++++ b/src/tpm2/crypto/openssl/ExpDCache.c
+@@ -61,6 +61,8 @@
+ #include "Tpm.h"
+ #include "ExpDCache_fp.h"
+ 
++extern void monogon_warn_unsafe_library(void);
++
+ /* Implement a cache for the private exponent D so it doesn't need to be
+  * recalculated every time from P, Q, E and N (modulus). The cache has a
+  * number of entries that cache D and use P, Q, and E for lookup.
+@@ -169,6 +171,7 @@ BIGNUM *ExpDCacheFind(const BIGNUM *P, const BIGNUM *N, const BIGNUM *E, BIGNUM
+     unsigned myage;
+     BIGNUM *D;
+ 
++    monogon_warn_unsafe_library();
+     for (i = 0; i < ARRAY_SIZE(ExpDCache); i++) {
+         if (BN_cmp(ExpDCache[i].P, P) == 0 && BN_cmp(ExpDCache[i].N, N) == 0 &&
+             BN_cmp(ExpDCache[i].E, E) == 0) {
+@@ -190,8 +193,6 @@ BIGNUM *ExpDCacheFind(const BIGNUM *P, const BIGNUM *N, const BIGNUM *E, BIGNUM
+                 *Q = NULL;
+                 return NULL;
+             }
+-            BN_set_flags(*Q, BN_FLG_CONSTTIME);
+-            BN_set_flags(D, BN_FLG_CONSTTIME);
+             return D;
+         }
+     }
+-- 
+2.42.0
+
diff --git a/third_party/libtpms/patches/0006-bazel-support-implement.patch b/third_party/libtpms/patches/0006-bazel-support-implement.patch
new file mode 100644
index 0000000..8152a55
--- /dev/null
+++ b/third_party/libtpms/patches/0006-bazel-support-implement.patch
@@ -0,0 +1,106 @@
+From fa72e847a7fb503daa25b5007edb28483a0f6e42 Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 14:31:54 +0200
+Subject: [PATCH 6/6] bazel support: implement
+
+---
+ BUILD.bazel              | 45 ++++++++++++++++++++++++++++++++++++++++
+ WORKSPACE                |  0
+ include/libtpms/config.h |  3 +++
+ src/tpm_library.c        |  1 +
+ src/tpm_tpm2_interface.c |  1 +
+ 5 files changed, 50 insertions(+)
+ create mode 100644 BUILD.bazel
+ create mode 100644 WORKSPACE
+ create mode 100644 include/libtpms/config.h
+
+diff --git a/BUILD.bazel b/BUILD.bazel
+new file mode 100644
+index 0000000..591942d
+--- /dev/null
++++ b/BUILD.bazel
+@@ -0,0 +1,45 @@
++cc_library(
++    name = "libtpms_tpm2",
++    includes = [
++        "include",
++    ],
++    copts = [
++        "-Iexternal/libtpms/include/libtpms",
++        "-Iexternal/libtpms/src",
++        "-Iexternal/libtpms/src/tpm2",
++        "-Iexternal/libtpms/src/tpm2/crypto",
++        "-Iexternal/libtpms/src/tpm2/crypto/openssl",
++    ],
++    defines = [
++        "TPM_LIBTPMS_CALLBACKS",
++        "TPM_NV_DISK",
++    ],
++    deps = [
++        "@boringssl//:ssl",
++    ],
++    textual_hdrs = [
++        "src/tpm2/EccConstantData.inl",
++    ],
++    srcs = glob([
++        "include/config.h",
++        "include/libtpms/*.h",
++
++        "src/*.h",
++        "src/*.c",
++
++        "src/tpm2/*.h",
++        "src/tpm2/*.c",
++
++        "src/tpm2/crypto/*.h",
++        "src/tpm2/crypto/openssl/*.h",
++        "src/tpm2/crypto/openssl/*.c",
++
++        "src/monogon_unsafe.c",
++    ], [
++        # No TPM1.2 support.
++        "src/tpm_tpm12*",
++    ]),
++    visibility = [
++        "//visibility:public",
++    ],
++)
+diff --git a/WORKSPACE b/WORKSPACE
+new file mode 100644
+index 0000000..e69de29
+diff --git a/include/libtpms/config.h b/include/libtpms/config.h
+new file mode 100644
+index 0000000..bb4316e
+--- /dev/null
++++ b/include/libtpms/config.h
+@@ -0,0 +1,3 @@
++#pragma once
++
++#define WITH_TPM2 1
+diff --git a/src/tpm_library.c b/src/tpm_library.c
+index 20153b7..a3c5694 100644
+--- a/src/tpm_library.c
++++ b/src/tpm_library.c
+@@ -63,6 +63,7 @@
+ #include "tpm_debug.h"
+ #include "tpm_error.h"
+ #include "tpm_library.h"
++#include "tpm_library_conf.h"
+ #include "tpm_library_intern.h"
+ #include "tpm_nvfilename.h"
+ #include "tpm_tis.h"
+diff --git a/src/tpm_tpm2_interface.c b/src/tpm_tpm2_interface.c
+index 4570d78..7e51b5e 100644
+--- a/src/tpm_tpm2_interface.c
++++ b/src/tpm_tpm2_interface.c
+@@ -65,6 +65,7 @@
+ #include "tpm_nvfile.h" // TPM_NVRAM_Loaddata()
+ #include "tpm_error.h"
+ #include "tpm_library_intern.h"
++#include "tpm_library_conf.h"
+ #include "tpm_nvfilename.h"
+ 
+ extern BOOL      g_inFailureMode;
+-- 
+2.42.0
+
diff --git a/third_party/libtpms/patches/BUILD.bazel b/third_party/libtpms/patches/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/third_party/libtpms/patches/BUILD.bazel
diff --git a/third_party/swtpm/BUILD.bazel b/third_party/swtpm/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/third_party/swtpm/BUILD.bazel
diff --git a/third_party/swtpm/external.bzl b/third_party/swtpm/external.bzl
new file mode 100644
index 0000000..903bb33
--- /dev/null
+++ b/third_party/swtpm/external.bzl
@@ -0,0 +1,21 @@
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+def swtpm_external(name, version):
+    sums = {
+        # master at 2024/06/04
+        "0c9a6c4a12a63b86ab472e69e95bd75853d4fa96": "169ddb139597fa808e112d452457445c79ed521bb34f999066d20de9214056ce",
+    }
+
+    http_archive(
+        name = name,
+        patch_args = ["-p1"],
+        patches = [
+            "//third_party/swtpm/patches:0001-bazel-compat-glib.h-glib-glib.h.patch",
+            "//third_party/swtpm/patches:0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch",
+            "//third_party/swtpm/patches:0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch",
+            "//third_party/swtpm/patches:0004-bazel-support-implement.patch",
+        ],
+        sha256 = sums[version],
+        strip_prefix = "swtpm-" + version,
+        urls = ["https://github.com/stefanberger/swtpm/archive/%s.tar.gz" % version],
+    )
diff --git a/third_party/swtpm/patches/0001-bazel-compat-glib.h-glib-glib.h.patch b/third_party/swtpm/patches/0001-bazel-compat-glib.h-glib-glib.h.patch
new file mode 100644
index 0000000..de98cd3
--- /dev/null
+++ b/third_party/swtpm/patches/0001-bazel-compat-glib.h-glib-glib.h.patch
@@ -0,0 +1,197 @@
+From c7932ca7f91b92002048e0e59470b0af6156aa8d Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 11:59:31 +0200
+Subject: [PATCH 1/4] bazel compat: <glib.h> -> "glib/glib.h"
+
+---
+ src/swtpm/cuse_tpm.c                    | 2 +-
+ src/swtpm/threadpool.c                  | 2 +-
+ src/swtpm_localca/swtpm_localca.c       | 2 +-
+ src/swtpm_localca/swtpm_localca.h       | 2 +-
+ src/swtpm_localca/swtpm_localca_utils.h | 2 +-
+ src/swtpm_setup/swtpm.c                 | 2 +-
+ src/swtpm_setup/swtpm.h                 | 2 +-
+ src/swtpm_setup/swtpm_setup.c           | 6 +++---
+ src/swtpm_setup/swtpm_setup.h           | 2 +-
+ src/swtpm_setup/swtpm_setup_utils.c     | 2 +-
+ src/swtpm_setup/swtpm_setup_utils.h     | 2 +-
+ src/utils/swtpm_utils.c                 | 2 +-
+ src/utils/swtpm_utils.h                 | 2 +-
+ 13 files changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/src/swtpm/cuse_tpm.c b/src/swtpm/cuse_tpm.c
+index 5977b63..4bcc503 100644
+--- a/src/swtpm/cuse_tpm.c
++++ b/src/swtpm/cuse_tpm.c
+@@ -56,7 +56,7 @@
+ 
+ #include <fuse/cuse_lowlevel.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include <libtpms/tpm_library.h>
+ #include <libtpms/tpm_tis.h>
+diff --git a/src/swtpm/threadpool.c b/src/swtpm/threadpool.c
+index 770c16a..95d0085 100644
+--- a/src/swtpm/threadpool.c
++++ b/src/swtpm/threadpool.c
+@@ -37,7 +37,7 @@
+ 
+ #include <stdbool.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include "threadpool.h"
+ 
+diff --git a/src/swtpm_localca/swtpm_localca.c b/src/swtpm_localca/swtpm_localca.c
+index 3a9fa6f..2842f22 100644
+--- a/src/swtpm_localca/swtpm_localca.c
++++ b/src/swtpm_localca/swtpm_localca.c
+@@ -22,7 +22,7 @@
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include <gmp.h>
+ 
+diff --git a/src/swtpm_localca/swtpm_localca.h b/src/swtpm_localca/swtpm_localca.h
+index c1cb19f..e203a4d 100644
+--- a/src/swtpm_localca/swtpm_localca.h
++++ b/src/swtpm_localca/swtpm_localca.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_LOCALCA_H
+ #define SWTPM_LOCALCA_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ extern gchar *gl_LOGFILE;
+ 
+diff --git a/src/swtpm_localca/swtpm_localca_utils.h b/src/swtpm_localca/swtpm_localca_utils.h
+index 2fd33b8..487738a 100644
+--- a/src/swtpm_localca/swtpm_localca_utils.h
++++ b/src/swtpm_localca/swtpm_localca_utils.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_LOCALCA_UTILS_H
+ #define SWTPM_LOCALCA_UTILS_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ gchar *get_config_value(gchar **config_file_lines, const gchar *varname, const gchar *fallback);
+ int get_config_envvars(gchar **config_file_lines, gchar  ***env);
+diff --git a/src/swtpm_setup/swtpm.c b/src/swtpm_setup/swtpm.c
+index 822215e..66eac0b 100644
+--- a/src/swtpm_setup/swtpm.c
++++ b/src/swtpm_setup/swtpm.c
+@@ -21,7 +21,7 @@
+ #include <sys/wait.h>
+ #include <unistd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include <openssl/bn.h>
+ #include <openssl/evp.h>
+diff --git a/src/swtpm_setup/swtpm.h b/src/swtpm_setup/swtpm.h
+index 2f81dce..1377d38 100644
+--- a/src/swtpm_setup/swtpm.h
++++ b/src/swtpm_setup/swtpm.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_SETUP_SWTPM_H
+ #define SWTPM_SETUP_SWTPM_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ #include <pwd.h>
+ 
+ #include <openssl/sha.h>
+diff --git a/src/swtpm_setup/swtpm_setup.c b/src/swtpm_setup/swtpm_setup.c
+index 8f87ad4..96e8b9f 100644
+--- a/src/swtpm_setup/swtpm_setup.c
++++ b/src/swtpm_setup/swtpm_setup.c
+@@ -23,9 +23,9 @@
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ 
+-#include <glib.h>
+-#include <glib/gstdio.h>
+-#include <glib/gprintf.h>
++#include "glib/glib.h"
++#include "glib/gstdio.h"
++#include "glib/gprintf.h"
+ 
+ #include <glib-object.h>
+ #include <json-glib/json-glib.h>
+diff --git a/src/swtpm_setup/swtpm_setup.h b/src/swtpm_setup/swtpm_setup.h
+index 913b36f..b87e501 100644
+--- a/src/swtpm_setup/swtpm_setup.h
++++ b/src/swtpm_setup/swtpm_setup.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_SETUP_H
+ #define SWTPM_SETUP_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ extern gchar *gl_LOGFILE;
+ 
+diff --git a/src/swtpm_setup/swtpm_setup_utils.c b/src/swtpm_setup/swtpm_setup_utils.c
+index 923e175..eddae73 100644
+--- a/src/swtpm_setup/swtpm_setup_utils.c
++++ b/src/swtpm_setup/swtpm_setup_utils.c
+@@ -17,7 +17,7 @@
+ #include <sys/utsname.h>
+ #include <unistd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include "swtpm_conf.h"
+ #include "swtpm_utils.h"
+diff --git a/src/swtpm_setup/swtpm_setup_utils.h b/src/swtpm_setup/swtpm_setup_utils.h
+index d074d3a..6c4be5e 100644
+--- a/src/swtpm_setup/swtpm_setup_utils.h
++++ b/src/swtpm_setup/swtpm_setup_utils.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_SETUP_UTILS_H
+ #define SWTPM_SETUP_UTILS_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ gchar *get_config_value(gchar **config_file_lines, const gchar *configname);
+ int create_config_files(gboolean overwrite, gboolean root_flag,
+diff --git a/src/utils/swtpm_utils.c b/src/utils/swtpm_utils.c
+index 35a4243..db32615 100644
+--- a/src/utils/swtpm_utils.c
++++ b/src/utils/swtpm_utils.c
+@@ -20,7 +20,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include "swtpm_utils.h"
+ 
+diff --git a/src/utils/swtpm_utils.h b/src/utils/swtpm_utils.h
+index 22f1f4b..78ef97b 100644
+--- a/src/utils/swtpm_utils.h
++++ b/src/utils/swtpm_utils.h
+@@ -12,7 +12,7 @@
+ 
+ #include <pwd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #define min(X,Y) ((X) < (Y) ? (X) : (Y))
+ #define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch b/third_party/swtpm/patches/0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch
new file mode 100644
index 0000000..21a2552
--- /dev/null
+++ b/third_party/swtpm/patches/0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch
@@ -0,0 +1,80 @@
+From 9410d7d0e3093380bb9d5cff3241107ff55435dd Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:06:17 +0200
+Subject: [PATCH 2/4] swtpm_localca: replace gmp/mpz dependency with boringssl
+ bignum
+
+---
+ src/swtpm_localca/swtpm_localca.c | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/src/swtpm_localca/swtpm_localca.c b/src/swtpm_localca/swtpm_localca.c
+index 2842f22..d42d3a2 100644
+--- a/src/swtpm_localca/swtpm_localca.c
++++ b/src/swtpm_localca/swtpm_localca.c
+@@ -24,7 +24,8 @@
+ 
+ #include "glib/glib.h"
+ 
+-#include <gmp.h>
++#include <openssl/bn.h>
++#include <openssl/crypto.h>
+ 
+ #include "swtpm_conf.h"
+ #include "swtpm_utils.h"
+@@ -313,7 +314,8 @@ static int get_next_serial(const gchar *certserial, const gchar *lockfile,
+     g_autofree gchar *buffer = NULL;
+     char serialbuffer[50];
+     size_t buffer_len;
+-    mpz_t serial;
++    BIGNUM *serial = BN_new();
++    char *serial_dec = NULL;
+     int lockfd;
+     int ret = 1;
+ 
+@@ -328,22 +330,18 @@ static int get_next_serial(const gchar *certserial, const gchar *lockfile,
+     if (read_file(certserial, &buffer, &buffer_len) != 0)
+         goto error;
+ 
+-    mpz_init(serial);
+-
+     if (buffer_len > 0 && buffer_len <= 49) {
+         memcpy(serialbuffer, buffer, buffer_len);
+         serialbuffer[buffer_len] = 0;
+ 
+-        if (gmp_sscanf(serialbuffer, "%Zu", serial) != 1)
+-            goto new_serial;
+-        mpz_add_ui(serial, serial, 1);
+-
+-        if ((mpz_sizeinbase(serial, 2) + 7) / 8 > 20)
++        if (BN_dec2bn(&serial, serialbuffer) == 0)
+             goto new_serial;
++        BN_add_word(serial, 1);
+ 
+-        if (gmp_snprintf(serialbuffer,
++        serial_dec = BN_bn2dec(serial);
++        if (snprintf(serialbuffer,
+                          sizeof(serialbuffer),
+-                         "%Zu", serial) >= (int)sizeof(serialbuffer))
++                         "%s", serial_dec) >= (int)sizeof(serialbuffer))
+             goto new_serial;
+     } else {
+ new_serial:
+@@ -356,10 +354,12 @@ new_serial:
+     write_file(certserial, (unsigned char *)*serial_str, strlen(*serial_str));
+     ret = 0;
+ 
+-    mpz_clear(serial);
+-
+ error:
+     unlock_file(lockfd);
++    if (serial_dec) {
++        OPENSSL_free(serial_dec);
++    }
++    BN_free(serial);
+ 
+     return ret;
+ }
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch b/third_party/swtpm/patches/0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch
new file mode 100644
index 0000000..5d13017
--- /dev/null
+++ b/third_party/swtpm/patches/0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch
@@ -0,0 +1,3681 @@
+From be2cc81e58d33e09aef534d517c5dda0d7f12272 Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:49:01 +0200
+Subject: [PATCH 3/4] swtpm_setup: replace dep on JSON-GLib with
+ sheredom/json.h
+
+Turns out swtpm_setup requests capability info from `swtpm` by shelling
+out to it then parsing JSON output.
+
+Pulling in JSON-Glib as a library sounds like pain. Let's just use a
+simple single-file JSON parser library.
+
+There will be no comment on using JSON for this from me.
+---
+ include/json.h                | 3462 +++++++++++++++++++++++++++++++++
+ src/swtpm_setup/swtpm_setup.c |  150 +-
+ 2 files changed, 3554 insertions(+), 58 deletions(-)
+ create mode 100644 include/json.h
+
+diff --git a/include/json.h b/include/json.h
+new file mode 100644
+index 0000000..7116d85
+--- /dev/null
++++ b/include/json.h
+@@ -0,0 +1,3462 @@
++/*
++   The latest version of this library is available on GitHub;
++   https://github.com/sheredom/json.h.
++*/
++
++/*
++   This is free and unencumbered software released into the public domain.
++
++   Anyone is free to copy, modify, publish, use, compile, sell, or
++   distribute this software, either in source code form or as a compiled
++   binary, for any purpose, commercial or non-commercial, and by any
++   means.
++
++   In jurisdictions that recognize copyright laws, the author or authors
++   of this software dedicate any and all copyright interest in the
++   software to the public domain. We make this dedication for the benefit
++   of the public at large and to the detriment of our heirs and
++   successors. We intend this dedication to be an overt act of
++   relinquishment in perpetuity of all present and future rights to this
++   software under copyright law.
++
++   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++
++   For more information, please refer to <http://unlicense.org/>.
++*/
++
++#ifndef SHEREDOM_JSON_H_INCLUDED
++#define SHEREDOM_JSON_H_INCLUDED
++
++#if defined(_MSC_VER)
++#pragma warning(push)
++
++/* disable warning: no function prototype given: converting '()' to '(void)' */
++#pragma warning(disable : 4255)
++
++/* disable warning: '__cplusplus' is not defined as a preprocessor macro,
++ * replacing with '0' for '#if/#elif' */
++#pragma warning(disable : 4668)
++
++/* disable warning: 'bytes padding added after construct' */
++#pragma warning(disable : 4820)
++#endif
++
++#include <stddef.h>
++#include <string.h>
++
++#if defined(__TINYC__)
++#define JSON_ATTRIBUTE(a) __attribute((a))
++#else
++#define JSON_ATTRIBUTE(a) __attribute__((a))
++#endif
++
++#if defined(_MSC_VER) || defined(__WATCOMC__)
++#define json_weak __inline
++#elif defined(__clang__) || defined(__GNUC__) || defined(__TINYC__)
++#define json_weak JSON_ATTRIBUTE(weak)
++#else
++#error Non clang, non gcc, non MSVC, non tcc, non WATCOM compiler found!
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct json_value_s;
++struct json_parse_result_s;
++
++enum json_parse_flags_e {
++  json_parse_flags_default = 0,
++
++  /* allow trailing commas in objects and arrays. For example, both [true,] and
++     {"a" : null,} would be allowed with this option on. */
++  json_parse_flags_allow_trailing_comma = 0x1,
++
++  /* allow unquoted keys for objects. For example, {a : null} would be allowed
++     with this option on. */
++  json_parse_flags_allow_unquoted_keys = 0x2,
++
++  /* allow a global unbracketed object. For example, a : null, b : true, c : {}
++     would be allowed with this option on. */
++  json_parse_flags_allow_global_object = 0x4,
++
++  /* allow objects to use '=' instead of ':' between key/value pairs. For
++     example, a = null, b : true would be allowed with this option on. */
++  json_parse_flags_allow_equals_in_object = 0x8,
++
++  /* allow that objects don't have to have comma separators between key/value
++     pairs. */
++  json_parse_flags_allow_no_commas = 0x10,
++
++  /* allow c-style comments (either variants) to be ignored in the input JSON
++     file. */
++  json_parse_flags_allow_c_style_comments = 0x20,
++
++  /* deprecated flag, unused. */
++  json_parse_flags_deprecated = 0x40,
++
++  /* record location information for each value. */
++  json_parse_flags_allow_location_information = 0x80,
++
++  /* allow strings to be 'single quoted'. */
++  json_parse_flags_allow_single_quoted_strings = 0x100,
++
++  /* allow numbers to be hexadecimal. */
++  json_parse_flags_allow_hexadecimal_numbers = 0x200,
++
++  /* allow numbers like +123 to be parsed. */
++  json_parse_flags_allow_leading_plus_sign = 0x400,
++
++  /* allow numbers like .0123 or 123. to be parsed. */
++  json_parse_flags_allow_leading_or_trailing_decimal_point = 0x800,
++
++  /* allow Infinity, -Infinity, NaN, -NaN. */
++  json_parse_flags_allow_inf_and_nan = 0x1000,
++
++  /* allow multi line string values. */
++  json_parse_flags_allow_multi_line_strings = 0x2000,
++
++  /* allow simplified JSON to be parsed. Simplified JSON is an enabling of a set
++     of other parsing options. */
++  json_parse_flags_allow_simplified_json =
++      (json_parse_flags_allow_trailing_comma |
++       json_parse_flags_allow_unquoted_keys |
++       json_parse_flags_allow_global_object |
++       json_parse_flags_allow_equals_in_object |
++       json_parse_flags_allow_no_commas),
++
++  /* allow JSON5 to be parsed. JSON5 is an enabling of a set of other parsing
++     options. */
++  json_parse_flags_allow_json5 =
++      (json_parse_flags_allow_trailing_comma |
++       json_parse_flags_allow_unquoted_keys |
++       json_parse_flags_allow_c_style_comments |
++       json_parse_flags_allow_single_quoted_strings |
++       json_parse_flags_allow_hexadecimal_numbers |
++       json_parse_flags_allow_leading_plus_sign |
++       json_parse_flags_allow_leading_or_trailing_decimal_point |
++       json_parse_flags_allow_inf_and_nan |
++       json_parse_flags_allow_multi_line_strings)
++};
++
++/* Parse a JSON text file, returning a pointer to the root of the JSON
++ * structure. json_parse performs 1 call to malloc for the entire encoding.
++ * Returns 0 if an error occurred (malformed JSON input, or malloc failed). */
++json_weak struct json_value_s *json_parse(const void *src, size_t src_size);
++
++/* Parse a JSON text file, returning a pointer to the root of the JSON
++ * structure. json_parse performs 1 call to alloc_func_ptr for the entire
++ * encoding. Returns 0 if an error occurred (malformed JSON input, or malloc
++ * failed). If an error occurred, the result struct (if not NULL) will explain
++ * the type of error, and the location in the input it occurred. If
++ * alloc_func_ptr is null then malloc is used. */
++json_weak struct json_value_s *
++json_parse_ex(const void *src, size_t src_size, size_t flags_bitset,
++              void *(*alloc_func_ptr)(void *, size_t), void *user_data,
++              struct json_parse_result_s *result);
++
++/* Extracts a value and all the data that makes it up into a newly created
++ * value. json_extract_value performs 1 call to malloc for the entire encoding.
++ */
++json_weak struct json_value_s *
++json_extract_value(const struct json_value_s *value);
++
++/* Extracts a value and all the data that makes it up into a newly created
++ * value. json_extract_value performs 1 call to alloc_func_ptr for the entire
++ * encoding. If alloc_func_ptr is null then malloc is used. */
++json_weak struct json_value_s *
++json_extract_value_ex(const struct json_value_s *value,
++                      void *(*alloc_func_ptr)(void *, size_t), void *user_data);
++
++/* Write out a minified JSON utf-8 string. This string is an encoding of the
++ * minimal string characters required to still encode the same data.
++ * json_write_minified performs 1 call to malloc for the entire encoding. Return
++ * 0 if an error occurred (malformed JSON input, or malloc failed). The out_size
++ * parameter is optional as the utf-8 string is null terminated. */
++json_weak void *json_write_minified(const struct json_value_s *value,
++                                    size_t *out_size);
++
++/* Write out a pretty JSON utf-8 string. This string is encoded such that the
++ * resultant JSON is pretty in that it is easily human readable. The indent and
++ * newline parameters allow a user to specify what kind of indentation and
++ * newline they want (two spaces / three spaces / tabs? \r, \n, \r\n ?). Both
++ * indent and newline can be NULL, indent defaults to two spaces ("  "), and
++ * newline defaults to linux newlines ('\n' as the newline character).
++ * json_write_pretty performs 1 call to malloc for the entire encoding. Return 0
++ * if an error occurred (malformed JSON input, or malloc failed). The out_size
++ * parameter is optional as the utf-8 string is null terminated. */
++json_weak void *json_write_pretty(const struct json_value_s *value,
++                                  const char *indent, const char *newline,
++                                  size_t *out_size);
++
++/* Reinterpret a JSON value as a string. Returns null is the value was not a
++ * string. */
++json_weak struct json_string_s *
++json_value_as_string(struct json_value_s *const value);
++
++/* Reinterpret a JSON value as a number. Returns null is the value was not a
++ * number. */
++json_weak struct json_number_s *
++json_value_as_number(struct json_value_s *const value);
++
++/* Reinterpret a JSON value as an object. Returns null is the value was not an
++ * object. */
++json_weak struct json_object_s *
++json_value_as_object(struct json_value_s *const value);
++
++/* Reinterpret a JSON value as an array. Returns null is the value was not an
++ * array. */
++json_weak struct json_array_s *
++json_value_as_array(struct json_value_s *const value);
++
++/* Whether the value is true. */
++json_weak int json_value_is_true(const struct json_value_s *const value);
++
++/* Whether the value is false. */
++json_weak int json_value_is_false(const struct json_value_s *const value);
++
++/* Whether the value is null. */
++json_weak int json_value_is_null(const struct json_value_s *const value);
++
++/* The various types JSON values can be. Used to identify what a value is. */
++typedef enum json_type_e {
++  json_type_string,
++  json_type_number,
++  json_type_object,
++  json_type_array,
++  json_type_true,
++  json_type_false,
++  json_type_null
++
++} json_type_t;
++
++/* A JSON string value. */
++typedef struct json_string_s {
++  /* utf-8 string */
++  const char *string;
++  /* The size (in bytes) of the string */
++  size_t string_size;
++
++} json_string_t;
++
++/* A JSON string value (extended). */
++typedef struct json_string_ex_s {
++  /* The JSON string this extends. */
++  struct json_string_s string;
++
++  /* The character offset for the value in the JSON input. */
++  size_t offset;
++
++  /* The line number for the value in the JSON input. */
++  size_t line_no;
++
++  /* The row number for the value in the JSON input, in bytes. */
++  size_t row_no;
++
++} json_string_ex_t;
++
++/* A JSON number value. */
++typedef struct json_number_s {
++  /* ASCII string containing representation of the number. */
++  const char *number;
++  /* the size (in bytes) of the number. */
++  size_t number_size;
++
++} json_number_t;
++
++/* an element of a JSON object. */
++typedef struct json_object_element_s {
++  /* the name of this element. */
++  struct json_string_s *name;
++  /* the value of this element. */
++  struct json_value_s *value;
++  /* the next object element (can be NULL if the last element in the object). */
++  struct json_object_element_s *next;
++
++} json_object_element_t;
++
++/* a JSON object value. */
++typedef struct json_object_s {
++  /* a linked list of the elements in the object. */
++  struct json_object_element_s *start;
++  /* the number of elements in the object. */
++  size_t length;
++
++} json_object_t;
++
++/* an element of a JSON array. */
++typedef struct json_array_element_s {
++  /* the value of this element. */
++  struct json_value_s *value;
++  /* the next array element (can be NULL if the last element in the array). */
++  struct json_array_element_s *next;
++
++} json_array_element_t;
++
++/* a JSON array value. */
++typedef struct json_array_s {
++  /* a linked list of the elements in the array. */
++  struct json_array_element_s *start;
++  /* the number of elements in the array. */
++  size_t length;
++
++} json_array_t;
++
++/* a JSON value. */
++typedef struct json_value_s {
++  /* a pointer to either a json_string_s, json_number_s, json_object_s, or. */
++  /* json_array_s. Should be cast to the appropriate struct type based on what.
++   */
++  /* the type of this value is. */
++  void *payload;
++  /* must be one of json_type_e. If type is json_type_true, json_type_false, or.
++   */
++  /* json_type_null, payload will be NULL. */
++  size_t type;
++
++} json_value_t;
++
++/* a JSON value (extended). */
++typedef struct json_value_ex_s {
++  /* the JSON value this extends. */
++  struct json_value_s value;
++
++  /* the character offset for the value in the JSON input. */
++  size_t offset;
++
++  /* the line number for the value in the JSON input. */
++  size_t line_no;
++
++  /* the row number for the value in the JSON input, in bytes. */
++  size_t row_no;
++
++} json_value_ex_t;
++
++/* a parsing error code. */
++enum json_parse_error_e {
++  /* no error occurred (huzzah!). */
++  json_parse_error_none = 0,
++
++  /* expected either a comma or a closing '}' or ']' to close an object or. */
++  /* array! */
++  json_parse_error_expected_comma_or_closing_bracket,
++
++  /* colon separating name/value pair was missing! */
++  json_parse_error_expected_colon,
++
++  /* expected string to begin with '"'! */
++  json_parse_error_expected_opening_quote,
++
++  /* invalid escaped sequence in string! */
++  json_parse_error_invalid_string_escape_sequence,
++
++  /* invalid number format! */
++  json_parse_error_invalid_number_format,
++
++  /* invalid value! */
++  json_parse_error_invalid_value,
++
++  /* reached end of buffer before object/array was complete! */
++  json_parse_error_premature_end_of_buffer,
++
++  /* string was malformed! */
++  json_parse_error_invalid_string,
++
++  /* a call to malloc, or a user provider allocator, failed. */
++  json_parse_error_allocator_failed,
++
++  /* the JSON input had unexpected trailing characters that weren't part of the.
++     JSON value. */
++  json_parse_error_unexpected_trailing_characters,
++
++  /* catch-all error for everything else that exploded (real bad chi!). */
++  json_parse_error_unknown
++};
++
++/* error report from json_parse_ex(). */
++typedef struct json_parse_result_s {
++  /* the error code (one of json_parse_error_e). */
++  size_t error;
++
++  /* the character offset for the error in the JSON input. */
++  size_t error_offset;
++
++  /* the line number for the error in the JSON input. */
++  size_t error_line_no;
++
++  /* the row number for the error, in bytes. */
++  size_t error_row_no;
++
++} json_parse_result_t;
++
++#ifdef __cplusplus
++} /* extern "C". */
++#endif
++
++#include <stdlib.h>
++
++#if defined(_MSC_VER)
++#pragma warning(pop)
++#endif
++
++#if defined(_MSC_VER) && (_MSC_VER < 1920)
++#define json_uintmax_t unsigned __int64
++#else
++#include <inttypes.h>
++#define json_uintmax_t uintmax_t
++#endif
++
++#if defined(_MSC_VER)
++#define json_strtoumax _strtoui64
++#else
++#define json_strtoumax strtoumax
++#endif
++
++#if defined(__cplusplus) && (__cplusplus >= 201103L)
++#define json_null nullptr
++#else
++#define json_null 0
++#endif
++
++#if defined(__clang__)
++#pragma clang diagnostic push
++
++/* we do one big allocation via malloc, then cast aligned slices of this for. */
++/* our structures - we don't have a way to tell the compiler we know what we. */
++/* are doing, so disable the warning instead! */
++#pragma clang diagnostic ignored "-Wcast-align"
++
++/* We use C style casts everywhere. */
++#pragma clang diagnostic ignored "-Wold-style-cast"
++
++/* We need long long for strtoull. */
++#pragma clang diagnostic ignored "-Wc++11-long-long"
++
++/* Who cares if nullptr doesn't work with C++98, we don't use it there! */
++#pragma clang diagnostic ignored "-Wc++98-compat"
++#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
++
++#if __has_warning("-Wunsafe-buffer-usage")
++#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
++#endif
++
++#elif defined(_MSC_VER)
++#pragma warning(push)
++
++/* disable 'function selected for inline expansion' warning. */
++#pragma warning(disable : 4711)
++
++/* disable '#pragma warning: there is no warning number' warning. */
++#pragma warning(disable : 4619)
++
++/* disable 'warning number not a valid compiler warning' warning. */
++#pragma warning(disable : 4616)
++
++/* disable 'Compiler will insert Spectre mitigation for memory load if
++ * /Qspectre. */
++/* switch specified' warning. */
++#pragma warning(disable : 5045)
++#endif
++
++struct json_parse_state_s {
++  const char *src;
++  size_t size;
++  size_t offset;
++  size_t flags_bitset;
++  char *data;
++  char *dom;
++  size_t dom_size;
++  size_t data_size;
++  size_t line_no;     /* line counter for error reporting. */
++  size_t line_offset; /* (offset-line_offset) is the character number (in
++                         bytes). */
++  size_t error;
++};
++
++json_weak int json_hexadecimal_digit(const char c);
++int json_hexadecimal_digit(const char c) {
++  if ('0' <= c && c <= '9') {
++    return c - '0';
++  }
++  if ('a' <= c && c <= 'f') {
++    return c - 'a' + 10;
++  }
++  if ('A' <= c && c <= 'F') {
++    return c - 'A' + 10;
++  }
++  return -1;
++}
++
++json_weak int json_hexadecimal_value(const char *c, const unsigned long size,
++                                     unsigned long *result);
++int json_hexadecimal_value(const char *c, const unsigned long size,
++                           unsigned long *result) {
++  const char *p;
++  int digit;
++
++  if (size > sizeof(unsigned long) * 2) {
++    return 0;
++  }
++
++  *result = 0;
++  for (p = c; (unsigned long)(p - c) < size; ++p) {
++    *result <<= 4;
++    digit = json_hexadecimal_digit(*p);
++    if (digit < 0 || digit > 15) {
++      return 0;
++    }
++    *result |= (unsigned char)digit;
++  }
++  return 1;
++}
++
++json_weak int json_skip_whitespace(struct json_parse_state_s *state);
++int json_skip_whitespace(struct json_parse_state_s *state) {
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  const char *const src = state->src;
++
++  if (offset >= state->size) {
++    return 0;
++  }
++
++  /* the only valid whitespace according to ECMA-404 is ' ', '\n', '\r' and
++   * '\t'. */
++  switch (src[offset]) {
++  default:
++    return 0;
++  case ' ':
++  case '\r':
++  case '\t':
++  case '\n':
++    break;
++  }
++
++  do {
++    switch (src[offset]) {
++    default:
++      /* Update offset. */
++      state->offset = offset;
++      return 1;
++    case ' ':
++    case '\r':
++    case '\t':
++      break;
++    case '\n':
++      state->line_no++;
++      state->line_offset = offset;
++      break;
++    }
++
++    offset++;
++  } while (offset < size);
++
++  /* Update offset. */
++  state->offset = offset;
++  return 1;
++}
++
++json_weak int json_skip_c_style_comments(struct json_parse_state_s *state);
++int json_skip_c_style_comments(struct json_parse_state_s *state) {
++  /* to have a C-style comment we need at least 2 characters of space */
++  if ((state->offset + 2) > state->size) {
++    return 0;
++  }
++
++  /* do we have a comment? */
++  if ('/' == state->src[state->offset]) {
++    if ('/' == state->src[state->offset + 1]) {
++      /* we had a comment of the form // */
++
++      /* skip first '/' */
++      state->offset++;
++
++      /* skip second '/' */
++      state->offset++;
++
++      while (state->offset < state->size) {
++        switch (state->src[state->offset]) {
++        default:
++          /* skip the character in the comment */
++          state->offset++;
++          break;
++        case '\n':
++          /* if we have a newline, our comment has ended! Skip the newline */
++          state->offset++;
++
++          /* we entered a newline, so move our line info forward */
++          state->line_no++;
++          state->line_offset = state->offset;
++          return 1;
++        }
++      }
++
++      /* we reached the end of the JSON file! */
++      return 1;
++    } else if ('*' == state->src[state->offset + 1]) {
++      /* we had a comment in the C-style long form */
++
++      /* skip '/' */
++      state->offset++;
++
++      /* skip '*' */
++      state->offset++;
++
++      while (state->offset + 1 < state->size) {
++        if (('*' == state->src[state->offset]) &&
++            ('/' == state->src[state->offset + 1])) {
++          /* we reached the end of our comment! */
++          state->offset += 2;
++          return 1;
++        } else if ('\n' == state->src[state->offset]) {
++          /* we entered a newline, so move our line info forward */
++          state->line_no++;
++          state->line_offset = state->offset;
++        }
++
++        /* skip character within comment */
++        state->offset++;
++      }
++
++      /* comment wasn't ended correctly which is a failure */
++      return 1;
++    }
++  }
++
++  /* we didn't have any comment, which is ok too! */
++  return 0;
++}
++
++json_weak int json_skip_all_skippables(struct json_parse_state_s *state);
++int json_skip_all_skippables(struct json_parse_state_s *state) {
++  /* skip all whitespace and other skippables until there are none left. note
++   * that the previous version suffered from read past errors should. the
++   * stream end on json_skip_c_style_comments eg. '{"a" ' with comments flag.
++   */
++
++  int did_consume = 0;
++  const size_t size = state->size;
++
++  if (json_parse_flags_allow_c_style_comments & state->flags_bitset) {
++    do {
++      if (state->offset == size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      did_consume = json_skip_whitespace(state);
++
++      /* This should really be checked on access, not in front of every call.
++       */
++      if (state->offset >= size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      did_consume |= json_skip_c_style_comments(state);
++    } while (0 != did_consume);
++  } else {
++    do {
++      if (state->offset == size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      did_consume = json_skip_whitespace(state);
++    } while (0 != did_consume);
++  }
++
++  if (state->offset == size) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    return 1;
++  }
++
++  return 0;
++}
++
++json_weak int json_get_value_size(struct json_parse_state_s *state,
++                                  int is_global_object);
++
++json_weak int json_get_string_size(struct json_parse_state_s *state,
++                                   size_t is_key);
++int json_get_string_size(struct json_parse_state_s *state, size_t is_key) {
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  size_t data_size = 0;
++  const char *const src = state->src;
++  const int is_single_quote = '\'' == src[offset];
++  const char quote_to_use = is_single_quote ? '\'' : '"';
++  const size_t flags_bitset = state->flags_bitset;
++  unsigned long codepoint;
++  unsigned long high_surrogate = 0;
++
++  if ((json_parse_flags_allow_location_information & flags_bitset) != 0 &&
++      is_key != 0) {
++    state->dom_size += sizeof(struct json_string_ex_s);
++  } else {
++    state->dom_size += sizeof(struct json_string_s);
++  }
++
++  if ('"' != src[offset]) {
++    /* if we are allowed single quoted strings check for that too. */
++    if (!((json_parse_flags_allow_single_quoted_strings & flags_bitset) &&
++          is_single_quote)) {
++      state->error = json_parse_error_expected_opening_quote;
++      state->offset = offset;
++      return 1;
++    }
++  }
++
++  /* skip leading '"' or '\''. */
++  offset++;
++
++  while ((offset < size) && (quote_to_use != src[offset])) {
++    /* add space for the character. */
++    data_size++;
++
++    switch (src[offset]) {
++    default:
++      break;
++    case '\0':
++    case '\t':
++      state->error = json_parse_error_invalid_string;
++      state->offset = offset;
++      return 1;
++    }
++
++    if ('\\' == src[offset]) {
++      /* skip reverse solidus character. */
++      offset++;
++
++      if (offset == size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        state->offset = offset;
++        return 1;
++      }
++
++      switch (src[offset]) {
++      default:
++        state->error = json_parse_error_invalid_string_escape_sequence;
++        state->offset = offset;
++        return 1;
++      case '"':
++      case '\\':
++      case '/':
++      case 'b':
++      case 'f':
++      case 'n':
++      case 'r':
++      case 't':
++        /* all valid characters! */
++        offset++;
++        break;
++      case 'u':
++        if (!(offset + 5 < size)) {
++          /* invalid escaped unicode sequence! */
++          state->error = json_parse_error_invalid_string_escape_sequence;
++          state->offset = offset;
++          return 1;
++        }
++
++        codepoint = 0;
++        if (!json_hexadecimal_value(&src[offset + 1], 4, &codepoint)) {
++          /* escaped unicode sequences must contain 4 hexadecimal digits! */
++          state->error = json_parse_error_invalid_string_escape_sequence;
++          state->offset = offset;
++          return 1;
++        }
++
++        /* Valid sequence!
++         * see: https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points.
++         *      1       7       U + 0000        U + 007F        0xxxxxxx.
++         *      2       11      U + 0080        U + 07FF        110xxxxx
++         * 10xxxxxx.
++         *      3       16      U + 0800        U + FFFF        1110xxxx
++         * 10xxxxxx        10xxxxxx.
++         *      4       21      U + 10000       U + 10FFFF      11110xxx
++         * 10xxxxxx        10xxxxxx        10xxxxxx.
++         * Note: the high and low surrogate halves used by UTF-16 (U+D800
++         * through U+DFFF) and code points not encodable by UTF-16 (those after
++         * U+10FFFF) are not legal Unicode values, and their UTF-8 encoding must
++         * be treated as an invalid byte sequence. */
++
++        if (high_surrogate != 0) {
++          /* we previously read the high half of the \uxxxx\uxxxx pair, so now
++           * we expect the low half. */
++          if (codepoint >= 0xdc00 &&
++              codepoint <= 0xdfff) { /* low surrogate range. */
++            data_size += 3;
++            high_surrogate = 0;
++          } else {
++            state->error = json_parse_error_invalid_string_escape_sequence;
++            state->offset = offset;
++            return 1;
++          }
++        } else if (codepoint <= 0x7f) {
++          data_size += 0;
++        } else if (codepoint <= 0x7ff) {
++          data_size += 1;
++        } else if (codepoint >= 0xd800 &&
++                   codepoint <= 0xdbff) { /* high surrogate range. */
++          /* The codepoint is the first half of a "utf-16 surrogate pair". so we
++           * need the other half for it to be valid: \uHHHH\uLLLL. */
++          if (offset + 11 > size || '\\' != src[offset + 5] ||
++              'u' != src[offset + 6]) {
++            state->error = json_parse_error_invalid_string_escape_sequence;
++            state->offset = offset;
++            return 1;
++          }
++          high_surrogate = codepoint;
++        } else if (codepoint >= 0xd800 &&
++                   codepoint <= 0xdfff) { /* low surrogate range. */
++          /* we did not read the other half before. */
++          state->error = json_parse_error_invalid_string_escape_sequence;
++          state->offset = offset;
++          return 1;
++        } else {
++          data_size += 2;
++        }
++        /* escaped codepoints after 0xffff are supported in json through utf-16
++         * surrogate pairs: \uD83D\uDD25 for U+1F525. */
++
++        offset += 5;
++        break;
++      }
++    } else if (('\r' == src[offset]) || ('\n' == src[offset])) {
++      if (!(json_parse_flags_allow_multi_line_strings & flags_bitset)) {
++        /* invalid escaped unicode sequence! */
++        state->error = json_parse_error_invalid_string_escape_sequence;
++        state->offset = offset;
++        return 1;
++      }
++
++      offset++;
++    } else {
++      /* skip character (valid part of sequence). */
++      offset++;
++    }
++  }
++
++  /* If the offset is equal to the size, we had a non-terminated string! */
++  if (offset == size) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    state->offset = offset - 1;
++    return 1;
++  }
++
++  /* skip trailing '"' or '\''. */
++  offset++;
++
++  /* add enough space to store the string. */
++  state->data_size += data_size;
++
++  /* one more byte for null terminator ending the string! */
++  state->data_size++;
++
++  /* update offset. */
++  state->offset = offset;
++
++  return 0;
++}
++
++json_weak int is_valid_unquoted_key_char(const char c);
++int is_valid_unquoted_key_char(const char c) {
++  return (('0' <= c && c <= '9') || ('a' <= c && c <= 'z') ||
++          ('A' <= c && c <= 'Z') || ('_' == c));
++}
++
++json_weak int json_get_key_size(struct json_parse_state_s *state);
++int json_get_key_size(struct json_parse_state_s *state) {
++  const size_t flags_bitset = state->flags_bitset;
++
++  if (json_parse_flags_allow_unquoted_keys & flags_bitset) {
++    size_t offset = state->offset;
++    const size_t size = state->size;
++    const char *const src = state->src;
++    size_t data_size = state->data_size;
++
++    /* if we are allowing unquoted keys, first grok for a quote... */
++    if ('"' == src[offset]) {
++      /* ... if we got a comma, just parse the key as a string as normal. */
++      return json_get_string_size(state, 1);
++    } else if ((json_parse_flags_allow_single_quoted_strings & flags_bitset) &&
++               ('\'' == src[offset])) {
++      /* ... if we got a comma, just parse the key as a string as normal. */
++      return json_get_string_size(state, 1);
++    } else {
++      while ((offset < size) && is_valid_unquoted_key_char(src[offset])) {
++        offset++;
++        data_size++;
++      }
++
++      /* one more byte for null terminator ending the string! */
++      data_size++;
++
++      if (json_parse_flags_allow_location_information & flags_bitset) {
++        state->dom_size += sizeof(struct json_string_ex_s);
++      } else {
++        state->dom_size += sizeof(struct json_string_s);
++      }
++
++      /* update offset. */
++      state->offset = offset;
++
++      /* update data_size. */
++      state->data_size = data_size;
++
++      return 0;
++    }
++  } else {
++    /* we are only allowed to have quoted keys, so just parse a string! */
++    return json_get_string_size(state, 1);
++  }
++}
++
++json_weak int json_get_object_size(struct json_parse_state_s *state,
++                                   int is_global_object);
++int json_get_object_size(struct json_parse_state_s *state,
++                         int is_global_object) {
++  const size_t flags_bitset = state->flags_bitset;
++  const char *const src = state->src;
++  const size_t size = state->size;
++  size_t elements = 0;
++  int allow_comma = 0;
++  int found_closing_brace = 0;
++
++  if (is_global_object) {
++    /* if we found an opening '{' of an object, we actually have a normal JSON
++     * object at the root of the DOM... */
++    if (!json_skip_all_skippables(state) && '{' == state->src[state->offset]) {
++      /* . and we don't actually have a global object after all! */
++      is_global_object = 0;
++    }
++  }
++
++  if (!is_global_object) {
++    if ('{' != src[state->offset]) {
++      state->error = json_parse_error_unknown;
++      return 1;
++    }
++
++    /* skip leading '{'. */
++    state->offset++;
++  }
++
++  state->dom_size += sizeof(struct json_object_s);
++
++  if ((state->offset == size) && !is_global_object) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    return 1;
++  }
++
++  do {
++    if (!is_global_object) {
++      if (json_skip_all_skippables(state)) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      if ('}' == src[state->offset]) {
++        /* skip trailing '}'. */
++        state->offset++;
++
++        found_closing_brace = 1;
++
++        /* finished the object! */
++        break;
++      }
++    } else {
++      /* we don't require brackets, so that means the object ends when the input
++       * stream ends! */
++      if (json_skip_all_skippables(state)) {
++        break;
++      }
++    }
++
++    /* if we parsed at least one element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++      } else if (json_parse_flags_allow_no_commas & flags_bitset) {
++        /* we don't require a comma, and we didn't find one, which is ok! */
++        allow_comma = 0;
++      } else {
++        /* otherwise we are required to have a comma, and we found none. */
++        state->error = json_parse_error_expected_comma_or_closing_bracket;
++        return 1;
++      }
++
++      if (json_parse_flags_allow_trailing_comma & flags_bitset) {
++        continue;
++      } else {
++        if (json_skip_all_skippables(state)) {
++          state->error = json_parse_error_premature_end_of_buffer;
++          return 1;
++        }
++      }
++    }
++
++    if (json_get_key_size(state)) {
++      /* key parsing failed! */
++      state->error = json_parse_error_invalid_string;
++      return 1;
++    }
++
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    if (json_parse_flags_allow_equals_in_object & flags_bitset) {
++      const char current = src[state->offset];
++      if ((':' != current) && ('=' != current)) {
++        state->error = json_parse_error_expected_colon;
++        return 1;
++      }
++    } else {
++      if (':' != src[state->offset]) {
++        state->error = json_parse_error_expected_colon;
++        return 1;
++      }
++    }
++
++    /* skip colon. */
++    state->offset++;
++
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    if (json_get_value_size(state, /* is_global_object = */ 0)) {
++      /* value parsing failed! */
++      return 1;
++    }
++
++    /* successfully parsed a name/value pair! */
++    elements++;
++    allow_comma = 1;
++  } while (state->offset < size);
++
++  if ((state->offset == size) && !is_global_object && !found_closing_brace) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    return 1;
++  }
++
++  state->dom_size += sizeof(struct json_object_element_s) * elements;
++
++  return 0;
++}
++
++json_weak int json_get_array_size(struct json_parse_state_s *state);
++int json_get_array_size(struct json_parse_state_s *state) {
++  const size_t flags_bitset = state->flags_bitset;
++  size_t elements = 0;
++  int allow_comma = 0;
++  const char *const src = state->src;
++  const size_t size = state->size;
++
++  if ('[' != src[state->offset]) {
++    /* expected array to begin with leading '['. */
++    state->error = json_parse_error_unknown;
++    return 1;
++  }
++
++  /* skip leading '['. */
++  state->offset++;
++
++  state->dom_size += sizeof(struct json_array_s);
++
++  while (state->offset < size) {
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    if (']' == src[state->offset]) {
++      /* skip trailing ']'. */
++      state->offset++;
++
++      state->dom_size += sizeof(struct json_array_element_s) * elements;
++
++      /* finished the object! */
++      return 0;
++    }
++
++    /* if we parsed at least once element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++      } else if (!(json_parse_flags_allow_no_commas & flags_bitset)) {
++        state->error = json_parse_error_expected_comma_or_closing_bracket;
++        return 1;
++      }
++
++      if (json_parse_flags_allow_trailing_comma & flags_bitset) {
++        allow_comma = 0;
++        continue;
++      } else {
++        if (json_skip_all_skippables(state)) {
++          state->error = json_parse_error_premature_end_of_buffer;
++          return 1;
++        }
++      }
++    }
++
++    if (json_get_value_size(state, /* is_global_object = */ 0)) {
++      /* value parsing failed! */
++      return 1;
++    }
++
++    /* successfully parsed an array element! */
++    elements++;
++    allow_comma = 1;
++  }
++
++  /* we consumed the entire input before finding the closing ']' of the array!
++   */
++  state->error = json_parse_error_premature_end_of_buffer;
++  return 1;
++}
++
++json_weak int json_get_number_size(struct json_parse_state_s *state);
++int json_get_number_size(struct json_parse_state_s *state) {
++  const size_t flags_bitset = state->flags_bitset;
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  int had_leading_digits = 0;
++  const char *const src = state->src;
++
++  state->dom_size += sizeof(struct json_number_s);
++
++  if ((json_parse_flags_allow_hexadecimal_numbers & flags_bitset) &&
++      (offset + 1 < size) && ('0' == src[offset]) &&
++      (('x' == src[offset + 1]) || ('X' == src[offset + 1]))) {
++    /* skip the leading 0x that identifies a hexadecimal number. */
++    offset += 2;
++
++    /* consume hexadecimal digits. */
++    while ((offset < size) && (('0' <= src[offset] && src[offset] <= '9') ||
++                               ('a' <= src[offset] && src[offset] <= 'f') ||
++                               ('A' <= src[offset] && src[offset] <= 'F'))) {
++      offset++;
++    }
++  } else {
++    int found_sign = 0;
++    int inf_or_nan = 0;
++
++    if ((offset < size) &&
++        (('-' == src[offset]) ||
++         ((json_parse_flags_allow_leading_plus_sign & flags_bitset) &&
++          ('+' == src[offset])))) {
++      /* skip valid leading '-' or '+'. */
++      offset++;
++
++      found_sign = 1;
++    }
++
++    if (json_parse_flags_allow_inf_and_nan & flags_bitset) {
++      const char inf[9] = "Infinity";
++      const size_t inf_strlen = sizeof(inf) - 1;
++      const char nan[4] = "NaN";
++      const size_t nan_strlen = sizeof(nan) - 1;
++
++      if (offset + inf_strlen < size) {
++        int found = 1;
++        size_t i;
++        for (i = 0; i < inf_strlen; i++) {
++          if (inf[i] != src[offset + i]) {
++            found = 0;
++            break;
++          }
++        }
++
++        if (found) {
++          /* We found our special 'Infinity' keyword! */
++          offset += inf_strlen;
++
++          inf_or_nan = 1;
++        }
++      }
++
++      if (offset + nan_strlen < size) {
++        int found = 1;
++        size_t i;
++        for (i = 0; i < nan_strlen; i++) {
++          if (nan[i] != src[offset + i]) {
++            found = 0;
++            break;
++          }
++        }
++
++        if (found) {
++          /* We found our special 'NaN' keyword! */
++          offset += nan_strlen;
++
++          inf_or_nan = 1;
++        }
++      }
++
++      if (inf_or_nan) {
++        if (offset < size) {
++          switch (src[offset]) {
++          default:
++            break;
++          case '0':
++          case '1':
++          case '2':
++          case '3':
++          case '4':
++          case '5':
++          case '6':
++          case '7':
++          case '8':
++          case '9':
++          case 'e':
++          case 'E':
++            /* cannot follow an inf or nan with digits! */
++            state->error = json_parse_error_invalid_number_format;
++            state->offset = offset;
++            return 1;
++          }
++        }
++      }
++    }
++
++    if (found_sign && !inf_or_nan && (offset < size) &&
++        !('0' <= src[offset] && src[offset] <= '9')) {
++      /* check if we are allowing leading '.'. */
++      if (!(json_parse_flags_allow_leading_or_trailing_decimal_point &
++            flags_bitset) ||
++          ('.' != src[offset])) {
++        /* a leading '-' must be immediately followed by any digit! */
++        state->error = json_parse_error_invalid_number_format;
++        state->offset = offset;
++        return 1;
++      }
++    }
++
++    if ((offset < size) && ('0' == src[offset])) {
++      /* skip valid '0'. */
++      offset++;
++
++      /* we need to record whether we had any leading digits for checks later.
++       */
++      had_leading_digits = 1;
++
++      if ((offset < size) && ('0' <= src[offset] && src[offset] <= '9')) {
++        /* a leading '0' must not be immediately followed by any digit! */
++        state->error = json_parse_error_invalid_number_format;
++        state->offset = offset;
++        return 1;
++      }
++    }
++
++    /* the main digits of our number next. */
++    while ((offset < size) && ('0' <= src[offset] && src[offset] <= '9')) {
++      offset++;
++
++      /* we need to record whether we had any leading digits for checks later.
++       */
++      had_leading_digits = 1;
++    }
++
++    if ((offset < size) && ('.' == src[offset])) {
++      offset++;
++
++      if ((offset >= size) || !('0' <= src[offset] && src[offset] <= '9')) {
++        if (!(json_parse_flags_allow_leading_or_trailing_decimal_point &
++              flags_bitset) ||
++            !had_leading_digits) {
++          /* a decimal point must be followed by at least one digit. */
++          state->error = json_parse_error_invalid_number_format;
++          state->offset = offset;
++          return 1;
++        }
++      }
++
++      /* a decimal point can be followed by more digits of course! */
++      while ((offset < size) && ('0' <= src[offset] && src[offset] <= '9')) {
++        offset++;
++      }
++    }
++
++    if ((offset < size) && ('e' == src[offset] || 'E' == src[offset])) {
++      /* our number has an exponent! Skip 'e' or 'E'. */
++      offset++;
++
++      if ((offset < size) && ('-' == src[offset] || '+' == src[offset])) {
++        /* skip optional '-' or '+'. */
++        offset++;
++      }
++
++      if ((offset < size) && !('0' <= src[offset] && src[offset] <= '9')) {
++        /* an exponent must have at least one digit! */
++        state->error = json_parse_error_invalid_number_format;
++        state->offset = offset;
++        return 1;
++      }
++
++      /* consume exponent digits. */
++      do {
++        offset++;
++      } while ((offset < size) && ('0' <= src[offset] && src[offset] <= '9'));
++    }
++  }
++
++  if (offset < size) {
++    switch (src[offset]) {
++    case ' ':
++    case '\t':
++    case '\r':
++    case '\n':
++    case '}':
++    case ',':
++    case ']':
++      /* all of the above are ok. */
++      break;
++    case '=':
++      if (json_parse_flags_allow_equals_in_object & flags_bitset) {
++        break;
++      }
++
++      state->error = json_parse_error_invalid_number_format;
++      state->offset = offset;
++      return 1;
++    default:
++      state->error = json_parse_error_invalid_number_format;
++      state->offset = offset;
++      return 1;
++    }
++  }
++
++  state->data_size += offset - state->offset;
++
++  /* one more byte for null terminator ending the number string! */
++  state->data_size++;
++
++  /* update offset. */
++  state->offset = offset;
++
++  return 0;
++}
++
++json_weak int json_get_value_size(struct json_parse_state_s *state,
++                                  int is_global_object);
++int json_get_value_size(struct json_parse_state_s *state,
++                        int is_global_object) {
++  const size_t flags_bitset = state->flags_bitset;
++  const char *const src = state->src;
++  size_t offset;
++  const size_t size = state->size;
++
++  if (json_parse_flags_allow_location_information & flags_bitset) {
++    state->dom_size += sizeof(struct json_value_ex_s);
++  } else {
++    state->dom_size += sizeof(struct json_value_s);
++  }
++
++  if (is_global_object) {
++    return json_get_object_size(state, /* is_global_object = */ 1);
++  } else {
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    /* can cache offset now. */
++    offset = state->offset;
++
++    switch (src[offset]) {
++    case '"':
++      return json_get_string_size(state, 0);
++    case '\'':
++      if (json_parse_flags_allow_single_quoted_strings & flags_bitset) {
++        return json_get_string_size(state, 0);
++      } else {
++        /* invalid value! */
++        state->error = json_parse_error_invalid_value;
++        return 1;
++      }
++    case '{':
++      return json_get_object_size(state, /* is_global_object = */ 0);
++    case '[':
++      return json_get_array_size(state);
++    case '-':
++    case '0':
++    case '1':
++    case '2':
++    case '3':
++    case '4':
++    case '5':
++    case '6':
++    case '7':
++    case '8':
++    case '9':
++      return json_get_number_size(state);
++    case '+':
++      if (json_parse_flags_allow_leading_plus_sign & flags_bitset) {
++        return json_get_number_size(state);
++      } else {
++        /* invalid value! */
++        state->error = json_parse_error_invalid_number_format;
++        return 1;
++      }
++    case '.':
++      if (json_parse_flags_allow_leading_or_trailing_decimal_point &
++          flags_bitset) {
++        return json_get_number_size(state);
++      } else {
++        /* invalid value! */
++        state->error = json_parse_error_invalid_number_format;
++        return 1;
++      }
++    default:
++      if ((offset + 4) <= size && 't' == src[offset + 0] &&
++          'r' == src[offset + 1] && 'u' == src[offset + 2] &&
++          'e' == src[offset + 3]) {
++        state->offset += 4;
++        return 0;
++      } else if ((offset + 5) <= size && 'f' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'l' == src[offset + 2] &&
++                 's' == src[offset + 3] && 'e' == src[offset + 4]) {
++        state->offset += 5;
++        return 0;
++      } else if ((offset + 4) <= size && 'n' == state->src[offset + 0] &&
++                 'u' == state->src[offset + 1] &&
++                 'l' == state->src[offset + 2] &&
++                 'l' == state->src[offset + 3]) {
++        state->offset += 4;
++        return 0;
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 3) <= size && 'N' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'N' == src[offset + 2]) {
++        return json_get_number_size(state);
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 8) <= size && 'I' == src[offset + 0] &&
++                 'n' == src[offset + 1] && 'f' == src[offset + 2] &&
++                 'i' == src[offset + 3] && 'n' == src[offset + 4] &&
++                 'i' == src[offset + 5] && 't' == src[offset + 6] &&
++                 'y' == src[offset + 7]) {
++        return json_get_number_size(state);
++      }
++
++      /* invalid value! */
++      state->error = json_parse_error_invalid_value;
++      return 1;
++    }
++  }
++}
++
++json_weak void json_parse_value(struct json_parse_state_s *state,
++                                int is_global_object,
++                                struct json_value_s *value);
++
++json_weak void json_parse_string(struct json_parse_state_s *state,
++                                 struct json_string_s *string);
++void json_parse_string(struct json_parse_state_s *state,
++                       struct json_string_s *string) {
++  size_t offset = state->offset;
++  size_t bytes_written = 0;
++  const char *const src = state->src;
++  const char quote_to_use = '\'' == src[offset] ? '\'' : '"';
++  char *data = state->data;
++  unsigned long high_surrogate = 0;
++  unsigned long codepoint;
++
++  string->string = data;
++
++  /* skip leading '"' or '\''. */
++  offset++;
++
++  while (quote_to_use != src[offset]) {
++    if ('\\' == src[offset]) {
++      /* skip the reverse solidus. */
++      offset++;
++
++      switch (src[offset++]) {
++      default:
++        return; /* we cannot ever reach here. */
++      case 'u': {
++        codepoint = 0;
++        if (!json_hexadecimal_value(&src[offset], 4, &codepoint)) {
++          return; /* this shouldn't happen as the value was already validated.
++                   */
++        }
++
++        offset += 4;
++
++        if (codepoint <= 0x7fu) {
++          data[bytes_written++] = (char)codepoint; /* 0xxxxxxx. */
++        } else if (codepoint <= 0x7ffu) {
++          data[bytes_written++] =
++              (char)(0xc0u | (codepoint >> 6)); /* 110xxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | (codepoint & 0x3fu)); /* 10xxxxxx. */
++        } else if (codepoint >= 0xd800 &&
++                   codepoint <= 0xdbff) { /* high surrogate. */
++          high_surrogate = codepoint;
++          continue; /* we need the low half to form a complete codepoint. */
++        } else if (codepoint >= 0xdc00 &&
++                   codepoint <= 0xdfff) { /* low surrogate. */
++          /* combine with the previously read half to obtain the complete
++           * codepoint. */
++          const unsigned long surrogate_offset =
++              0x10000u - (0xD800u << 10) - 0xDC00u;
++          codepoint = (high_surrogate << 10) + codepoint + surrogate_offset;
++          high_surrogate = 0;
++          data[bytes_written++] =
++              (char)(0xF0u | (codepoint >> 18)); /* 11110xxx. */
++          data[bytes_written++] =
++              (char)(0x80u | ((codepoint >> 12) & 0x3fu)); /* 10xxxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | ((codepoint >> 6) & 0x3fu)); /* 10xxxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | (codepoint & 0x3fu)); /* 10xxxxxx. */
++        } else {
++          /* we assume the value was validated and thus is within the valid
++           * range. */
++          data[bytes_written++] =
++              (char)(0xe0u | (codepoint >> 12)); /* 1110xxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | ((codepoint >> 6) & 0x3fu)); /* 10xxxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | (codepoint & 0x3fu)); /* 10xxxxxx. */
++        }
++      } break;
++      case '"':
++        data[bytes_written++] = '"';
++        break;
++      case '\\':
++        data[bytes_written++] = '\\';
++        break;
++      case '/':
++        data[bytes_written++] = '/';
++        break;
++      case 'b':
++        data[bytes_written++] = '\b';
++        break;
++      case 'f':
++        data[bytes_written++] = '\f';
++        break;
++      case 'n':
++        data[bytes_written++] = '\n';
++        break;
++      case 'r':
++        data[bytes_written++] = '\r';
++        break;
++      case 't':
++        data[bytes_written++] = '\t';
++        break;
++      case '\r':
++        data[bytes_written++] = '\r';
++
++        /* check if we have a "\r\n" sequence. */
++        if ('\n' == src[offset]) {
++          data[bytes_written++] = '\n';
++          offset++;
++        }
++
++        break;
++      case '\n':
++        data[bytes_written++] = '\n';
++        break;
++      }
++    } else {
++      /* copy the character. */
++      data[bytes_written++] = src[offset++];
++    }
++  }
++
++  /* skip trailing '"' or '\''. */
++  offset++;
++
++  /* record the size of the string. */
++  string->string_size = bytes_written;
++
++  /* add null terminator to string. */
++  data[bytes_written++] = '\0';
++
++  /* move data along. */
++  state->data += bytes_written;
++
++  /* update offset. */
++  state->offset = offset;
++}
++
++json_weak void json_parse_key(struct json_parse_state_s *state,
++                              struct json_string_s *string);
++void json_parse_key(struct json_parse_state_s *state,
++                    struct json_string_s *string) {
++  if (json_parse_flags_allow_unquoted_keys & state->flags_bitset) {
++    const char *const src = state->src;
++    char *const data = state->data;
++    size_t offset = state->offset;
++
++    /* if we are allowing unquoted keys, check for quoted anyway... */
++    if (('"' == src[offset]) || ('\'' == src[offset])) {
++      /* ... if we got a quote, just parse the key as a string as normal. */
++      json_parse_string(state, string);
++    } else {
++      size_t size = 0;
++
++      string->string = state->data;
++
++      while (is_valid_unquoted_key_char(src[offset])) {
++        data[size++] = src[offset++];
++      }
++
++      /* add null terminator to string. */
++      data[size] = '\0';
++
++      /* record the size of the string. */
++      string->string_size = size++;
++
++      /* move data along. */
++      state->data += size;
++
++      /* update offset. */
++      state->offset = offset;
++    }
++  } else {
++    /* we are only allowed to have quoted keys, so just parse a string! */
++    json_parse_string(state, string);
++  }
++}
++
++json_weak void json_parse_object(struct json_parse_state_s *state,
++                                 int is_global_object,
++                                 struct json_object_s *object);
++void json_parse_object(struct json_parse_state_s *state, int is_global_object,
++                       struct json_object_s *object) {
++  const size_t flags_bitset = state->flags_bitset;
++  const size_t size = state->size;
++  const char *const src = state->src;
++  size_t elements = 0;
++  int allow_comma = 0;
++  struct json_object_element_s *previous = json_null;
++
++  if (is_global_object) {
++    /* if we skipped some whitespace, and then found an opening '{' of an. */
++    /* object, we actually have a normal JSON object at the root of the DOM...
++     */
++    if ('{' == src[state->offset]) {
++      /* . and we don't actually have a global object after all! */
++      is_global_object = 0;
++    }
++  }
++
++  if (!is_global_object) {
++    /* skip leading '{'. */
++    state->offset++;
++  }
++
++  (void)json_skip_all_skippables(state);
++
++  /* reset elements. */
++  elements = 0;
++
++  while (state->offset < size) {
++    struct json_object_element_s *element = json_null;
++    struct json_string_s *string = json_null;
++    struct json_value_s *value = json_null;
++
++    if (!is_global_object) {
++      (void)json_skip_all_skippables(state);
++
++      if ('}' == src[state->offset]) {
++        /* skip trailing '}'. */
++        state->offset++;
++
++        /* finished the object! */
++        break;
++      }
++    } else {
++      if (json_skip_all_skippables(state)) {
++        /* global object ends when the file ends! */
++        break;
++      }
++    }
++
++    /* if we parsed at least one element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++        continue;
++      }
++    }
++
++    element = (struct json_object_element_s *)state->dom;
++
++    state->dom += sizeof(struct json_object_element_s);
++
++    if (json_null == previous) {
++      /* this is our first element, so record it in our object. */
++      object->start = element;
++    } else {
++      previous->next = element;
++    }
++
++    previous = element;
++
++    if (json_parse_flags_allow_location_information & flags_bitset) {
++      struct json_string_ex_s *string_ex =
++          (struct json_string_ex_s *)state->dom;
++      state->dom += sizeof(struct json_string_ex_s);
++
++      string_ex->offset = state->offset;
++      string_ex->line_no = state->line_no;
++      string_ex->row_no = state->offset - state->line_offset;
++
++      string = &(string_ex->string);
++    } else {
++      string = (struct json_string_s *)state->dom;
++      state->dom += sizeof(struct json_string_s);
++    }
++
++    element->name = string;
++
++    (void)json_parse_key(state, string);
++
++    (void)json_skip_all_skippables(state);
++
++    /* skip colon or equals. */
++    state->offset++;
++
++    (void)json_skip_all_skippables(state);
++
++    if (json_parse_flags_allow_location_information & flags_bitset) {
++      struct json_value_ex_s *value_ex = (struct json_value_ex_s *)state->dom;
++      state->dom += sizeof(struct json_value_ex_s);
++
++      value_ex->offset = state->offset;
++      value_ex->line_no = state->line_no;
++      value_ex->row_no = state->offset - state->line_offset;
++
++      value = &(value_ex->value);
++    } else {
++      value = (struct json_value_s *)state->dom;
++      state->dom += sizeof(struct json_value_s);
++    }
++
++    element->value = value;
++
++    json_parse_value(state, /* is_global_object = */ 0, value);
++
++    /* successfully parsed a name/value pair! */
++    elements++;
++    allow_comma = 1;
++  }
++
++  /* if we had at least one element, end the linked list. */
++  if (previous) {
++    previous->next = json_null;
++  }
++
++  if (0 == elements) {
++    object->start = json_null;
++  }
++
++  object->length = elements;
++}
++
++json_weak void json_parse_array(struct json_parse_state_s *state,
++                                struct json_array_s *array);
++void json_parse_array(struct json_parse_state_s *state,
++                      struct json_array_s *array) {
++  const char *const src = state->src;
++  const size_t size = state->size;
++  size_t elements = 0;
++  int allow_comma = 0;
++  struct json_array_element_s *previous = json_null;
++
++  /* skip leading '['. */
++  state->offset++;
++
++  (void)json_skip_all_skippables(state);
++
++  /* reset elements. */
++  elements = 0;
++
++  do {
++    struct json_array_element_s *element = json_null;
++    struct json_value_s *value = json_null;
++
++    (void)json_skip_all_skippables(state);
++
++    if (']' == src[state->offset]) {
++      /* skip trailing ']'. */
++      state->offset++;
++
++      /* finished the array! */
++      break;
++    }
++
++    /* if we parsed at least one element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++        continue;
++      }
++    }
++
++    element = (struct json_array_element_s *)state->dom;
++
++    state->dom += sizeof(struct json_array_element_s);
++
++    if (json_null == previous) {
++      /* this is our first element, so record it in our array. */
++      array->start = element;
++    } else {
++      previous->next = element;
++    }
++
++    previous = element;
++
++    if (json_parse_flags_allow_location_information & state->flags_bitset) {
++      struct json_value_ex_s *value_ex = (struct json_value_ex_s *)state->dom;
++      state->dom += sizeof(struct json_value_ex_s);
++
++      value_ex->offset = state->offset;
++      value_ex->line_no = state->line_no;
++      value_ex->row_no = state->offset - state->line_offset;
++
++      value = &(value_ex->value);
++    } else {
++      value = (struct json_value_s *)state->dom;
++      state->dom += sizeof(struct json_value_s);
++    }
++
++    element->value = value;
++
++    json_parse_value(state, /* is_global_object = */ 0, value);
++
++    /* successfully parsed an array element! */
++    elements++;
++    allow_comma = 1;
++  } while (state->offset < size);
++
++  /* end the linked list. */
++  if (previous) {
++    previous->next = json_null;
++  }
++
++  if (0 == elements) {
++    array->start = json_null;
++  }
++
++  array->length = elements;
++}
++
++json_weak void json_parse_number(struct json_parse_state_s *state,
++                                 struct json_number_s *number);
++void json_parse_number(struct json_parse_state_s *state,
++                       struct json_number_s *number) {
++  const size_t flags_bitset = state->flags_bitset;
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  size_t bytes_written = 0;
++  const char *const src = state->src;
++  char *data = state->data;
++
++  number->number = data;
++
++  if (json_parse_flags_allow_hexadecimal_numbers & flags_bitset) {
++    if (('0' == src[offset]) &&
++        (('x' == src[offset + 1]) || ('X' == src[offset + 1]))) {
++      /* consume hexadecimal digits. */
++      while ((offset < size) &&
++             (('0' <= src[offset] && src[offset] <= '9') ||
++              ('a' <= src[offset] && src[offset] <= 'f') ||
++              ('A' <= src[offset] && src[offset] <= 'F') ||
++              ('x' == src[offset]) || ('X' == src[offset]))) {
++        data[bytes_written++] = src[offset++];
++      }
++    }
++  }
++
++  while (offset < size) {
++    int end = 0;
++
++    switch (src[offset]) {
++    case '0':
++    case '1':
++    case '2':
++    case '3':
++    case '4':
++    case '5':
++    case '6':
++    case '7':
++    case '8':
++    case '9':
++    case '.':
++    case 'e':
++    case 'E':
++    case '+':
++    case '-':
++      data[bytes_written++] = src[offset++];
++      break;
++    default:
++      end = 1;
++      break;
++    }
++
++    if (0 != end) {
++      break;
++    }
++  }
++
++  if (json_parse_flags_allow_inf_and_nan & flags_bitset) {
++    const size_t inf_strlen = 8; /* = strlen("Infinity");. */
++    const size_t nan_strlen = 3; /* = strlen("NaN");. */
++
++    if (offset + inf_strlen < size) {
++      if ('I' == src[offset]) {
++        size_t i;
++        /* We found our special 'Infinity' keyword! */
++        for (i = 0; i < inf_strlen; i++) {
++          data[bytes_written++] = src[offset++];
++        }
++      }
++    }
++
++    if (offset + nan_strlen < size) {
++      if ('N' == src[offset]) {
++        size_t i;
++        /* We found our special 'NaN' keyword! */
++        for (i = 0; i < nan_strlen; i++) {
++          data[bytes_written++] = src[offset++];
++        }
++      }
++    }
++  }
++
++  /* record the size of the number. */
++  number->number_size = bytes_written;
++  /* add null terminator to number string. */
++  data[bytes_written++] = '\0';
++  /* move data along. */
++  state->data += bytes_written;
++  /* update offset. */
++  state->offset = offset;
++}
++
++json_weak void json_parse_value(struct json_parse_state_s *state,
++                                int is_global_object,
++                                struct json_value_s *value);
++void json_parse_value(struct json_parse_state_s *state, int is_global_object,
++                      struct json_value_s *value) {
++  const size_t flags_bitset = state->flags_bitset;
++  const char *const src = state->src;
++  const size_t size = state->size;
++  size_t offset;
++
++  (void)json_skip_all_skippables(state);
++
++  /* cache offset now. */
++  offset = state->offset;
++
++  if (is_global_object) {
++    value->type = json_type_object;
++    value->payload = state->dom;
++    state->dom += sizeof(struct json_object_s);
++    json_parse_object(state, /* is_global_object = */ 1,
++                      (struct json_object_s *)value->payload);
++  } else {
++    switch (src[offset]) {
++    case '"':
++    case '\'':
++      value->type = json_type_string;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_string_s);
++      json_parse_string(state, (struct json_string_s *)value->payload);
++      break;
++    case '{':
++      value->type = json_type_object;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_object_s);
++      json_parse_object(state, /* is_global_object = */ 0,
++                        (struct json_object_s *)value->payload);
++      break;
++    case '[':
++      value->type = json_type_array;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_array_s);
++      json_parse_array(state, (struct json_array_s *)value->payload);
++      break;
++    case '-':
++    case '+':
++    case '0':
++    case '1':
++    case '2':
++    case '3':
++    case '4':
++    case '5':
++    case '6':
++    case '7':
++    case '8':
++    case '9':
++    case '.':
++      value->type = json_type_number;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_number_s);
++      json_parse_number(state, (struct json_number_s *)value->payload);
++      break;
++    default:
++      if ((offset + 4) <= size && 't' == src[offset + 0] &&
++          'r' == src[offset + 1] && 'u' == src[offset + 2] &&
++          'e' == src[offset + 3]) {
++        value->type = json_type_true;
++        value->payload = json_null;
++        state->offset += 4;
++      } else if ((offset + 5) <= size && 'f' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'l' == src[offset + 2] &&
++                 's' == src[offset + 3] && 'e' == src[offset + 4]) {
++        value->type = json_type_false;
++        value->payload = json_null;
++        state->offset += 5;
++      } else if ((offset + 4) <= size && 'n' == src[offset + 0] &&
++                 'u' == src[offset + 1] && 'l' == src[offset + 2] &&
++                 'l' == src[offset + 3]) {
++        value->type = json_type_null;
++        value->payload = json_null;
++        state->offset += 4;
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 3) <= size && 'N' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'N' == src[offset + 2]) {
++        value->type = json_type_number;
++        value->payload = state->dom;
++        state->dom += sizeof(struct json_number_s);
++        json_parse_number(state, (struct json_number_s *)value->payload);
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 8) <= size && 'I' == src[offset + 0] &&
++                 'n' == src[offset + 1] && 'f' == src[offset + 2] &&
++                 'i' == src[offset + 3] && 'n' == src[offset + 4] &&
++                 'i' == src[offset + 5] && 't' == src[offset + 6] &&
++                 'y' == src[offset + 7]) {
++        value->type = json_type_number;
++        value->payload = state->dom;
++        state->dom += sizeof(struct json_number_s);
++        json_parse_number(state, (struct json_number_s *)value->payload);
++      }
++      break;
++    }
++  }
++}
++
++struct json_value_s *
++json_parse_ex(const void *src, size_t src_size, size_t flags_bitset,
++              void *(*alloc_func_ptr)(void *user_data, size_t size),
++              void *user_data, struct json_parse_result_s *result) {
++  struct json_parse_state_s state;
++  void *allocation;
++  struct json_value_s *value;
++  size_t total_size;
++  int input_error;
++
++  if (result) {
++    result->error = json_parse_error_none;
++    result->error_offset = 0;
++    result->error_line_no = 0;
++    result->error_row_no = 0;
++  }
++
++  if (json_null == src) {
++    /* invalid src pointer was null! */
++    return json_null;
++  }
++
++  state.src = (const char *)src;
++  state.size = src_size;
++  state.offset = 0;
++  state.line_no = 1;
++  state.line_offset = 0;
++  state.error = json_parse_error_none;
++  state.dom_size = 0;
++  state.data_size = 0;
++  state.flags_bitset = flags_bitset;
++
++  input_error = json_get_value_size(
++      &state, (int)(json_parse_flags_allow_global_object & state.flags_bitset));
++
++  if (0 == input_error) {
++    json_skip_all_skippables(&state);
++
++    if (state.offset != state.size) {
++      /* our parsing didn't have an error, but there are characters remaining in
++       * the input that weren't part of the JSON! */
++
++      state.error = json_parse_error_unexpected_trailing_characters;
++      input_error = 1;
++    }
++  }
++
++  if (input_error) {
++    /* parsing value's size failed (most likely an invalid JSON DOM!). */
++    if (result) {
++      result->error = state.error;
++      result->error_offset = state.offset;
++      result->error_line_no = state.line_no;
++      result->error_row_no = state.offset - state.line_offset;
++    }
++    return json_null;
++  }
++
++  /* our total allocation is the combination of the dom and data sizes (we. */
++  /* first encode the structure of the JSON, and then the data referenced by. */
++  /* the JSON values). */
++  total_size = state.dom_size + state.data_size;
++
++  if (json_null == alloc_func_ptr) {
++    allocation = malloc(total_size);
++  } else {
++    allocation = alloc_func_ptr(user_data, total_size);
++  }
++
++  if (json_null == allocation) {
++    /* malloc failed! */
++    if (result) {
++      result->error = json_parse_error_allocator_failed;
++      result->error_offset = 0;
++      result->error_line_no = 0;
++      result->error_row_no = 0;
++    }
++
++    return json_null;
++  }
++
++  /* reset offset so we can reuse it. */
++  state.offset = 0;
++
++  /* reset the line information so we can reuse it. */
++  state.line_no = 1;
++  state.line_offset = 0;
++
++  state.dom = (char *)allocation;
++  state.data = state.dom + state.dom_size;
++
++  if (json_parse_flags_allow_location_information & state.flags_bitset) {
++    struct json_value_ex_s *value_ex = (struct json_value_ex_s *)state.dom;
++    state.dom += sizeof(struct json_value_ex_s);
++
++    value_ex->offset = state.offset;
++    value_ex->line_no = state.line_no;
++    value_ex->row_no = state.offset - state.line_offset;
++
++    value = &(value_ex->value);
++  } else {
++    value = (struct json_value_s *)state.dom;
++    state.dom += sizeof(struct json_value_s);
++  }
++
++  json_parse_value(
++      &state, (int)(json_parse_flags_allow_global_object & state.flags_bitset),
++      value);
++
++  return (struct json_value_s *)allocation;
++}
++
++struct json_value_s *json_parse(const void *src, size_t src_size) {
++  return json_parse_ex(src, src_size, json_parse_flags_default, json_null,
++                       json_null, json_null);
++}
++
++struct json_extract_result_s {
++  size_t dom_size;
++  size_t data_size;
++};
++
++struct json_value_s *json_extract_value(const struct json_value_s *value) {
++  return json_extract_value_ex(value, json_null, json_null);
++}
++
++json_weak struct json_extract_result_s
++json_extract_get_number_size(const struct json_number_s *const number);
++json_weak struct json_extract_result_s
++json_extract_get_string_size(const struct json_string_s *const string);
++json_weak struct json_extract_result_s
++json_extract_get_object_size(const struct json_object_s *const object);
++json_weak struct json_extract_result_s
++json_extract_get_array_size(const struct json_array_s *const array);
++json_weak struct json_extract_result_s
++json_extract_get_value_size(const struct json_value_s *const value);
++
++struct json_extract_result_s
++json_extract_get_number_size(const struct json_number_s *const number) {
++  struct json_extract_result_s result;
++  result.dom_size = sizeof(struct json_number_s);
++  result.data_size = number->number_size;
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_string_size(const struct json_string_s *const string) {
++  struct json_extract_result_s result;
++  result.dom_size = sizeof(struct json_string_s);
++  result.data_size = string->string_size + 1;
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_object_size(const struct json_object_s *const object) {
++  struct json_extract_result_s result;
++  size_t i;
++  const struct json_object_element_s *element = object->start;
++
++  result.dom_size = sizeof(struct json_object_s) +
++                    (sizeof(struct json_object_element_s) * object->length);
++  result.data_size = 0;
++
++  for (i = 0; i < object->length; i++) {
++    const struct json_extract_result_s string_result =
++        json_extract_get_string_size(element->name);
++    const struct json_extract_result_s value_result =
++        json_extract_get_value_size(element->value);
++
++    result.dom_size += string_result.dom_size;
++    result.data_size += string_result.data_size;
++
++    result.dom_size += value_result.dom_size;
++    result.data_size += value_result.data_size;
++
++    element = element->next;
++  }
++
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_array_size(const struct json_array_s *const array) {
++  struct json_extract_result_s result;
++  size_t i;
++  const struct json_array_element_s *element = array->start;
++
++  result.dom_size = sizeof(struct json_array_s) +
++                    (sizeof(struct json_array_element_s) * array->length);
++  result.data_size = 0;
++
++  for (i = 0; i < array->length; i++) {
++    const struct json_extract_result_s value_result =
++        json_extract_get_value_size(element->value);
++
++    result.dom_size += value_result.dom_size;
++    result.data_size += value_result.data_size;
++
++    element = element->next;
++  }
++
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_value_size(const struct json_value_s *const value) {
++  struct json_extract_result_s result = {0, 0};
++
++  switch (value->type) {
++  default:
++    break;
++  case json_type_object:
++    result = json_extract_get_object_size(
++        (const struct json_object_s *)value->payload);
++    break;
++  case json_type_array:
++    result = json_extract_get_array_size(
++        (const struct json_array_s *)value->payload);
++    break;
++  case json_type_number:
++    result = json_extract_get_number_size(
++        (const struct json_number_s *)value->payload);
++    break;
++  case json_type_string:
++    result = json_extract_get_string_size(
++        (const struct json_string_s *)value->payload);
++    break;
++  }
++
++  result.dom_size += sizeof(struct json_value_s);
++
++  return result;
++}
++
++struct json_extract_state_s {
++  char *dom;
++  char *data;
++};
++
++json_weak void json_extract_copy_value(struct json_extract_state_s *const state,
++                                       const struct json_value_s *const value);
++void json_extract_copy_value(struct json_extract_state_s *const state,
++                             const struct json_value_s *const value) {
++  struct json_string_s *string;
++  struct json_number_s *number;
++  struct json_object_s *object;
++  struct json_array_s *array;
++  struct json_value_s *new_value;
++
++  memcpy(state->dom, value, sizeof(struct json_value_s));
++  new_value = (struct json_value_s *)state->dom;
++  state->dom += sizeof(struct json_value_s);
++  new_value->payload = state->dom;
++
++  if (json_type_string == value->type) {
++    memcpy(state->dom, value->payload, sizeof(struct json_string_s));
++    string = (struct json_string_s *)state->dom;
++    state->dom += sizeof(struct json_string_s);
++
++    memcpy(state->data, string->string, string->string_size + 1);
++    string->string = state->data;
++    state->data += string->string_size + 1;
++  } else if (json_type_number == value->type) {
++    memcpy(state->dom, value->payload, sizeof(struct json_number_s));
++    number = (struct json_number_s *)state->dom;
++    state->dom += sizeof(struct json_number_s);
++
++    memcpy(state->data, number->number, number->number_size);
++    number->number = state->data;
++    state->data += number->number_size;
++  } else if (json_type_object == value->type) {
++    struct json_object_element_s *element;
++    size_t i;
++
++    memcpy(state->dom, value->payload, sizeof(struct json_object_s));
++    object = (struct json_object_s *)state->dom;
++    state->dom += sizeof(struct json_object_s);
++
++    element = object->start;
++    object->start = (struct json_object_element_s *)state->dom;
++
++    for (i = 0; i < object->length; i++) {
++      struct json_value_s *previous_value;
++      struct json_object_element_s *previous_element;
++
++      memcpy(state->dom, element, sizeof(struct json_object_element_s));
++      element = (struct json_object_element_s *)state->dom;
++      state->dom += sizeof(struct json_object_element_s);
++
++      string = element->name;
++      memcpy(state->dom, string, sizeof(struct json_string_s));
++      string = (struct json_string_s *)state->dom;
++      state->dom += sizeof(struct json_string_s);
++      element->name = string;
++
++      memcpy(state->data, string->string, string->string_size + 1);
++      string->string = state->data;
++      state->data += string->string_size + 1;
++
++      previous_value = element->value;
++      element->value = (struct json_value_s *)state->dom;
++      json_extract_copy_value(state, previous_value);
++
++      previous_element = element;
++      element = element->next;
++
++      if (element) {
++        previous_element->next = (struct json_object_element_s *)state->dom;
++      }
++    }
++  } else if (json_type_array == value->type) {
++    struct json_array_element_s *element;
++    size_t i;
++
++    memcpy(state->dom, value->payload, sizeof(struct json_array_s));
++    array = (struct json_array_s *)state->dom;
++    state->dom += sizeof(struct json_array_s);
++
++    element = array->start;
++    array->start = (struct json_array_element_s *)state->dom;
++
++    for (i = 0; i < array->length; i++) {
++      struct json_value_s *previous_value;
++      struct json_array_element_s *previous_element;
++
++      memcpy(state->dom, element, sizeof(struct json_array_element_s));
++      element = (struct json_array_element_s *)state->dom;
++      state->dom += sizeof(struct json_array_element_s);
++
++      previous_value = element->value;
++      element->value = (struct json_value_s *)state->dom;
++      json_extract_copy_value(state, previous_value);
++
++      previous_element = element;
++      element = element->next;
++
++      if (element) {
++        previous_element->next = (struct json_array_element_s *)state->dom;
++      }
++    }
++  }
++}
++
++struct json_value_s *json_extract_value_ex(const struct json_value_s *value,
++                                           void *(*alloc_func_ptr)(void *,
++                                                                   size_t),
++                                           void *user_data) {
++  void *allocation;
++  struct json_extract_result_s result;
++  struct json_extract_state_s state;
++  size_t total_size;
++
++  if (json_null == value) {
++    /* invalid value was null! */
++    return json_null;
++  }
++
++  result = json_extract_get_value_size(value);
++  total_size = result.dom_size + result.data_size;
++
++  if (json_null == alloc_func_ptr) {
++    allocation = malloc(total_size);
++  } else {
++    allocation = alloc_func_ptr(user_data, total_size);
++  }
++
++  state.dom = (char *)allocation;
++  state.data = state.dom + result.dom_size;
++
++  json_extract_copy_value(&state, value);
++
++  return (struct json_value_s *)allocation;
++}
++
++struct json_string_s *json_value_as_string(struct json_value_s *const value) {
++  if (value->type != json_type_string) {
++    return json_null;
++  }
++
++  return (struct json_string_s *)value->payload;
++}
++
++struct json_number_s *json_value_as_number(struct json_value_s *const value) {
++  if (value->type != json_type_number) {
++    return json_null;
++  }
++
++  return (struct json_number_s *)value->payload;
++}
++
++struct json_object_s *json_value_as_object(struct json_value_s *const value) {
++  if (value->type != json_type_object) {
++    return json_null;
++  }
++
++  return (struct json_object_s *)value->payload;
++}
++
++struct json_array_s *json_value_as_array(struct json_value_s *const value) {
++  if (value->type != json_type_array) {
++    return json_null;
++  }
++
++  return (struct json_array_s *)value->payload;
++}
++
++int json_value_is_true(const struct json_value_s *const value) {
++  return value->type == json_type_true;
++}
++
++int json_value_is_false(const struct json_value_s *const value) {
++  return value->type == json_type_false;
++}
++
++int json_value_is_null(const struct json_value_s *const value) {
++  return value->type == json_type_null;
++}
++
++json_weak int
++json_write_minified_get_value_size(const struct json_value_s *value,
++                                   size_t *size);
++
++json_weak int json_write_get_number_size(const struct json_number_s *number,
++                                         size_t *size);
++int json_write_get_number_size(const struct json_number_s *number,
++                               size_t *size) {
++  json_uintmax_t parsed_number;
++  size_t i;
++
++  if (number->number_size >= 2) {
++    switch (number->number[1]) {
++    default:
++      break;
++    case 'x':
++    case 'X':
++      /* the number is a json_parse_flags_allow_hexadecimal_numbers hexadecimal
++       * so we have to do extra work to convert it to a non-hexadecimal for JSON
++       * output. */
++      parsed_number = json_strtoumax(number->number, json_null, 0);
++
++      i = 0;
++
++      while (0 != parsed_number) {
++        parsed_number /= 10;
++        i++;
++      }
++
++      *size += i;
++      return 0;
++    }
++  }
++
++  /* check to see if the number has leading/trailing decimal point. */
++  i = 0;
++
++  /* skip any leading '+' or '-'. */
++  if ((i < number->number_size) &&
++      (('+' == number->number[i]) || ('-' == number->number[i]))) {
++    i++;
++  }
++
++  /* check if we have infinity. */
++  if ((i < number->number_size) && ('I' == number->number[i])) {
++    const char *inf = "Infinity";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *inf++;
++
++      /* Check if we found the Infinity string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *inf) {
++      /* Inf becomes 1.7976931348623158e308 because JSON can't support it. */
++      *size += 22;
++
++      /* if we had a leading '-' we need to record it in the JSON output. */
++      if ('-' == number->number[0]) {
++        *size += 1;
++      }
++    }
++
++    return 0;
++  }
++
++  /* check if we have nan. */
++  if ((i < number->number_size) && ('N' == number->number[i])) {
++    const char *nan = "NaN";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *nan++;
++
++      /* Check if we found the NaN string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *nan) {
++      /* NaN becomes 1 because JSON can't support it. */
++      *size += 1;
++
++      return 0;
++    }
++  }
++
++  /* if we had a leading decimal point. */
++  if ((i < number->number_size) && ('.' == number->number[i])) {
++    /* 1 + because we had a leading decimal point. */
++    *size += 1;
++    goto cleanup;
++  }
++
++  for (; i < number->number_size; i++) {
++    const char c = number->number[i];
++    if (!('0' <= c && c <= '9')) {
++      break;
++    }
++  }
++
++  /* if we had a trailing decimal point. */
++  if ((i + 1 == number->number_size) && ('.' == number->number[i])) {
++    /* 1 + because we had a trailing decimal point. */
++    *size += 1;
++    goto cleanup;
++  }
++
++cleanup:
++  *size += number->number_size; /* the actual string of the number. */
++
++  /* if we had a leading '+' we don't record it in the JSON output. */
++  if ('+' == number->number[0]) {
++    *size -= 1;
++  }
++
++  return 0;
++}
++
++json_weak int json_write_get_string_size(const struct json_string_s *string,
++                                         size_t *size);
++int json_write_get_string_size(const struct json_string_s *string,
++                               size_t *size) {
++  size_t i;
++  for (i = 0; i < string->string_size; i++) {
++    switch (string->string[i]) {
++    case '"':
++    case '\\':
++    case '\b':
++    case '\f':
++    case '\n':
++    case '\r':
++    case '\t':
++      *size += 2;
++      break;
++    default:
++      *size += 1;
++      break;
++    }
++  }
++
++  *size += 2; /* need to encode the surrounding '"' characters. */
++
++  return 0;
++}
++
++json_weak int
++json_write_minified_get_array_size(const struct json_array_s *array,
++                                   size_t *size);
++int json_write_minified_get_array_size(const struct json_array_s *array,
++                                       size_t *size) {
++  struct json_array_element_s *element;
++
++  *size += 2; /* '[' and ']'. */
++
++  if (1 < array->length) {
++    *size += array->length - 1; /* ','s seperate each element. */
++  }
++
++  for (element = array->start; json_null != element; element = element->next) {
++    if (json_write_minified_get_value_size(element->value, size)) {
++      /* value was malformed! */
++      return 1;
++    }
++  }
++
++  return 0;
++}
++
++json_weak int
++json_write_minified_get_object_size(const struct json_object_s *object,
++                                    size_t *size);
++int json_write_minified_get_object_size(const struct json_object_s *object,
++                                        size_t *size) {
++  struct json_object_element_s *element;
++
++  *size += 2; /* '{' and '}'. */
++
++  *size += object->length; /* ':'s seperate each name/value pair. */
++
++  if (1 < object->length) {
++    *size += object->length - 1; /* ','s seperate each element. */
++  }
++
++  for (element = object->start; json_null != element; element = element->next) {
++    if (json_write_get_string_size(element->name, size)) {
++      /* string was malformed! */
++      return 1;
++    }
++
++    if (json_write_minified_get_value_size(element->value, size)) {
++      /* value was malformed! */
++      return 1;
++    }
++  }
++
++  return 0;
++}
++
++json_weak int
++json_write_minified_get_value_size(const struct json_value_s *value,
++                                   size_t *size);
++int json_write_minified_get_value_size(const struct json_value_s *value,
++                                       size_t *size) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return 1;
++  case json_type_number:
++    return json_write_get_number_size((struct json_number_s *)value->payload,
++                                      size);
++  case json_type_string:
++    return json_write_get_string_size((struct json_string_s *)value->payload,
++                                      size);
++  case json_type_array:
++    return json_write_minified_get_array_size(
++        (struct json_array_s *)value->payload, size);
++  case json_type_object:
++    return json_write_minified_get_object_size(
++        (struct json_object_s *)value->payload, size);
++  case json_type_true:
++    *size += 4; /* the string "true". */
++    return 0;
++  case json_type_false:
++    *size += 5; /* the string "false". */
++    return 0;
++  case json_type_null:
++    *size += 4; /* the string "null". */
++    return 0;
++  }
++}
++
++json_weak char *json_write_minified_value(const struct json_value_s *value,
++                                          char *data);
++
++json_weak char *json_write_number(const struct json_number_s *number,
++                                  char *data);
++char *json_write_number(const struct json_number_s *number, char *data) {
++  json_uintmax_t parsed_number, backup;
++  size_t i;
++
++  if (number->number_size >= 2) {
++    switch (number->number[1]) {
++    default:
++      break;
++    case 'x':
++    case 'X':
++      /* The number is a json_parse_flags_allow_hexadecimal_numbers hexadecimal
++       * so we have to do extra work to convert it to a non-hexadecimal for JSON
++       * output. */
++      parsed_number = json_strtoumax(number->number, json_null, 0);
++
++      /* We need a copy of parsed number twice, so take a backup of it. */
++      backup = parsed_number;
++
++      i = 0;
++
++      while (0 != parsed_number) {
++        parsed_number /= 10;
++        i++;
++      }
++
++      /* Restore parsed_number to its original value stored in the backup. */
++      parsed_number = backup;
++
++      /* Now use backup to take a copy of i, or the length of the string. */
++      backup = i;
++
++      do {
++        *(data + i - 1) = '0' + (char)(parsed_number % 10);
++        parsed_number /= 10;
++        i--;
++      } while (0 != parsed_number);
++
++      data += backup;
++
++      return data;
++    }
++  }
++
++  /* check to see if the number has leading/trailing decimal point. */
++  i = 0;
++
++  /* skip any leading '-'. */
++  if ((i < number->number_size) &&
++      (('+' == number->number[i]) || ('-' == number->number[i]))) {
++    i++;
++  }
++
++  /* check if we have infinity. */
++  if ((i < number->number_size) && ('I' == number->number[i])) {
++    const char *inf = "Infinity";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *inf++;
++
++      /* Check if we found the Infinity string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *inf++) {
++      const char *dbl_max;
++
++      /* if we had a leading '-' we need to record it in the JSON output. */
++      if ('-' == number->number[0]) {
++        *data++ = '-';
++      }
++
++      /* Inf becomes 1.7976931348623158e308 because JSON can't support it. */
++      for (dbl_max = "1.7976931348623158e308"; '\0' != *dbl_max; dbl_max++) {
++        *data++ = *dbl_max;
++      }
++
++      return data;
++    }
++  }
++
++  /* check if we have nan. */
++  if ((i < number->number_size) && ('N' == number->number[i])) {
++    const char *nan = "NaN";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *nan++;
++
++      /* Check if we found the NaN string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *nan++) {
++      /* NaN becomes 0 because JSON can't support it. */
++      *data++ = '0';
++      return data;
++    }
++  }
++
++  /* if we had a leading decimal point. */
++  if ((i < number->number_size) && ('.' == number->number[i])) {
++    i = 0;
++
++    /* skip any leading '+'. */
++    if ('+' == number->number[i]) {
++      i++;
++    }
++
++    /* output the leading '-' if we had one. */
++    if ('-' == number->number[i]) {
++      *data++ = '-';
++      i++;
++    }
++
++    /* insert a '0' to fix the leading decimal point for JSON output. */
++    *data++ = '0';
++
++    /* and output the rest of the number as normal. */
++    for (; i < number->number_size; i++) {
++      *data++ = number->number[i];
++    }
++
++    return data;
++  }
++
++  for (; i < number->number_size; i++) {
++    const char c = number->number[i];
++    if (!('0' <= c && c <= '9')) {
++      break;
++    }
++  }
++
++  /* if we had a trailing decimal point. */
++  if ((i + 1 == number->number_size) && ('.' == number->number[i])) {
++    i = 0;
++
++    /* skip any leading '+'. */
++    if ('+' == number->number[i]) {
++      i++;
++    }
++
++    /* output the leading '-' if we had one. */
++    if ('-' == number->number[i]) {
++      *data++ = '-';
++      i++;
++    }
++
++    /* and output the rest of the number as normal. */
++    for (; i < number->number_size; i++) {
++      *data++ = number->number[i];
++    }
++
++    /* insert a '0' to fix the trailing decimal point for JSON output. */
++    *data++ = '0';
++
++    return data;
++  }
++
++  i = 0;
++
++  /* skip any leading '+'. */
++  if ('+' == number->number[i]) {
++    i++;
++  }
++
++  for (; i < number->number_size; i++) {
++    *data++ = number->number[i];
++  }
++
++  return data;
++}
++
++json_weak char *json_write_string(const struct json_string_s *string,
++                                  char *data);
++char *json_write_string(const struct json_string_s *string, char *data) {
++  size_t i;
++
++  *data++ = '"'; /* open the string. */
++
++  for (i = 0; i < string->string_size; i++) {
++    switch (string->string[i]) {
++    case '"':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = '"';
++      break;
++    case '\\':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = '\\';
++      break;
++    case '\b':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'b';
++      break;
++    case '\f':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'f';
++      break;
++    case '\n':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'n';
++      break;
++    case '\r':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'r';
++      break;
++    case '\t':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 't';
++      break;
++    default:
++      *data++ = string->string[i];
++      break;
++    }
++  }
++
++  *data++ = '"'; /* close the string. */
++
++  return data;
++}
++
++json_weak char *json_write_minified_array(const struct json_array_s *array,
++                                          char *data);
++char *json_write_minified_array(const struct json_array_s *array, char *data) {
++  struct json_array_element_s *element = json_null;
++
++  *data++ = '['; /* open the array. */
++
++  for (element = array->start; json_null != element; element = element->next) {
++    if (element != array->start) {
++      *data++ = ','; /* ','s seperate each element. */
++    }
++
++    data = json_write_minified_value(element->value, data);
++
++    if (json_null == data) {
++      /* value was malformed! */
++      return json_null;
++    }
++  }
++
++  *data++ = ']'; /* close the array. */
++
++  return data;
++}
++
++json_weak char *json_write_minified_object(const struct json_object_s *object,
++                                           char *data);
++char *json_write_minified_object(const struct json_object_s *object,
++                                 char *data) {
++  struct json_object_element_s *element = json_null;
++
++  *data++ = '{'; /* open the object. */
++
++  for (element = object->start; json_null != element; element = element->next) {
++    if (element != object->start) {
++      *data++ = ','; /* ','s seperate each element. */
++    }
++
++    data = json_write_string(element->name, data);
++
++    if (json_null == data) {
++      /* string was malformed! */
++      return json_null;
++    }
++
++    *data++ = ':'; /* ':'s seperate each name/value pair. */
++
++    data = json_write_minified_value(element->value, data);
++
++    if (json_null == data) {
++      /* value was malformed! */
++      return json_null;
++    }
++  }
++
++  *data++ = '}'; /* close the object. */
++
++  return data;
++}
++
++json_weak char *json_write_minified_value(const struct json_value_s *value,
++                                          char *data);
++char *json_write_minified_value(const struct json_value_s *value, char *data) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return json_null;
++  case json_type_number:
++    return json_write_number((struct json_number_s *)value->payload, data);
++  case json_type_string:
++    return json_write_string((struct json_string_s *)value->payload, data);
++  case json_type_array:
++    return json_write_minified_array((struct json_array_s *)value->payload,
++                                     data);
++  case json_type_object:
++    return json_write_minified_object((struct json_object_s *)value->payload,
++                                      data);
++  case json_type_true:
++    data[0] = 't';
++    data[1] = 'r';
++    data[2] = 'u';
++    data[3] = 'e';
++    return data + 4;
++  case json_type_false:
++    data[0] = 'f';
++    data[1] = 'a';
++    data[2] = 'l';
++    data[3] = 's';
++    data[4] = 'e';
++    return data + 5;
++  case json_type_null:
++    data[0] = 'n';
++    data[1] = 'u';
++    data[2] = 'l';
++    data[3] = 'l';
++    return data + 4;
++  }
++}
++
++void *json_write_minified(const struct json_value_s *value, size_t *out_size) {
++  size_t size = 0;
++  char *data = json_null;
++  char *data_end = json_null;
++
++  if (json_null == value) {
++    return json_null;
++  }
++
++  if (json_write_minified_get_value_size(value, &size)) {
++    /* value was malformed! */
++    return json_null;
++  }
++
++  size += 1; /* for the '\0' null terminating character. */
++
++  data = (char *)malloc(size);
++
++  if (json_null == data) {
++    /* malloc failed! */
++    return json_null;
++  }
++
++  data_end = json_write_minified_value(value, data);
++
++  if (json_null == data_end) {
++    /* bad chi occurred! */
++    free(data);
++    return json_null;
++  }
++
++  /* null terminated the string. */
++  *data_end = '\0';
++
++  if (json_null != out_size) {
++    *out_size = size;
++  }
++
++  return data;
++}
++
++json_weak int json_write_pretty_get_value_size(const struct json_value_s *value,
++                                               size_t depth, size_t indent_size,
++                                               size_t newline_size,
++                                               size_t *size);
++
++json_weak int json_write_pretty_get_array_size(const struct json_array_s *array,
++                                               size_t depth, size_t indent_size,
++                                               size_t newline_size,
++                                               size_t *size);
++int json_write_pretty_get_array_size(const struct json_array_s *array,
++                                     size_t depth, size_t indent_size,
++                                     size_t newline_size, size_t *size) {
++  struct json_array_element_s *element;
++
++  *size += 1; /* '['. */
++
++  if (0 < array->length) {
++    /* if we have any elements we need to add a newline after our '['. */
++    *size += newline_size;
++
++    *size += array->length - 1; /* ','s seperate each element. */
++
++    for (element = array->start; json_null != element;
++         element = element->next) {
++      /* each element gets an indent. */
++      *size += (depth + 1) * indent_size;
++
++      if (json_write_pretty_get_value_size(element->value, depth + 1,
++                                           indent_size, newline_size, size)) {
++        /* value was malformed! */
++        return 1;
++      }
++
++      /* each element gets a newline too. */
++      *size += newline_size;
++    }
++
++    /* since we wrote out some elements, need to add a newline and indentation.
++     */
++    /* to the trailing ']'. */
++    *size += depth * indent_size;
++  }
++
++  *size += 1; /* ']'. */
++
++  return 0;
++}
++
++json_weak int
++json_write_pretty_get_object_size(const struct json_object_s *object,
++                                  size_t depth, size_t indent_size,
++                                  size_t newline_size, size_t *size);
++int json_write_pretty_get_object_size(const struct json_object_s *object,
++                                      size_t depth, size_t indent_size,
++                                      size_t newline_size, size_t *size) {
++  struct json_object_element_s *element;
++
++  *size += 1; /* '{'. */
++
++  if (0 < object->length) {
++    *size += newline_size; /* need a newline next. */
++
++    *size += object->length - 1; /* ','s seperate each element. */
++
++    for (element = object->start; json_null != element;
++         element = element->next) {
++      /* each element gets an indent and newline. */
++      *size += (depth + 1) * indent_size;
++      *size += newline_size;
++
++      if (json_write_get_string_size(element->name, size)) {
++        /* string was malformed! */
++        return 1;
++      }
++
++      *size += 3; /* seperate each name/value pair with " : ". */
++
++      if (json_write_pretty_get_value_size(element->value, depth + 1,
++                                           indent_size, newline_size, size)) {
++        /* value was malformed! */
++        return 1;
++      }
++    }
++
++    *size += depth * indent_size;
++  }
++
++  *size += 1; /* '}'. */
++
++  return 0;
++}
++
++json_weak int json_write_pretty_get_value_size(const struct json_value_s *value,
++                                               size_t depth, size_t indent_size,
++                                               size_t newline_size,
++                                               size_t *size);
++int json_write_pretty_get_value_size(const struct json_value_s *value,
++                                     size_t depth, size_t indent_size,
++                                     size_t newline_size, size_t *size) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return 1;
++  case json_type_number:
++    return json_write_get_number_size((struct json_number_s *)value->payload,
++                                      size);
++  case json_type_string:
++    return json_write_get_string_size((struct json_string_s *)value->payload,
++                                      size);
++  case json_type_array:
++    return json_write_pretty_get_array_size(
++        (struct json_array_s *)value->payload, depth, indent_size, newline_size,
++        size);
++  case json_type_object:
++    return json_write_pretty_get_object_size(
++        (struct json_object_s *)value->payload, depth, indent_size,
++        newline_size, size);
++  case json_type_true:
++    *size += 4; /* the string "true". */
++    return 0;
++  case json_type_false:
++    *size += 5; /* the string "false". */
++    return 0;
++  case json_type_null:
++    *size += 4; /* the string "null". */
++    return 0;
++  }
++}
++
++json_weak char *json_write_pretty_value(const struct json_value_s *value,
++                                        size_t depth, const char *indent,
++                                        const char *newline, char *data);
++
++json_weak char *json_write_pretty_array(const struct json_array_s *array,
++                                        size_t depth, const char *indent,
++                                        const char *newline, char *data);
++char *json_write_pretty_array(const struct json_array_s *array, size_t depth,
++                              const char *indent, const char *newline,
++                              char *data) {
++  size_t k, m;
++  struct json_array_element_s *element;
++
++  *data++ = '['; /* open the array. */
++
++  if (0 < array->length) {
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (element = array->start; json_null != element;
++         element = element->next) {
++      if (element != array->start) {
++        *data++ = ','; /* ','s seperate each element. */
++
++        for (k = 0; '\0' != newline[k]; k++) {
++          *data++ = newline[k];
++        }
++      }
++
++      for (k = 0; k < depth + 1; k++) {
++        for (m = 0; '\0' != indent[m]; m++) {
++          *data++ = indent[m];
++        }
++      }
++
++      data = json_write_pretty_value(element->value, depth + 1, indent, newline,
++                                     data);
++
++      if (json_null == data) {
++        /* value was malformed! */
++        return json_null;
++      }
++    }
++
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (k = 0; k < depth; k++) {
++      for (m = 0; '\0' != indent[m]; m++) {
++        *data++ = indent[m];
++      }
++    }
++  }
++
++  *data++ = ']'; /* close the array. */
++
++  return data;
++}
++
++json_weak char *json_write_pretty_object(const struct json_object_s *object,
++                                         size_t depth, const char *indent,
++                                         const char *newline, char *data);
++char *json_write_pretty_object(const struct json_object_s *object, size_t depth,
++                               const char *indent, const char *newline,
++                               char *data) {
++  size_t k, m;
++  struct json_object_element_s *element;
++
++  *data++ = '{'; /* open the object. */
++
++  if (0 < object->length) {
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (element = object->start; json_null != element;
++         element = element->next) {
++      if (element != object->start) {
++        *data++ = ','; /* ','s seperate each element. */
++
++        for (k = 0; '\0' != newline[k]; k++) {
++          *data++ = newline[k];
++        }
++      }
++
++      for (k = 0; k < depth + 1; k++) {
++        for (m = 0; '\0' != indent[m]; m++) {
++          *data++ = indent[m];
++        }
++      }
++
++      data = json_write_string(element->name, data);
++
++      if (json_null == data) {
++        /* string was malformed! */
++        return json_null;
++      }
++
++      /* " : "s seperate each name/value pair. */
++      *data++ = ' ';
++      *data++ = ':';
++      *data++ = ' ';
++
++      data = json_write_pretty_value(element->value, depth + 1, indent, newline,
++                                     data);
++
++      if (json_null == data) {
++        /* value was malformed! */
++        return json_null;
++      }
++    }
++
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (k = 0; k < depth; k++) {
++      for (m = 0; '\0' != indent[m]; m++) {
++        *data++ = indent[m];
++      }
++    }
++  }
++
++  *data++ = '}'; /* close the object. */
++
++  return data;
++}
++
++json_weak char *json_write_pretty_value(const struct json_value_s *value,
++                                        size_t depth, const char *indent,
++                                        const char *newline, char *data);
++char *json_write_pretty_value(const struct json_value_s *value, size_t depth,
++                              const char *indent, const char *newline,
++                              char *data) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return json_null;
++  case json_type_number:
++    return json_write_number((struct json_number_s *)value->payload, data);
++  case json_type_string:
++    return json_write_string((struct json_string_s *)value->payload, data);
++  case json_type_array:
++    return json_write_pretty_array((struct json_array_s *)value->payload, depth,
++                                   indent, newline, data);
++  case json_type_object:
++    return json_write_pretty_object((struct json_object_s *)value->payload,
++                                    depth, indent, newline, data);
++  case json_type_true:
++    data[0] = 't';
++    data[1] = 'r';
++    data[2] = 'u';
++    data[3] = 'e';
++    return data + 4;
++  case json_type_false:
++    data[0] = 'f';
++    data[1] = 'a';
++    data[2] = 'l';
++    data[3] = 's';
++    data[4] = 'e';
++    return data + 5;
++  case json_type_null:
++    data[0] = 'n';
++    data[1] = 'u';
++    data[2] = 'l';
++    data[3] = 'l';
++    return data + 4;
++  }
++}
++
++void *json_write_pretty(const struct json_value_s *value, const char *indent,
++                        const char *newline, size_t *out_size) {
++  size_t size = 0;
++  size_t indent_size = 0;
++  size_t newline_size = 0;
++  char *data = json_null;
++  char *data_end = json_null;
++
++  if (json_null == value) {
++    return json_null;
++  }
++
++  if (json_null == indent) {
++    indent = "  "; /* default to two spaces. */
++  }
++
++  if (json_null == newline) {
++    newline = "\n"; /* default to linux newlines. */
++  }
++
++  while ('\0' != indent[indent_size]) {
++    ++indent_size; /* skip non-null terminating characters. */
++  }
++
++  while ('\0' != newline[newline_size]) {
++    ++newline_size; /* skip non-null terminating characters. */
++  }
++
++  if (json_write_pretty_get_value_size(value, 0, indent_size, newline_size,
++                                       &size)) {
++    /* value was malformed! */
++    return json_null;
++  }
++
++  size += 1; /* for the '\0' null terminating character. */
++
++  data = (char *)malloc(size);
++
++  if (json_null == data) {
++    /* malloc failed! */
++    return json_null;
++  }
++
++  data_end = json_write_pretty_value(value, 0, indent, newline, data);
++
++  if (json_null == data_end) {
++    /* bad chi occurred! */
++    free(data);
++    return json_null;
++  }
++
++  /* null terminated the string. */
++  *data_end = '\0';
++
++  if (json_null != out_size) {
++    *out_size = size;
++  }
++
++  return data;
++}
++
++#if defined(__clang__)
++#pragma clang diagnostic pop
++#elif defined(_MSC_VER)
++#pragma warning(pop)
++#endif
++
++#endif /* SHEREDOM_JSON_H_INCLUDED. */
+diff --git a/src/swtpm_setup/swtpm_setup.c b/src/swtpm_setup/swtpm_setup.c
+index 96e8b9f..ade5e34 100644
+--- a/src/swtpm_setup/swtpm_setup.c
++++ b/src/swtpm_setup/swtpm_setup.c
+@@ -5,6 +5,7 @@
+  * Author: Stefan Berger, stefanb@linux.ibm.com
+  *
+  * Copyright (c) IBM Corporation, 2021
++ * Copyright (c) Monogon SE, 2024
+  */
+ 
+ #include "config.h"
+@@ -27,8 +28,7 @@
+ #include "glib/gstdio.h"
+ #include "glib/gprintf.h"
+ 
+-#include <glib-object.h>
+-#include <json-glib/json-glib.h>
++#include "json.h"
+ 
+ #include <libtpms/tpm_nvfilename.h>
+ 
+@@ -99,78 +99,112 @@ static int tpm_get_specs_and_attributes(struct swtpm *swtpm, gchar ***params)
+ {
+     int ret;
+     g_autofree gchar *json = NULL;
+-    JsonParser *jp = NULL;
+-    GError *error = NULL;
+-    JsonReader *jr = NULL;
+-    JsonNode *root;
+-    static const struct parse_rule {
+-         const char *node1;
+-         const char *node2;
+-         gboolean is_int;
+-         const char *optname;
+-    } parser_rules[7] = {
+-         {"TPMSpecification", "family", FALSE, "--tpm-spec-family"},
+-         {"TPMSpecification", "level", TRUE, "--tpm-spec-level"},
+-         {"TPMSpecification", "revision", TRUE, "--tpm-spec-revision"},
+-         {"TPMAttributes", "manufacturer", FALSE, "--tpm-manufacturer"},
+-         {"TPMAttributes", "model", FALSE, "--tpm-model"},
+-         {"TPMAttributes", "version", FALSE, "--tpm-version"},
+-         {NULL, NULL, FALSE, NULL},
+-    };
+-    size_t idx;
++    struct json_value_s *root = NULL;
++    struct json_object_s *obj = NULL;
++
++    *params = NULL;
+ 
+     ret = swtpm->cops->ctrl_get_tpm_specs_and_attrs(swtpm, &json);
+     if (ret != 0) {
+         logerr(gl_LOGFILE, "Could not get the TPM spec and attribute parameters.\n");
+-        return 1;
++        ret = 1;
++        goto error;
+     }
+ 
+-    jp = json_parser_new();
++    root = json_parse(json, strlen(json));
++    if (root == 0) {
++        logerr(gl_LOGFILE, "Could not parse JSON from TPM spec and attribute parameters.\n");
++        ret = 1;
++        goto error;
++    }
++    obj = json_value_as_object(root);
++    if (obj == NULL) {
++        logerr(gl_LOGFILE, "JSON root is not an object.\n");
++        ret = 1;
++        goto error;
++    }
+ 
+-    if (!json_parser_load_from_data(jp, json, -1, &error)) {
+-        logerr(gl_LOGFILE, "JSON parser failed: %s\n", error->message);
+-        g_error_free(error);
++    struct json_object_s *TPMSpecification = NULL;
++    struct json_object_s *TPMAttributes = NULL;
++    for (struct json_object_element_s *el = obj->start; el != NULL; el = el->next) {
++        if (strcmp(el->name->string, "TPMSpecification") == 0) {
++            TPMSpecification = json_value_as_object(el->value);
++            continue;
++        }
++        if (strcmp(el->name->string, "TPMAttributes") == 0) {
++            TPMAttributes = json_value_as_object(el->value);
++            continue;
++        }
++    }
++    if (TPMSpecification == NULL) {
++        logerr(gl_LOGFILE, "TPMSpecification not found in JSON.\n");
++        ret = 1;
++        goto error;
++    }
++    if (TPMAttributes == NULL) {
++        logerr(gl_LOGFILE, "TPMAttributes not found in JSON.\n");
++        ret = 1;
+         goto error;
+     }
+ 
+-    *params = NULL;
+-    root = json_parser_get_root(jp);
+-
+-    for (idx = 0; parser_rules[idx].node1 != NULL; idx++) {
+-        jr = json_reader_new(root);
+-        if (json_reader_read_member(jr, parser_rules[idx].node1) &&
+-            json_reader_read_member(jr, parser_rules[idx].node2)) {
+-            gchar *str;
+-
+-            if (parser_rules[idx].is_int)
+-                str = g_strdup_printf("%ld", (long)json_reader_get_int_value(jr));
+-            else
+-                str = g_strdup(json_reader_get_string_value(jr));
+-
+-            *params = concat_arrays(*params,
+-                                    (gchar*[]){
+-                                        g_strdup(parser_rules[idx].optname),
+-                                        str,
+-                                        NULL
+-                                    }, TRUE);
+-        } else {
+-            logerr(gl_LOGFILE, "Could not find [%s][%s] in '%s'\n",
+-                   parser_rules[idx].node1, parser_rules[idx].node2, json);
+-            ret = 1;
+-            break;
++    const char *spec_family = NULL;
++    const char *spec_level = NULL;
++    const char *spec_revision = NULL;
++    const char *attr_manufacturer = NULL;
++    const char *attr_model = NULL;
++    const char *attr_version = NULL;
++
++    for (struct json_object_element_s *el = TPMSpecification->start; el != NULL; el = el->next) {
++        if (strcmp(el->name->string, "family") == 0 && el->value->type == json_type_string) {
++            spec_family = json_value_as_string(el->value)->string;
++            continue;
++        }
++        if (strcmp(el->name->string, "level") == 0 && el->value->type == json_type_number) {
++            spec_level = json_value_as_number(el->value)->number;
++            continue;
++        }
++        if (strcmp(el->name->string, "revision") == 0 && el->value->type == json_type_number) {
++            spec_revision = json_value_as_number(el->value)->number;
++            continue;
++        }
++    }
++    for (struct json_object_element_s *el = TPMAttributes->start; el != NULL; el = el->next) {
++        if (strcmp(el->name->string, "manufacturer") == 0 && el->value->type == json_type_string) {
++            attr_manufacturer = json_value_as_string(el->value)->string;
++            continue;
++        }
++        if (strcmp(el->name->string, "model") == 0 && el->value->type == json_type_string) {
++            attr_model = json_value_as_string(el->value)->string;
++            continue;
++        }
++        if (strcmp(el->name->string, "version") == 0 && el->value->type == json_type_string) {
++            attr_version = json_value_as_string(el->value)->string;
++            continue;
+         }
+-        g_object_unref(jr);
+-        jr = NULL;
+     }
+ 
++    if (!spec_family) { logerr(gl_LOGFILE, "family not found in TPMSpecifiction.\n"); ret = 1; goto error; }
++    if (!spec_level) { logerr(gl_LOGFILE, "level not found in TPMSpecifiction.\n"); ret = 1; goto error; }
++    if (!spec_revision) { logerr(gl_LOGFILE, "revision not found in TPMSpecifiction.\n"); ret = 1; goto error; }
++    if (!attr_manufacturer) { logerr(gl_LOGFILE, "manufacturer not found in TPMAttributes.\n"); ret = 1; goto error; }
++    if (!attr_model) { logerr(gl_LOGFILE, "model not found in TPMAttributes.\n"); ret = 1; goto error; }
++    if (!attr_version) { logerr(gl_LOGFILE, "version not found in TPMAttributes.\n"); ret = 1; goto error; }
++
++    *params = concat_arrays(*params, (gchar*[]) {
++            g_strdup("--tpm-spec-family"), g_strdup(spec_family),
++            g_strdup("--tpm-spec-revision"), g_strdup(spec_revision),
++            g_strdup("--tpm-spec-level"), g_strdup(spec_level),
++            g_strdup("--tpm-manufacturer"), g_strdup(attr_manufacturer),
++            g_strdup("--tpm-model"), g_strdup(attr_model),
++            g_strdup("--tpm-version"), g_strdup(attr_version),
++            NULL }, TRUE);
++error:
+     if (ret) {
+         g_strfreev(*params);
+-        *params = NULL;
+-        g_object_unref(jr);
+     }
+-error:
+-    g_object_unref(jp);
+-
++    if (root) {
++        free(root);
++    }
+     return ret;
+ }
+ 
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/0004-bazel-support-implement.patch b/third_party/swtpm/patches/0004-bazel-support-implement.patch
new file mode 100644
index 0000000..15245c6
--- /dev/null
+++ b/third_party/swtpm/patches/0004-bazel-support-implement.patch
@@ -0,0 +1,212 @@
+From 3b2ea39444bf97d7847fdb1a3ca70f9d58ffe22a Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 15:10:02 +0200
+Subject: [PATCH 4/4] bazel support: implement
+
+---
+ .gitignore             |  2 -
+ BUILD.bazel            | 94 ++++++++++++++++++++++++++++++++++++++++++
+ WORKSPACE              |  0
+ include/config.h       |  8 ++++
+ include/swtpm.h        |  5 +++
+ src/swtpm/main.c       |  2 +-
+ src/utils/swtpm_conf.h | 22 ++++++++++
+ 7 files changed, 130 insertions(+), 3 deletions(-)
+ create mode 100644 BUILD.bazel
+ create mode 100644 WORKSPACE
+ create mode 100644 include/config.h
+ create mode 100644 include/swtpm.h
+ create mode 100644 src/utils/swtpm_conf.h
+
+diff --git a/.gitignore b/.gitignore
+index c669f06..9982dd0 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -35,7 +35,6 @@ Makefile
+ /m4/*
+ /.pc/*
+ /patches/*
+-/include/swtpm.h
+ /man/man3/*.3
+ /man/man5/*.5
+ /man/man8/*.8
+@@ -60,7 +59,6 @@ Makefile
+ /src/swtpm_ioctl/swtpm_ioctl
+ /src/swtpm_localca/swtpm_localca
+ /src/swtpm_setup/swtpm_setup
+-/src/utils/swtpm_conf.h
+ /test-driver
+ tests/*.log
+ tests/*.trs
+diff --git a/BUILD.bazel b/BUILD.bazel
+new file mode 100644
+index 0000000..acddc0e
+--- /dev/null
++++ b/BUILD.bazel
+@@ -0,0 +1,94 @@
++cc_binary(
++    name = "swtpm",
++    deps = [
++        "@libtpms//:libtpms_tpm2",
++        "@glib//glib",
++    ],
++    srcs = glob([
++        "src/swtpm/*.h",
++        "src/swtpm/*.c",
++        "src/utils/*.h",
++        "src/utils/*.c",
++        "include/*.h",
++        "include/swtpm/*.h",
++    ], [
++        # No CUSE support.
++        "src/swtpm/cuse_tpm.c",
++        # Only used in utils.
++        "src/utils/swtpm_utils.c",
++    ]),
++    copts = [
++        "-Iexternal/swtpm/include",
++        "-Iexternal/swtpm/include/swtpm",
++        "-Iexternal/swtpm/src/utils",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
++
++cc_binary(
++    name = "swtpm_localca",
++    deps = [
++        "@libtpms//:libtpms_tpm2",
++        "@glib//glib",
++    ],
++    srcs = glob([
++        "src/swtpm_localca/*.h",
++        "src/swtpm_localca/*.c",
++        "include/*.h",
++        "include/swtpm/*.h",
++        "src/utils/*.h",
++        "src/utils/*.c",
++    ], []),
++    copts = [
++        "-Iexternal/swtpm/include",
++        "-Iexternal/swtpm/include/swtpm",
++        "-Iexternal/swtpm/src/utils",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
++
++cc_binary(
++    name = "swtpm_setup",
++    deps = [
++        "@libtpms//:libtpms_tpm2",
++        "@glib//glib",
++    ],
++    srcs = glob([
++        "src/swtpm_setup/*.h",
++        "src/swtpm_setup/*.c",
++        "include/*.h",
++        "include/swtpm/*.h",
++        "src/utils/*.h",
++        "src/utils/*.c",
++    ], []),
++    copts = [
++        "-Iexternal/swtpm/include",
++        "-Iexternal/swtpm/include/swtpm",
++        "-Iexternal/swtpm/src/utils",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
++
++cc_binary(
++    name = "swtpm_cert",
++    deps = [
++        "@boringssl//:ssl",
++    ],
++    srcs = glob([
++        "src/swtpm_cert/*.h",
++        "src/swtpm_cert/*.c",
++        "include/*.h",
++    ], []),
++    copts = [
++        "-Iexternal/swtpm/include",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
+diff --git a/WORKSPACE b/WORKSPACE
+new file mode 100644
+index 0000000..e69de29
+diff --git a/include/config.h b/include/config.h
+new file mode 100644
+index 0000000..d3829d6
+--- /dev/null
++++ b/include/config.h
+@@ -0,0 +1,8 @@
++#pragma once
++#define _GNU_SOURCE
++
++#define VERSION "0.8.2-monogon"
++
++// A bunch of files in swtpm depend on stdint types but never include them.
++// Just inject them through here.
++#include <stdint.h>
+diff --git a/include/swtpm.h b/include/swtpm.h
+new file mode 100644
+index 0000000..2eddeec
+--- /dev/null
++++ b/include/swtpm.h
+@@ -0,0 +1,5 @@
++#pragma once
++
++#define SWTPM_VER_MAJOR 0
++#define SWTPM_VER_MINOR 8
++#define SWTPM_VER_MICRO 2
+diff --git a/src/swtpm/main.c b/src/swtpm/main.c
+index 4864e85..633ca33 100644
+--- a/src/swtpm/main.c
++++ b/src/swtpm/main.c
+@@ -83,7 +83,7 @@ int main(int argc, char **argv)
+     } else if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
+         usage(stdout, argv[0]);
+     } else if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) {
+-        fprintf(stdout, "TPM emulator version %d.%d.%d, "
++        fprintf(stdout, "TPM emulator version %d.%d.%d-monogon, "
+                 "Copyright (c) 2014-2022 IBM Corp. and others\n",
+                 SWTPM_VER_MAJOR,
+                 SWTPM_VER_MINOR,
+diff --git a/src/utils/swtpm_conf.h b/src/utils/swtpm_conf.h
+new file mode 100644
+index 0000000..de8afdb
+--- /dev/null
++++ b/src/utils/swtpm_conf.h
+@@ -0,0 +1,22 @@
++/* SPDX-License-Identifier: BSD-3-Clause */
++/*
++ * swtpm_conf.h: Compile-time constants
++ *
++ * Author: Stefan Berger, stefanb@linux.ibm.com
++ *
++ * Copyright (c) IBM Corporation, 2021,2023
++ */
++
++#ifndef SWTPM_SETUP_CONF_H
++#define SWTPM_SETUP_CONF_H
++
++#define SWTPM_VER_MAJOR 0
++#define SWTPM_VER_MINOR 8
++#define SWTPM_VER_MICRO 2
++
++#define SYSCONFDIR "/unused"
++#define BINDIR "/unused"
++
++#define DEFAULT_PCR_BANKS "sha256"
++
++#endif /* SWTPM_SETUP_CONF_H */
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/BUILD.bazel b/third_party/swtpm/patches/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/third_party/swtpm/patches/BUILD.bazel
