Skip to content

Commit

Permalink
feat: refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
james-d-elliott committed Jun 10, 2024
1 parent 3f52cb1 commit affd146
Show file tree
Hide file tree
Showing 12 changed files with 149 additions and 85 deletions.
18 changes: 9 additions & 9 deletions metadata/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ type Decoder struct {
}

// Parse handles parsing of the raw JSON values of the metadata blob. Should be used after using Decode or DecodeBytes.
func (d *Decoder) Parse(payload *MetadataBLOBPayloadJSON) (metadata *Metadata, err error) {
func (d *Decoder) Parse(payload *PayloadJSON) (metadata *Metadata, err error) {
metadata = &Metadata{
Parsed: MetadataBLOBPayload{
Parsed: Parsed{
LegalHeader: payload.LegalHeader,
Number: payload.Number,
},
Expand All @@ -58,13 +58,13 @@ func (d *Decoder) Parse(payload *MetadataBLOBPayloadJSON) (metadata *Metadata, e
return nil, fmt.Errorf("error occurred parsing next update value '%s': %w", payload.NextUpdate, err)
}

var parsed MetadataBLOBPayloadEntry
var parsed Entry

for _, entry := range payload.Entries {
if parsed, err = entry.Parse(); err != nil {
metadata.Unparsed = append(metadata.Unparsed, MetadataBLOBPayloadEntryError{
Error: err,
MetadataBLOBPayloadEntryJSON: entry,
metadata.Unparsed = append(metadata.Unparsed, EntryError{
Error: err,
EntryJSON: entry,
})

continue
Expand All @@ -81,7 +81,7 @@ func (d *Decoder) Parse(payload *MetadataBLOBPayloadJSON) (metadata *Metadata, e
}

// Decode the blob from an io.ReadCloser. This function will close the io.ReadCloser after completing.
func (d *Decoder) Decode(r io.ReadCloser) (payload *MetadataBLOBPayloadJSON, err error) {
func (d *Decoder) Decode(r io.ReadCloser) (payload *PayloadJSON, err error) {
defer r.Close()

bytes, err := io.ReadAll(r)
Expand All @@ -93,8 +93,8 @@ func (d *Decoder) Decode(r io.ReadCloser) (payload *MetadataBLOBPayloadJSON, err
}

// DecodeBytes handles decoding raw bytes. If you have a read closer it's suggested to use Decode.
func (d *Decoder) DecodeBytes(bytes []byte) (payload *MetadataBLOBPayloadJSON, err error) {
payload = &MetadataBLOBPayloadJSON{}
func (d *Decoder) DecodeBytes(bytes []byte) (payload *PayloadJSON, err error) {
payload = &PayloadJSON{}

var token *jwt.Token

Expand Down
70 changes: 35 additions & 35 deletions metadata/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
func Fetch() (metadata *Metadata, err error) {
var (
decoder *Decoder
payload *MetadataBLOBPayloadJSON
payload *PayloadJSON
res *http.Response
)

Expand All @@ -39,12 +39,12 @@ func Fetch() (metadata *Metadata, err error) {
}

type Metadata struct {
Parsed MetadataBLOBPayload
Unparsed []MetadataBLOBPayloadEntryError
Parsed Parsed
Unparsed []EntryError
}

func (m *Metadata) ToMap() (metadata map[uuid.UUID]*MetadataBLOBPayloadEntry) {
metadata = make(map[uuid.UUID]*MetadataBLOBPayloadEntry)
func (m *Metadata) ToMap() (metadata map[uuid.UUID]*Entry) {
metadata = make(map[uuid.UUID]*Entry)

for _, entry := range m.Parsed.Entries {
if entry.AaGUID != uuid.Nil {
Expand All @@ -55,15 +55,10 @@ func (m *Metadata) ToMap() (metadata map[uuid.UUID]*MetadataBLOBPayloadEntry) {
return metadata
}

type MetadataBLOBPayloadEntryError struct {
Error error
MetadataBLOBPayloadEntryJSON
}

// MetadataBLOBPayload is a structure representing the MetadataBLOBPayload MDS3 dictionary.
// Parsed is a structure representing the Parsed MDS3 dictionary.
//
// See: https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#metadata-blob-payload-entry-dictionary
type MetadataBLOBPayload struct {
type Parsed struct {
// The legalHeader, if present, contains a legal guide for accessing and using metadata, which itself MAY contain URL(s) pointing to further information, such as a full Terms and Conditions statement.
LegalHeader string

Expand All @@ -74,19 +69,19 @@ type MetadataBLOBPayload struct {
NextUpdate time.Time

// List of zero or more MetadataTOCPayloadEntry objects.
Entries []MetadataBLOBPayloadEntry
Entries []Entry
}

// MetadataBLOBPayloadJSON is an intermediary JSON/JWT representation of the MetadataBLOBPayload.
type MetadataBLOBPayloadJSON struct {
// PayloadJSON is an intermediary JSON/JWT representation of the Parsed.
type PayloadJSON struct {
LegalHeader string `json:"legalHeader"`
Number int `json:"no"`
NextUpdate string `json:"nextUpdate"`

Entries []MetadataBLOBPayloadEntryJSON `json:"entries"`
Entries []EntryJSON `json:"entries"`
}

func (j MetadataBLOBPayloadJSON) Parse() (payload MetadataBLOBPayload, err error) {
func (j PayloadJSON) Parse() (payload Parsed, err error) {
var update time.Time

if update, err = time.Parse(time.DateOnly, j.NextUpdate); err != nil {
Expand All @@ -95,26 +90,26 @@ func (j MetadataBLOBPayloadJSON) Parse() (payload MetadataBLOBPayload, err error

n := len(j.Entries)

entries := make([]MetadataBLOBPayloadEntry, n)
entries := make([]Entry, n)

for i := 0; i < n; i++ {
if entries[i], err = j.Entries[i].Parse(); err != nil {
return payload, fmt.Errorf("error occurred parsing entry %d: %w", i, err)
}
}

return MetadataBLOBPayload{
return Parsed{
LegalHeader: j.LegalHeader,
Number: j.Number,
NextUpdate: update,
Entries: entries,
}, nil
}

// MetadataBLOBPayloadEntry is a structure representing the MetadataBLOBPayloadEntry MDS3 dictionary.
// Entry is a structure representing the Entry MDS3 dictionary.
//
// See: https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#metadata-blob-payload-entry-dictionary
type MetadataBLOBPayloadEntry struct {
type Entry struct {
// The Authenticator Attestation ID.
Aaid string `json:"aaid"`

Expand All @@ -125,7 +120,7 @@ type MetadataBLOBPayloadEntry struct {
AttestationCertificateKeyIdentifiers []string `json:"attestationCertificateKeyIdentifiers"`

// The metadataStatement JSON object as defined in FIDOMetadataStatement.
MetadataStatement MetadataStatement `json:"metadataStatement"`
MetadataStatement Statement `json:"metadataStatement"`

// Status of the FIDO Biometric Certification of one or more biometric components of the Authenticator
BiometricStatusReports []BiometricStatusReport `json:"biometricStatusReports"`
Expand All @@ -143,15 +138,15 @@ type MetadataBLOBPayloadEntry struct {
RogueListHash string
}

// MetadataBLOBPayloadEntryJSON is an intermediary JSON/JWT structure representing the MetadataBLOBPayloadEntry MDS3 dictionary.
// EntryJSON is an intermediary JSON/JWT structure representing the Entry MDS3 dictionary.
//
// See: https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#metadata-blob-payload-entry-dictionary
type MetadataBLOBPayloadEntryJSON struct {
type EntryJSON struct {
Aaid string `json:"aaid"`
AaGUID string `json:"aaguid"`
AttestationCertificateKeyIdentifiers []string `json:"attestationCertificateKeyIdentifiers"`

MetadataStatement MetadataStatementJSON `json:"metadataStatement"`
MetadataStatement StatementJSON `json:"metadataStatement"`
BiometricStatusReports []BiometricStatusReportJSON `json:"biometricStatusReports"`
StatusReports []StatusReportJSON `json:"statusReports"`

Expand All @@ -160,7 +155,7 @@ type MetadataBLOBPayloadEntryJSON struct {
RogueListHash string `json:"rogueListHash"`
}

func (j MetadataBLOBPayloadEntryJSON) Parse() (entry MetadataBLOBPayloadEntry, err error) {
func (j EntryJSON) Parse() (entry Entry, err error) {
var aaguid uuid.UUID

if len(j.AaGUID) != 0 {
Expand All @@ -169,7 +164,7 @@ func (j MetadataBLOBPayloadEntryJSON) Parse() (entry MetadataBLOBPayloadEntry, e
}
}

var statement MetadataStatement
var statement Statement

if statement, err = j.MetadataStatement.Parse(); err != nil {
return entry, fmt.Errorf("error occurred parsing metadata entry with AAGUID '%s': %w", j.AaGUID, err)
Expand Down Expand Up @@ -215,7 +210,7 @@ func (j MetadataBLOBPayloadEntryJSON) Parse() (entry MetadataBLOBPayloadEntry, e
}
}

return MetadataBLOBPayloadEntry{
return Entry{
Aaid: j.Aaid,
AaGUID: aaguid,
AttestationCertificateKeyIdentifiers: j.AttestationCertificateKeyIdentifiers,
Expand All @@ -228,12 +223,12 @@ func (j MetadataBLOBPayloadEntryJSON) Parse() (entry MetadataBLOBPayloadEntry, e
}, nil
}

// MetadataStatement is a structure representing the MetadataStatement MDS3 dictionary.
// Statement is a structure representing the Statement MDS3 dictionary.
// Authenticator metadata statements are used directly by the FIDO server at a relying party, but the information
// contained in the authoritative statement is used in several other places.
//
// See: https://fidoalliance.org/specs/mds/fido-metadata-statement-v3.0-ps-20210518.html#metadata-keys
type MetadataStatement struct {
type Statement struct {
// The legalHeader, if present, contains a legal guide for accessing and using metadata, which itself MAY contain URL(s) pointing to further information, such as a full Terms and Conditions statement.
LegalHeader string

Expand Down Expand Up @@ -321,7 +316,7 @@ type MetadataStatement struct {
AuthenticatorGetInfo AuthenticatorGetInfo
}

func (s *MetadataStatement) Verifier() (opts x509.VerifyOptions) {
func (s *Statement) Verifier() (opts x509.VerifyOptions) {
roots := x509.NewCertPool()

for _, root := range s.AttestationRootCertificates {
Expand All @@ -333,12 +328,12 @@ func (s *MetadataStatement) Verifier() (opts x509.VerifyOptions) {
}
}

// MetadataStatementJSON is an intermediary JSON/JWT structure representing the MetadataStatement MDS3 dictionary.
// StatementJSON is an intermediary JSON/JWT structure representing the Statement MDS3 dictionary.
// Authenticator metadata statements are used directly by the FIDO server at a relying party, but the information
// contained in the authoritative statement is used in several other places.
//
// See: https://fidoalliance.org/specs/mds/fido-metadata-statement-v3.0-ps-20210518.html#metadata-keys
type MetadataStatementJSON struct {
type StatementJSON struct {
LegalHeader string `json:"legalHeader"`
Aaid string `json:"aaid"`
AaGUID string `json:"aaguid"`
Expand Down Expand Up @@ -368,7 +363,7 @@ type MetadataStatementJSON struct {
AuthenticatorGetInfo AuthenticatorGetInfoJSON `json:"authenticatorGetInfo"`
}

func (j MetadataStatementJSON) Parse() (statement MetadataStatement, err error) {
func (j StatementJSON) Parse() (statement Statement, err error) {
var aaguid uuid.UUID

if len(j.AaGUID) != 0 {
Expand Down Expand Up @@ -401,7 +396,7 @@ func (j MetadataStatementJSON) Parse() (statement MetadataStatement, err error)
return statement, fmt.Errorf("error occurred parsing statement with description '%s': error occurred parsing authenticator get info value: %w", j.Description, err)
}

return MetadataStatement{
return Statement{
LegalHeader: j.LegalHeader,
Aaid: j.Aaid,
AaGUID: aaguid,
Expand Down Expand Up @@ -914,3 +909,8 @@ func DefaultUndesiredAuthenticatorStatuses() []AuthenticatorStatus {

return undesired
}

type EntryError struct {
Error error
EntryJSON
}
12 changes: 6 additions & 6 deletions metadata/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,11 @@ func TestConformanceMetadataTOCParsing(t *testing.T) {

require.NoError(t, err)

metadata := make(map[uuid.UUID]MetadataBLOBPayloadEntryJSON)
metadata := make(map[uuid.UUID]EntryJSON)

var (
res *http.Response
blob *MetadataBLOBPayloadJSON
blob *PayloadJSON
me *MetadataError
)

Expand Down Expand Up @@ -317,8 +317,8 @@ func getEndpoints(c *http.Client) ([]string, error) {
return resp.Result, err
}

func getTestMetadata(s string, c *http.Client) (MetadataStatementJSON, error) {
var statement MetadataStatementJSON
func getTestMetadata(s string, c *http.Client) (StatementJSON, error) {
var statement StatementJSON

// MDSGetEndpointsRequest is the request sent to the conformance metadata getEndpoints endpoint.
type MDSGetTestMetadata struct {
Expand All @@ -345,8 +345,8 @@ func getTestMetadata(s string, c *http.Client) (MetadataStatementJSON, error) {
}

type ConformanceResponse struct {
Status string `json:"status"`
Result MetadataStatementJSON `json:"result"`
Status string `json:"status"`
Result StatementJSON `json:"result"`
}

var resp ConformanceResponse
Expand Down
2 changes: 1 addition & 1 deletion metadata/providers/cached/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ func (p *Provider) init() (err error) {
}

func (p *Provider) parse(rc io.ReadCloser) (data *metadata.Metadata, err error) {
var payload *metadata.MetadataBLOBPayloadJSON
var payload *metadata.PayloadJSON

if payload, err = p.decoder.Decode(rc); err != nil {
return nil, err
Expand Down
2 changes: 1 addition & 1 deletion metadata/providers/memory/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
type Option func(provider *Provider) (err error)

// WithMetadata provides the required metadata for the memory provider.
func WithMetadata(mds map[uuid.UUID]*metadata.MetadataBLOBPayloadEntry) Option {
func WithMetadata(mds map[uuid.UUID]*metadata.Entry) Option {
return func(provider *Provider) (err error) {
provider.mds = mds

Expand Down
4 changes: 2 additions & 2 deletions metadata/providers/memory/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func New(opts ...Option) (provider metadata.Provider, err error) {
// a simple one-shot that doesn't perform any locking, provide dynamic functionality, or download the metadata at any
// stage (it expects it's provided via one of the Option's).
type Provider struct {
mds map[uuid.UUID]*metadata.MetadataBLOBPayloadEntry
mds map[uuid.UUID]*metadata.Entry
desired []metadata.AuthenticatorStatus
undesired []metadata.AuthenticatorStatus
entry bool
Expand All @@ -40,7 +40,7 @@ type Provider struct {
status bool
}

func (p *Provider) GetEntry(ctx context.Context, aaguid uuid.UUID) (entry *metadata.MetadataBLOBPayloadEntry, err error) {
func (p *Provider) GetEntry(ctx context.Context, aaguid uuid.UUID) (entry *metadata.Entry, err error) {
if p.mds == nil {
return nil, metadata.ErrNotInitialized
}
Expand Down
2 changes: 1 addition & 1 deletion metadata/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

type Provider interface {
// GetEntry returns a MDS3 payload entry given a AAGUID. This
GetEntry(ctx context.Context, aaguid uuid.UUID) (entry *MetadataBLOBPayloadEntry, err error)
GetEntry(ctx context.Context, aaguid uuid.UUID) (entry *Entry, err error)

// GetValidateEntry returns true if this provider requires an entry to exist with a AAGUID matching the attestation
// statement during registration.
Expand Down
2 changes: 1 addition & 1 deletion protocol/attestation.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ func (a *AttestationObject) VerifyAttestation(clientDataHash []byte, mds metadat

var (
aaguid uuid.UUID
entry *metadata.MetadataBLOBPayloadEntry
entry *metadata.Entry
)

if len(a.AuthData.AttData.AAGUID) != 0 {
Expand Down
Loading

0 comments on commit affd146

Please sign in to comment.