Skip to content

Latest commit

 

History

History
243 lines (233 loc) · 21.9 KB

README.md

File metadata and controls

243 lines (233 loc) · 21.9 KB

Fully managed .NET AES implementation (based on AES-NI)

Do not use this in production! This is a toy project to explore System.Runtime.Intrinsics and AES-NI

Currently with support for ECB, CBC and GCM encrypt/decrypt (all NIST KATs passing). Adding all sorts of paddings is also supported, removing & verifying it is on my todo list... Other modes of use may follow as well.

AES key expansion performance

Method Mean Error StdDev
Aes128BitKeyExpansion 35.91 ns 0.6520 ns 0.6099 ns
Aes192BitKeyExpansion 47.13 ns 0.7675 ns 0.6804 ns
Aes256BitKeyExpansion 42.32 ns 0.9240 ns 0.9887 ns

AES GCM encrypt performance

Method KeySize DataSize AadDataSize Mean Error Ratio
AesNi 128 16 0 116.9 ns 0.9230 ns 0.59
Framework 128 16 0 196.7 ns 0.2843 ns 1.00
AesNi 128 16 16 125.9 ns 0.7349 ns 0.60
Framework 128 16 16 209.8 ns 1.3427 ns 1.00
AesNi 128 16 1024 363.3 ns 1.4387 ns 1.02
Framework 128 16 1024 357.8 ns 1.2221 ns 1.00
AesNi 128 16 1048576 251,047.3 ns 635.6994 ns 1.69
Framework 128 16 1048576 148,721.9 ns 328.4326 ns 1.00
AesNi 128 1024 0 513.7 ns 1.6526 ns 1.08
Framework 128 1024 0 475.1 ns 1.6877 ns 1.00
AesNi 128 1024 16 515.3 ns 1.3066 ns 1.09
Framework 128 1024 16 472.2 ns 2.3596 ns 1.00
AesNi 128 1024 1024 766.6 ns 1.5603 ns 1.21
Framework 128 1024 1024 635.7 ns 2.5873 ns 1.00
AesNi 128 1024 1048576 259,308.8 ns 1,252.8282 ns 1.70
Framework 128 1024 1048576 152,773.2 ns 851.4720 ns 1.00
AesNi 128 1048576 0 422,961.0 ns 2,256.4577 ns 1.59
Framework 128 1048576 0 266,618.2 ns 422.4311 ns 1.00
AesNi 128 1048576 16 424,680.1 ns 3,185.9390 ns 1.59
Framework 128 1048576 16 267,013.1 ns 1,777.2603 ns 1.00
AesNi 128 1048576 1024 434,743.8 ns 4,371.0678 ns 1.59
Framework 128 1048576 1024 273,610.6 ns 450.4404 ns 1.00
AesNi 128 1048576 1048576 689,697.7 ns 868.5420 ns 1.64
Framework 128 1048576 1048576 421,531.7 ns 3,582.6085 ns 1.00
AesNi 192 16 0 143.6 ns 0.5633 ns 0.74
Framework 192 16 0 192.9 ns 0.6242 ns 1.00
AesNi 192 16 16 153.1 ns 0.7294 ns 0.73
Framework 192 16 16 210.9 ns 0.4006 ns 1.00
AesNi 192 16 1024 400.2 ns 0.8833 ns 1.12
Framework 192 16 1024 356.8 ns 0.6916 ns 1.00
AesNi 192 16 1048576 250,448.8 ns 394.2873 ns 1.69
Framework 192 16 1048576 148,382.0 ns 290.7987 ns 1.00
AesNi 192 1024 0 568.1 ns 1.1216 ns 1.16
Framework 192 1024 0 487.6 ns 6.0360 ns 1.00
AesNi 192 1024 16 578.4 ns 1.1946 ns 1.16
Framework 192 1024 16 499.8 ns 1.7812 ns 1.00
AesNi 192 1024 1024 807.0 ns 1.3291 ns 1.25
Framework 192 1024 1024 643.6 ns 1.8400 ns 1.00
AesNi 192 1024 1048576 262,869.2 ns 943.2716 ns 1.73
Framework 192 1024 1048576 152,335.9 ns 935.3822 ns 1.00
AesNi 192 1048576 0 438,345.8 ns 1,060.3746 ns 1.57
Framework 192 1048576 0 278,631.5 ns 486.4308 ns 1.00
AesNi 192 1048576 16 442,616.3 ns 547.3178 ns 1.55
Framework 192 1048576 16 286,545.5 ns 1,512.6367 ns 1.00
AesNi 192 1048576 1024 450,771.3 ns 676.5289 ns 1.55
Framework 192 1048576 1024 290,664.8 ns 391.3501 ns 1.00
AesNi 192 1048576 1048576 686,396.4 ns 14,703.2507 ns 1.56
Framework 192 1048576 1048576 441,713.9 ns 494.7152 ns 1.00
AesNi 256 16 0 141.9 ns 0.3664 ns 0.71
Framework 256 16 0 198.5 ns 0.2866 ns 1.00
AesNi 256 16 16 156.5 ns 0.5802 ns 0.74
Framework 256 16 16 210.5 ns 0.9646 ns 1.00
AesNi 256 16 1024 400.8 ns 7.5786 ns 1.13
Framework 256 16 1024 355.9 ns 1.5194 ns 1.00
AesNi 256 16 1048576 247,994.4 ns 1,455.3164 ns 1.69
Framework 256 16 1048576 146,328.1 ns 1,307.2082 ns 1.00
AesNi 256 1024 0 544.0 ns 2.3217 ns 1.08
Framework 256 1024 0 502.1 ns 5.9181 ns 1.00
AesNi 256 1024 16 583.3 ns 6.9148 ns 1.13
Framework 256 1024 16 517.3 ns 4.6781 ns 1.00
AesNi 256 1024 1024 835.2 ns 12.4978 ns 1.32
Framework 256 1024 1024 634.3 ns 4.9952 ns 1.00
AesNi 256 1024 1048576 249,924.6 ns 1,841.8605 ns 1.68
Framework 256 1024 1048576 148,455.3 ns 458.4788 ns 1.00
AesNi 256 1048576 0 442,180.1 ns 4,221.1879 ns 1.52
Framework 256 1048576 0 291,458.2 ns 3,763.9204 ns 1.00
AesNi 256 1048576 16 438,106.3 ns 5,505.4349 ns 1.48
Framework 256 1048576 16 295,714.9 ns 2,600.2403 ns 1.00
AesNi 256 1048576 1024 456,180.5 ns 4,805.1506 ns 1.63
Framework 256 1048576 1024 280,266.8 ns 3,468.0828 ns 1.00
AesNi 256 1048576 1048576 689,585.6 ns 5,874.2785 ns 1.63
Framework 256 1048576 1048576 424,188.0 ns 2,975.6839 ns 1.00

