In [ ]:
# This script features a comparison between the different tested ciphers

import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
import numpy as np

figsize=(4.5, 3)

In [ ]:
# Import all CSV data files
dhe_aes128_256 = pd.read_csv("DHE-RSA-AES128-GCM-SHA256.csv")
ecdhe_aes128_256 = pd.read_csv("ECDHE-RSA-AES128-GCM-SHA256.csv")
dhe_aes256_384 = pd.read_csv("DHE-RSA-AES256-GCM-SHA384.csv")
ecdhe_aes256_384 = pd.read_csv("ECDHE-RSA-AES256-GCM-SHA384.csv")
dhe_chacha = pd.read_csv("DHE-RSA-CHACHA20-POLY1305.csv")
ecdhe_chacha = pd.read_csv("ECDHE-RSA-CHACHA20-POLY1305.csv")

ecdhe_chacha

In [ ]:
# Extract the data for only one connection
dhe_aes128_256_1C = dhe_aes128_256[dhe_aes128_256['numConns'] == 1]
ecdhe_aes128_256_1C = ecdhe_aes128_256[ecdhe_aes128_256['numConns'] == 1]
dhe_aes256_384_1C = dhe_aes256_384[dhe_aes256_384['numConns'] == 1]
ecdhe_aes256_384_1C = ecdhe_aes256_384[ecdhe_aes256_384['numConns'] == 1]
dhe_chacha_1C = dhe_chacha[dhe_chacha['numConns'] == 1]
ecdhe_chacha_1C = ecdhe_chacha[ecdhe_chacha['numConns'] == 1]

In [ ]:
# Normalize the needed data
for i,r in dhe_aes128_256_1C.iterrows():
    r['openssl'] /= r['numBytes']
    r['numBytes'] = math.log10(r['dataLen'])
for i,r in ecdhe_aes128_256_1C.iterrows():
    r['openssl'] /= r['numBytes']
    r['numBytes'] = math.log10(r['dataLen'])
for i,r in dhe_aes256_384_1C.iterrows():
    r['openssl'] /= r['numBytes']
    r['numBytes'] = math.log10(r['dataLen'])
for i,r in ecdhe_aes256_384_1C.iterrows():
    r['openssl'] /= r['numBytes']
    r['numBytes'] = math.log10(r['dataLen'])
for i,r in dhe_chacha_1C.iterrows():
    r['openssl'] /= r['numBytes']
    r['numBytes'] = math.log10(r['dataLen'])
for i,r in ecdhe_chacha_1C.iterrows():
    r['openssl'] /= r['numBytes']
    r['numBytes'] = math.log10(r['dataLen'])

In [ ]:
# Plot the cost of the denseMap in relationship to the cipher and the size of the data transfer
fig = plt.figure(figsize=(7, 4), dpi=300)
ax = fig.gca(projection='3d')
ax.plot(dhe_aes128_256_1C['numBytes'], dhe_aes128_256_1C['openssl'], zs=0, zdir='y', label='dhe128')
ax.plot(ecdhe_aes128_256_1C['numBytes'], ecdhe_aes128_256_1C['openssl'], zs=1, zdir='y', label='ecdhe128')
ax.plot(dhe_aes256_384_1C['numBytes'], dhe_aes256_384_1C['openssl'], zs=2, zdir='y', label='dhe256')
ax.plot(ecdhe_aes256_384_1C['numBytes'], ecdhe_aes256_384_1C['openssl'], zs=3, zdir='y', label='ecdhe256')
ax.plot(dhe_chacha_1C['numBytes'], dhe_chacha_1C['openssl'], zs=4, zdir='y', label='dheChaCha')
ax.plot(ecdhe_chacha_1C['numBytes'], ecdhe_chacha_1C['openssl'], zs=5, zdir='y', label='ecdheChaCha')

ax.set_xlim(2, 7)
ax.set_xlabel('Bytes 10^x')
ax.set_zlim(0, 60000)
ax.set_zlabel('Cycles')
ax.set_ylim(0, 5)
ax.set_ylabel('Sample')

ax.legend()

plt.savefig('output/openssl_cipher_3d.pdf',bbox_inches='tight')
plt.show()

In [ ]:
# Same as above in 2D
fig = plt.figure(figsize=(4.5, 3), dpi=300)

