summaryrefslogtreecommitdiff
path: root/src/ext/ed25519/donna/fuzz/build-nix.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/ed25519/donna/fuzz/build-nix.php')
-rw-r--r--src/ext/ed25519/donna/fuzz/build-nix.php134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/ext/ed25519/donna/fuzz/build-nix.php b/src/ext/ed25519/donna/fuzz/build-nix.php
new file mode 100644
index 0000000000..c69144ebc9
--- /dev/null
+++ b/src/ext/ed25519/donna/fuzz/build-nix.php
@@ -0,0 +1,134 @@
+<?php
+ function echoln($str) {
+ echo $str;
+ echo "\n";
+ }
+
+ function usage($reason) {
+ echoln("Usage: php build-nix.php [flags]");
+ echoln("Flags in parantheses are optional");
+ echoln("");
+ echoln(" --bits=[32,64]");
+ echoln(" --function=[curve25519,ed25519]");
+ echoln(" (--compiler=[*gcc,clang,icc]) which compiler to use, gcc is default");
+ echoln(" (--with-openssl) use openssl for SHA512");
+ echoln(" (--with-sse2) additionally fuzz against SSE2");
+ echoln(" (--no-asm) don't use platform specific asm");
+ echoln("");
+ if ($reason)
+ echoln($reason);
+ }
+
+ function cleanup() {
+ system("rm -f *.o");
+ }
+
+ function runcmd($desc, $cmd) {
+ echoln($desc);
+
+ $ret = 0;
+ system($cmd, $ret);
+ if ($ret) {
+ cleanup();
+ exit;
+ }
+ }
+
+ class argument {
+ var $set, $value;
+ }
+
+ class multiargument extends argument {
+ function multiargument($flag, $legal_values) {
+ global $argc, $argv;
+
+ $this->set = false;
+
+ $map = array();
+ foreach($legal_values as $value)
+ $map[$value] = true;
+
+ for ($i = 1; $i < $argc; $i++) {
+ if (!preg_match("!--".$flag."=(.*)!", $argv[$i], $m))
+ continue;
+ if (isset($map[$m[1]])) {
+ $this->value = $m[1];
+ $this->set = true;
+ return;
+ } else {
+ usage("{$m[1]} is not a valid parameter to --{$flag}!");
+ exit(1);
+ }
+ }
+ }
+ }
+
+ class flag extends argument {
+ function flag($flag) {
+ global $argc, $argv;
+
+ $this->set = false;
+
+ $flag = "--{$flag}";
+ for ($i = 1; $i < $argc; $i++) {
+ if ($argv[$i] !== $flag)
+ continue;
+ $this->value = true;
+ $this->set = true;
+ return;
+ }
+ }
+ }
+
+ $bits = new multiargument("bits", array("32", "64"));
+ $function = new multiargument("function", array("curve25519", "ed25519"));
+ $compiler = new multiargument("compiler", array("gcc", "clang", "icc"));
+ $with_sse2 = new flag("with-sse2");
+ $with_openssl = new flag("with-openssl");
+ $no_asm = new flag("no-asm");
+
+ $err = "";
+ if (!$bits->set)
+ $err .= "--bits not set\n";
+ if (!$function->set)
+ $err .= "--function not set\n";
+
+ if ($err !== "") {
+ usage($err);
+ exit;
+ }
+
+ $compile = ($compiler->set) ? $compiler->value : "gcc";
+ $link = "";
+ $flags = "-O3 -m{$bits->value}";
+ $ret = 0;
+
+ if ($with_openssl->set) $link .= " -lssl -lcrypto";
+ if (!$with_openssl->set) $flags .= " -DED25519_REFHASH -DED25519_TEST";
+ if ($no_asm->set) $flags .= " -DED25519_NO_INLINE_ASM";
+
+ if ($function->value === "curve25519") {
+ runcmd("building ref10..", "{$compile} {$flags} curve25519-ref10.c -c -o curve25519-ref10.o");
+ runcmd("building ed25519..", "{$compile} {$flags} ed25519-donna.c -c -o ed25519.o");
+ if ($with_sse2->set) {
+ runcmd("building ed25519-sse2..", "{$compile} {$flags} ed25519-donna-sse2.c -c -o ed25519-sse2.o -msse2");
+ $flags .= " -DED25519_SSE2";
+ $link .= " ed25519-sse2.o";
+ }
+ runcmd("linking..", "{$compile} {$flags} {$link} fuzz-curve25519.c ed25519.o curve25519-ref10.o -o fuzz-curve25519");
+ echoln("fuzz-curve25519 built.");
+ } else if ($function->value === "ed25519") {
+ runcmd("building ref10..", "{$compile} {$flags} ed25519-ref10.c -c -o ed25519-ref10.o");
+ runcmd("building ed25519..", "{$compile} {$flags} ed25519-donna.c -c -o ed25519.o");
+ if ($with_sse2->set) {
+ runcmd("building ed25519-sse2..", "{$compile} {$flags} ed25519-donna-sse2.c -c -o ed25519-sse2.o -msse2");
+ $flags .= " -DED25519_SSE2";
+ $link .= " ed25519-sse2.o";
+ }
+ runcmd("linking..", "{$compile} {$flags} {$link} fuzz-ed25519.c ed25519.o ed25519-ref10.o -o fuzz-ed25519");
+ echoln("fuzz-ed25519 built.");
+ }
+
+
+ cleanup();
+?>