@@ -8,8 +8,10 @@ export class HcVaultClient implements KmsClient {
88 private keyUri : string
99 private keyId : string
1010 private keyName : string
11+ private authPromise ?: Promise < void >
1112
12- constructor ( keyUri : string , namespace ?: string , token ?: string ) {
13+ constructor ( keyUri : string , namespace ?: string , token ?: string ,
14+ roleId ?: string , secretId ?: string ) {
1315 if ( ! keyUri . startsWith ( HcVaultDriver . PREFIX ) ) {
1416 throw new Error ( `key uri must start with ${ HcVaultDriver . PREFIX } ` )
1517 }
@@ -27,19 +29,34 @@ export class HcVaultClient implements KmsClient {
2729 ...token && { token } ,
2830 apiVersion : 'v1' ,
2931 } )
32+ if ( roleId != null && secretId != null ) {
33+ this . authPromise = this . kmsClient . approleLogin ( { role_id : roleId , secret_id : secretId } )
34+ . then ( ( result ) => {
35+ this . kmsClient . token = result . auth . client_token
36+ } )
37+ }
3038 }
3139
3240 supported ( keyUri : string ) : boolean {
3341 return this . keyUri === keyUri
3442 }
3543
44+ private async ensureAuthenticated ( ) : Promise < void > {
45+ if ( this . authPromise ) {
46+ await this . authPromise
47+ this . authPromise = undefined // Clear after first use
48+ }
49+ }
50+
3651 async encrypt ( plaintext : Buffer ) : Promise < Buffer > {
52+ await this . ensureAuthenticated ( )
3753 const response = await this . kmsClient . encryptData ( { name : this . keyName , plaintext : plaintext . toString ( 'base64' ) } )
3854 let data = response . data . ciphertext
3955 return Buffer . from ( data , 'utf8' )
4056 }
4157
4258 async decrypt ( ciphertext : Buffer ) : Promise < Buffer > {
59+ await this . ensureAuthenticated ( )
4360 const response = await this . kmsClient . decryptData ( { name : this . keyName , ciphertext : ciphertext . toString ( 'utf8' ) } )
4461 let data = response . data . plaintext
4562 return Buffer . from ( data , 'base64' ) ;
0 commit comments