plt.plot(dhe_aes128_256_1C['numBytes'], dhe_aes128_256_1C['openssl'], label='dhe128')
plt.plot(ecdhe_aes128_256_1C['numBytes'], ecdhe_aes128_256_1C['openssl'], label='ecdhe128')
plt.plot(dhe_aes256_384_1C['numBytes'], dhe_aes256_384_1C['openssl'], label='dhe256')
plt.plot(ecdhe_aes256_384_1C['numBytes'], ecdhe_aes256_384_1C['openssl'], label='ecdhe256')
plt.plot(dhe_chacha_1C['numBytes'], dhe_chacha_1C['openssl'], label='dheChaCha')
plt.plot(dhe_chacha_1C['numBytes'], dhe_chacha_1C['openssl'], label='ecdheChaCha')

plt.semilogy()

plt.ylim([1,100000])
plt.xlabel('Bytes 10^x')
plt.ylabel('Cycles per Byte')
plt.title("Cost of OpenSSL by data length")
plt.legend()
plt.grid(b=True)

plt.savefig('output/openssl_cipher_2d.pdf',bbox_inches='tight')
plt.show()

In [ ]:
# Plot the cost of the SipHash-2-4
fig = plt.figure(figsize=figsize, dpi=300)

# Plot the normalized data
plt.plot(dhe_aes128_256_1C['numPkts'],
         dhe_aes128_256_1C['siphash'] / dhe_aes128_256_1C['numPkts'],
        label="dhe128")
plt.plot(ecdhe_aes128_256_1C['numPkts'],
         ecdhe_aes128_256_1C['siphash'] / ecdhe_aes128_256_1C['numPkts'],
        label="ecdhe128")
plt.plot(dhe_aes256_384_1C['numPkts'],
         dhe_aes256_384_1C['siphash'] / dhe_aes256_384_1C['numPkts'],
        label="dhe128")
plt.plot(ecdhe_aes256_384_1C['numPkts'],
         ecdhe_aes256_384_1C['siphash'] / ecdhe_aes256_384_1C['numPkts'],
        label="ecdhe128")
plt.plot(dhe_chacha_1C['numPkts'],
         dhe_chacha_1C['siphash'] / dhe_chacha_1C['numPkts'],
        label="dhe128")
plt.plot(ecdhe_chacha_1C['numPkts'],
         ecdhe_chacha_1C['siphash'] / ecdhe_chacha_1C['numPkts'],
        label="ecdhe128")

plt.loglog(basex=2, basey=2)

#plt.ylim([1,100000])
plt.ylim([1,2**13])
plt.xlabel('#Packets')
plt.ylabel('Cycles per Packet')
plt.title("Cost of SipHash by #Pkts")
plt.grid(b=True)
plt.legend()

plt.savefig('output/siphash_cipher.pdf',bbox_inches='tight')
plt.show()

In [ ]:
# Produce a stacked bar chart for cost points
# 10000000 bytes transfered
# Always use mean of all ciphers

dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []

categories = ['memory', 'siphash', 'tbb', 'denseMap', 'openssl']
N = len(categories)

for dat in dataSetsRaw:
    dataSetsFiltered += [dat[dat['dataLen'] == 10000000]]

#for dat in dataSetsFiltered:
#    print(dat)

for dat in dataSetsFiltered:
    for _,r in dat.iterrows():
        r['openssl'] /= r['numPkts']
        r['denseMap'] /= r['numPkts']
        r['tbb'] /= r['numPkts']
        r['siphash'] /= r['numPkts']
        r['memory'] /= r['numPkts']

#for dat in dataSetsFiltered:
#    print(dat)

dataSetsFiltered

means = []

for cat in categories:
    cur = []
    for dat in dataSetsFiltered:
        cur += [int(dat[cat].mean())]
    means += [cur]

#print(means)

stacks = []

fig = plt.figure(figsize=figsize, dpi=300)

ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
    print(cat)
    stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
    for x in range(0,len(dataSetsRaw)):
        cutLower[x] += cat[x]
        
plt.ylabel('Cycles')
plt.title('Cycles per category - 10000000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[0][0], stacks[1][0], stacks[2][0], stacks[3][0], stacks[4][0]),
           (categories[0],categories[1],categories[2],categories[3],categories[4]),
          bbox_to_anchor=(1, 1))

fig.savefig('output/stack_bar_all_10000000.pdf',bbox_inches='tight')
plt.show()

In [ ]:
# Produce a stacked bar chart for cost points
# 1000 bytes transfered
# Always use mean of all ciphers

dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []

categories = ['memory', 'siphash', 'tbb', 'denseMap', 'openssl']
N = len(categories)