AES encrypt performance

Method CipherMode KeySize DataSize Mean Error Ratio
AesNi CBC 128 16 51.48 ns 0.1573 ns 0.67
Framework CBC 128 16 77.08 ns 0.5826 ns 1.00
AesNi CBC 128 1024 693.96 ns 1.4697 ns 0.92
Framework CBC 128 1024 752.54 ns 4.9276 ns 1.00
AesNi CBC 128 1048576 698,223.91 ns 1,881.7810 ns 0.98
Framework CBC 128 1048576 711,672.78 ns 4,434.7702 ns 1.00
AesNi CBC 192 16 58.98 ns 0.4968 ns 0.71
Framework CBC 192 16 82.70 ns 0.6663 ns 1.00
AesNi CBC 192 1024 862.64 ns 1.0201 ns 0.93
Framework CBC 192 1024 926.99 ns 2.3510 ns 1.00
AesNi CBC 192 1048576 842,651.03 ns 4,075.8823 ns 0.99
Framework CBC 192 1048576 853,973.89 ns 917.3084 ns 1.00
AesNi CBC 256 16 58.53 ns 0.1174 ns 0.70
Framework CBC 256 16 83.33 ns 0.4332 ns 1.00
AesNi CBC 256 1024 859.57 ns 7.9029 ns 0.85
Framework CBC 256 1024 1,016.35 ns 2.2197 ns 1.00
AesNi CBC 256 1048576 835,345.80 ns 8,567.1241 ns 0.82
Framework CBC 256 1048576 1,020,803.67 ns 2,502.8008 ns 1.00
AesNi ECB 128 16 45.14 ns 0.1515 ns 0.58
Framework ECB 128 16 77.69 ns 0.1875 ns 1.00
AesNi ECB 128 1024 132.40 ns 0.4511 ns 0.79
Framework ECB 128 1024 166.86 ns 1.3364 ns 1.00
AesNi ECB 128 1048576 141,626.77 ns 198.7224 ns 1.48
Framework ECB 128 1048576 95,954.07 ns 171.3752 ns 1.00
AesNi ECB 192 16 51.69 ns 0.0787 ns 0.67
Framework ECB 192 16 76.63 ns 0.4839 ns 1.00
AesNi ECB 192 1024 153.73 ns 0.3768 ns 0.83
Framework ECB 192 1024 185.51 ns 0.3866 ns 1.00
AesNi ECB 192 1048576 121,029.49 ns 123.5305 ns 1.03
Framework ECB 192 1048576 117,916.41 ns 511.1359 ns 1.00
AesNi ECB 256 16 53.39 ns 0.1102 ns 0.67
Framework ECB 256 16 79.32 ns 1.0731 ns 1.00
AesNi ECB 256 1024 150.18 ns 0.4052 ns 0.71
Framework ECB 256 1024 212.85 ns 2.3061 ns 1.00
AesNi ECB 256 1048576 121,857.20 ns 605.2357 ns 0.89
Framework ECB 256 1048576 136,291.12 ns 660.5039 ns 1.00

