Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Encryption and decryption errors occur repeatedly #582

Closed
yuanchangjian opened this issue Apr 11, 2023 · 15 comments
Closed

Encryption and decryption errors occur repeatedly #582

yuanchangjian opened this issue Apr 11, 2023 · 15 comments

Comments

@yuanchangjian
Copy link

`
export class LYRSA extends LYObject implements ILYRSA {
private _publicKey: string;

protected async getPublicKey(): Promise<string> {
	if (!this._publicKey) {
		const publicKey = await rootHttp.getPublicKey();
		this._publicKey = publicKey.pubSubjectKey;
	}
	return this._publicKey;
}

protected async getPrivateKey(): Promise<string> {
	throw new Error('Method not implemented.');
}

async encrypt(data: string): Promise<string> {
	const publicKey = await this.getPublicKey();
	const key = '-----BEGIN PUBLIC KEY-----\n' + publicKey + '\n-----END PUBLIC KEY-----';
	return hextob64(KJUR.crypto.Cipher.encrypt(data, KEYUTIL.getKey(key) as RSAKey, 'RSAOAEP256'));
}

async decrypt(data: string): Promise<string> {
	const privateKey = await this.getPrivateKey();
	const key = "-----BEGIN RSA PRIVATE KEY-----\n"+ privateKey + "\n" + "-----END RSA PRIVATE KEY-----"
	return KJUR.crypto.Cipher.decrypt(b64utohex(data), KEYUTIL.getKey(key) as RSAKey, 'RSAOAEP256');
}

}
`

`
const key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQAB"
const pKey = "MIIEpAIBAAKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQABAoIBAHHckKZu/uAl0edaq6lHcqjZMkMQj+OmSV1Z3W+ksQKhy+F+9lD4XJzJYPHnNEhixSRLsoQkSCRYOWkqHrOJoHnRSPI5FenzX6XR8dy3yyZZnQXJ5GFwlPzqICkray58L/vFZdkeYDdssK1ZsVOZ1M3HRYF0lL0xvN+9KsjmTZO3qtG6yt8pL7EZW19AfZFEuNdD6EEV2cEB4zPT0gRWh+uAIIu+XYnSy4dEAqksQM/iiJ+CMrxJceTatfKLPXUdC8qI+IuUiUDwZLsu15C3G0E06DMk10wCSZjZEgDTM5hqWPUWahpUh5lQDW64zlZM3qm/cxcqfA3+VOMlagc/I7ECgYEA+Ft1QoiXPoCRCVYyJ8eiBS7xuMLk91kKyLF8vzi4XwXmy46T2TuPMGRDw+gGl65vS2TfHaD23VS12G90Jv6YyBOEo/A4g9ImpSwblI2kwl3vnR7t5R46gWUveed54QQec9UloEzfB9s0pXDhP9Eng1yo4yOFhC/cQKDd0I9jNUUCgYEA8YH8Mhq+dDmwaf8tvoG/3cEAF/g45qrY1wfPjFYhZGrgGKkpc6DmYTeugYCJFx+VBOtrA7O23lAjuAxhGLYE74KE0tzNQzSXllG0aJG++1Ive6DNu7UXXELaWYjxacojMbPH2e7HMTJTzgVvIOtTtBo5sSr3R6JpX0n+AfEXIE0CgYAR12AhG3biApJovUx1Fx5IiQrMXxPbwQXJTRbNFeII0X+299MfM+whadKEbFKs6tcL738nvbx+QeueVMNfWcLX/K72p/cnYR1tmDGTBmnjnKPuAZ7NatKBISe79ikHRSh64cEGNv9+rPynNei4kOnpwepQBuk8icOk0OmeZe6WkQKBgQDO221uZSXYW0lVoPJHiM8UW6l+3meue4u7sr79DxEO99P2i34rwhdSEeVwmu3RVoXHbvV8eEQb6zyM+l14Uv+rPnoSOnm+JJ/qaxVBtASHM3/kPnm5W4Uky0ZHBlrxJ+g5PCnj6vfGlbrebh0fbzGExCnCLHEddGkY60Gb3CrYyQKBgQCqAqg9InHjP0ma+Co7ptHYAzm46+Jq7QowsCl07SoTujVf9qaYpohdhqp8kXVonwUrQQ+PEwvtK4ORGA3FIPgfDXaV5g7gThsTGTZ11GAKuzdtQSCPRuRR1+wcxZaGF0WfLJw1Jvd8vKEt2qBJ+Jrlj4rnH2mZ9n3ZFEof14L7iQ=="

@register('LYTestRSA')
class LYTestRSA extends LYRSA {
protected getPublicKey(): Promise {
return Promise.resolve(key);
}

protected getPrivateKey(): Promise<string> {
	return Promise.resolve(pKey);
}

}

describe.only('LYEnv', function () {
this.timeout(3000000);

const RSA = new LYTestRSA();

it('encrypt & decrypt', async () => {
	for (let i = 0; i < 10000; i++) {
		console.log(i)
		const data = 'ngzCT7HX5GK3gLaT';
		const encrypt = await RSA.encrypt(data);
		const decrypt = await RSA.decrypt(encrypt);
		assert.equal(decrypt, data);
	}
});

});
`

image

@yuanchangjian
Copy link
Author

import { KJUR, hextob64, KEYUTIL, b64utohex, RSAKey } from 'jsrsasign';

@yuanchangjian
Copy link
Author

image

@yuanchangjian
Copy link
Author

image

@kjur
Copy link
Owner

kjur commented Apr 11, 2023

I've tried encryption and decryption with your keys and data without your Promise codes 100 times. Then they didn't fail.

#!/usr/bin/env node
var rs = require("jsrsasign");

const key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQAB";
const pKey = "MIIEpAIBAAKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQABAoIBAHHckKZu/uAl0edaq6lHcqjZMkMQj+OmSV1Z3W+ksQKhy+F+9lD4XJzJYPHnNEhixSRLsoQkSCRYOWkqHrOJoHnRSPI5FenzX6XR8dy3yyZZnQXJ5GFwlPzqICkray58L/vFZdkeYDdssK1ZsVOZ1M3HRYF0lL0xvN+9KsjmTZO3qtG6yt8pL7EZW19AfZFEuNdD6EEV2cEB4zPT0gRWh+uAIIu+XYnSy4dEAqksQM/iiJ+CMrxJceTatfKLPXUdC8qI+IuUiUDwZLsu15C3G0E06DMk10wCSZjZEgDTM5hqWPUWahpUh5lQDW64zlZM3qm/cxcqfA3+VOMlagc/I7ECgYEA+Ft1QoiXPoCRCVYyJ8eiBS7xuMLk91kKyLF8vzi4XwXmy46T2TuPMGRDw+gGl65vS2TfHaD23VS12G90Jv6YyBOEo/A4g9ImpSwblI2kwl3vnR7t5R46gWUveed54QQec9UloEzfB9s0pXDhP9Eng1yo4yOFhC/cQKDd0I9jNUUCgYEA8YH8Mhq+dDmwaf8tvoG/3cEAF/g45qrY1wfPjFYhZGrgGKkpc6DmYTeugYCJFx+VBOtrA7O23lAjuAxhGLYE74KE0tzNQzSXllG0aJG++1Ive6DNu7UXXELaWYjxacojMbPH2e7HMTJTzgVvIOtTtBo5sSr3R6JpX0n+AfEXIE0CgYAR12AhG3biApJovUx1Fx5IiQrMXxPbwQXJTRbNFeII0X+299MfM+whadKEbFKs6tcL738nvbx+QeueVMNfWcLX/K72p/cnYR1tmDGTBmnjnKPuAZ7NatKBISe79ikHRSh64cEGNv9+rPynNei4kOnpwepQBuk8icOk0OmeZe6WkQKBgQDO221uZSXYW0lVoPJHiM8UW6l+3meue4u7sr79DxEO99P2i34rwhdSEeVwmu3RVoXHbvV8eEQb6zyM+l14Uv+rPnoSOnm+JJ/qaxVBtASHM3/kPnm5W4Uky0ZHBlrxJ+g5PCnj6vfGlbrebh0fbzGExCnCLHEddGkY60Gb3CrYyQKBgQCqAqg9InHjP0ma+Co7ptHYAzm46+Jq7QowsCl07SoTujVf9qaYpohdhqp8kXVonwUrQQ+PEwvtK4ORGA3FIPgfDXaV5g7gThsTGTZ11GAKuzdtQSCPRuRR1+wcxZaGF0WfLJw1Jvd8vKEt2qBJ+Jrlj4rnH2mZ9n3ZFEof14L7iQ==";
var data = "ngzCT7HX5GK3gLaT";

let pubkey = rs.KEYUTIL.getKey(rs.b64topem(key, "PUBLIC KEY"));
let prvkey = rs.KEYUTIL.getKey(rs.b64topem(pKey, "RSA PRIVATE KEY"));

let countSuccess = 0;
for (let i = 0; i < 100; i++) {
    //console.log(data);
    let hEnc = rs.KJUR.crypto.Cipher.encrypt(data, pubkey, "RSAOAEP256");
    //console.log(hEnc);
    let sDec = rs.KJUR.crypto.Cipher.decrypt(hEnc, prvkey, "RSAOAEP256");
    //console.log(sDec);
    if (data == sDec) countSuccess++;
}
console.log(`SUCCESS=${countSuccess} FAIL=${100 - countSuccess}`);

This shows:

SUCCESS=100 FAIL=0

It seems to having issue in your code. Thank you.

@kjur kjur closed this as completed Apr 11, 2023
@yuanchangjian
Copy link
Author

I've tried encryption and decryption with your keys and data without your Promise codes 100 times. Then they didn't fail.

#!/usr/bin/env node
var rs = require("jsrsasign");

const key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQAB";
const pKey = "MIIEpAIBAAKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQABAoIBAHHckKZu/uAl0edaq6lHcqjZMkMQj+OmSV1Z3W+ksQKhy+F+9lD4XJzJYPHnNEhixSRLsoQkSCRYOWkqHrOJoHnRSPI5FenzX6XR8dy3yyZZnQXJ5GFwlPzqICkray58L/vFZdkeYDdssK1ZsVOZ1M3HRYF0lL0xvN+9KsjmTZO3qtG6yt8pL7EZW19AfZFEuNdD6EEV2cEB4zPT0gRWh+uAIIu+XYnSy4dEAqksQM/iiJ+CMrxJceTatfKLPXUdC8qI+IuUiUDwZLsu15C3G0E06DMk10wCSZjZEgDTM5hqWPUWahpUh5lQDW64zlZM3qm/cxcqfA3+VOMlagc/I7ECgYEA+Ft1QoiXPoCRCVYyJ8eiBS7xuMLk91kKyLF8vzi4XwXmy46T2TuPMGRDw+gGl65vS2TfHaD23VS12G90Jv6YyBOEo/A4g9ImpSwblI2kwl3vnR7t5R46gWUveed54QQec9UloEzfB9s0pXDhP9Eng1yo4yOFhC/cQKDd0I9jNUUCgYEA8YH8Mhq+dDmwaf8tvoG/3cEAF/g45qrY1wfPjFYhZGrgGKkpc6DmYTeugYCJFx+VBOtrA7O23lAjuAxhGLYE74KE0tzNQzSXllG0aJG++1Ive6DNu7UXXELaWYjxacojMbPH2e7HMTJTzgVvIOtTtBo5sSr3R6JpX0n+AfEXIE0CgYAR12AhG3biApJovUx1Fx5IiQrMXxPbwQXJTRbNFeII0X+299MfM+whadKEbFKs6tcL738nvbx+QeueVMNfWcLX/K72p/cnYR1tmDGTBmnjnKPuAZ7NatKBISe79ikHRSh64cEGNv9+rPynNei4kOnpwepQBuk8icOk0OmeZe6WkQKBgQDO221uZSXYW0lVoPJHiM8UW6l+3meue4u7sr79DxEO99P2i34rwhdSEeVwmu3RVoXHbvV8eEQb6zyM+l14Uv+rPnoSOnm+JJ/qaxVBtASHM3/kPnm5W4Uky0ZHBlrxJ+g5PCnj6vfGlbrebh0fbzGExCnCLHEddGkY60Gb3CrYyQKBgQCqAqg9InHjP0ma+Co7ptHYAzm46+Jq7QowsCl07SoTujVf9qaYpohdhqp8kXVonwUrQQ+PEwvtK4ORGA3FIPgfDXaV5g7gThsTGTZ11GAKuzdtQSCPRuRR1+wcxZaGF0WfLJw1Jvd8vKEt2qBJ+Jrlj4rnH2mZ9n3ZFEof14L7iQ==";
var data = "ngzCT7HX5GK3gLaT";

let pubkey = rs.KEYUTIL.getKey(rs.b64topem(key, "PUBLIC KEY"));
let prvkey = rs.KEYUTIL.getKey(rs.b64topem(pKey, "RSA PRIVATE KEY"));

let countSuccess = 0;
for (let i = 0; i < 100; i++) {
    //console.log(data);
    let hEnc = rs.KJUR.crypto.Cipher.encrypt(data, pubkey, "RSAOAEP256");
    //console.log(hEnc);
    let sDec = rs.KJUR.crypto.Cipher.decrypt(hEnc, prvkey, "RSAOAEP256");
    //console.log(sDec);
    if (data == sDec) countSuccess++;
}
console.log(`SUCCESS=${countSuccess} FAIL=${100 - countSuccess}`);

This shows:

SUCCESS=100 FAIL=0

It seems to having issue in your code. Thank you.

image

Adding a little bit more frequency will make it appear

@yuanchangjian
Copy link
Author

image

I encountered an issue when I increased the loop count using the use case you provided. Could you please try increasing the loop count and see if the issue persists?

@yuanchangjian
Copy link
Author

@kjur

@kjur kjur reopened this Apr 12, 2023
@kjur
Copy link
Owner

kjur commented Apr 13, 2023

Hello @davedoesdev ,

Thank you so much for your contribution for RSA OAEP encryption and decryption. As reported above, your OAEP encryption function will occasionally generate wrong encrypted data which can't be decrypted. Failure rate is approxmately 0.5% or so.

Could you help me to fix it?

Here is a test code to reproduce the issue:

#!/usr/bin/env node

var rs = require("jsrsasign");

const key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQAB";
const pKey = "MIIEpAIBAAKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQABAoIBAHHckKZu/uAl0edaq6lHcqjZMkMQj+OmSV1Z3W+ksQKhy+F+9lD4XJzJYPHnNEhixSRLsoQkSCRYOWkqHrOJoHnRSPI5FenzX6XR8dy3yyZZnQXJ5GFwlPzqICkray58L/vFZdkeYDdssK1ZsVOZ1M3HRYF0lL0xvN+9KsjmTZO3qtG6yt8pL7EZW19AfZFEuNdD6EEV2cEB4zPT0gRWh+uAIIu+XYnSy4dEAqksQM/iiJ+CMrxJceTatfKLPXUdC8qI+IuUiUDwZLsu15C3G0E06DMk10wCSZjZEgDTM5hqWPUWahpUh5lQDW64zlZM3qm/cxcqfA3+VOMlagc/I7ECgYEA+Ft1QoiXPoCRCVYyJ8eiBS7xuMLk91kKyLF8vzi4XwXmy46T2TuPMGRDw+gGl65vS2TfHaD23VS12G90Jv6YyBOEo/A4g9ImpSwblI2kwl3vnR7t5R46gWUveed54QQec9UloEzfB9s0pXDhP9Eng1yo4yOFhC/cQKDd0I9jNUUCgYEA8YH8Mhq+dDmwaf8tvoG/3cEAF/g45qrY1wfPjFYhZGrgGKkpc6DmYTeugYCJFx+VBOtrA7O23lAjuAxhGLYE74KE0tzNQzSXllG0aJG++1Ive6DNu7UXXELaWYjxacojMbPH2e7HMTJTzgVvIOtTtBo5sSr3R6JpX0n+AfEXIE0CgYAR12AhG3biApJovUx1Fx5IiQrMXxPbwQXJTRbNFeII0X+299MfM+whadKEbFKs6tcL738nvbx+QeueVMNfWcLX/K72p/cnYR1tmDGTBmnjnKPuAZ7NatKBISe79ikHRSh64cEGNv9+rPynNei4kOnpwepQBuk8icOk0OmeZe6WkQKBgQDO221uZSXYW0lVoPJHiM8UW6l+3meue4u7sr79DxEO99P2i34rwhdSEeVwmu3RVoXHbvV8eEQb6zyM+l14Uv+rPnoSOnm+JJ/qaxVBtASHM3/kPnm5W4Uky0ZHBlrxJ+g5PCnj6vfGlbrebh0fbzGExCnCLHEddGkY60Gb3CrYyQKBgQCqAqg9InHjP0ma+Co7ptHYAzm46+Jq7QowsCl07SoTujVf9qaYpohdhqp8kXVonwUrQQ+PEwvtK4ORGA3FIPgfDXaV5g7gThsTGTZ11GAKuzdtQSCPRuRR1+wcxZaGF0WfLJw1Jvd8vKEt2qBJ+Jrlj4rnH2mZ9n3ZFEof14L7iQ==";
var data = "ngzCT7HX5GK3gLaT";

let pubkey = rs.KEYUTIL.getKey(rs.b64topem(key, "PUBLIC KEY"));
let prvkey = rs.KEYUTIL.getKey(rs.b64topem(pKey, "RSA PRIVATE KEY"));

let numTry = 1000;
let countSuccess = 0;
let countException = 0;
for (let i = 0; i < numTry; i++) {
    let hEnc, sDec;
    hEnc = pubkey.encryptOAEP(data, "sha256");
    try {
	sDec = prvkey.decryptOAEP(hEnc, "sha256");
	if (data == sDec) countSuccess++;
    } catch(ex) {
	console.log("DECRYPT FAILED");
	console.log(hEnc);
	countException++;
    }
}
console.log(`SUCCESS=${countSuccess} FAIL=${numTry - countSuccess - countException} EXCEPTION=${countException}`);

And below is its output:

DECRYPT FAILED
6a521cca0e3e0868e832804a9120e70c36d42c66091b7c18a64afc65ce17f59663bb4b58ea1bcd2ed4567b0052a68a3baeb6cd15b20b4f90cae371236ef4bf9c87c63438cd223e0962b86a973af9d3b58ccce453fe9fe79fae38a925569a32ff9a1d4a162acf4b401dbe2bad478d026bed4276df5ea41abddb7869c72df87ef0a8904819e99707f63bb8c28d834c092c8a848543eb7d08c5e2290d14173e93651a84bed20ed22ddd3ae346f6b9cbcdcb8af8e09385c966a8e54ea1978120dce28b544e58352ae3cc8b16ccc2d3e62d99a4ad32b6df026e1ccd16976c5598e9b821d83aa7884cea85db2b1be7357c05aa675c2d999290e648d4a14d7c2f33d2
DECRYPT FAILED
b05cb71730e546ebd346e8654b1881879c99dac51bb6baf5c815a4c298f38ae2cd637728b887026e0395e85a6ed3a8cc320cd66645a6905db4a7df108fad0f81f81c7eceb6732cc264a883342a0460a1d6237d0ab94c5a4edb2a2dd798688252f0cdacfe0368be8abcbdb97ef857b8a6f0d677d66472361aa79e9f5bde9160acf1c7f941b6f93e19a38432e115dda69113934807628e0b0905f6e359fb2b27c066103d279bcdb255b73aa55bc8ce0f158db0f5f629f86896958f7b687102e18a7a18d04d6a472b803a68d462242eefeefb8b0a684ca8905700223f4c9f1d2486344ee2735252f7e86aec1797355b343ed489e67dcd395fb88fffe3ece624d9
DECRYPT FAILED
263f463cdb7be8680091b098facd2210da443820006982239b8cb3f46c58e3c5753c52d1143c369898ae145aef68b5283b0b57bcffad42d21209b9efe9fa9a6c8b4900c3e02645d0b815a042975bc88f45cec33eb77e5bd2f1439029872531263d32d5d7bd8300a87f88f2f235e7a5d8a79eb7202633cb6d132ca1d4b2ba2a0cfb2a4682981e484b756e3ac3009a18db73032c43fe74aa4f2607173e23777e664d1b2db5b6e2a10f968f4c3c74d99beb648f570f533ca99ef738eefd38b0f1ce86e976ac4f1183ec460d9e34155cfcb62aa0df8ff107accb1ff1dab8ab8ebcdfe915c68984a98e16ea48604cbdd79541d051110533db09e30f45e75a15f698
DECRYPT FAILED
4b69ada7f41fa0d7dfab59a727d1d0b079d1c3e4fe8fa88d37ba047f946b90f23d76439f8341831d1b71109aecf5e767ccdb68be74895c7dbb1def047d1e7c2d011360cef616c81b58c7bced7e835b250cfac44af0a4a00b9431107ee537f3ec961357b550a282c4281be9766256ce8f07a405497a751d7726ef1dafe632ac1ece6f2c9998f984b0fae1ecca2c437d578e7ce1e8921c4277d33c4caf42f0d67843f7880066ee0191ce8035c4a39c48a94a2df7c80efff9ee63f6fc0ee3c33c62fd9f6731b3c5b0e1b834c7955fb69ebef9a438a61da61ff1c3c025f264b6e2566aa0b3ebdde49d36aa05ac1a6e3bfc3aa717dd86e69286939952cf086c9df0
DECRYPT FAILED
8c13344968905a02a867b05a9e1fd12f9d2d18966d84db1cd50ae36c549dae326a2c9f369572f2c4639624495c3a85171c758965f4608233422bc1cda3f2b4d87c21233f7338bbba0914ca8fe38102336068393c12b09e8977a9154522eadefde47d9b3ab897dd81618d79e099832b0ff4890659180ae70499b9bd9b020ac276d9780f4f82c028c4deb4b07c88ffd7b9da0b8eb0d93af26ac3f8531fcd5fbea03ead52941001fc0a1964d664333b8cc03397e637a138b38dd1b4b244f6d7b03c68b12053dc28c57c608c27247de3938cb583acfd11be916c0d0594240b395b950fe3327e0d05e8f777425816ab0fa2cd5fa5b42f806f1d32d9310e7de84400
DECRYPT FAILED
0e12454f6c1d2cdf7e6e982066b49c7edbf24d23ef393dacaf81d9dbb073961c9dc918e90c75f31e3a877e83b04eef3cb2e4fddd3d474bd526623bae5e6bc808bbd1622be7ea6a2e25aa333706cdc2821b7f68c02f8536ce3d51be0db6f3f260c1b2e103ebf5c78d0035515488e5a8500c46d28ccec096e4b3d26d0a1f67a05978a8fa77228d464aa48e90d0d27af0e9db5b1e7a5ddb64294bf7f3fdddcf8b34d34c3aeba17b05dc42b368452e32507f5c1a3047b9d882305369e79357e1b9cf0a541a91059b48197cd64e3486428d3dbcf1eb38a34e79f687ca0778cc0e3056f11fa67b9c45c7e4a34388919fd8c0b4b8af594fa0ccd31d9ca66f4dd30213
DECRYPT FAILED
ed47cabb9e654ae69a9c6b9899ab7007ffbb70c0226d5be10b9e56101fbb295cd12a173c581c139fcc8cda25df9f8ed5dc2894a808114af9629ef2f5260d02b7366ffe41630e1fd31f1bc6d6d758bf2f6198390133ebcff94b82b88b798e062695c37954b21692f5cc8f6cd555f2c34296706a75d84e3a6e893d663f7326cf472e08a31d3bc4f4659b3bd831a1607ec7c4cf3aad09e7f55f975eee2b081391870e237f2163dfa4219bc540dfbf0d7274637f8037949a1a0f87a8cb4f9607cf4900985c57f9d48c1394ea90c46a65f85165a7d7a4b6ba994ef9f510b8e98ddfc8fbbf6dcfe735bf7ed1d2e0448bc5a98af23471a2a7065ce92b9734c465838a
DECRYPT FAILED
bcc03ea3aa3efb89f9626dd4531cc918b3586d7a2d942c434b832c79b673e2d82f877f679f413d0426caa2978c377ecc865d7a165ee8afa637f65e20bbd7968118ef6190db2bd24cd591e394eeb812b939eda7c8a1dfc4b1bbdc16e105790751106c424ef7546479724b2b9c30a838660b6de26504ae6cc65bb373f0c1aa0aa3f4921d2fe3c8badbeb14dbc59332ffe461457ada3a8bb3784f402063b2cc47ff4d6705b64b3f1cf1f2e1412b377445e5617ec015db45c3409de5f00de56767eab6680c579fee7ed59cd27840422f6cb8bf8220966ba0edd5a12941d6a78d90c07d3059010d3e0a1b84897af05b75c2d3bf61b0fdc1d6cbe3b4a8acb13be544
DECRYPT FAILED
fbb3abf1b56094d5c6ffbaaaac0967464e10fad8f801b2e9ac45a82bd1f6a55c56ea9e248ac5d5e7db164bfdbf86f9a23d15390ec14d9413e9da8250f998441a1f55a7a07128877d8ee2049023fbd61b38a3c9720b110cadec342ef8fba9c21b96260e6b29098a131ec8b3cdc92064cad1f6ed866a54c86e2d401203f00ec58e70f1db02dd17b4eae74443cc5256136fcd05b5691953e734a28579aad148aa6b895a52068aaf8745ffc87685070946ab7fa7b22288051638fede2d7d884516c92cc79193cb15f35ca6fecafd448bc66af9b71ff0eb5145a812704918a7c5b51c790c2f63d3876b446e9659690a4b30b90bdc3c66e42aa6e6881c4604069424
SUCCESS=991 FAIL=0 EXCEPTION=9