for dat in dataSetsRaw:
    dataSetsFiltered += [dat[dat['dataLen'] == 1000]]

#for dat in dataSetsFiltered:
#    print(dat)

[print("{" + str(r['numConns']) + "," + str(r['openssl'] / r['numConns']) + "},", end='') for _,r in dataSetsFiltered[1].iterrows()]

for dat in dataSetsFiltered:
    for _,r in dat.iterrows():
        r['openssl'] /= r['numPkts']
        r['denseMap'] /= r['numPkts']
        r['tbb'] /= r['numPkts']
        r['siphash'] /= r['numPkts']
        r['memory'] /= r['numPkts']

#for dat in dataSetsFiltered:
#    print(dat)

dataSetsFiltered

means = []

for cat in categories:
    cur = []
    for dat in dataSetsFiltered:
        cur += [int(dat[cat].mean())]
    means += [cur]

#print(means)

stacks = []

fig = plt.figure(figsize=figsize, dpi=300)

ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
    stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
    for x in range(0,len(dataSetsRaw)):
        cutLower[x] += cat[x]
        
plt.ylabel('Cycles')
plt.title('Cycles per category - 1000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[0][0], stacks[1][0], stacks[2][0], stacks[3][0], stacks[4][0]),
           (categories[0],categories[1],categories[2],categories[3],categories[4]),
          bbox_to_anchor=(1, 1))

fig.savefig('output/stack_bar_all_1000.pdf',bbox_inches='tight')
plt.show()

In [ ]:
# Produce a stacked bar chart for cost points, except openssl
# 10000000 bytes transfered
# Always use mean of all ciphers

dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []

categories = ['memory', 'siphash', 'tbb', 'denseMap']
N = len(categories)

for dat in dataSetsRaw:
    dataSetsFiltered += [dat[dat['dataLen'] == 10000000]]

#for dat in dataSetsFiltered:
#    print(dat)

for dat in dataSetsFiltered:
    for _,r in dat.iterrows():
        r['openssl'] /= r['numPkts']
        r['denseMap'] /= r['numPkts']
        r['tbb'] /= r['numPkts']
        r['siphash'] /= r['numPkts']
        r['memory'] /= r['numPkts']

#for dat in dataSetsFiltered:
#    print(dat)

means = []

for cat in categories:
    cur = []
    for dat in dataSetsFiltered:
        cur += [int(dat[cat].mean())]
    means += [cur]

#print(means)
    
stacks = []

fig = plt.figure(figsize=figsize, dpi=300)

ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
    stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
    for x in range(0,len(dataSetsRaw)):
        cutLower[x] += cat[x]
        
plt.ylabel('Cycles')
plt.title('Cycles per category - 10000000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[3][0], stacks[2][0], stacks[1][0], stacks[0][0]),
           (categories[3],categories[2],categories[1],categories[0]),
          bbox_to_anchor=(1, 1))

fig.savefig('output/stack_bar_noSSL_10000000.pdf',bbox_inches='tight')
plt.show()

In [ ]:
# Produce a stacked bar chart for cost points, except openssl
# 1000 bytes transfered
# Always use mean of all ciphers

dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []

categories = ['memory', 'siphash', 'tbb', 'denseMap']
N = len(categories)

for dat in dataSetsRaw:
    dataSetsFiltered += [dat[dat['dataLen'] == 1000]]

#for dat in dataSetsFiltered:
#    print(dat)

for dat in dataSetsFiltered:
    for _,r in dat.iterrows():
        r['openssl'] /= r['numPkts']
        r['denseMap'] /= r['numPkts']
        r['tbb'] /= r['numPkts']
        r['siphash'] /= r['numPkts']
        r['memory'] /= r['numPkts']

#for dat in dataSetsFiltered:
#    print(dat)
    
means = []

for cat in categories:
    cur = []
    for dat in dataSetsFiltered:
        cur += [int(dat[cat].mean())]
    means += [cur]

stacks = []

fig = plt.figure(figsize=figsize, dpi=300)

ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
    stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
    for x in range(0,len(dataSetsRaw)):
        cutLower[x] += cat[x]
        
plt.ylabel('Cycles')
plt.title('Cycles per category - 1000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[3][0], stacks[2][0], stacks[1][0], stacks[0][0]),
           (categories[3],categories[2],categories[1],categories[0]),
            bbox_to_anchor=(1, 1))

fig.savefig('output/stack_bar_noSSL_1000.pdf',bbox_inches='tight')
plt.show()

In [ ]: