aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/contrib/examples/extract-handshakes/offset-finder.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/examples/extract-handshakes/offset-finder.c')
-rw-r--r--contrib/examples/extract-handshakes/offset-finder.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/contrib/examples/extract-handshakes/offset-finder.c b/contrib/examples/extract-handshakes/offset-finder.c
new file mode 100644
index 0000000..d0bc69c
--- /dev/null
+++ b/contrib/examples/extract-handshakes/offset-finder.c
@@ -0,0 +1,44 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2015-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
+ */
+
+struct def {
+ const char *name;
+ unsigned long offset;
+ unsigned long indirection_offset;
+};
+extern const struct def defs[];
+
+#ifdef __KERNEL__
+#include "../../../src/noise.h"
+
+const struct def defs[] = {
+ { "LOCAL_STATIC_PRIVATE_KEY", offsetof(struct noise_static_identity, static_private), offsetof(struct noise_handshake, static_identity) },
+ { "LOCAL_EPHEMERAL_PRIVATE_KEY", offsetof(struct noise_handshake, ephemeral_private), -1 },
+ { "REMOTE_STATIC_PUBLIC_KEY", offsetof(struct noise_handshake, remote_static), -1 },
+ { "PRESHARED_KEY", offsetof(struct noise_handshake, preshared_key), -1 },
+ { NULL, 0 }
+};
+#else
+#include <stdio.h>
+int main(int argc, char *argv[])
+{
+ puts("declare -A OFFSETS=(");
+ for (const struct def *def = defs; def->name; ++def) {
+ printf("\t[%s]=%ld", def->name, def->offset);
+ if (def->indirection_offset != -1)
+ printf(",%ld", def->indirection_offset);
+ putchar('\n');
+ }
+ puts(")");
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ puts("ENDIAN=big");
+#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ puts("ENDIAN=little");
+#else
+#error "Unsupported endianness"
+#endif
+ return 0;
+}
+#endif