Advanced Encryption Standard

Usage no npm install needed!

<script type="module">
  import bsaes from '';


bsaes.js - JavaScript AES


Just as it's possible to write a TCP/IP protocol stack in some utterly inappropriate programing language like ML or Visual Basic, so too, it's possible to implement TCP/IP over carrier pidgeons, or paper tape, or demons summoned from the vasty deep.

-- Stross, C., The Jennifer Morgue

This package provides a pure-JavaScript bitsliced AES implementation, as logical operations on 32 bit unsigned integers, ported from the Go port of the BearSSL code.

As a concession to performance and the futility of pure-JS crypto, a variable time table based AESENC analog is also provided in the unsafe sub-module.


THIS IS NOT INTENDED AS A GENERAL PURPOSE AES IMPLEMENTATION. Unless you need access to AES algorithm internals (ie: AddRoundKey, SubBytes, ShiftRows, and or MixColumns) it is strongly recommended that you use crypto instead.

While sensible languages and compilers generally would transform an AES implementation of this design into something that is timing side-channel free, JavaScript and it's various implementations are not sensible by any common definition of the word.


  • The inverse transformations are not currently implemented for reasons of brevity.

  • The bitsliced nature of the implementation means that under the hood each operation is applied to 2 blocks at once. This can be used to increase performance of certain constructs.

  • If timing side-channels are beyond your threat model, this could be more easily accomplished via a table driven implementation, with better performance.

  • The package is not documented as developers that can't figure it out really have no business using it, at all.