This project implements AES in both CBC and CTR modes. It only implements the modes, and uses aes-js for the underlying AES cipher. When encrypting, the 16-byte initialization vector is chosen randomly ( from window.crypto.getRandomValues()) and prepended to the ciphertext. When decrypting, the first 16 bytes are assumed to be the initialization vector.
In CBC mode, padding is performed according to RFC 1423.