@@ -10,7 +10,6 @@ const {
10
10
encodeBase64,
11
11
toUtf8Bytes,
12
12
} = require ( 'ethers' ) ;
13
- const { secp256r1 } = require ( '@noble/curves/p256' ) ;
14
13
15
14
class ZKEmailSigningKey {
16
15
#domainName;
@@ -79,46 +78,34 @@ class ZKEmailSigningKey {
79
78
}
80
79
81
80
class WebAuthnSigningKey extends P256SigningKey {
82
- constructor ( privateKey ) {
83
- super ( privateKey ) ;
84
- }
85
-
86
- static random ( ) {
87
- return new this ( secp256r1 . utils . randomPrivateKey ( ) ) ;
88
- }
89
-
90
- get PREFIX ( ) {
91
- return '{"type":"webauthn.get","challenge":"' ;
92
- }
93
-
94
- get SUFFIX ( ) {
95
- return '"}' ;
96
- }
97
-
98
- base64toBase64Url = str => str . replaceAll ( '+' , '-' ) . replaceAll ( '/' , '_' ) . replaceAll ( '=' , '' ) ;
99
-
100
81
sign ( digest /*: BytesLike*/ ) /*: { serialized: string } */ {
101
82
assertArgument ( dataLength ( digest ) === 32 , 'invalid digest length' , 'digest' , digest ) ;
102
83
103
- const clientDataJSON = this . PREFIX . concat ( this . base64toBase64Url ( encodeBase64 ( toBeHex ( digest , 32 ) ) ) ) . concat (
104
- this . SUFFIX ,
105
- ) ;
84
+ const clientDataJSON = JSON . stringify ( {
85
+ type : 'webauthn.get' ,
86
+ challenge : encodeBase64 ( digest ) . replaceAll ( '+' , '-' ) . replaceAll ( '/' , '_' ) . replaceAll ( '=' , '' ) ,
87
+ } ) ;
106
88
107
- const authenticatorData = toBeHex ( '0' , 37 ) ;
89
+ const authenticatorData = toBeHex ( 0n , 37 ) ; // equivalent to `hexlify(new Uint8Array(37))`
108
90
109
91
// Regular P256 signature
110
- const sig = super . sign ( sha256 ( concat ( [ authenticatorData , sha256 ( toUtf8Bytes ( clientDataJSON ) ) ] ) ) ) ;
111
-
112
- return {
113
- serialized : this . serialize ( sig . r , sig . s , authenticatorData , clientDataJSON ) ,
114
- } ;
115
- }
92
+ const { r, s } = super . sign ( sha256 ( concat ( [ authenticatorData , sha256 ( toUtf8Bytes ( clientDataJSON ) ) ] ) ) ) ;
116
93
117
- serialize ( r , s , authenticatorData , clientDataJSON ) {
118
- return AbiCoder . defaultAbiCoder ( ) . encode (
94
+ const serialized = AbiCoder . defaultAbiCoder ( ) . encode (
119
95
[ 'tuple(bytes32,bytes32,uint256,uint256,bytes,string)' ] ,
120
- [ [ r , s , 23 , 1 , authenticatorData , clientDataJSON ] ] ,
96
+ [
97
+ [
98
+ r ,
99
+ s ,
100
+ clientDataJSON . indexOf ( '"challenge"' ) ,
101
+ clientDataJSON . indexOf ( '"type"' ) ,
102
+ authenticatorData ,
103
+ clientDataJSON ,
104
+ ] ,
105
+ ] ,
121
106
) ;
107
+
108
+ return { serialized } ;
122
109
}
123
110
}
124
111
0 commit comments