1
1
import { digest , generateSalt } from '@sd-jwt/crypto-nodejs' ;
2
2
import type { DisclosureFrame , Signer , Verifier } from '@sd-jwt/types' ;
3
- import { describe , test , beforeAll , afterAll } from 'vitest' ;
3
+ import { describe , test , beforeAll , afterAll , expect } from 'vitest' ;
4
4
import { SDJwtVcInstance } from '..' ;
5
5
import type { SdJwtVcPayload } from '../sd-jwt-vc-payload' ;
6
6
import Crypto from 'node:crypto' ;
@@ -41,7 +41,7 @@ const restHandlers = [
41
41
} ;
42
42
return HttpResponse . json ( res ) ;
43
43
} ) ,
44
- http . get ( 'http://exmaple .com/example' , ( ) => {
44
+ http . get ( 'http://example .com/example' , ( ) => {
45
45
const res : TypeMetadataFormat = {
46
46
vct : 'http://example.com/example' ,
47
47
name : 'ExampleCredentialType' ,
@@ -53,6 +53,13 @@ const restHandlers = [
53
53
} ;
54
54
return HttpResponse . json ( res ) ;
55
55
} ) ,
56
+ http . get ( 'http://example.com/timeout' , ( ) => {
57
+ return new Promise ( ( resolve ) => {
58
+ setTimeout ( ( ) => {
59
+ resolve ( HttpResponse . json ( { } ) ) ;
60
+ } , 10000 ) ;
61
+ } ) ;
62
+ } ) ,
56
63
] ;
57
64
58
65
//this value could be generated on demand to make it easier when changing the values
@@ -62,7 +69,7 @@ const vctIntegrity =
62
69
const server = setupServer ( ...restHandlers ) ;
63
70
64
71
const iss = 'ExampleIssuer' ;
65
- const vct = 'http://exmaple .com/example' ;
72
+ const vct = 'http://example .com/example' ;
66
73
const iat = new Date ( ) . getTime ( ) / 1000 ;
67
74
68
75
const { privateKey, publicKey } = Crypto . generateKeyPairSync ( 'ed25519' ) ;
@@ -84,31 +91,33 @@ const createSignerVerifier = () => {
84
91
} ;
85
92
86
93
describe ( 'App' , ( ) => {
94
+ const { signer, verifier } = createSignerVerifier ( ) ;
95
+
96
+ const sdjwt = new SDJwtVcInstance ( {
97
+ signer,
98
+ signAlg : 'EdDSA' ,
99
+ verifier,
100
+ hasher : digest ,
101
+ hashAlg : 'sha-256' ,
102
+ saltGenerator : generateSalt ,
103
+ loadTypeMetadataFormat : true ,
104
+ timeout : 1000 ,
105
+ } ) ;
106
+
107
+ const claims = {
108
+ firstname : 'John' ,
109
+ } ;
110
+ const disclosureFrame = {
111
+ _sd : [ 'firstname' ] ,
112
+ } ;
113
+
87
114
beforeAll ( ( ) => server . listen ( { onUnhandledRequest : 'warn' } ) ) ;
88
115
89
116
afterAll ( ( ) => server . close ( ) ) ;
90
117
91
118
afterEach ( ( ) => server . resetHandlers ( ) ) ;
92
119
93
120
test ( 'VCT Validation' , async ( ) => {
94
- const { signer, verifier } = createSignerVerifier ( ) ;
95
- const sdjwt = new SDJwtVcInstance ( {
96
- signer,
97
- signAlg : 'EdDSA' ,
98
- verifier,
99
- hasher : digest ,
100
- hashAlg : 'sha-256' ,
101
- saltGenerator : generateSalt ,
102
- loadTypeMetadataFormat : true ,
103
- } ) ;
104
-
105
- const claims = {
106
- firstname : 'John' ,
107
- } ;
108
- const disclosureFrame = {
109
- _sd : [ 'firstname' ] ,
110
- } ;
111
-
112
121
const expectedPayload : SdJwtVcPayload = {
113
122
iat,
114
123
iss,
@@ -124,5 +133,23 @@ describe('App', () => {
124
133
await sdjwt . verify ( encodedSdjwt ) ;
125
134
} ) ;
126
135
136
+ test ( 'VCT Validation with timeout' , async ( ) => {
137
+ const vct = 'http://example.com/timeout' ;
138
+ const expectedPayload : SdJwtVcPayload = {
139
+ iat,
140
+ iss,
141
+ vct,
142
+ ...claims ,
143
+ } ;
144
+ const encodedSdjwt = await sdjwt . issue (
145
+ expectedPayload ,
146
+ disclosureFrame as unknown as DisclosureFrame < SdJwtVcPayload > ,
147
+ ) ;
148
+
149
+ expect ( sdjwt . verify ( encodedSdjwt ) ) . rejects . toThrowError (
150
+ `Request to ${ vct } timed out` ,
151
+ ) ;
152
+ } ) ;
153
+
127
154
//TODO: we need tests with an embedded schema, extended and maybe also to test the errors when schema information is not available or the integrity is not valid
128
155
} ) ;
0 commit comments