#!/bin/sh rm -rf merge-tmp mkdir merge-tmp awk ' BEGIN { numbatmanversions = 0 numcomputers = 0 numbats = 0 numbatversions = 0 numparams = 0 numobjects = 0 nummessagelengths = 0 } { if (!($1 in invbatmanversions)) { batmanversions[numbatmanversions] = $1 invbatmanversions[$1] = numbatmanversions ++numbatmanversions } $1 = invbatmanversions[$1] if (!($2 in invcomputers)) { computers[numcomputers] = $2 invcomputers[$2] = numcomputers ++numcomputers } $2 = invcomputers[$2] if (!($4 in invbats)) { bats[numbats] = $4 invbats[$4] = numbats ++numbats } $4 = invbats[$4] if (!($5 in invbatversions)) { batversions[numbatversions] = $5 invbatversions[$5] = numbatversions ++numbatversions } $5 = invbatversions[$5] if (!($6 in invparams)) { params[numparams] = $6 invparams[$6] = numparams ++numparams } $6 = invparams[$6] o = $1","$2","$4","$5","$6 if (!(o in invobjects)) { objects[numobjects] = o invobjects[o] = numobjects ++numobjects } $1 = invobjects[o] $2 = "" $3 = "" # benchmark start date $4 = "" $5 = "" $6 = "" if (!($8 in invmessagelengths)) { messagelengths[nummessagelengths] = $8 invmessagelengths[$8] = nummessagelengths ++nummessagelengths } $8 = invmessagelengths[$8] print } END { print numbatmanversions > "merge-tmp/batmanversions" for (i = 0;i < numbatmanversions;++i) print batmanversions[i] > "merge-tmp/batmanversions" print numcomputers > "merge-tmp/computers" for (i = 0;i < numcomputers;++i) print computers[i] > "merge-tmp/computers" print numbats > "merge-tmp/bats" for (i = 0;i < numbats;++i) print bats[i] > "merge-tmp/bats" print numbatversions > "merge-tmp/batversions" for (i = 0;i < numbatversions;++i) print batversions[i] > "merge-tmp/batversions" print numparams > "merge-tmp/params" for (i = 0;i < numparams;++i) print params[i] > "merge-tmp/params" print (nummessagelengths-1) > "merge-tmp/messagelengths" for (i = 1;i < nummessagelengths;++i) print messagelengths[i] > "merge-tmp/messagelengths" print numobjects > "merge-tmp/objects" for (i = 0;i < numobjects;++i) print objects[i] > "merge-tmp/objects" } ' \ | sort > merge-tmp/sorted # new fields: # $1 object # $2 operation # $3 messagelength # $4 type # $5 median # $6 etc. measurements awk ' function printmedian(x,y,ynum,i) { ynum = split(x,y,/,/) for (i = ynum;i >= 1;--i) if (y[i] == -1) { y[i] = y[ynum] --ynum } while (ynum > 2) { for (i = 1;i <= ynum;++i) if (y[i] < y[ynum]) { y[ynum + 1] = y[ynum] y[ynum] = y[i] y[i] = y[ynum + 1] } --ynum for (i = 1;i <= ynum;++i) if (y[i] > y[ynum]) { y[ynum + 1] = y[ynum] y[ynum] = y[i] y[i] = y[ynum + 1] } --ynum } if (ynum == 0) print -1 else if (ynum == 1) print y[1] else if (ynum == 2) print int((y[1] + y[2]) / 2) } function printobject(j) { print object print patentclaims print copyrightclaims print timingattacks print fakekeyattacks print ccattacks printmedian(keypaircycles) printmedian(secretkeybytes) printmedian(publickeybytes) printmedian(sharedsecretcycles) printmedian(sharedsecretbytes) for (i = 1;i <= nummessagelengths;++i) printmedian(ciphertextcycles[i]) for (i = 1;i <= nummessagelengths;++i) printmedian(ciphertextbytes[i]) for (i = 1;i <= nummessagelengths;++i) printmedian(plaintextcycles[i]) for (i = 1;i <= nummessagelengths;++i) printmedian(signedmessagecycles[i]) for (i = 1;i <= nummessagelengths;++i) printmedian(signedmessagebytes[i]) for (i = 1;i <= nummessagelengths;++i) printmedian(messagesignedcycles[i]) for (elog = 0;elog <= 40;elog += 2) for (klog = 0;klog <= 40;klog += 4) for (slog = 0;slog <= 40;slog += 1) printmedian(distinguishingchance[elog"."klog"."slog]) for (elog = 0;elog <= 40;elog += 2) for (klog = 0;klog <= 40;klog += 4) for (slog = 0;slog <= 40;slog += 1) printmedian(forgerychance[elog"."klog"."slog]) for (elog = 0;elog <= 40;elog += 2) for (klog = 0;klog <= 40;klog += 4) for (slog = 0;slog <= 40;slog += 1) printmedian(cdhchance[elog"."klog"."slog]) print "" } BEGIN { getline nummessagelengths < "merge-tmp/messagelengths" object = -1 todo = 0 } { if ($1 != object) { if (todo) printobject() object = $1 patentclaims = -1 copyrightclaims = -1 timingattacks = -1 fakekeyattacks = -1 ccattacks = -1 keypaircycles = "-1" sharedsecretcycles = "-1" secretkeybytes = "-1" publickeybytes = "-1" sharedsecretbytes = "-1" for (i = 1;i <= nummessagelengths;++i) ciphertextcycles[i] = "-1" for (i = 1;i <= nummessagelengths;++i) ciphertextbytes[i] = "-1" for (i = 1;i <= nummessagelengths;++i) plaintextcycles[i] = "-1" for (i = 1;i <= nummessagelengths;++i) signedmessagecycles[i] = "-1" for (i = 1;i <= nummessagelengths;++i) signedmessagebytes[i] = "-1" for (i = 1;i <= nummessagelengths;++i) messagesignedcycles[i] = "-1" for (elog = 0;elog <= 40;elog += 2) for (klog = 0;klog <= 40;klog += 4) for (slog = 0;slog <= 40;slog += 1) distinguishingchance[elog"."klog"."slog] = "-1" for (elog = 0;elog <= 40;elog += 2) for (klog = 0;klog <= 40;klog += 4) for (slog = 0;slog <= 40;slog += 1) forgerychance[elog"."klog"."slog] = "-1" for (elog = 0;elog <= 40;elog += 2) for (klog = 0;klog <= 40;klog += 4) for (slog = 0;slog <= 40;slog += 1) cdhchance[elog"."klog"."slog] = "-1" } todo = 1 operation = $2 messagelength = $3 type = $4 median = $5 elog = $6 klog = $7 if (operation == "keypair" && type == "cycles") { for (i = 6;i <= NF;++i) keypaircycles = keypaircycles","$i } else if (operation == "publickey" && type == "bytes") { for (i = 6;i <= NF;++i) publickeybytes = publickeybytes","$i } else if (operation == "secretkey" && type == "bytes") { for (i = 6;i <= NF;++i) secretkeybytes = secretkeybytes","$i } else if (operation == "ciphertext" && type == "cycles") { for (i = 6;i <= NF;++i) ciphertextcycles[messagelength] = ciphertextcycles[messagelength]","$i } else if (operation == "ciphertext" && type == "bytes") { for (i = 6;i <= NF;++i) ciphertextbytes[messagelength] = ciphertextbytes[messagelength]","$i } else if (operation == "plaintext" && type == "cycles") { for (i = 6;i <= NF;++i) plaintextcycles[messagelength] = plaintextcycles[messagelength]","$i } else if (operation == "signedmessage" && type == "cycles") { for (i = 6;i <= NF;++i) signedmessagecycles[messagelength] = signedmessagecycles[messagelength]","$i } else if (operation == "signedmessage" && type == "bytes") { for (i = 6;i <= NF;++i) signedmessagebytes[messagelength] = signedmessagebytes[messagelength]","$i } else if (operation == "messagesigned" && type == "cycles") { for (i = 6;i <= NF;++i) messagesignedcycles[messagelength] = messagesignedcycles[messagelength]","$i } else if (operation == "sharedsecret" && type == "cycles") { for (i = 6;i <= NF;++i) sharedsecretcycles = sharedsecretcycles","$i } else if (operation == "sharedsecret" && type == "bytes") { for (i = 6;i <= NF;++i) sharedsecretbytes = sharedsecretbytes","$i } else if (operation == "distinguishingchance" && type == "chance") { for (slog = 0;slog <= 40;slog += 1) distinguishingchance[elog"."klog"."slog] = distinguishingchance[elog"."klog"."slog]","$(8 + slog) } else if (operation == "forgerychance" && type == "chance") { for (slog = 0;slog <= 40;slog += 1) forgerychance[elog"."klog"."slog] = forgerychance[elog"."klog"."slog]","$(8 + slog) } else if (operation == "cdhchance" && type == "chance") { for (slog = 0;slog <= 40;slog += 1) cdhchance[elog"."klog"."slog] = cdhchance[elog"."klog"."slog]","$(8 + slog) } else if (operation == "timingattacks" && type == "attack") { timingattacks = median } else if (operation == "ccattacks" && type == "attack") { ccattacks = median } else if (operation == "fakekeyattacks" && type == "attack") { fakekeyattacks = median } else if (operation == "copyrightclaims" && type == "restriction") { copyrightclaims = median } else if (operation == "patentclaims" && type == "restriction") { patentclaims = median } } END { if (todo) printobject() } ' < merge-tmp/sorted \ | cat \ merge-tmp/batmanversions merge-tmp/computers \ merge-tmp/bats merge-tmp/batversions merge-tmp/params \ merge-tmp/messagelengths merge-tmp/objects -