@davedoesdev
Copy link
Contributor

Sure, I'll take a look. Might be a few days though.

@davedoesdev
Copy link
Contributor

davedoesdev commented Apr 14, 2023

@kjur How do I build jsrsasign-all-min.js?

@kjur
Copy link
Owner

kjur commented Apr 14, 2023

Hi @davedoesdev ,

I've attached some script to generate jsrsasign.js or jsrsasign-all-min.js without minification.
mktestlib.zip

These scripts will generate "lib/jsrsasign.js" and "lib/jsrsasign-all-min.js".

USAGE

  1. copy this archive to npm directory
    % cp mktestlib.zip npm/

  2. unzip it
    % unzip mktestlib.zip

  3. to generate lib/jsrsasign-all-min.js
    % mktestlib_libjsrsasignallmin.sh
    Then file "testlib_libjsrsasignallmin.js" will be generated.
    This can be replacement of "lib/jsrsasign-all-min.js".

  4. to generate lib/jsrsasign.js
    % mktestlib_libjsrsasign.sh
    Then file "testlib_libjsrsasign.js" will be generated.
    This can be replacement of "lib/jsrsasign.js".

@kjur
Copy link
Owner

kjur commented Apr 14, 2023

Hi @davedoesdev san,

Current lib/jsrsasign.js and lib/jsrsasign-all-min.js generator depend on old and wrong "YUI compressor" and I think it would be better not to introduce you such generator. For your debugging, above scripts may enough.

