npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@keeex/jssha

v3.3.1

Published

jsSHA implements the complete Secure Hash Standard (SHA) family (SHA-1, SHA-224/256/384/512, SHA3-224/256/384/512, SHAKE128/256, cSHAKE128/256, and KMAC128/256) with HMAC

Downloads

109

Readme

jsSHA

A pure TypeScript/JavaScript streaming implementation of the complete Secure Hash Standard (SHA) family (SHA-1, SHA-224/256/384/512, SHA3-224/256/384/512, SHAKE128/256, cSHAKE128/256, and KMAC128/256) with HMAC.

Keeex fork

This repository is a fork of the original jsSHA that roughly changes the following:

  • works fine with ESM and TypeScript
  • remove CSM support

Usage

Below are common use-cases.

Installation

Browser

Include the desired JavaScript file (sha.js, sha1.js, sha256.js, sha512.js, or sha3.js) in your header:

<script type="text/javascript" src="/path/to/sha.js"></script>

Babelized files are available in the /web directory of the package.

Node.js

jsSHA is available through NPM and be installed by simply doing

npm install @keeex/jssha

To use the module, first require it using:

import jsSHA from "@keeex/jssha";
/* The limited variant files are also exported (sha1, sha256, sha512, and sha3)
 * and are accessible as \`@keeex/jssha/lib/sha1.ts\`, \`@keeex/jssha/lib/sha256.ts\`…
import {jsSHA1} from "@keeex/jssha/lib/sha1.js";

Hashing

Instantiate a new jsSHA object with the desired hash variant, input format, and options as parameters. The hash variant can be one of SHA-1, SHA-224, SHA3-224, SHA-256, SHA3-256, SHA-384, SHA3-384, SHA-512, SHA3-512, SHAKE128, or SHAKE256. The input format can be one of HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY. You can then stream in input using the update object function, calling it multiple times if needed. Finally, simply call getHash with the output type as a parameter (B64, HEX, BYTES, ARRAYBUFFER, or UINT8ARRAY). Example to calculate the SHA-512 of "This is a test":

const shaObj = new jsSHA("SHA-512", "TEXT", { encoding: "UTF8" });
/* .update() can be chained */
shaObj.update("This is").update(" a ");
shaObj.update("test");
const hash = shaObj.getHash("HEX");

The constructor takes a hashmap as a optional third argument with defaults {"encoding" : "UTF8", "numRounds" : 1}. numRounds controls the number of hashing iterations/rounds performed and encoding specifies the encoding used to encode TEXT-type inputs. Valid encoding values are "UTF8", "UTF16BE", and "UTF16LE".

getHash also takes a hashmap as an optional second argument with defaults {"outputUpper" : false, "b64Pad" : "="}. outputUpper is only used for "HEX" outputs and b64Pad only for "B64" outputs.

Important: SHAKE128 and SHAKE256 require outputLen to be in the hashmap where outputLen is the desired output length of the SHAKE algorithm in a multiple of 8 bits.

HMAC

Instantiate a new jsSHA object similiar to hashing but with the third argument in the form of { "hmacKey": { "value": VALUE, "format": FORMAT } }. FORMAT takes the same values as the input format from hashing and the VALUE is then either a string, ArrayBuffer, or Uint8Array. You can stream in the input using the update object function just like hashing. Finally, get the HMAC by calling the getHash function with the output type as its argument. Example to calculate the SHA-512 HMAC of the string "This is a test" with the key "abc":

const shaObj = new jsSHA("SHA-512", "TEXT", {
  hmacKey: { value: "abc", format: "TEXT" },
});
shaObj.update("This is a ");
shaObj.update("test");
const hmac = shaObj.getHash("HEX");

Note: You cannot specify numRounds with HMAC.

cSHAKE

Instantiate a new jsSHA object similiar to HMAC but first argument being either "CSHAKE128" or "CSHAKE256" and the third argument in the form of { "customization"?: { "value": VALUE, "format": FORMAT }, "funcName"?: { "value": VALUE, "format": FORMAT } }. FORMAT takes the same values as the input format from hashing and the VALUE is then either a string, ArrayBuffer, or Uint8Array. Per the NIST specification, both customization and funcName are optional. You can stream in the input using the update object function just like hashing. Finally, get the hash by calling the getHash function with the output type and length as arguments. Example to calculate the cSHAKE128 of the string "This is a test" with the customization string "My Tagged Application" and an output size of 256-bits.

const shaObj = new jsSHA("CSHAKE128", "TEXT", {
  customization: { value: "My Tagged Application", format: "TEXT" },
});
shaObj.update("This is a ");
shaObj.update("test");
const cshake = shaObj.getHash("HEX", { outputLen: 256 });

Note: You cannot specify numRounds with cSHAKE.

Important: outputLen is required to be in the hashmap where outputLen is the desired output length of the cSHAKE algorithm in a multiple of 8 bits.

KMAC

Instantiate a new jsSHA object similiar to cSHAKE but first argument being either "KMAC128" or "KMAC256" and the third argument in the form of { "customization"?: { "value": VALUE, "format": FORMAT }, "kmacKey?: { "value": VALUE, "format": FORMAT } }. FORMAT takes the same values as the input format from hashing and the VALUE is then either a string, ArrayBuffer, or Uint8Array. Per the NIST specification customization is optional whereas kmacKey is required. You can stream in the input using the update object function just like hashing. Finally, get the hash by calling the getHash function with the output type and length as arguments. Example to calculate the KMAC128 of the string "This is a test" with the customization string "My Tagged Application", key "abc", and an output size of 256-bits.

const shaObj = new jsSHA("KMAC128", "TEXT", {
  customization: { value: "My Tagged Application", format: "TEXT" },
  kmacKey: { value: "abc", format: "TEXT" },
});
shaObj.update("This is a ");
shaObj.update("test");
const kmac = shaObj.getHash("HEX", { outputLen: 256 });

Note: You cannot specify numRounds with KMAC.

Important: outputLen is required to be in the hashmap where outputLen is the desired output length of the KMAC algorithm in a multiple of 8 bits.

Contact Info

The original project's website is located at https://caligatio.github.io/jsSHA/

For details about this fork, contact KeeeX.