o1js
Version:
TypeScript framework for zk-SNARKs and zkApps
138 lines (105 loc) • 5.44 kB
text/typescript
import { Bigint2048, rsaVerify65537 } from './rsa.js';
import {
sha256Bigint,
generateRsaParams,
rsaSign,
randomPrime,
} from './utils.js';
import { expect } from 'expect';
import { it, describe } from 'node:test';
describe('RSA65537 verification tests', () => {
it('should accept a simple RSA signature', () => {
const message = Bigint2048.from(4n);
const rsaSig = Bigint2048.from(31n);
const modul = Bigint2048.from(33n);
rsaVerify65537(message, rsaSig, modul);
});
// Params imported from https://github.com/rzcoder/node-rsa#:~:text=key.importKey(%7B,%2C%20%27components%27)%3B
it('should accept RSA signature with hardcoded valid parameters', () => {
const params = {
n: 0x0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783n,
e: 65537n,
d: 0x5d2f0dd982596ef781affb1cab73a77c46985c6da2aafc252cea3f4546e80f40c0e247d7d9467750ea1321cc5aa638871b3ed96d19dcc124916b0bcb296f35e1n,
p: 0x00c59419db615e56b9805cc45673a32d278917534804171edcf925ab1df203927fn,
q: 0x00aee3f86b66087abc069b8b1736e38ad6af624f7ea80e70b95f4ff2bf77cd90fdn,
dmp1: 0x008112f5a969fcb56f4e3a4c51a60dcdebec157ee4a7376b843487b53844e8ac85n,
dmq1: 0x1a7370470e0f8a4095df40922a430fe498720e03e1f70d257c3ce34202249d21n,
coeff:
0x00b399675e5e81506b729a777cc03026f0b2119853dfc5eb124610c0ab82999e45n,
};
const message = Bigint2048.from(13n);
const rsaSig = Bigint2048.from(rsaSign(13n, params.d, params.n));
const modul = Bigint2048.from(params.n);
rsaVerify65537(message, rsaSig, modul);
});
it('should accept RSA signature with randomly generated parameters: 512-bits (20 iterations)', async () => {
const input = await sha256Bigint('hello there!');
for (let i = 0; i < 20; i++) {
const params = generateRsaParams(512);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.d, params.n));
const modulus = Bigint2048.from(params.n);
rsaVerify65537(message, signature, modulus);
}
});
it('should accept RSA signature with randomly generated parameters: 1024-bits (10 iterations)', async () => {
const input = await sha256Bigint('how is it going!');
for (let i = 0; i < 10; i++) {
const params = generateRsaParams(1024);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.d, params.n));
const modulus = Bigint2048.from(params.n); // domain public key
rsaVerify65537(message, signature, modulus);
}
});
it('should accept RSA signature with randomly generated parameters: 2048-bits (5 iterations)', async () => {
const input = await sha256Bigint('how are you!');
for (let i = 0; i < 5; i++) {
const params = generateRsaParams(2048);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.d, params.n));
const modulus = Bigint2048.from(params.n);
rsaVerify65537(message, signature, modulus);
}
});
it('should reject RSA signature with randomly generated parameters larger than 2048 bits', async () => {
const input = await sha256Bigint('how are you!');
const params = generateRsaParams(2560);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.d, params.n));
const modulus = Bigint2048.from(params.n);
expect(() => rsaVerify65537(message, signature, modulus)).toThrowError();
});
it('should reject RSA signature with non-compliant modulus: 2048 bits', async () => {
const input = await sha256Bigint('hello!');
const params = generateRsaParams(2048);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.d, params.n));
const modulus = Bigint2048.from(randomPrime(2048)); // Tamper with modulus
expect(() => rsaVerify65537(message, signature, modulus)).toThrowError();
});
it('should reject RSA signature with non-compliant input: 2048 bits', async () => {
const input = await sha256Bigint('hello!');
const params = generateRsaParams(2048);
const message = Bigint2048.from(35n); // Tamper with input
const signature = Bigint2048.from(rsaSign(input, params.d, params.n));
const modulus = Bigint2048.from(params.n);
expect(() => rsaVerify65537(message, signature, modulus)).toThrowError();
});
it('should reject non compliant RSA signature: false private key: 2048 bits', async () => {
const input = await sha256Bigint('hello!');
const params = generateRsaParams(2048);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.e, params.n)); // Tamper with private key
const modulus = Bigint2048.from(params.n);
expect(() => rsaVerify65537(message, signature, modulus)).toThrowError();
});
it('should reject non-compliant RSA signature: false signature modulus : 2048 bits', async () => {
const input = await sha256Bigint('hello!');
const params = generateRsaParams(2048);
const message = Bigint2048.from(input);
const signature = Bigint2048.from(rsaSign(input, params.d, 1223n)); // Tamper with signature modulus
const modulus = Bigint2048.from(params.n);
expect(() => rsaVerify65537(message, signature, modulus)).toThrowError();
});
});