@kjur
Copy link
Owner

kjur commented Apr 14, 2023

Otherwise I can write a QUnit test script for the issue like other test/qunit-*.html test scripts. Please ask me if you want it.

kjur added a commit that referenced this issue Apr 15, 2023
@kjur
Copy link
Owner

kjur commented Apr 15, 2023

Hi @yuanchangjian , this issue was fixed in 10.8.2 release today.

Hi @davedoesdev san, thank you kindly for your help.

@kjur kjur closed this as completed Apr 15, 2023
@kjur
Copy link
Owner

kjur commented Apr 15, 2023

Just FYI. Here is mocha test code for 10,000 times RSA OAEP encryption and decryption. It takes too much time so that it is not included in the release:

// for issue 582, 583
var assert = require('assert');
var rs = require('../lib/jsrsasign.js');

const pubb64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQAB";
const prvb64 = "MIIEpAIBAAKCAQEA6kw0JFxZqgxISVe54G+ZHeyOoIpGr++DqplOQuijlR48GhkPjYd99J5DwQQXwb8lbNUPU7iwlQ7sqfNAMjk/CXmMM56th/jPlMEydZuzn+/SmNMPsVUd+Cn3dUMQMhZZZcNkFZuVuIzTSQsrjUah7dGdiozsKyriBbksiehO2i7Vc61PlTJOU/1PCgKHjsaw5qzB9Qfh2R/esM9miuiOKEiA4kupij3w7GTwi6NZ/VjSD+2uDgCpaIWjhxJQIT6kzE6hjx12wV94eMkKvkv9F/sZGmCBefFVzvahUmINTe4xGdainQ7aHZkYdHWJpnFm7N/u/MdNMAmawLv8RbKlwQIDAQABAoIBAHHckKZu/uAl0edaq6lHcqjZMkMQj+OmSV1Z3W+ksQKhy+F+9lD4XJzJYPHnNEhixSRLsoQkSCRYOWkqHrOJoHnRSPI5FenzX6XR8dy3yyZZnQXJ5GFwlPzqICkray58L/vFZdkeYDdssK1ZsVOZ1M3HRYF0lL0xvN+9KsjmTZO3qtG6yt8pL7EZW19AfZFEuNdD6EEV2cEB4zPT0gRWh+uAIIu+XYnSy4dEAqksQM/iiJ+CMrxJceTatfKLPXUdC8qI+IuUiUDwZLsu15C3G0E06DMk10wCSZjZEgDTM5hqWPUWahpUh5lQDW64zlZM3qm/cxcqfA3+VOMlagc/I7ECgYEA+Ft1QoiXPoCRCVYyJ8eiBS7xuMLk91kKyLF8vzi4XwXmy46T2TuPMGRDw+gGl65vS2TfHaD23VS12G90Jv6YyBOEo/A4g9ImpSwblI2kwl3vnR7t5R46gWUveed54QQec9UloEzfB9s0pXDhP9Eng1yo4yOFhC/cQKDd0I9jNUUCgYEA8YH8Mhq+dDmwaf8tvoG/3cEAF/g45qrY1wfPjFYhZGrgGKkpc6DmYTeugYCJFx+VBOtrA7O23lAjuAxhGLYE74KE0tzNQzSXllG0aJG++1Ive6DNu7UXXELaWYjxacojMbPH2e7HMTJTzgVvIOtTtBo5sSr3R6JpX0n+AfEXIE0CgYAR12AhG3biApJovUx1Fx5IiQrMXxPbwQXJTRbNFeII0X+299MfM+whadKEbFKs6tcL738nvbx+QeueVMNfWcLX/K72p/cnYR1tmDGTBmnjnKPuAZ7NatKBISe79ikHRSh64cEGNv9+rPynNei4kOnpwepQBuk8icOk0OmeZe6WkQKBgQDO221uZSXYW0lVoPJHiM8UW6l+3meue4u7sr79DxEO99P2i34rwhdSEeVwmu3RVoXHbvV8eEQb6zyM+l14Uv+rPnoSOnm+JJ/qaxVBtASHM3/kPnm5W4Uky0ZHBlrxJ+g5PCnj6vfGlbrebh0fbzGExCnCLHEddGkY60Gb3CrYyQKBgQCqAqg9InHjP0ma+Co7ptHYAzm46+Jq7QowsCl07SoTujVf9qaYpohdhqp8kXVonwUrQQ+PEwvtK4ORGA3FIPgfDXaV5g7gThsTGTZ11GAKuzdtQSCPRuRR1+wcxZaGF0WfLJw1Jvd8vKEt2qBJ+Jrlj4rnH2mZ9n3ZFEof14L7iQ==";
const data = "ngzCT7HX5GK3gLaT";

describe("rsa oaep enc dec loop", function() {
    describe("test", function() {
        let pubkey = rs.KEYUTIL.getKey(rs.b64topem(pubb64, "PUBLIC KEY"));
        let prvkey = rs.KEYUTIL.getKey(rs.b64topem(prvb64, "RSA PRIVATE KEY"));

        let numTry = 10000;
        //let numTry = 1;
        let countSuccess = 0;
        let countException = 0;
        for (let i = 0; i < numTry; i++) {
            let hEnc, sDec;
            hEnc = pubkey.encryptOAEP(data, "sha256");
            //console.log(hEnc);
            try {
                sDec = prvkey.decryptOAEP(hEnc, "sha256");
                if (data == sDec) countSuccess++;
            } catch(ex) {
                console.log(ex);
                countException++;
            }
        }
        //console.log(`${countSuccess} ${countException}`);
        assert.equal(countSuccess, numTry);
        assert.equal(countException, 0);
    });
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants