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 🙏

© 2026 – Pkg Stats / Ryan Hefner

rsa-contracts

v0.0.2

Published

Solidity contract library for RSA verification.

Readme

Solidity RSA Library

NPM Version CI Tests

Simple RSA verification library for Solidity contracts.

Library Setup

# Using NPM
/home/ricmoo/my-project> npm install rsa-contracts

From your Solidity:

import "rsa-contracts/contract/lib-rsa.sol";

contract MyContract {
    function validateRSA3072(bytes32 hash, bytes32[12] memory pubkey,
      bytes32[12] memory sig) public returns (bool) {
        return RSA3072.recoverHash(pubkey, 65537, sig) == hash;
    }
}

API

The API for each of the supported keypair sizes is the same, only differing in the number of bytes32 words that make up the modulus and signature, which must match the keypair size.

// RSA 1024-bit
RSA1024.recoverHash(bytes32[4] modulus, uint exponent, bytes32[4] sig)
  returns (bytes32)

// RSA 2048-bit
RSA2048.recoverHash(bytes32[8] modulus, uint exponent, bytes32[8] sig)
  returns (bytes32)

// RSA 3072-bit
RSA3072.recoverHash(bytes32[12] modulus, uint exponent, bytes32[12] sig)
  returns (bytes32)

// RSA 4096-bit
RSA4096.recoverHash(bytes32[16] modulus, uint exponent, bytes32[16] sig)
  returns (bytes32)

RSA public keys have two components, the modulus (also called n) and the exponent (also called e).

The coresponding private key can be used to efficiently compute a signature such that:

digest = (signature ** exponent) % modulus

So, during signing the payload is hashed using SHA2-256 into a digest, then encoded with PKCS#1 v1.5 to pad the 256-bit digest up to the necessary key size (for example, 3072-bits). The private key then computes the signature.

To verify the signed content, these contract methods can be used to recover the original hash which can then be checked against the expected value.

require(RSA3072.recoverHash(modulus, 65537, signature) == digest);

The vast majority of RSA usage expect the exponent 65537, so usually it can be omitted from the public key and you need only provide the modulus, hard-coding the exponent where necessary. That depends on the system you are using though.

License

MIT License