AES decrypt performance

Method CipherMode KeySize DataSize Mean Error Ratio
AesNi CBC 128 16 40.56 ns 0.3099 ns 0.48
Framework CBC 128 16 85.17 ns 0.7217 ns 1.00
AesNi CBC 128 1024 150.37 ns 6.1546 ns 0.82
Framework CBC 128 1024 189.60 ns 1.9181 ns 1.00
AesNi CBC 128 1048576 105,309.20 ns 536.4942 ns 0.97
Framework CBC 128 1048576 108,803.69 ns 670.8807 ns 1.00
AesNi CBC 192 16 45.69 ns 0.9025 ns 0.54
Framework CBC 192 16 84.60 ns 0.4631 ns 1.00
AesNi CBC 192 1024 155.21 ns 1.7375 ns 0.77
Framework CBC 192 1024 202.52 ns 0.8997 ns 1.00
AesNi CBC 192 1048576 124,210.60 ns 459.2670 ns 0.99
Framework CBC 192 1048576 125,101.53 ns 198.4721 ns 1.00
AesNi CBC 256 16 45.23 ns 0.2512 ns 0.51
Framework CBC 256 16 89.06 ns 0.7113 ns 1.00
AesNi CBC 256 1024 155.90 ns 1.9114 ns 0.70
Framework CBC 256 1024 224.04 ns 2.2041 ns 1.00
AesNi CBC 256 1048576 127,773.17 ns 3,084.0620 ns 0.90
Framework CBC 256 1048576 144,033.44 ns 359.6341 ns 1.00
AesNi ECB 128 16 31.46 ns 0.1889 ns 0.41
Framework ECB 128 16 76.86 ns 0.3054 ns 1.00
AesNi ECB 128 1024 111.58 ns 1.0203 ns 0.33
Framework ECB 128 1024 339.31 ns 3.0097 ns 1.00
AesNi ECB 128 1048576 139,299.30 ns 476.1600 ns 0.56
Framework ECB 128 1048576 250,596.04 ns 2,637.1993 ns 1.00
AesNi ECB 192 16 36.16 ns 0.1581 ns 0.48
Framework ECB 192 16 75.77 ns 0.5718 ns 1.00
AesNi ECB 192 1024 134.45 ns 0.7831 ns 0.40
Framework ECB 192 1024 333.48 ns 5.6652 ns 1.00
AesNi ECB 192 1048576 162,322.50 ns 954.9279 ns 0.63
Framework ECB 192 1048576 259,364.61 ns 1,087.2464 ns 1.00
AesNi ECB 256 16 36.13 ns 0.0700 ns 0.47
Framework ECB 256 16 76.63 ns 0.7104 ns 1.00
AesNi ECB 256 1024 133.11 ns 0.4417 ns 0.35
Framework ECB 256 1024 375.75 ns 0.9654 ns 1.00
AesNi ECB 256 1048576 161,534.95 ns 905.5891 ns 0.55
Framework ECB 256 1048576 294,344.69 ns 1,807.6672 ns 1.00