1
1
const { ethers } = require ( 'hardhat' ) ;
2
2
const { expect } = require ( 'chai' ) ;
3
3
const { loadFixture } = require ( '@nomicfoundation/hardhat-network-helpers' ) ;
4
+ const { bytes, bytes32 } = ethers . Typed ;
4
5
5
6
const parse = require ( './RSA.helper' ) ;
6
7
@@ -24,7 +25,7 @@ describe('RSA', function () {
24
25
// const { sha224, sha256 } = require('@noble/hashes/sha256');
25
26
// const { sha384, sha512 } = require('@noble/hashes/sha512');
26
27
27
- if ( test . SHAAlg === 'SHA256' ) {
28
+ if ( test . SHAAlg === 'SHA256' && length >= 0x100 ) {
28
29
const result = test . Result === 'P' ;
29
30
30
31
it ( `signature length ${ length } ${ test . extra } ${ result ? 'works' : 'fails' } ` , async function ( ) {
@@ -33,65 +34,69 @@ describe('RSA', function () {
33
34
const exp = '0x' + test . e ;
34
35
const mod = '0x' + test . n ;
35
36
36
- expect ( await this . mock . $pkcs1 ( ethers . sha256 ( data ) , sig , exp , mod ) ) . to . equal ( result ) ;
37
- expect ( await this . mock . $pkcs1Sha256 ( data , sig , exp , mod ) ) . to . equal ( result ) ;
37
+ expect ( await this . mock . $pkcs1Sha256 ( bytes32 ( ethers . sha256 ( data ) ) , sig , exp , mod ) ) . to . equal ( result ) ;
38
+ expect ( await this . mock . $pkcs1Sha256 ( bytes ( data ) , sig , exp , mod ) ) . to . equal ( result ) ;
38
39
} ) ;
39
40
}
40
41
}
41
42
} ) ;
42
43
43
44
describe ( 'others tests' , function ( ) {
44
- it ( 'openssl' , async function ( ) {
45
- const data = ethers . toUtf8Bytes ( 'hello world' ) ;
46
- const sig =
47
- '0x079bed733b48d69bdb03076cb17d9809072a5a765460bc72072d687dba492afe951d75b814f561f253ee5cc0f3d703b6eab5b5df635b03a5437c0a5c179309812f5b5c97650361c645bc99f806054de21eb187bc0a704ed38d3d4c2871a117c19b6da7e9a3d808481c46b22652d15b899ad3792da5419e50ee38759560002388' ;
48
- const exp =
49
- '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001' ;
50
- const mod =
51
- '0xdf3edde009b96bc5b03b48bd73fe70a3ad20eaf624d0dc1ba121a45cc739893741b7cf82acf1c91573ec8266538997c6699760148de57e54983191eca0176f518e547b85fe0bb7d9e150df19eee734cf5338219c7f8f7b13b39f5384179f62c135e544cb70be7505751f34568e06981095aeec4f3a887639718a3e11d48c240d' ;
52
- expect ( await this . mock . $pkcs1Sha256 ( data , sig , exp , mod ) ) . to . be . true ;
53
- } ) ;
45
+ // > openssl genrsa -out private.pem 2048
46
+ // > openssl rsa -in private.pem -outform der -pubout -out public.pem
47
+ // > openssl asn1parse -in public.pem -inform DER -strparse 19
48
+ // > echo -n 'hello world!' | openssl dgst -sha256 -sign private.pem | xxd -p | tr -d \\n
49
+ const openssl = {
50
+ descr : 'openssl' ,
51
+ data : ethers . toUtf8Bytes ( 'hello world!' ) ,
52
+ sig : '0x2ff4349940bf0db9bce422e316ac47e3d24b0a869acb05c9c46f74e17491177698b150f2a5996a6bf7d7c73e05af91ad78632115a7d95b823c462596486e56e8473b75a270ca4760cd83f244d5d3af81d2c7d188879abbc2992b22d51e22ffb725f0828c852ee44f81def383e0f92ebfa3c6d97ca5e52a4254f9a886680e3fb394c2a8a955849313dce2cb416f8a67974effd9a17d229146ce10a98684fb3d46a1e53ddaf831cdd2beed895532533c554ae087b2738a5c4cf0802e8062b2a599fd76d67b92eabffa8a92b24e08fbc866217502a4a3d9f6157e491bede3c1048fa8f2d804f66128e8a883018b0ec33a59e1086bf71ae5dc193d9815ca82892dbc' ,
53
+ exp : '0x010001' ,
54
+ mod : '0xDC1CE5F7B202464CD320B4F9E44FEE0A358BE7022AB155A5BDEE45B1AED3C5A19645D898E294CBA96EAD6929FD8FB4B23E9ADB4D3143A736232C32A8617A77B89F7D8399B9BE37F8349D111067F71D2F20237B9F1A7C1CF44819F9FA5AA030F563DCFB1CC59FFAA86BA2ABEE28D949FED0DF34071B7558950079E28CD9BBA4CAC2F0F86D7BBFB13363C792B5A70C9B279F0B43A264A7CB1A7C7C41FC6EC1D1C1125A6BECE3207AE582F74CE896B9AC18DB00C8985B70145217B831CC313FC06581E186BF70A2EEE2C3C065B5C91A89B2C099B4924CDBF5707D161BD83AC8D9FCA309AC75D63EACF21027C2C9C9F05994331CBDFDD24F9BC6C8B58D8F1824540B' ,
55
+ result : true ,
56
+ } ;
54
57
55
58
// According to RFC4055, pg.5 and RFC8017, pg. 64, for SHA-1, and the SHA-2 family,
56
59
// the algorithm parameter has to be NULL and both explicit NULL parameter and implicit
57
60
// NULL parameter (ie, absent NULL parameter) are considered to be legal and equivalent.
58
- it ( 'rfc8017 implicit null parameter' , async function ( ) {
59
- const data = ethers . toUtf8Bytes ( 'hello world!' ) ;
60
- const sig =
61
- '0xa0073057133ff3758e7e111b4d7441f1d8cbe4b2dd5ee4316a14264290dee5ed7f175716639bd9bb43a14e4f9fcb9e84dedd35e2205caac04828b2c053f68176d971ea88534dd2eeec903043c3469fc69c206b2a8694fd262488441ed8852280c3d4994e9d42bd1d575c7024095f1a20665925c2175e089c0d731471f6cc145404edf5559fd2276e45e448086f71c78d0cc6628fad394a34e51e8c10bc39bfe09ed2f5f742cc68bee899d0a41e4c75b7b80afd1c321d89ccd9fe8197c44624d91cc935dfa48de3c201099b5b417be748aef29248527e8bbb173cab76b48478d4177b338fe1f1244e64d7d23f07add560d5ad50b68d6649a49d7bc3db686daaa7' ;
62
- const exp = '0x03' ;
63
- const mod =
64
- '0xe932ac92252f585b3a80a4dd76a897c8b7652952fe788f6ec8dd640587a1ee5647670a8ad4c2be0f9fa6e49c605adf77b5174230af7bd50e5d6d6d6d28ccf0a886a514cc72e51d209cc772a52ef419f6a953f3135929588ebe9b351fca61ced78f346fe00dbb6306e5c2a4c6dfc3779af85ab417371cf34d8387b9b30ae46d7a5ff5a655b8d8455f1b94ae736989d60a6f2fd5cadbffbd504c5a756a2e6bb5cecc13bca7503f6df8b52ace5c410997e98809db4dc30d943de4e812a47553dce54844a78e36401d13f77dc650619fed88d8b3926e3d8e319c80c744779ac5d6abe252896950917476ece5e8fc27d5f053d6018d91b502c4787558a002b9283da7' ;
65
- expect ( await this . mock . $pkcs1Sha256 ( data , sig , exp , mod ) ) . to . be . true ;
66
- } ) ;
61
+ const rfc4055 = {
62
+ descr : 'rfc8017 implicit null parameter' ,
63
+ data : ethers . toUtf8Bytes ( 'hello world!' ) ,
64
+ sig : '0xa0073057133ff3758e7e111b4d7441f1d8cbe4b2dd5ee4316a14264290dee5ed7f175716639bd9bb43a14e4f9fcb9e84dedd35e2205caac04828b2c053f68176d971ea88534dd2eeec903043c3469fc69c206b2a8694fd262488441ed8852280c3d4994e9d42bd1d575c7024095f1a20665925c2175e089c0d731471f6cc145404edf5559fd2276e45e448086f71c78d0cc6628fad394a34e51e8c10bc39bfe09ed2f5f742cc68bee899d0a41e4c75b7b80afd1c321d89ccd9fe8197c44624d91cc935dfa48de3c201099b5b417be748aef29248527e8bbb173cab76b48478d4177b338fe1f1244e64d7d23f07add560d5ad50b68d6649a49d7bc3db686daaa7' ,
65
+ exp : '0x03' ,
66
+ mod : '0xe932ac92252f585b3a80a4dd76a897c8b7652952fe788f6ec8dd640587a1ee5647670a8ad4c2be0f9fa6e49c605adf77b5174230af7bd50e5d6d6d6d28ccf0a886a514cc72e51d209cc772a52ef419f6a953f3135929588ebe9b351fca61ced78f346fe00dbb6306e5c2a4c6dfc3779af85ab417371cf34d8387b9b30ae46d7a5ff5a655b8d8455f1b94ae736989d60a6f2fd5cadbffbd504c5a756a2e6bb5cecc13bca7503f6df8b52ace5c410997e98809db4dc30d943de4e812a47553dce54844a78e36401d13f77dc650619fed88d8b3926e3d8e319c80c744779ac5d6abe252896950917476ece5e8fc27d5f053d6018d91b502c4787558a002b9283da7' ,
67
+ result : true ,
68
+ } ;
67
69
68
- it ( 'returns false for a very short n' , async function ( ) {
69
- const data = ethers . toUtf8Bytes ( 'hello world!' ) ;
70
- const sig = '0x0102' ;
71
- const exp = '0x03' ;
72
- const mod = '0x0405' ;
73
- expect ( await this . mock . $pkcs1Sha256 ( data , sig , exp , mod ) ) . to . be . false ;
74
- } ) ;
70
+ const shortN = {
71
+ descr : 'returns false for a very short n' ,
72
+ data : ethers . toUtf8Bytes ( 'hello world!' ) ,
73
+ sig : '0x0102' ,
74
+ exp : '0x03' ,
75
+ mod : '0x0405' ,
76
+ result : false ,
77
+ } ;
75
78
76
- it ( 'returns false for a signature with different length to n' , async function ( ) {
77
- const data = ethers . toUtf8Bytes ( 'hello world!' ) ;
78
- const sig = '0x00112233' ;
79
- const exp = '0x03' ;
80
- const mod =
81
- '0xe932ac92252f585b3a80a4dd76a897c8b7652952fe788f6ec8dd640587a1ee5647670a8ad4c2be0f9fa6e49c605adf77b5174230af7bd50e5d6d6d6d28ccf0a886a514cc72e51d209cc772a52ef419f6a953f3135929588ebe9b351fca61ced78f346fe00dbb6306e5c2a4c6dfc3779af85ab417371cf34d8387b9b30ae46d7a5ff5a655b8d8455f1b94ae736989d60a6f2fd5cadbffbd504c5a756a2e6bb5cecc13bca7503f6df8b52ace5c410997e98809db4dc30d943de4e812a47553dce54844a78e36401d13f77dc650619fed88d8b3926e3d8e319c80c744779ac5d6abe252896950917476ece5e8fc27d5f053d6018d91b502c4787558a002b9283da7' ;
82
- expect ( await this . mock . $pkcs1Sha256 ( data , sig , exp , mod ) ) . to . be . false ;
83
- } ) ;
79
+ const differentLength = {
80
+ descr : 'returns false for a signature with different length to n' ,
81
+ data : ethers . toUtf8Bytes ( 'hello world!' ) ,
82
+ sig : '0x00112233' ,
83
+ exp : '0x03' ,
84
+ mod : '0xe932ac92252f585b3a80a4dd76a897c8b7652952fe788f6ec8dd640587a1ee5647670a8ad4c2be0f9fa6e49c605adf77b5174230af7bd50e5d6d6d6d28ccf0a886a514cc72e51d209cc772a52ef419f6a953f3135929588ebe9b351fca61ced78f346fe00dbb6306e5c2a4c6dfc3779af85ab417371cf34d8387b9b30ae46d7a5ff5a655b8d8455f1b94ae736989d60a6f2fd5cadbffbd504c5a756a2e6bb5cecc13bca7503f6df8b52ace5c410997e98809db4dc30d943de4e812a47553dce54844a78e36401d13f77dc650619fed88d8b3926e3d8e319c80c744779ac5d6abe252896950917476ece5e8fc27d5f053d6018d91b502c4787558a002b9283da7' ,
85
+ result : false ,
86
+ } ;
84
87
85
- it ( 'returns false if s >= n' , async function ( ) {
86
- // this is the openssl example where sig has been replaced by sig + mod
87
- const data = ethers . toUtf8Bytes ( 'hello world' ) ;
88
- const sig =
89
- '0xe6dacb53450242618b3e502a257c08acb44b456c7931988da84f0cda8182b435d6d5453ac1e72b07c7dadf2747609b7d544d15f3f14081f9dbad9c48b7aa78d2bdafd81d630f19a0270d7911f4ec82b171e9a95889ffc9e740dc9fac89407a82d152ecb514967d4d9165e67ce0d7f39a3082657cdfca148a5fc2b3a7348c4795' ;
90
- const exp =
91
- '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001' ;
92
- const mod =
93
- '0xdf3edde009b96bc5b03b48bd73fe70a3ad20eaf624d0dc1ba121a45cc739893741b7cf82acf1c91573ec8266538997c6699760148de57e54983191eca0176f518e547b85fe0bb7d9e150df19eee734cf5338219c7f8f7b13b39f5384179f62c135e544cb70be7505751f34568e06981095aeec4f3a887639718a3e11d48c240d' ;
94
- expect ( await this . mock . $pkcs1Sha256 ( data , sig , exp , mod ) ) . to . be . false ;
95
- } ) ;
88
+ // this is the openssl example where sig has been replaced by sig + mod
89
+ const sTooLarge = {
90
+ ...openssl ,
91
+ descr : 'returns false if s >= n' ,
92
+ sig : ethers . toBeHex ( ethers . toBigInt ( openssl . sig ) + ethers . toBigInt ( openssl . mod ) ) ,
93
+ result : false ,
94
+ } ;
95
+
96
+ for ( const { descr, data, sig, exp, mod, result } of [ openssl , rfc4055 , shortN , differentLength , sTooLarge ] ) {
97
+ it ( descr , async function ( ) {
98
+ expect ( await this . mock . $pkcs1Sha256 ( bytes ( data ) , sig , exp , mod ) ) . to . equal ( result ) ;
99
+ } ) ;
100
+ }
96
101
} ) ;
97
102
} ) ;
0 commit comments