chiark / gitweb /
pub/, progs/: Implement Bernstein's Ed25519 signature scheme.
[catacomb] / pub / ed25519-tvconv
diff --git a/pub/ed25519-tvconv b/pub/ed25519-tvconv
new file mode 100755 (executable)
index 0000000..854a543
--- /dev/null
@@ -0,0 +1,29 @@
+#! /usr/bin/perl
+
+$mode = shift @ARGV;
+
+if ($mode eq "k") { print "pubkey {\n"; }
+elsif ($mode eq "s") { print "sign {\n"; }
+elsif ($mode eq "v") { print "verify {\n"; }
+
+while (<>) {
+  s/^([^:]{64})([^:]{64}):\2:([^:]*):([^:]{128})\3:$/$1:$2:$3:$4/;
+  my ($k, $K, $m, $s) = ($1, $2, $3, $4);
+  $m = '""' unless length $m;
+  if ($mode eq "k") { print "  $k\n    $K;\n"; }
+  elsif ($mode eq "s") { print "  $k\n    $m\n    $s;\n"; }
+  elsif ($mode eq "v") {
+    print "  $K\n    $m\n    $s\n    0;\n";
+    (my $Kneg = $K) =~ s/([0-9a-f]{2})$/ sprintf "%02x", hex($1) ^ 0x80 /e;
+    print "  $Kneg\n    $m\n    $s\n    -1;\n";
+    (my $Kzap = $K) =~ s/^([0-9a-f]{2})/ sprintf "%02x", hex($1) ^ 0xff /e;
+    print "  $Kzap\n    $m\n    $s\n    -1;\n";
+    (my $mzap = $m) =~ s/^([0-9a-f]{2})/ sprintf "%02x", hex($1) ^ 0xff /e;
+    $mzap = "00" unless $m ne '""';
+    print "  $K\n    $mzap\n    $s\n    -1;\n";
+    (my $szap = $s) =~ s/^([0-9a-f]{2})/ sprintf "%02x", hex($1) ^ 0xff /e;
+    print "  $K\n    $m\n    $szap\n    -1;\n";
+  }
+}
+
+print "}\n";