Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit b3a849b

Browse files
author
Firas Qutishat
authored
Merge pull request #2984 from Baha-sk/rest-agent-mediatype
feat: add mediatype profiles and key types to agent-rest
2 parents fddeec2 + 0f5c14a commit b3a849b

File tree

2 files changed

+211
-2
lines changed

2 files changed

+211
-2
lines changed

cmd/aries-agent-rest/startcmd/start.go

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"github.com/hyperledger/aries-framework-go/pkg/framework/aries"
3333
"github.com/hyperledger/aries-framework-go/pkg/framework/aries/defaults"
3434
"github.com/hyperledger/aries-framework-go/pkg/framework/context"
35+
"github.com/hyperledger/aries-framework-go/pkg/kms"
3536
"github.com/hyperledger/aries-framework-go/pkg/vdr/httpbinding"
3637
"github.com/hyperledger/aries-framework-go/spi/storage"
3738
)
@@ -170,6 +171,30 @@ const (
170171
" Alternatively, this can be set with the following environment variable (in CSV format): " +
171172
agentContextProviderEnvKey
172173

174+
// default verification key type flag.
175+
agentKeyTypeFlagName = "key-type"
176+
agentKeyTypeEnvKey = "ARIESD_KEY_TYPE"
177+
agentKeyTypeUsage = "Default key type supported by this agent." +
178+
" This flag sets the verification (and for DIDComm V1 encryption as well) key type used for key creation in the agent." + //nolint:lll
179+
" Alternatively, this can be set with the following environment variable: " +
180+
agentKeyTypeEnvKey
181+
182+
// default key agreement type flag.
183+
agentKeyAgreementTypeFlagName = "key-agreement-type"
184+
agentKeyAgreementTypeEnvKey = "ARIESD_KEY_AGREEMENT_TYPE"
185+
agentKeyAgreementTypeUsage = "Default key agreement type supported by this agent." +
186+
" Default encryption (used in DIDComm V2) key type used for key agreement creation in the agent." +
187+
" Alternatively, this can be set with the following environment variable: " +
188+
agentKeyAgreementTypeEnvKey
189+
190+
// media type profiles flag.
191+
agentMediaTypeProfilesFlagName = "media-type-profiles"
192+
agentMediaTypeProfilesEnvKey = "ARIESD_MEDIA_TYPE_PROFILES"
193+
agentMediaTypeProfilesUsage = "Media Type Profiles supported by this agent." +
194+
" This flag can be repeated, allowing setting up multiple profiles." +
195+
" Alternatively, this can be set with the following environment variable (in CSV format): " +
196+
agentMediaTypeProfilesEnvKey
197+
173198
httpProtocol = "http"
174199
websocketProtocol = "ws"
175200

@@ -180,16 +205,35 @@ const (
180205
var (
181206
errMissingHost = errors.New("host not provided")
182207
logger = log.New("aries-framework/agent-rest")
208+
209+
//nolint:gochecknoglobals
210+
keyTypes = map[string]kms.KeyType{
211+
"ed25519": kms.ED25519Type,
212+
"ecdsap256ieee1363": kms.ECDSAP256TypeIEEEP1363,
213+
"ecdsap256der": kms.ECDSAP256TypeDER,
214+
"ecdsap384ieee1363": kms.ECDSAP384TypeIEEEP1363,
215+
"ecdsap384der": kms.ECDSAP384TypeDER,
216+
"ecdsap521ieee1363": kms.ECDSAP521TypeIEEEP1363,
217+
"ecdsap521der": kms.ECDSAP521TypeDER,
218+
}
219+
220+
//nolint:gochecknoglobals
221+
keyAgreementTypes = map[string]kms.KeyType{
222+
"x25519kw": kms.X25519ECDHKWType,
223+
"p256kw": kms.NISTP256ECDHKWType,
224+
"p384kw": kms.NISTP384ECDHKWType,
225+
"p521kw": kms.NISTP521ECDHKWType,
226+
}
183227
)
184228

185229
type agentParameters struct {
186230
server server
187231
host, defaultLabel, transportReturnRoute string
188232
tlsCertFile, tlsKeyFile string
189-
token string
233+
token, keyType, keyAgreementType string
190234
webhookURLs, httpResolvers, outboundTransports []string
191235
inboundHostInternals, inboundHostExternals []string
192-
contextProviderURLs []string
236+
contextProviderURLs, mediaTypeProfiles []string
193237
autoAccept bool
194238
msgHandler command.MessageHandler
195239
dbParam *dbParam
@@ -332,6 +376,21 @@ func createStartCMD(server server) *cobra.Command { //nolint: funlen,gocyclo,goc
332376
return err
333377
}
334378

379+
keyType, err := getUserSetVar(cmd, agentKeyTypeFlagName, agentKeyTypeEnvKey, true)
380+
if err != nil {
381+
return err
382+
}
383+
384+
keyAgreementType, err := getUserSetVar(cmd, agentKeyAgreementTypeFlagName, agentKeyAgreementTypeEnvKey, true)
385+
if err != nil {
386+
return err
387+
}
388+
389+
mediaTypeProfiles, err := getUserSetVars(cmd, agentMediaTypeProfilesFlagName, agentMediaTypeProfilesEnvKey, true)
390+
if err != nil {
391+
return err
392+
}
393+
335394
parameters := &agentParameters{
336395
server: server,
337396
host: host,
@@ -349,6 +408,9 @@ func createStartCMD(server server) *cobra.Command { //nolint: funlen,gocyclo,goc
349408
tlsCertFile: tlsCertFile,
350409
tlsKeyFile: tlsKeyFile,
351410
autoExecuteRFC0593: autoExecuteRFC0593,
411+
keyType: keyType,
412+
keyAgreementType: keyAgreementType,
413+
mediaTypeProfiles: mediaTypeProfiles,
352414
}
353415

354416
return startAgent(parameters)
@@ -417,6 +479,7 @@ func getAutoExecuteRFC0593(cmd *cobra.Command) (bool, error) {
417479
return strconv.ParseBool(autoExecuteRFC0593Str)
418480
}
419481

482+
//nolint:funlen
420483
func createFlags(startCmd *cobra.Command) {
421484
// agent host flag
422485
startCmd.Flags().StringP(agentHostFlagName, agentHostFlagShorthand, "", agentHostFlagUsage)
@@ -477,6 +540,12 @@ func createFlags(startCmd *cobra.Command) {
477540

478541
// db timeout
479542
startCmd.Flags().StringP(databaseTimeoutFlagName, "", "", databaseTimeoutFlagUsage)
543+
544+
startCmd.Flags().StringP(agentKeyTypeFlagName, "", "", agentKeyTypeUsage)
545+
546+
startCmd.Flags().StringP(agentKeyAgreementTypeFlagName, "", "", agentKeyAgreementTypeUsage)
547+
548+
startCmd.Flags().StringSliceP(agentMediaTypeProfilesFlagName, "", []string{}, agentMediaTypeProfilesUsage)
480549
}
481550

482551
func getUserSetVar(cmd *cobra.Command, flagName, envKey string, isOptional bool) (string, error) {
@@ -714,6 +783,7 @@ func startAgent(parameters *agentParameters) error {
714783
return nil
715784
}
716785

786+
//nolint:funlen,gocyclo
717787
func createAriesAgent(parameters *agentParameters) (*context.Provider, error) {
718788
var opts []aries.Option
719789

@@ -758,6 +828,18 @@ func createAriesAgent(parameters *agentParameters) (*context.Provider, error) {
758828
opts = append(opts, aries.WithJSONLDContextProviderURL(parameters.contextProviderURLs...))
759829
}
760830

831+
if kt, ok := keyTypes[parameters.keyType]; ok {
832+
opts = append(opts, aries.WithKeyType(kt))
833+
}
834+
835+
if kat, ok := keyAgreementTypes[parameters.keyAgreementType]; ok {
836+
opts = append(opts, aries.WithKeyAgreementType(kat))
837+
}
838+
839+
if len(parameters.mediaTypeProfiles) > 0 {
840+
opts = append(opts, aries.WithMediaTypeProfiles(parameters.mediaTypeProfiles))
841+
}
842+
761843
framework, err := aries.New(opts...)
762844
if err != nil {
763845
return nil, fmt.Errorf("failed to start aries agent rest on port [%s], failed to initialize framework : %w",

cmd/aries-agent-rest/startcmd/start_test.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/stretchr/testify/require"
2323

2424
"github.com/hyperledger/aries-framework-go/pkg/common/log"
25+
"github.com/hyperledger/aries-framework-go/pkg/didcomm/transport"
2526
spi "github.com/hyperledger/aries-framework-go/spi/log"
2627
)
2728

@@ -687,6 +688,132 @@ func TestStartAriesTLS(t *testing.T) {
687688
require.EqualError(t, errors.Unwrap(err), "open invalid: no such file or directory")
688689
}
689690

691+
func TestCreateAriesWithKeyType(t *testing.T) {
692+
tests := []struct {
693+
name string
694+
kt string
695+
}{
696+
{
697+
name: "test ed25519 key type",
698+
kt: "ed25519",
699+
},
700+
{
701+
name: "test ecdsap256ieee1363 key type",
702+
kt: "ecdsap256ieee1363",
703+
},
704+
{
705+
name: "test ecdsap256der key type",
706+
kt: "ecdsap256der",
707+
},
708+
{
709+
name: "test ecdsap384ieee1363 key type",
710+
kt: "ecdsap384ieee1363",
711+
},
712+
{
713+
name: "test ecdsap384der key type",
714+
kt: "ecdsap384der",
715+
},
716+
{
717+
name: "test ecdsap521ieee1363 key type",
718+
kt: "ecdsap521ieee1363",
719+
},
720+
{
721+
name: "test ecdsap521der key type",
722+
kt: "ecdsap521der",
723+
},
724+
}
725+
726+
for _, tt := range tests {
727+
tc := tt
728+
t.Run(tc.name, func(t *testing.T) {
729+
parameters := &agentParameters{
730+
dbParam: &dbParam{dbType: databaseTypeMemOption},
731+
keyType: tc.kt,
732+
}
733+
734+
ctx, err := createAriesAgent(parameters)
735+
require.NoError(t, err)
736+
require.EqualValues(t, ctx.KeyType(), keyTypes[tc.kt])
737+
})
738+
}
739+
}
740+
741+
func TestCreateAriesWithKeyAgreementType(t *testing.T) {
742+
tests := []struct {
743+
name string
744+
kt string
745+
}{
746+
{
747+
name: "test x25519kw key agreement type",
748+
kt: "x25519kw",
749+
},
750+
{
751+
name: "test p256kw key agreement type",
752+
kt: "p256kw",
753+
},
754+
{
755+
name: "test p384kw key agreement type",
756+
kt: "p384kw",
757+
},
758+
{
759+
name: "test p521kw key agreement type",
760+
kt: "p521kw",
761+
},
762+
}
763+
764+
for _, tt := range tests {
765+
tc := tt
766+
t.Run(tc.name, func(t *testing.T) {
767+
parameters := &agentParameters{
768+
dbParam: &dbParam{dbType: databaseTypeMemOption},
769+
keyAgreementType: tc.kt,
770+
}
771+
772+
ctx, err := createAriesAgent(parameters)
773+
require.NoError(t, err)
774+
require.EqualValues(t, ctx.KeyAgreementType(), keyAgreementTypes[tc.kt])
775+
})
776+
}
777+
}
778+
779+
func TestCreateAriesWithMediaTypeProfiles(t *testing.T) {
780+
tests := []struct {
781+
name string
782+
mtp []string
783+
}{
784+
{
785+
name: "test didcomm/v2 media type profile",
786+
mtp: []string{transport.MediaTypeDIDCommV2Profile},
787+
},
788+
{
789+
name: "test didcomm/aip2;env=rfc19 media type profile",
790+
mtp: []string{transport.MediaTypeAIP2RFC0019Profile},
791+
},
792+
{
793+
name: "test didcomm/aip2;env=rfc587 media type profile",
794+
mtp: []string{transport.MediaTypeAIP2RFC0587Profile},
795+
},
796+
{
797+
name: "test didcomm/v2 and didcomm/aip2;env=rfc19 media type profiles",
798+
mtp: []string{transport.MediaTypeDIDCommV2Profile, transport.MediaTypeAIP2RFC0019Profile},
799+
},
800+
}
801+
802+
for _, tt := range tests {
803+
tc := tt
804+
t.Run(tc.name, func(t *testing.T) {
805+
parameters := &agentParameters{
806+
dbParam: &dbParam{dbType: databaseTypeMemOption},
807+
mediaTypeProfiles: tc.mtp,
808+
}
809+
810+
ctx, err := createAriesAgent(parameters)
811+
require.NoError(t, err)
812+
require.EqualValues(t, ctx.MediaTypeProfiles(), tc.mtp)
813+
})
814+
}
815+
}
816+
690817
func TestStartAriesWithAuthorization(t *testing.T) {
691818
const (
692819
goodToken = "ABCD"

0 commit comments

Comments
 (0)