From abf127797c498d23dc3b01478007d4db0e8a042d Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Mon, 27 Apr 2020 19:24:04 -0700 Subject: [PATCH 1/7] Revert "service: Move fido2 (temporarily)" This reverts commit f077689e0fd6420c9a599dc16a4607f41a6474c2. --- service/client.go | 25 ++++++++-------- service/cmd_fido2.go | 31 ++++++++++++-------- service/go.mod | 1 + service/go.sum | 70 ++++++++++++++++++++++++++++++++++++++++++-- service/run.go | 3 +- 5 files changed, 102 insertions(+), 28 deletions(-) diff --git a/service/client.go b/service/client.go index acc8e9b1..9027b13d 100644 --- a/service/client.go +++ b/service/client.go @@ -12,6 +12,7 @@ import ( "time" "github.com/keys-pub/keys/ds" + "github.com/keys-pub/keysd/fido2" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" @@ -24,11 +25,11 @@ import ( // Client defines the RPC client. type Client struct { sync.Mutex - keysClient KeysClient - // fido2Client fido2.AuthenticatorsClient - conn *grpc.ClientConn - cfg *Config - connectFn ClientConnectFn + keysClient KeysClient + fido2Client fido2.AuthenticatorsClient + conn *grpc.ClientConn + cfg *Config + connectFn ClientConnectFn } // VersionDev is default for dev environment. @@ -62,7 +63,7 @@ func (c *Client) Connect(cfg *Config, authToken string) error { } c.conn = conn c.keysClient = NewKeysClient(conn) - // c.fido2Client = fido2.NewAuthenticatorsClient(conn) + c.fido2Client = fido2.NewAuthenticatorsClient(conn) return nil } @@ -94,10 +95,10 @@ func (c *Client) KeysClient() KeysClient { return c.keysClient } -// // FIDO2Client returns FIDO2 Authenticators RPC client. -// func (c *Client) FIDO2Client() fido2.AuthenticatorsClient { -// return c.fido2Client -// } +// FIDO2Client returns FIDO2 Authenticators RPC client. +func (c *Client) FIDO2Client() fido2.AuthenticatorsClient { + return c.fido2Client +} // Close ... func (c *Client) Close() error { @@ -107,7 +108,7 @@ func (c *Client) Close() error { c.conn = nil } c.keysClient = nil - // c.fido2Client = nil + c.fido2Client = nil return err } @@ -181,7 +182,7 @@ func runClient(build Build, args []string, client *Client, errorFn func(err erro cmds = append(cmds, configCommands(client)...) cmds = append(cmds, logCommands(client)...) cmds = append(cmds, wormholeCommands(client)...) - // cmds = append(cmds, fido2Commands(client)...) + cmds = append(cmds, fido2Commands(client)...) cmds = append(cmds, adminCommands(client)...) sort.Slice(cmds, func(i, j int) bool { return cmds[i].Name < cmds[j].Name diff --git a/service/cmd_fido2.go b/service/cmd_fido2.go index b4147445..1806a22f 100644 --- a/service/cmd_fido2.go +++ b/service/cmd_fido2.go @@ -1,15 +1,20 @@ package service -// func fido2Commands(client *Client) []cli.Command { -// return []cli.Command{ -// cli.Command{ -// Name: "fido2", -// Usage: "FIDO2", -// Subcommands: []cli.Command{ -// cmds.DevicesFn(client.FIDO2Client), -// cmds.DeviceInfoFn(client.FIDO2Client), -// cmds.MakeCredentialFn(client.FIDO2Client), -// }, -// }, -// } -// } +import ( + "github.com/keys-pub/keysd/fido2/cmds" + "github.com/urfave/cli" +) + +func fido2Commands(client *Client) []cli.Command { + return []cli.Command{ + cli.Command{ + Name: "fido2", + Usage: "FIDO2", + Subcommands: []cli.Command{ + cmds.DevicesFn(client.FIDO2Client), + cmds.DeviceInfoFn(client.FIDO2Client), + cmds.MakeCredentialFn(client.FIDO2Client), + }, + }, + } +} diff --git a/service/go.mod b/service/go.mod index 4d5f3d79..68378c3a 100644 --- a/service/go.mod +++ b/service/go.mod @@ -8,6 +8,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 github.com/keys-pub/keys v0.0.0-20200423195135-6b5d508024d0 github.com/keys-pub/keysd/db v0.0.0-20200413003215-f85e85366c95 + github.com/keys-pub/keysd/fido2 v0.0.0-20200427220403-902714bb307e github.com/keys-pub/keysd/http/api v0.0.0-20200415010142-cfcd41d36dd1 github.com/keys-pub/keysd/http/client v0.0.0-20200414170516-1e0e72775735 github.com/keys-pub/keysd/http/server v0.0.0-20200419021946-2d1a17136bd0 diff --git a/service/go.sum b/service/go.sum index f2bcdc15..9844748b 100644 --- a/service/go.sum +++ b/service/go.sum @@ -71,8 +71,15 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -83,6 +90,7 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -115,19 +123,59 @@ github.com/keybase/saltpack v0.0.0-20190828020936-3f47e8e2e6ec h1:ejQ18jEAjyiFen github.com/keybase/saltpack v0.0.0-20190828020936-3f47e8e2e6ec/go.mod h1:loEJH62iafRcA8ZYlUEq9WgJh/Z9BHdHHfAmxzacQng= github.com/keybase/saltpack v0.0.0-20200228190633-d75baa96bffb h1:+AxJjayBs1yJrAddiOyvj7EjuN7ag1gl9QFszNTQX2M= github.com/keybase/saltpack v0.0.0-20200228190633-d75baa96bffb/go.mod h1:loEJH62iafRcA8ZYlUEq9WgJh/Z9BHdHHfAmxzacQng= +github.com/keys-pub/go-libfido2 v0.0.0-20200423021134-ec5cf6208cfc h1:IsKKRZ/cjI097saZEEEQw1M69jJqYebIWsvjbXWaLFA= +github.com/keys-pub/go-libfido2 v0.0.0-20200423021134-ec5cf6208cfc/go.mod h1:fTqaHBgT+hk2QptbKZ2KpGtzDXbLLKntOW/hUD0iXR8= +github.com/keys-pub/go-libfido2 v0.0.0-20200425222209-cff61ff56fc6 h1:ljrPkpzxZdP+06cs5vcK0kbG+rZJKR3SaPpIp83rHBo= +github.com/keys-pub/go-libfido2 v0.0.0-20200425222209-cff61ff56fc6/go.mod h1:fTqaHBgT+hk2QptbKZ2KpGtzDXbLLKntOW/hUD0iXR8= +github.com/keys-pub/go-libfido2 v0.0.0-20200426183310-e453219aa3c8 h1:63gt1+AjnHrRFekKOyU6SImnzSNOnK8poeraGNFbfgo= +github.com/keys-pub/go-libfido2 v0.0.0-20200426183310-e453219aa3c8/go.mod h1:fTqaHBgT+hk2QptbKZ2KpGtzDXbLLKntOW/hUD0iXR8= +github.com/keys-pub/go-libfido2 v0.0.0-20200427035032-3e225c0ecafc h1:KVD8kw82lU0mQTukLFKmQRTBNcrAPEod6xooTzDpiKA= +github.com/keys-pub/go-libfido2 v0.0.0-20200427035032-3e225c0ecafc/go.mod h1:fTqaHBgT+hk2QptbKZ2KpGtzDXbLLKntOW/hUD0iXR8= +github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d h1:xDOACYC0W9SHJO1cxQSQLjh2i9idG1Bph4AoY4XQUwE= +github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab h1:D7YOtUfZ34F99SW9mdZic8lG1LASUUGojHGtxfS6kds= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab/go.mod h1:LWDVrixSjx446s2aLIcJ6ML5ir4vX3kJ3mVvJYXI/Xc= github.com/keys-pub/keys v0.0.0-20200413002436-33c0c3d4ec1b h1:P9+8upxxJyZK95YnG3ONgDceGGJ/e25uabBVeeJslBo= github.com/keys-pub/keys v0.0.0-20200413002436-33c0c3d4ec1b/go.mod h1:LWDVrixSjx446s2aLIcJ6ML5ir4vX3kJ3mVvJYXI/Xc= github.com/keys-pub/keys v0.0.0-20200413004324-63e8a0774692 h1:S/I38MPrpBCZqvJboeF8O4YmrGr6c6I0MgTulpR/hgQ= github.com/keys-pub/keys v0.0.0-20200413004324-63e8a0774692/go.mod h1:LWDVrixSjx446s2aLIcJ6ML5ir4vX3kJ3mVvJYXI/Xc= +github.com/keys-pub/keys v0.0.0-20200414155340-f3f1d54a3cd3 h1:WI46rpUrsc4m6Xf85IL027D6OvfJZMYNsQBxalwPBD4= +github.com/keys-pub/keys v0.0.0-20200414155340-f3f1d54a3cd3/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= github.com/keys-pub/keys v0.0.0-20200414165426-6b7f7009114b h1:k+BaDSxJSjl1xYe25SMQNvNo7/knETHmB5/Kw80nxJw= github.com/keys-pub/keys v0.0.0-20200414165426-6b7f7009114b/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200414224338-a7049a9dc173 h1:RM/ruqTk2OFbV3PeLg47hSI3001n7gnjmGFlzneKdW0= +github.com/keys-pub/keys v0.0.0-20200414224338-a7049a9dc173/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200414232622-686194228d66 h1:E+XYd+hd95g6nfHyMfcQqQf/L0wCFphyohAP6XyKGOw= +github.com/keys-pub/keys v0.0.0-20200414232622-686194228d66/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200414233210-cb1779dda6c1 h1:aK5w5kcJk8qp1d3rcZgDXdw2r786T/zNtQzJv2huTHs= +github.com/keys-pub/keys v0.0.0-20200414233210-cb1779dda6c1/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200415233605-42b12cdb1dda h1:S0yoKyJ5W+x641s6OcH2jqIePf2/It/kOt5qhoqFwGI= +github.com/keys-pub/keys v0.0.0-20200415233605-42b12cdb1dda/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200416181314-985d41762378 h1:4i0S1FDjqmXk4NGnteMIiaJp6GwoxfVSDiHUnPLKIU8= +github.com/keys-pub/keys v0.0.0-20200416181314-985d41762378/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200417224012-3579aa95e091 h1:+LjJg9dwWvkVWRifbFYtFiksByndjO0rUWEsOBpg/ZE= +github.com/keys-pub/keys v0.0.0-20200417224012-3579aa95e091/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= github.com/keys-pub/keys v0.0.0-20200419021533-e5e1457374ab/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keys v0.0.0-20200423031320-c01b0c96d717 h1:GHhQivZjfz+jZxJd1C3ueokAHMxDBB1WTo3ay9OaBA4= +github.com/keys-pub/keys v0.0.0-20200423031320-c01b0c96d717/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= github.com/keys-pub/keys v0.0.0-20200423195135-6b5d508024d0 h1:abpA+LQ/R2+8HN00IxXkC7RZrRwionBdwuSWG7WZyQw= github.com/keys-pub/keys v0.0.0-20200423195135-6b5d508024d0/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= +github.com/keys-pub/keysd v0.0.36 h1:LJ4icoup2ihQg9gSGCxtoYKem5jzPigf9VB777fuFTc= +github.com/keys-pub/keysd v0.0.37-0.20200426184731-707482381542 h1:vKMSbOUlwy38UkH3u27LFwgh4c6McA0RJkh3bKBOjlw= github.com/keys-pub/keysd/db v0.0.0-20200413003215-f85e85366c95 h1:5QzUKnwvuLpei8sBfFjcPZQKJSoIhYzg/yZxVqbvxlE= github.com/keys-pub/keysd/db v0.0.0-20200413003215-f85e85366c95/go.mod h1:zbe7XU3mVmOrFy+aQWU7+Z9Vy03ctb65Vlr3055AZ5c= +github.com/keys-pub/keysd/fido2 v0.0.0-20200424173049-a8841c3805aa h1:wz/2Gnsq64zxQAJp9R0KOsD2Q2CUcr0x9j0aYIS7lMA= +github.com/keys-pub/keysd/fido2 v0.0.0-20200424173049-a8841c3805aa/go.mod h1:MJF3AZyVhMkw03fwLTej0TlYQTv9uldoH4usFKrMOrI= +github.com/keys-pub/keysd/fido2 v0.0.0-20200424180941-933e211184d6 h1:IGwCR0d/GCmRDHyTLijFbiMFVWNrVZ8XA3PIbVFuXLw= +github.com/keys-pub/keysd/fido2 v0.0.0-20200424180941-933e211184d6/go.mod h1:RqJunZv/SShEXeTpcs8V/6Ea7iUneGL3YvBWZjtK2jc= +github.com/keys-pub/keysd/fido2 v0.0.0-20200425222705-334f0c7b66f7 h1:BJyDOabMLeAo0wxglH7ir3mOqtxlXDj0ZkjRrykjKtQ= +github.com/keys-pub/keysd/fido2 v0.0.0-20200425222705-334f0c7b66f7/go.mod h1:O2JfXO3sjgIDaKdAz6LBr9pO6DoTX5gBFSGausmsIMw= +github.com/keys-pub/keysd/fido2 v0.0.0-20200426184731-707482381542 h1:5RSEzQ5hdtcB/OYhwuhXGLha4/RYDwKBvq3MUKsmml8= +github.com/keys-pub/keysd/fido2 v0.0.0-20200426184731-707482381542/go.mod h1:3SiQs28b/ak24hlA8O3x8YDnLNxPwJr2HKg2UCUS6GY= +github.com/keys-pub/keysd/fido2 v0.0.0-20200427035443-641310d59016 h1:qyAU7+iHvfhFN1yCzt8C6xHVvormwUqPankuJX/0Ilo= +github.com/keys-pub/keysd/fido2 v0.0.0-20200427035443-641310d59016/go.mod h1:Zv1gPZrRHmPAbWt7RCfEGmR4k1Vdp7UicWqhO4D7uN0= +github.com/keys-pub/keysd/fido2 v0.0.0-20200427220403-902714bb307e h1:zTB06Dr2NZh25ONzojScyyoDkvjsLShg0X5DwJbADg8= +github.com/keys-pub/keysd/fido2 v0.0.0-20200427220403-902714bb307e/go.mod h1:mVqeZwNYUJ/g9uffwEr496Px+tBxY6RopLQCMRRlW54= github.com/keys-pub/keysd/firestore v0.0.0-20200413003414-34e8a825f8fd h1:vhnKWyxGwLgb0bdFSYHGjJ+bgHwxieiLZh3Du+A0xbE= github.com/keys-pub/keysd/firestore v0.0.0-20200413003414-34e8a825f8fd/go.mod h1:9veij84OYGkGSNE7oI6FasAsDuFMm0wtjDoaQ//doIg= github.com/keys-pub/keysd/firestore v0.0.0-20200414165918-c4b40ad4f02d h1:+04LDJiJLkFjCVSiNchSQTdw3syqRHJnT/AEXTQOtCw= @@ -236,6 +284,8 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/urfave/cli v1.22.3 h1:FpNT6zq26xNpHZy08emi755QwzLPs6Pukqjlc7RfOMU= +github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -311,6 +361,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd h1:QPwSajcTUrFriMF1nJ3XzgoqakqQEsnZf9LdXdi2nkI= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -324,6 +376,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -345,6 +398,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20u golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200408040146-ea54a3c99b9b h1:h03Ur1RlPrGTjua4koYdpGl8W0eYo8p1uI9w7RPlkdk= golang.org/x/sys v0.0.0-20200408040146-ea54a3c99b9b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f h1:gWF768j/LaZugp8dyS4UwsslYCYz9XgFxvlgsn0n9H8= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -404,8 +459,11 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4S5cnCrr5SwzvlrPRmqqCuJDB8UTs= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200319113533-08878b785e9c h1:5aI3/f/3eCZps9xwoEnmgfDJDhMbnJpfqeGpjVNgVEI= +google.golang.org/genproto v0.0.0-20200319113533-08878b785e9c/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200424135956-bca184e23272 h1:yKqICwsk6cvaHc7nFgdKRJU45wKUGve28MXBkX8nCTg= +google.golang.org/genproto v0.0.0-20200424135956-bca184e23272/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -413,8 +471,16 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= diff --git a/service/run.go b/service/run.go index c4595313..b2e33c2c 100644 --- a/service/run.go +++ b/service/run.go @@ -21,6 +21,7 @@ import ( "github.com/keys-pub/keys/saltpack" "github.com/keys-pub/keys/util" "github.com/keys-pub/keysd/db" + "github.com/keys-pub/keysd/fido2" "github.com/keys-pub/keysd/http/client" "github.com/keys-pub/keysd/wormhole" "github.com/keys-pub/keysd/wormhole/sctp" @@ -49,7 +50,7 @@ func newProtoService(cfg *Config, build Build, auth *auth) (*protoService, error func (s *protoService) Register(grpcServer *grpc.Server) { RegisterKeysServer(grpcServer, s) - // fido2.RegisterAuthenticatorsServer(grpcServer, fido2.NewAuthenticatorsServer()) + fido2.RegisterAuthenticatorsServer(grpcServer, fido2.NewAuthenticatorsServer()) } func setupLogging(cfg *Config, logPath string) (Logger, LogInterceptor) { From 25355a9fa9aa9ec7b53114684aab8b2283a1649a Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Tue, 28 Apr 2020 13:33:36 -0700 Subject: [PATCH 2/7] fido2: Update go-libfido2 --- fido2/go.mod | 2 +- fido2/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/fido2/go.mod b/fido2/go.mod index 0c2bec8d..d3fa0673 100644 --- a/fido2/go.mod +++ b/fido2/go.mod @@ -5,7 +5,7 @@ go 1.14 require ( github.com/gogo/protobuf v1.3.1 github.com/golang/protobuf v1.4.0 // indirect - github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d + github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.5.0 github.com/stretchr/testify v1.5.1 diff --git a/fido2/go.sum b/fido2/go.sum index f5ec661e..a11a26da 100644 --- a/fido2/go.sum +++ b/fido2/go.sum @@ -43,6 +43,8 @@ github.com/keys-pub/go-libfido2 v0.0.0-20200427035032-3e225c0ecafc h1:KVD8kw82lU github.com/keys-pub/go-libfido2 v0.0.0-20200427035032-3e225c0ecafc/go.mod h1:fTqaHBgT+hk2QptbKZ2KpGtzDXbLLKntOW/hUD0iXR8= github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d h1:xDOACYC0W9SHJO1cxQSQLjh2i9idG1Bph4AoY4XQUwE= github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= +github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 h1:nc1WncWfTKmTQNFNhqvL0fVItI6HE/hut/rrQIvUw1k= +github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keysd v0.0.36 h1:LJ4icoup2ihQg9gSGCxtoYKem5jzPigf9VB777fuFTc= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= From fcffe127d760f7bb2f511fa6e183440df36550ef Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Tue, 28 Apr 2020 19:27:04 -0700 Subject: [PATCH 3/7] Plugin --- fido2/cmds/cmds.go | 14 - fido2/cmds/fido2/main.go | 50 +-- fido2/cmds/rpc.go | 144 -------- fido2/fido2.pb.go | 349 +++++++++++++----- fido2/fido2.proto | 32 +- fido2/go.sum | 1 + fido2/{ => libfido2}/rpc.go | 64 ++-- fido2/{service.go => libfido2/server.go} | 89 +++-- .../server_test.go} | 7 +- fido2/plugin.go | 25 ++ fido2/plugin/fido2.go | 8 + scripts/build.sh | 6 + service/cmd_fido2.go | 19 +- service/go.mod | 2 +- service/go.sum | 3 + service/run.go | 28 +- 16 files changed, 471 insertions(+), 370 deletions(-) delete mode 100644 fido2/cmds/cmds.go delete mode 100644 fido2/cmds/rpc.go rename fido2/{ => libfido2}/rpc.go (65%) rename fido2/{service.go => libfido2/server.go} (57%) rename fido2/{fido2_test.go => libfido2/server_test.go} (85%) create mode 100644 fido2/plugin.go create mode 100644 fido2/plugin/fido2.go diff --git a/fido2/cmds/cmds.go b/fido2/cmds/cmds.go deleted file mode 100644 index 030176fd..00000000 --- a/fido2/cmds/cmds.go +++ /dev/null @@ -1,14 +0,0 @@ -package cmds - -import ( - "encoding/json" - "fmt" -) - -func printResponse(i interface{}) { - b, err := json.MarshalIndent(i, "", " ") - if err != nil { - panic(err) - } - fmt.Println(string(b)) -} diff --git a/fido2/cmds/fido2/main.go b/fido2/cmds/fido2/main.go index 20992900..73c11201 100644 --- a/fido2/cmds/fido2/main.go +++ b/fido2/cmds/fido2/main.go @@ -1,49 +1,37 @@ package main import ( + "context" + "encoding/json" + "fmt" "log" "os" - "time" "github.com/keys-pub/keysd/fido2" - "github.com/keys-pub/keysd/fido2/cmds" - "github.com/sirupsen/logrus" - "github.com/urfave/cli" ) func main() { - app := cli.NewApp() - app.Name = "fido2" - app.Version = "1.4.0" - app.Usage = "Manage FIDO2 devices" - - app.Flags = []cli.Flag{} - - logger := logrus.StandardLogger() - formatter := &logrus.TextFormatter{ - FullTimestamp: true, - TimestampFormat: time.RFC3339Nano, + if len(os.Args) < 2 { + log.Fatal("specify fido2 library") } - logger.SetFormatter(formatter) - server := fido2.NewAuthenticatorsServer() - - cliCmds := []cli.Command{ - cmds.Devices(server), - cmds.DeviceInfo(server), - cmds.MakeCredential(server), + server, err := fido2.OpenPlugin(os.Args[1]) + if err != nil { + log.Fatal(err) } - // sort.Slice(cliCmds, func(i, j int) bool { - // return cliCmds[i].Name < cliCmds[j].Name - // }) - app.Commands = cliCmds - - app.Before = func(c *cli.Context) error { - return nil + req := &fido2.DevicesRequest{} + resp, err := server.Devices(context.TODO(), req) + if err != nil { + log.Fatal(err) } + printResponse(resp) +} - if err := app.Run(os.Args); err != nil { - log.Fatal(err) +func printResponse(i interface{}) { + b, err := json.MarshalIndent(i, "", " ") + if err != nil { + panic(err) } + fmt.Println(string(b)) } diff --git a/fido2/cmds/rpc.go b/fido2/cmds/rpc.go deleted file mode 100644 index 0481acc3..00000000 --- a/fido2/cmds/rpc.go +++ /dev/null @@ -1,144 +0,0 @@ -package cmds - -import ( - "context" - "encoding/json" - - "github.com/keys-pub/keysd/fido2" - "github.com/urfave/cli" -) - -type devicesFn func(ctx context.Context, in *fido2.DevicesRequest) (*fido2.DevicesResponse, error) - -func devices(rpc devicesFn) cli.Command { - return cli.Command{ - Name: "devices", - Usage: "Show devices", - Flags: []cli.Flag{}, - Action: func(c *cli.Context) error { - req := &fido2.DevicesRequest{} - resp, err := rpc(context.TODO(), req) - if err != nil { - return err - } - printResponse(resp) - return nil - }, - } -} - -// Devices ... -func Devices(rpc fido2.AuthenticatorsServer) cli.Command { - return devices(rpc.Devices) -} - -// DevicesFn ... -func DevicesFn(rpc func() fido2.AuthenticatorsClient) cli.Command { - return devices(func(ctx context.Context, in *fido2.DevicesRequest) (*fido2.DevicesResponse, error) { - return rpc().Devices(ctx, in) - }) -} - -type deviceInfoFn func(ctx context.Context, in *fido2.DeviceInfoRequest) (*fido2.DeviceInfoResponse, error) - -func deviceInfo(rpc deviceInfoFn) cli.Command { - return cli.Command{ - Name: "device-info", - Usage: "Device info", - Flags: []cli.Flag{}, - ArgsUsage: deviceInfoRequestExample(), - Action: func(c *cli.Context) error { - var req fido2.DeviceInfoRequest - if err := json.Unmarshal([]byte(c.Args().First()), &req); err != nil { - return err - } - resp, err := rpc(context.TODO(), &req) - if err != nil { - return err - } - printResponse(resp) - return nil - }, - } -} - -// DeviceInfo ... -func DeviceInfo(rpc fido2.AuthenticatorsServer) cli.Command { - return deviceInfo(rpc.DeviceInfo) -} - -// DeviceInfoFn ... -func DeviceInfoFn(rpc func() fido2.AuthenticatorsClient) cli.Command { - return deviceInfo(func(ctx context.Context, in *fido2.DeviceInfoRequest) (*fido2.DeviceInfoResponse, error) { - return rpc().DeviceInfo(ctx, in) - }) -} - -func deviceInfoRequestExample() string { - req := fido2.DeviceInfoRequest{ - Device: "device path or name", - } - b, err := json.Marshal(req) // , " ", " ") - if err != nil { - panic(err) - } - return "'" + string(b) + "'" -} - -type makeCredentialFn func(ctx context.Context, in *fido2.MakeCredentialRequest) (*fido2.MakeCredentialResponse, error) - -func makeCredential(rpc makeCredentialFn) cli.Command { - return cli.Command{ - Name: "make-credential", - Usage: "Make credential", - Flags: []cli.Flag{}, - ArgsUsage: makeCredentialRequestExample(), - Action: func(c *cli.Context) error { - var req fido2.MakeCredentialRequest - if err := json.Unmarshal([]byte(c.Args().First()), &req); err != nil { - return err - } - resp, err := rpc(context.TODO(), &req) - if err != nil { - return err - } - printResponse(resp) - return nil - }, - } -} - -// MakeCredential ... -func MakeCredential(rpc fido2.AuthenticatorsServer) cli.Command { - return makeCredential(rpc.MakeCredential) -} - -// MakeCredentialFn ... -func MakeCredentialFn(rpc func() fido2.AuthenticatorsClient) cli.Command { - return makeCredential(func(ctx context.Context, in *fido2.MakeCredentialRequest) (*fido2.MakeCredentialResponse, error) { - return rpc().MakeCredential(ctx, in) - }) -} - -func makeCredentialRequestExample() string { - req := fido2.MakeCredentialRequest{ - Device: "", - ClientDataHash: []byte{0x01}, - RP: &fido2.RelyingParty{ - ID: "rpID", - Name: "rpName", - }, - User: &fido2.User{ - ID: []byte{0x02}, - Name: "userName", - DisplayName: "userDisplayName", - }, - Type: "es256", // Algorithm - PIN: "12345", // Pin - } - b, err := json.Marshal(req) // , " ", " ") - if err != nil { - panic(err) - } - return "'" + string(b) + "'" -} diff --git a/fido2/fido2.pb.go b/fido2/fido2.pb.go index 521fe290..a42ce1b5 100644 --- a/fido2/fido2.pb.go +++ b/fido2/fido2.pb.go @@ -29,6 +29,93 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type DeviceType int32 + +const ( + UnknownDevice DeviceType = 0 + U2F DeviceType = 1 + FIDO2 DeviceType = 2 +) + +var DeviceType_name = map[int32]string{ + 0: "UNKNOWN_DEVICE", + 1: "U2F", + 2: "FIDO2", +} + +var DeviceType_value = map[string]int32{ + "UNKNOWN_DEVICE": 0, + "U2F": 1, + "FIDO2": 2, +} + +func (x DeviceType) String() string { + return proto.EnumName(DeviceType_name, int32(x)) +} + +func (DeviceType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_05bb79244b7f5be6, []int{0} +} + +type CredentialType int32 + +const ( + UnknownCredential CredentialType = 0 + ES256 CredentialType = 1 + EDDSA CredentialType = 2 + RS256 CredentialType = 3 +) + +var CredentialType_name = map[int32]string{ + 0: "UNKNOWN_CREDENTIAL", + 1: "ES256", + 2: "EDDSA", + 3: "RS256", +} + +var CredentialType_value = map[string]int32{ + "UNKNOWN_CREDENTIAL": 0, + "ES256": 1, + "EDDSA": 2, + "RS256": 3, +} + +func (x CredentialType) String() string { + return proto.EnumName(CredentialType_name, int32(x)) +} + +func (CredentialType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_05bb79244b7f5be6, []int{1} +} + +type Extension int32 + +const ( + UnknownExtension Extension = 0 + HMACSecret Extension = 1 + CredProtect Extension = 2 +) + +var Extension_name = map[int32]string{ + 0: "UNKNOWN_Extension", + 1: "HMAC_SECRET", + 2: "CRED_PROTECT", +} + +var Extension_value = map[string]int32{ + "UNKNOWN_Extension": 0, + "HMAC_SECRET": 1, + "CRED_PROTECT": 2, +} + +func (x Extension) String() string { + return proto.EnumName(Extension_name, int32(x)) +} + +func (Extension) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_05bb79244b7f5be6, []int{2} +} + type RPCError struct { Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` @@ -331,12 +418,13 @@ func (m *Attestation) XXX_DiscardUnknown() { var xxx_messageInfo_Attestation proto.InternalMessageInfo type Credential struct { - ID []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - User *User `protobuf:"bytes,3,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ID []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + RP *RelyingParty `protobuf:"bytes,10,opt,name=rp,proto3" json:"rp,omitempty"` + User *User `protobuf:"bytes,11,opt,name=user,proto3" json:"user,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Credential) Reset() { *m = Credential{} } @@ -1275,6 +1363,9 @@ func (m *RelyingPartiesResponse) XXX_DiscardUnknown() { var xxx_messageInfo_RelyingPartiesResponse proto.InternalMessageInfo func init() { + proto.RegisterEnum("fido2.DeviceType", DeviceType_name, DeviceType_value) + proto.RegisterEnum("fido2.CredentialType", CredentialType_name, CredentialType_value) + proto.RegisterEnum("fido2.Extension", Extension_name, Extension_value) proto.RegisterType((*RPCError)(nil), "fido2.RPCError") proto.RegisterType((*Device)(nil), "fido2.Device") proto.RegisterType((*Option)(nil), "fido2.Option") @@ -1310,91 +1401,106 @@ func init() { func init() { proto.RegisterFile("fido2.proto", fileDescriptor_05bb79244b7f5be6) } var fileDescriptor_05bb79244b7f5be6 = []byte{ - // 1332 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcb, 0x6e, 0x1b, 0x37, - 0x17, 0xf6, 0x8c, 0x2e, 0xb6, 0x8e, 0xe4, 0x1b, 0x63, 0x2b, 0x13, 0x21, 0x91, 0x0c, 0x02, 0x7f, - 0x7e, 0x23, 0x46, 0x5d, 0xd4, 0x09, 0x50, 0x20, 0xdd, 0xd4, 0xb2, 0xd2, 0x44, 0x31, 0x92, 0x08, - 0x4c, 0x13, 0xa0, 0x4b, 0x46, 0x43, 0xc9, 0x03, 0xcb, 0x33, 0x53, 0x0e, 0xc7, 0x88, 0x1f, 0xa4, - 0x6f, 0xd0, 0x4d, 0x97, 0x7d, 0x88, 0x02, 0x59, 0x76, 0xd9, 0x95, 0xd0, 0x68, 0xd3, 0x2e, 0xfb, - 0x08, 0x05, 0x2f, 0x9a, 0x8b, 0x34, 0xae, 0x81, 0x64, 0x47, 0x7e, 0xe7, 0xf0, 0xf0, 0xf0, 0xe3, - 0xc7, 0x6f, 0x24, 0xa8, 0x8f, 0x3c, 0x37, 0x38, 0x3a, 0x0c, 0x79, 0x20, 0x02, 0x54, 0x51, 0x93, - 0xd6, 0xce, 0x38, 0x18, 0x07, 0x0a, 0xf9, 0x52, 0x8e, 0x74, 0x10, 0x13, 0x58, 0x23, 0x83, 0x93, - 0x27, 0x9c, 0x07, 0x1c, 0x21, 0x28, 0x0f, 0x03, 0x97, 0x39, 0xd6, 0x9e, 0xb5, 0x5f, 0x21, 0x6a, - 0x8c, 0x1c, 0x58, 0xbd, 0x60, 0x51, 0x44, 0xc7, 0xcc, 0xb1, 0xf7, 0xac, 0xfd, 0x1a, 0x99, 0x4f, - 0x65, 0xc4, 0x65, 0x82, 0x7a, 0x93, 0xc8, 0x29, 0xe9, 0x88, 0x99, 0xe2, 0x5f, 0x2d, 0xa8, 0xf6, - 0xd8, 0xa5, 0x37, 0x64, 0xb2, 0x64, 0x48, 0xc5, 0x99, 0x2a, 0x59, 0x23, 0x6a, 0x8c, 0x0e, 0xa0, - 0x16, 0xf2, 0xc0, 0x8d, 0x87, 0xa2, 0xef, 0xaa, 0xa2, 0x95, 0xee, 0xfa, 0x6c, 0xda, 0xa9, 0x0d, - 0x0c, 0xd8, 0x23, 0x69, 0x1c, 0xed, 0xc3, 0xda, 0x25, 0xf3, 0xdd, 0x80, 0xf7, 0x5d, 0xb5, 0x4d, - 0xa5, 0xdb, 0x98, 0x4d, 0x3b, 0x6b, 0x6f, 0x35, 0xd6, 0x23, 0x49, 0x14, 0x61, 0x68, 0x5c, 0x50, - 0x3f, 0x1e, 0xd1, 0xa1, 0x88, 0x39, 0xe3, 0x4e, 0x59, 0x6d, 0x99, 0xc3, 0x64, 0xcf, 0xa6, 0xb4, - 0x53, 0xd1, 0x3d, 0x9b, 0x29, 0x3e, 0x82, 0xea, 0xab, 0x50, 0x78, 0x81, 0x2f, 0x5b, 0xf6, 0xe9, - 0x05, 0x9b, 0xb7, 0x2c, 0xc7, 0x68, 0x07, 0x2a, 0x97, 0x74, 0x12, 0xcf, 0x39, 0xd0, 0x13, 0xfc, - 0x93, 0x05, 0xa0, 0xcf, 0xd9, 0xf7, 0x47, 0x01, 0x6a, 0xc9, 0x56, 0x79, 0xe4, 0x05, 0x7e, 0xe4, - 0x58, 0x7b, 0xa5, 0xfd, 0x1a, 0x49, 0xe6, 0xa8, 0x0d, 0xc0, 0xde, 0x0b, 0xe6, 0xeb, 0xa8, 0xad, - 0xa2, 0x19, 0x04, 0x61, 0xa8, 0x52, 0x3a, 0x8e, 0x3d, 0x7d, 0xc8, 0x46, 0x17, 0x66, 0xd3, 0x4e, - 0xf5, 0xf8, 0xf8, 0xe9, 0x9b, 0x7e, 0x8f, 0x98, 0x08, 0xfa, 0x3f, 0xac, 0x06, 0xaa, 0xc5, 0xc8, - 0x29, 0xef, 0x95, 0xf6, 0xeb, 0x47, 0xeb, 0x87, 0xfa, 0x9a, 0x75, 0xe3, 0x64, 0x1e, 0xc5, 0x8f, - 0xa1, 0x41, 0xd8, 0xe4, 0xca, 0xf3, 0xc7, 0x03, 0xca, 0xc5, 0x15, 0x6a, 0x82, 0xed, 0xb9, 0xfa, - 0x3c, 0xdd, 0xea, 0x6c, 0xda, 0xb1, 0xfb, 0x3d, 0x62, 0x7b, 0x6e, 0x72, 0x52, 0x3b, 0x3d, 0x29, - 0x3e, 0x83, 0xf2, 0x9b, 0x88, 0xf1, 0xcc, 0x9a, 0xc6, 0x4d, 0x6b, 0xd0, 0x1e, 0xd4, 0x5d, 0x2f, - 0x0a, 0x27, 0xf4, 0xea, 0xa5, 0x0c, 0x69, 0x35, 0x64, 0x21, 0xb9, 0xca, 0x1b, 0x06, 0xbe, 0xb9, - 0x13, 0x35, 0xc6, 0x7f, 0x59, 0x50, 0x3f, 0x16, 0x82, 0x45, 0x82, 0x2a, 0xde, 0xef, 0xc3, 0xc6, - 0x70, 0xe2, 0x31, 0x5f, 0xf4, 0xa8, 0xa0, 0xcf, 0x68, 0xa4, 0x45, 0xd3, 0x20, 0x0b, 0xa8, 0xa4, - 0x99, 0xc6, 0xe2, 0x4c, 0xce, 0x55, 0x17, 0x0d, 0x92, 0xcc, 0x25, 0x8d, 0x43, 0xce, 0xdc, 0x7e, - 0x8e, 0xc6, 0x13, 0x89, 0xf4, 0x88, 0x89, 0xc8, 0xf5, 0x72, 0xf4, 0xfd, 0x55, 0xc8, 0x4c, 0x3f, - 0xc9, 0x1c, 0x35, 0xa1, 0x1a, 0xc6, 0xef, 0x4e, 0xd9, 0x95, 0x92, 0x47, 0x83, 0x98, 0x99, 0x7a, - 0x19, 0x8c, 0x0b, 0xa7, 0xaa, 0x50, 0x35, 0x46, 0x5b, 0x50, 0x8a, 0xbc, 0xb1, 0xb3, 0xaa, 0x20, - 0x39, 0x94, 0xab, 0x47, 0x01, 0xbf, 0xa0, 0xc2, 0x59, 0x53, 0x75, 0xcd, 0x0c, 0xff, 0x00, 0x20, - 0x7b, 0x60, 0xbe, 0xf0, 0xe8, 0xe4, 0xbf, 0x98, 0x15, 0xb2, 0x27, 0xc3, 0xac, 0x1c, 0xa3, 0x0e, - 0x94, 0xe3, 0x88, 0x71, 0x75, 0x9a, 0xfa, 0x51, 0xdd, 0xdc, 0xb7, 0xbc, 0x20, 0xa2, 0x02, 0xd8, - 0x83, 0xda, 0x71, 0x14, 0x31, 0xae, 0x18, 0xcc, 0x32, 0x63, 0x2d, 0x30, 0x63, 0xba, 0xb5, 0xd3, - 0x6e, 0x0f, 0x01, 0xce, 0x2e, 0xe8, 0xf0, 0x35, 0x1b, 0x72, 0x26, 0x0c, 0x5f, 0x1b, 0xb3, 0x69, - 0x07, 0x9e, 0xbd, 0x38, 0x3e, 0xd1, 0x28, 0xc9, 0x64, 0x60, 0x01, 0x9b, 0xe9, 0x29, 0x22, 0xa5, - 0xf8, 0x43, 0x00, 0x7e, 0xfe, 0xe4, 0xbd, 0x17, 0x09, 0xcf, 0x1f, 0x6b, 0xdb, 0xd0, 0x25, 0xc8, - 0xe9, 0x1c, 0x25, 0x99, 0x0c, 0xf4, 0x15, 0xd4, 0xf9, 0x39, 0x61, 0x17, 0xd4, 0xf3, 0xe5, 0x02, - 0xfd, 0xf6, 0x37, 0x67, 0xd3, 0x4e, 0x9d, 0x9c, 0x26, 0x30, 0xc9, 0xe6, 0xe0, 0x2d, 0xd8, 0xd0, - 0x4f, 0x2c, 0x22, 0xec, 0xc7, 0x98, 0x45, 0x02, 0x3f, 0x86, 0xcd, 0x04, 0x89, 0xc2, 0xc0, 0x8f, - 0x98, 0x7c, 0x19, 0xae, 0x86, 0xd4, 0xc3, 0x4b, 0x5f, 0x86, 0x4e, 0x24, 0xf3, 0x28, 0x3e, 0x80, - 0xed, 0xf4, 0xc1, 0x9a, 0x82, 0xf2, 0xda, 0x74, 0xdc, 0x3c, 0x79, 0x33, 0xc3, 0xdf, 0x00, 0xca, - 0x26, 0x9b, 0xbd, 0xfe, 0x07, 0x65, 0xcf, 0x1f, 0x05, 0x2a, 0xb7, 0x7e, 0xb4, 0x9d, 0xdb, 0x48, - 0x25, 0xaa, 0x30, 0xfe, 0xd9, 0x86, 0xdd, 0x17, 0xf4, 0x9c, 0xa5, 0x94, 0xdd, 0xb0, 0x5d, 0x81, - 0xfe, 0xed, 0x42, 0xfd, 0x1f, 0x80, 0xcd, 0x43, 0xa3, 0x88, 0x5b, 0x66, 0xfb, 0xec, 0x73, 0xd7, - 0xa2, 0x22, 0x03, 0x62, 0xf3, 0x30, 0x11, 0x50, 0xf9, 0x1a, 0x01, 0x25, 0xaa, 0xab, 0x64, 0x54, - 0x77, 0x07, 0x4a, 0xa1, 0xe7, 0x2b, 0xb1, 0xd7, 0xba, 0xab, 0xb3, 0x69, 0xa7, 0x34, 0xe8, 0xbf, - 0x24, 0x12, 0x5b, 0xf0, 0x31, 0x77, 0xc9, 0xc7, 0x9a, 0x60, 0xf3, 0x73, 0x87, 0xa5, 0x56, 0x43, - 0x4e, 0x89, 0xcd, 0xcf, 0x25, 0x1e, 0x5f, 0x3a, 0xa3, 0x14, 0x7f, 0xf3, 0x96, 0xd8, 0xf1, 0x25, - 0x7e, 0x09, 0xcd, 0x45, 0x96, 0x0c, 0xcf, 0x8f, 0xa0, 0x4e, 0x53, 0x77, 0x30, 0x74, 0x23, 0x73, - 0x80, 0x8c, 0x6f, 0x90, 0x6c, 0x1a, 0x1e, 0xc1, 0xfa, 0x6b, 0x26, 0x64, 0xbb, 0x37, 0xb0, 0x6d, - 0xce, 0x68, 0x17, 0x9c, 0x11, 0x43, 0x35, 0x98, 0xb8, 0x03, 0xcf, 0xd7, 0x4e, 0xa6, 0x4d, 0xe4, - 0xd5, 0xc4, 0x95, 0x09, 0x26, 0x22, 0x65, 0x39, 0xdf, 0x47, 0xf7, 0x8b, 0xef, 0x4b, 0xd3, 0x8d, - 0x98, 0xb8, 0x49, 0x55, 0x9b, 0xb0, 0x6e, 0xf2, 0xcc, 0xc2, 0x03, 0xd8, 0x26, 0x4c, 0xf0, 0xab, - 0x93, 0x20, 0xf6, 0x6f, 0x5c, 0xfd, 0x00, 0x50, 0x36, 0xd9, 0x70, 0xb5, 0x03, 0x95, 0xa1, 0x04, - 0xcc, 0x97, 0x5b, 0x4f, 0xf0, 0x2f, 0x36, 0x6c, 0x25, 0xe6, 0x70, 0x13, 0x1f, 0x77, 0xa1, 0xcc, - 0x43, 0xf3, 0x3d, 0xae, 0x75, 0xd7, 0x66, 0xd3, 0x4e, 0x99, 0x0c, 0xfa, 0x3d, 0xa2, 0xd0, 0x02, - 0x6d, 0x96, 0x0a, 0xb5, 0x99, 0xfa, 0x6f, 0xf9, 0x5a, 0xff, 0x35, 0xcc, 0x57, 0x3e, 0x4d, 0x5d, - 0xf1, 0x65, 0x56, 0x5d, 0x5a, 0x45, 0x0a, 0x0f, 0x73, 0xea, 0x1a, 0x10, 0x3b, 0x0e, 0xe5, 0x8f, - 0x07, 0x65, 0x60, 0x74, 0x22, 0x9c, 0xb1, 0x6a, 0x48, 0xfd, 0x78, 0x50, 0x06, 0x47, 0x27, 0x82, - 0x24, 0x51, 0x7c, 0x02, 0xdb, 0x19, 0xaa, 0x0c, 0xad, 0x87, 0x50, 0xa3, 0x73, 0xd0, 0x08, 0x70, - 0x6b, 0x2e, 0xc0, 0x24, 0x39, 0x4d, 0xc1, 0xa7, 0xd0, 0x5c, 0x70, 0xc8, 0x4f, 0x57, 0x21, 0x7e, - 0x02, 0xb7, 0x97, 0x8a, 0x99, 0xbe, 0x1e, 0xe4, 0x2c, 0xa8, 0x69, 0x5a, 0x5a, 0xcc, 0xd6, 0x3e, - 0xc4, 0x00, 0x65, 0x02, 0x9f, 0xa7, 0x02, 0xd3, 0x6d, 0xa9, 0xa0, 0xdb, 0xe7, 0x70, 0x2b, 0xb7, - 0x8d, 0xe9, 0xf4, 0x21, 0xd4, 0x87, 0x29, 0x6c, 0xcc, 0x79, 0x7b, 0xa9, 0x61, 0x92, 0xcd, 0xc2, - 0xcf, 0x61, 0x37, 0xe3, 0x67, 0x1e, 0x8b, 0x3e, 0x83, 0xc5, 0xa7, 0xd0, 0x5c, 0xac, 0x65, 0x5a, - 0xfb, 0x02, 0x56, 0x43, 0x0d, 0x99, 0xb6, 0x8a, 0xbc, 0x94, 0xcc, 0x73, 0x8e, 0x7e, 0xab, 0xc0, - 0xc6, 0x71, 0x2c, 0xce, 0x64, 0x93, 0x43, 0x2a, 0x02, 0x1e, 0xa1, 0xc7, 0xb0, 0x6a, 0x3e, 0x44, - 0x68, 0x37, 0xf7, 0x19, 0x98, 0x37, 0xdc, 0x6a, 0x2e, 0xc2, 0xe6, 0xc9, 0xaf, 0xa0, 0x93, 0xdc, - 0x2f, 0x47, 0x67, 0xf9, 0x2b, 0x62, 0x2a, 0xdc, 0x29, 0x88, 0x24, 0x45, 0x5e, 0xc1, 0x46, 0xde, - 0x3c, 0xd1, 0x5d, 0x93, 0x5e, 0xf8, 0xe5, 0x69, 0xdd, 0xbb, 0x26, 0x9a, 0x14, 0xfc, 0x1a, 0xaa, - 0xda, 0xd5, 0xd0, 0x8e, 0x49, 0xcd, 0x99, 0x69, 0x6b, 0x77, 0x01, 0x4d, 0x16, 0x3e, 0x82, 0x8a, - 0x32, 0x35, 0x94, 0x92, 0x98, 0x5a, 0x61, 0x6b, 0x27, 0x0f, 0x66, 0x49, 0x48, 0xcd, 0x2c, 0x21, - 0x61, 0xc9, 0x0c, 0x13, 0x12, 0x96, 0x9d, 0x0f, 0xaf, 0xa0, 0x6f, 0xb3, 0xbf, 0x80, 0x6e, 0x2f, - 0x3d, 0x4f, 0x53, 0xc2, 0x59, 0x0e, 0x24, 0x15, 0xc8, 0xf2, 0x0f, 0x9b, 0x7b, 0xd7, 0xbc, 0x29, - 0x53, 0xad, 0x7d, 0x5d, 0x38, 0xa9, 0xf9, 0x1d, 0xd4, 0x33, 0x41, 0x74, 0x67, 0x79, 0xc1, 0xbc, - 0x56, 0xab, 0x28, 0x94, 0xbd, 0xe2, 0xbc, 0x7e, 0x93, 0x2b, 0x2e, 0x7c, 0x22, 0xc9, 0x15, 0x17, - 0x8b, 0x1e, 0xaf, 0x74, 0xef, 0x7e, 0xf8, 0xd8, 0x5e, 0xf9, 0xe3, 0x63, 0xdb, 0xfa, 0xe7, 0x63, - 0xdb, 0xfa, 0x30, 0x6b, 0x5b, 0xbf, 0xcf, 0xda, 0xd6, 0x9f, 0xb3, 0xb6, 0xf5, 0xf7, 0xac, 0x6d, - 0xbd, 0xab, 0xaa, 0x3f, 0x85, 0x0f, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x06, 0xe0, 0x51, 0x76, - 0x40, 0x0e, 0x00, 0x00, + // 1577 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xbd, 0x6f, 0x1b, 0x47, + 0x16, 0xe7, 0x2e, 0x3f, 0x24, 0x3e, 0x52, 0x14, 0x39, 0x96, 0xe8, 0xf5, 0xc2, 0x26, 0x79, 0x0b, + 0xd8, 0x27, 0x48, 0xb0, 0x0e, 0x47, 0xfb, 0xee, 0x00, 0x5f, 0x73, 0x14, 0x49, 0xdb, 0xb4, 0xce, + 0x12, 0x31, 0x92, 0x7c, 0xc5, 0x15, 0xc6, 0x9a, 0x1c, 0x51, 0x0b, 0x51, 0xbb, 0xbc, 0xdd, 0x59, + 0x9d, 0xf5, 0x0f, 0x04, 0x81, 0x9a, 0x54, 0x29, 0x52, 0xa8, 0x8a, 0x9b, 0x94, 0x69, 0xd3, 0x07, + 0x70, 0x99, 0x32, 0x15, 0x11, 0xb3, 0x49, 0xca, 0xfc, 0x09, 0xc1, 0x7c, 0xec, 0x07, 0x3f, 0x14, + 0x21, 0x76, 0xb7, 0xef, 0xf7, 0xde, 0xbc, 0xf9, 0xcd, 0x9b, 0x37, 0xbf, 0x99, 0x85, 0xdc, 0xb1, + 0xd5, 0x77, 0xea, 0xdb, 0x23, 0xd7, 0xa1, 0x0e, 0x4a, 0x73, 0x43, 0x5f, 0x1b, 0x38, 0x03, 0x87, + 0x23, 0x7f, 0x61, 0x5f, 0xc2, 0x69, 0x60, 0x58, 0xc6, 0xdd, 0x66, 0xdb, 0x75, 0x1d, 0x17, 0x21, + 0x48, 0xf5, 0x9c, 0x3e, 0xd1, 0x94, 0x9a, 0xb2, 0x91, 0xc6, 0xfc, 0x1b, 0x69, 0xb0, 0x74, 0x46, + 0x3c, 0xcf, 0x1c, 0x10, 0x4d, 0xad, 0x29, 0x1b, 0x59, 0x1c, 0x98, 0xcc, 0xd3, 0x27, 0xd4, 0xb4, + 0x86, 0x9e, 0x96, 0x14, 0x1e, 0x69, 0x1a, 0xdf, 0x2a, 0x90, 0x69, 0x91, 0x73, 0xab, 0x47, 0x58, + 0xca, 0x91, 0x49, 0x4f, 0x78, 0xca, 0x2c, 0xe6, 0xdf, 0x68, 0x0b, 0xb2, 0x23, 0xd7, 0xe9, 0xfb, + 0x3d, 0xda, 0xe9, 0xf3, 0xa4, 0xe9, 0x9d, 0x95, 0xc9, 0xb8, 0x9a, 0xed, 0x4a, 0xb0, 0x85, 0x23, + 0x3f, 0xda, 0x80, 0xe5, 0x73, 0x62, 0xf7, 0x1d, 0xb7, 0xd3, 0xe7, 0xd3, 0xa4, 0x77, 0xf2, 0x93, + 0x71, 0x75, 0xf9, 0x95, 0xc0, 0x5a, 0x38, 0xf4, 0x22, 0x03, 0xf2, 0x67, 0xa6, 0xed, 0x1f, 0x9b, + 0x3d, 0xea, 0xbb, 0xc4, 0xd5, 0x52, 0x7c, 0xca, 0x29, 0x8c, 0x71, 0x96, 0xa9, 0xb5, 0xb4, 0xe0, + 0x2c, 0x4d, 0xa3, 0x0e, 0x99, 0xfd, 0x11, 0xb5, 0x1c, 0x9b, 0x51, 0xb6, 0xcd, 0x33, 0x12, 0x50, + 0x66, 0xdf, 0x68, 0x0d, 0xd2, 0xe7, 0xe6, 0xd0, 0x0f, 0x6a, 0x20, 0x0c, 0xe3, 0x4b, 0x05, 0x40, + 0xac, 0xb3, 0x63, 0x1f, 0x3b, 0x48, 0x67, 0x54, 0x5d, 0xcf, 0x72, 0x6c, 0x4f, 0x53, 0x6a, 0xc9, + 0x8d, 0x2c, 0x0e, 0x6d, 0x54, 0x01, 0x20, 0x6f, 0x29, 0xb1, 0x85, 0x57, 0xe5, 0xde, 0x18, 0x82, + 0x0c, 0xc8, 0x98, 0xe6, 0xc0, 0xb7, 0xc4, 0x22, 0xf3, 0x3b, 0x30, 0x19, 0x57, 0x33, 0x8d, 0xc6, + 0xb3, 0xa3, 0x4e, 0x0b, 0x4b, 0x0f, 0xfa, 0x33, 0x2c, 0x39, 0x9c, 0xa2, 0xa7, 0xa5, 0x6a, 0xc9, + 0x8d, 0x5c, 0x7d, 0x65, 0x5b, 0x6c, 0xb3, 0x20, 0x8e, 0x03, 0xaf, 0xf1, 0x04, 0xf2, 0x98, 0x0c, + 0x2f, 0x2c, 0x7b, 0xd0, 0x35, 0x5d, 0x7a, 0x81, 0xca, 0xa0, 0x5a, 0x7d, 0xb1, 0x9e, 0x9d, 0xcc, + 0x64, 0x5c, 0x55, 0x3b, 0x2d, 0xac, 0x5a, 0xfd, 0x70, 0xa5, 0x6a, 0xb4, 0x52, 0xe3, 0x04, 0x52, + 0x47, 0x1e, 0x71, 0x63, 0x63, 0xf2, 0x37, 0x8d, 0x41, 0x35, 0xc8, 0xf5, 0x2d, 0x6f, 0x34, 0x34, + 0x2f, 0xf6, 0x98, 0x4b, 0x74, 0x43, 0x1c, 0x62, 0xa3, 0xac, 0x9e, 0x63, 0xcb, 0x3d, 0xe1, 0xdf, + 0xc6, 0xcf, 0x0a, 0xe4, 0x1a, 0x94, 0x12, 0x8f, 0x9a, 0xbc, 0xee, 0x0f, 0xa0, 0xd0, 0x1b, 0x5a, + 0xc4, 0xa6, 0x2d, 0x93, 0x9a, 0xcf, 0x4d, 0x4f, 0x34, 0x4d, 0x1e, 0xcf, 0xa0, 0xac, 0xcc, 0xa6, + 0x4f, 0x4f, 0x98, 0xcd, 0x59, 0xe4, 0x71, 0x68, 0xb3, 0x32, 0xf6, 0x5c, 0xd2, 0xef, 0x4c, 0x95, + 0xb1, 0xc9, 0x90, 0x16, 0x96, 0x1e, 0x36, 0x9e, 0x7d, 0x1d, 0x5e, 0x8c, 0x88, 0xe4, 0x13, 0xda, + 0xa8, 0x0c, 0x99, 0x91, 0xff, 0x66, 0x97, 0x5c, 0xf0, 0xf6, 0xc8, 0x63, 0x69, 0xf1, 0x93, 0x41, + 0x5c, 0xaa, 0x65, 0x38, 0xca, 0xbf, 0x51, 0x11, 0x92, 0x9e, 0x35, 0xd0, 0x96, 0x38, 0xc4, 0x3e, + 0xd9, 0xe8, 0x63, 0xc7, 0x3d, 0x33, 0xa9, 0xb6, 0xcc, 0xf3, 0x4a, 0xcb, 0xf8, 0x4c, 0x01, 0x60, + 0x24, 0x88, 0x4d, 0x2d, 0x73, 0xf8, 0x7b, 0xa5, 0xa5, 0x8c, 0x94, 0x2c, 0x2d, 0xfb, 0x46, 0x5b, + 0xa0, 0xba, 0x23, 0x0d, 0x6a, 0xca, 0x46, 0xae, 0x7e, 0x4b, 0x6e, 0x77, 0x7c, 0x6f, 0x45, 0x02, + 0xdc, 0xc5, 0xaa, 0x3b, 0x42, 0x55, 0x48, 0xf9, 0x1e, 0x71, 0xb5, 0x1c, 0x0f, 0xcf, 0xc9, 0x70, + 0xb6, 0x9d, 0x98, 0x3b, 0x0c, 0x0b, 0xb2, 0x0d, 0xcf, 0x23, 0x2e, 0xaf, 0x77, 0xbc, 0x8e, 0xca, + 0x4c, 0x1d, 0xe5, 0xda, 0xd4, 0x68, 0x6d, 0xdb, 0x00, 0x27, 0x67, 0x66, 0xef, 0x80, 0xf4, 0x5c, + 0x42, 0x65, 0x75, 0x0b, 0x93, 0x71, 0x15, 0x9e, 0xbf, 0x6c, 0x34, 0x05, 0x8a, 0x63, 0x11, 0x06, + 0x85, 0xd5, 0x68, 0xc9, 0x1e, 0x3f, 0x1f, 0xdb, 0x00, 0xee, 0x69, 0xfb, 0xad, 0xe5, 0x51, 0xcb, + 0x1e, 0x08, 0x91, 0x11, 0x29, 0xf0, 0x6e, 0x80, 0xe2, 0x58, 0x04, 0xfa, 0x2b, 0xe4, 0xdc, 0x53, + 0x4c, 0xce, 0x4c, 0xcb, 0x66, 0x03, 0x84, 0x52, 0xac, 0x4e, 0xc6, 0xd5, 0x1c, 0xde, 0x0d, 0x61, + 0x1c, 0x8f, 0x31, 0x8a, 0x50, 0x10, 0x07, 0xd2, 0xc3, 0xe4, 0x7f, 0x3e, 0xf1, 0xa8, 0xf1, 0x04, + 0x56, 0x43, 0xc4, 0x1b, 0x39, 0xb6, 0x47, 0xd8, 0x39, 0xea, 0x0b, 0x88, 0x1f, 0xd3, 0xe8, 0x1c, + 0x89, 0x40, 0x1c, 0x78, 0x8d, 0x2d, 0x28, 0x45, 0xc7, 0x5b, 0x26, 0x64, 0x9b, 0x2c, 0xfc, 0x52, + 0x20, 0xa4, 0x65, 0xfc, 0x13, 0x50, 0x3c, 0x58, 0xce, 0x75, 0x1f, 0x52, 0x96, 0x7d, 0xec, 0xf0, + 0xd8, 0x5c, 0xbd, 0x34, 0x35, 0x11, 0x0f, 0xe4, 0x6e, 0xe3, 0x9d, 0x0a, 0xeb, 0x2f, 0xcd, 0x53, + 0x12, 0x95, 0xec, 0x86, 0xe9, 0x16, 0x9c, 0x16, 0x75, 0xe1, 0x69, 0x11, 0x0d, 0x94, 0xfc, 0x63, + 0x0d, 0x94, 0xba, 0xa6, 0x81, 0xc2, 0x16, 0x4d, 0xc7, 0x5a, 0xf4, 0x0e, 0x24, 0x47, 0x96, 0xcd, + 0x8f, 0x46, 0x76, 0x67, 0x69, 0x32, 0xae, 0x26, 0xbb, 0x9d, 0x3d, 0xcc, 0xb0, 0x19, 0xd5, 0xeb, + 0xcf, 0xa9, 0x5e, 0x19, 0x54, 0xf7, 0x54, 0x23, 0x91, 0x30, 0xe1, 0x5d, 0xac, 0xba, 0xa7, 0x0c, + 0xf7, 0xcf, 0xb5, 0xe3, 0x08, 0x3f, 0x7a, 0x85, 0x55, 0xff, 0xdc, 0xd8, 0x83, 0xf2, 0x6c, 0x95, + 0x64, 0x9d, 0x1f, 0x43, 0xce, 0x8c, 0xb4, 0x44, 0x96, 0x1b, 0xc9, 0x05, 0xc4, 0x54, 0x06, 0xc7, + 0xc3, 0x8c, 0x63, 0x58, 0x39, 0x20, 0x94, 0xd1, 0xbd, 0xa1, 0xda, 0x72, 0x8d, 0xea, 0x82, 0x35, + 0x1a, 0x90, 0x71, 0x86, 0xfd, 0xae, 0x65, 0x0b, 0xdd, 0x13, 0x92, 0xb3, 0x3f, 0xec, 0xb3, 0x00, + 0xe9, 0x61, 0x6d, 0x19, 0xcc, 0x23, 0xf8, 0x1a, 0x0f, 0x98, 0x44, 0x7b, 0x84, 0xde, 0xd4, 0x55, + 0xab, 0xb0, 0x22, 0xe3, 0xe4, 0xc0, 0x2d, 0x28, 0x61, 0x42, 0xdd, 0x8b, 0xa6, 0xe3, 0xdb, 0x37, + 0x8e, 0xde, 0x04, 0x14, 0x0f, 0x96, 0xb5, 0x5a, 0x83, 0x74, 0x8f, 0x01, 0xf2, 0x9e, 0x17, 0x86, + 0xf1, 0x8d, 0x0a, 0xc5, 0x50, 0x1c, 0x6e, 0xaa, 0xc7, 0x5d, 0x48, 0xb9, 0x23, 0x79, 0x7b, 0x67, + 0x77, 0x96, 0x27, 0xe3, 0x6a, 0x0a, 0x77, 0x3b, 0x2d, 0xcc, 0xd1, 0x05, 0xbd, 0x99, 0x5c, 0xd8, + 0x9b, 0x91, 0x5a, 0xa7, 0xae, 0x55, 0x6b, 0x59, 0xf9, 0xf4, 0xc7, 0x75, 0x97, 0x7f, 0x1e, 0xef, + 0x2e, 0xd1, 0x45, 0x1c, 0x1f, 0x4d, 0x75, 0x57, 0x17, 0xab, 0xfe, 0x88, 0x3d, 0x35, 0xb8, 0x80, + 0x99, 0x43, 0xaa, 0x0d, 0x38, 0x21, 0xfe, 0xd4, 0xe0, 0x02, 0x67, 0x0e, 0x29, 0x0e, 0xbd, 0x46, + 0x13, 0x4a, 0xb1, 0x52, 0xc9, 0xb2, 0x6e, 0x43, 0xd6, 0x0c, 0x40, 0xd9, 0x80, 0xc5, 0xa0, 0x01, + 0xc3, 0xe0, 0x28, 0xc4, 0xd8, 0x85, 0xf2, 0x8c, 0x42, 0x7e, 0x7c, 0x17, 0x1a, 0x6d, 0xb8, 0x3d, + 0x97, 0x4c, 0xf2, 0xda, 0x9c, 0x92, 0xa0, 0xb2, 0xa4, 0x34, 0x1b, 0x2d, 0x74, 0x88, 0x00, 0x8a, + 0x39, 0x3e, 0xad, 0x0b, 0x24, 0xdb, 0xe4, 0x02, 0xb6, 0x2f, 0xe0, 0xd6, 0xd4, 0x34, 0x92, 0xe9, + 0x23, 0xc8, 0xf5, 0x22, 0x58, 0x8a, 0x73, 0x69, 0x8e, 0x30, 0x8e, 0x47, 0x19, 0x2f, 0x60, 0x3d, + 0xa6, 0x67, 0x16, 0xf1, 0x3e, 0xa1, 0x8a, 0xcf, 0xa0, 0x3c, 0x9b, 0x4b, 0x52, 0x7b, 0x08, 0x4b, + 0x23, 0x01, 0x49, 0x5a, 0x8b, 0xb4, 0x14, 0x07, 0x31, 0x9b, 0xff, 0x0d, 0x1e, 0x86, 0xfc, 0x55, + 0x71, 0x1f, 0x0a, 0x47, 0x7b, 0xbb, 0x7b, 0xfb, 0xff, 0xd9, 0x7b, 0xdd, 0x6a, 0xbf, 0xea, 0x34, + 0xdb, 0xc5, 0x84, 0x5e, 0xba, 0xbc, 0xaa, 0xad, 0x1c, 0xd9, 0xa7, 0xb6, 0xf3, 0x7f, 0x5b, 0xbe, + 0x95, 0x97, 0x20, 0x79, 0x54, 0x7f, 0x5a, 0x54, 0x50, 0x16, 0xd2, 0x4f, 0x3b, 0xad, 0xfd, 0x7a, + 0x51, 0xd5, 0xd1, 0xe7, 0x5f, 0x57, 0x12, 0xdf, 0xbd, 0xab, 0xc4, 0xd2, 0x6d, 0x7e, 0xa5, 0x40, + 0x21, 0xaa, 0x06, 0x9f, 0xe1, 0x21, 0xa0, 0x60, 0x86, 0x26, 0x6e, 0xb7, 0xda, 0x7b, 0x87, 0x9d, + 0xc6, 0xbf, 0x8b, 0x09, 0x7d, 0xfd, 0xf2, 0xaa, 0x56, 0x92, 0xb3, 0xc4, 0x5e, 0x20, 0x6b, 0x90, + 0x6e, 0x1f, 0xd4, 0xff, 0xf6, 0xf7, 0xa2, 0xa2, 0x67, 0x2f, 0xaf, 0x6a, 0xc2, 0xe0, 0x68, 0xab, + 0x75, 0xd0, 0x28, 0xaa, 0x12, 0x65, 0x06, 0x43, 0x31, 0x8f, 0x4d, 0x0a, 0x94, 0x1b, 0x7a, 0x59, + 0xf2, 0x9a, 0x21, 0xb2, 0xf9, 0x85, 0x02, 0xd9, 0x76, 0x70, 0x04, 0xd1, 0x16, 0x94, 0x02, 0x5a, + 0x21, 0x58, 0x4c, 0xe8, 0x6b, 0x97, 0x57, 0xb5, 0xa2, 0x64, 0x15, 0x05, 0x57, 0x21, 0xc7, 0x8e, + 0xda, 0xeb, 0x83, 0x76, 0x13, 0xb7, 0x0f, 0x8b, 0x8a, 0x5e, 0xb8, 0xbc, 0xaa, 0xc5, 0x9e, 0x17, + 0xe8, 0x4f, 0x90, 0x67, 0x8b, 0x7b, 0xdd, 0xc5, 0xfb, 0x87, 0xed, 0xe6, 0x61, 0x51, 0xd5, 0x57, + 0x2f, 0xaf, 0x6a, 0x39, 0xc6, 0xa0, 0xeb, 0x3a, 0x94, 0xf4, 0xa8, 0x5e, 0x92, 0xb4, 0x22, 0x0e, + 0xf5, 0xef, 0xd3, 0x50, 0x68, 0xf8, 0xf4, 0x84, 0x91, 0xec, 0x99, 0xd4, 0x71, 0x3d, 0xf4, 0x04, + 0x96, 0xe4, 0x9b, 0x00, 0xad, 0x4f, 0xdd, 0xc8, 0x41, 0xef, 0xe8, 0xe5, 0x59, 0x58, 0xaa, 0x6f, + 0x02, 0x35, 0xa7, 0x9e, 0xfc, 0xda, 0xfc, 0x85, 0x2e, 0x33, 0xdc, 0x59, 0xe0, 0x09, 0x93, 0xec, + 0x43, 0x61, 0xfa, 0x1e, 0x43, 0x77, 0x65, 0xf8, 0xc2, 0x47, 0x80, 0x7e, 0xef, 0x1a, 0x6f, 0x98, + 0xf0, 0x1f, 0x90, 0x11, 0x17, 0x0c, 0x5a, 0x93, 0xa1, 0x53, 0xf7, 0x9a, 0xbe, 0x3e, 0x83, 0x86, + 0x03, 0x1f, 0x43, 0x9a, 0xdf, 0x2f, 0x28, 0xea, 0xe7, 0xe8, 0x56, 0xd2, 0xd7, 0xa6, 0xc1, 0x78, + 0x11, 0xa2, 0x7b, 0x25, 0x2c, 0xc2, 0xdc, 0xbd, 0x14, 0x16, 0x61, 0xfe, 0x12, 0x32, 0x12, 0xe8, + 0x5f, 0xf1, 0xc7, 0xe8, 0xed, 0x39, 0xa5, 0x94, 0x29, 0xb4, 0x79, 0x47, 0x98, 0x01, 0xcf, 0xbf, + 0x31, 0xef, 0x5d, 0x23, 0x6f, 0x32, 0x5b, 0xe5, 0x3a, 0x77, 0x98, 0xf3, 0x29, 0xe4, 0x62, 0x4e, + 0x74, 0x67, 0x7e, 0x40, 0x90, 0x4b, 0x5f, 0xe4, 0x8a, 0x6f, 0xf1, 0xb4, 0x94, 0x84, 0x5b, 0xbc, + 0x50, 0xad, 0xc2, 0x2d, 0x5e, 0xac, 0x3f, 0x46, 0x62, 0xe7, 0xee, 0xfb, 0x0f, 0x95, 0xc4, 0x8f, + 0x1f, 0x2a, 0xca, 0xaf, 0x1f, 0x2a, 0xca, 0xfb, 0x49, 0x45, 0xf9, 0x61, 0x52, 0x51, 0x7e, 0x9a, + 0x54, 0x94, 0x5f, 0x26, 0x15, 0xe5, 0x4d, 0x86, 0xff, 0xcd, 0x3f, 0xfa, 0x2d, 0x00, 0x00, 0xff, + 0xff, 0x96, 0x52, 0xac, 0xbe, 0xf9, 0x0f, 0x00, 0x00, } func (this *RPCError) GoString() string { @@ -1515,10 +1621,13 @@ func (this *Credential) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 7) + s := make([]string, 0, 8) s = append(s, "&fido2.Credential{") s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.RP != nil { + s = append(s, "RP: "+fmt.Sprintf("%#v", this.RP)+",\n") + } if this.User != nil { s = append(s, "User: "+fmt.Sprintf("%#v", this.User)+",\n") } @@ -2691,7 +2800,19 @@ func (m *Credential) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintFido2(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x5a + } + if m.RP != nil { + { + size, err := m.RP.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintFido2(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 } if len(m.Type) > 0 { i -= len(m.Type) @@ -3899,6 +4020,10 @@ func (m *Credential) Size() (n int) { if l > 0 { n += 1 + l + sovFido2(uint64(l)) } + if m.RP != nil { + l = m.RP.Size() + n += 1 + l + sovFido2(uint64(l)) + } if m.User != nil { l = m.User.Size() n += 1 + l + sovFido2(uint64(l)) @@ -5710,7 +5835,43 @@ func (m *Credential) Unmarshal(dAtA []byte) error { } m.Type = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFido2 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFido2 + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFido2 + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RP == nil { + m.RP = &RelyingParty{} + } + if err := m.RP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } diff --git a/fido2/fido2.proto b/fido2/fido2.proto index 553442be..5ded02e3 100644 --- a/fido2/fido2.proto +++ b/fido2/fido2.proto @@ -86,7 +86,8 @@ message Attestation { message Credential { bytes id = 1 [(gogoproto.customname) = "ID"]; string type = 2; - User user = 3; + RelyingParty rp = 10 [(gogoproto.customname) = "RP"]; + User user = 11; } message Assertion { @@ -191,3 +192,32 @@ message RelyingPartiesRequest { message RelyingPartiesResponse { repeated RelyingParty parties = 1; } + + +enum DeviceType { + option (gogoproto.goproto_enum_prefix) = false; + option (gogoproto.enum_customname) = "DeviceType"; + + UNKNOWN_DEVICE = 0 [(gogoproto.enumvalue_customname) = "UnknownDevice"]; + U2F = 1; + FIDO2 = 2; +} + +enum CredentialType { + option (gogoproto.goproto_enum_prefix) = false; + option (gogoproto.enum_customname) = "CredentialType"; + + UNKNOWN_CREDENTIAL = 0 [(gogoproto.enumvalue_customname) = "UnknownCredential"]; + ES256 = 1 [(gogoproto.enumvalue_customname) = "ES256"]; + EDDSA = 2 [(gogoproto.enumvalue_customname) = "EDDSA"]; + RS256 = 3 [(gogoproto.enumvalue_customname) = "RS256"]; +} + +enum Extension { + option (gogoproto.goproto_enum_prefix) = false; + option (gogoproto.enum_customname) = "Extension"; + + UNKNOWN_Extension = 0 [(gogoproto.enumvalue_customname) = "UnknownExtension"]; + HMAC_SECRET = 1 [(gogoproto.enumvalue_customname) = "HMACSecret"]; + CRED_PROTECT = 2 [(gogoproto.enumvalue_customname) = "CredProtect"]; +} \ No newline at end of file diff --git a/fido2/go.sum b/fido2/go.sum index a11a26da..208c5d0a 100644 --- a/fido2/go.sum +++ b/fido2/go.sum @@ -46,6 +46,7 @@ github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 h1:nc1WncWfTKmTQNFNhqvL0fVItI6HE/hut/rrQIvUw1k= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keysd v0.0.36 h1:LJ4icoup2ihQg9gSGCxtoYKem5jzPigf9VB777fuFTc= +github.com/keys-pub/keysd v0.0.37 h1:Qx3Dhav0FMpJZGmSCbTcqHFMP6/q37arpdYBzbgseyA= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= diff --git a/fido2/rpc.go b/fido2/libfido2/rpc.go similarity index 65% rename from fido2/rpc.go rename to fido2/libfido2/rpc.go index ffbc1253..c157705a 100644 --- a/fido2/rpc.go +++ b/fido2/libfido2/rpc.go @@ -1,14 +1,15 @@ -package fido2 +package libfido2 import ( "github.com/keys-pub/go-libfido2" + "github.com/keys-pub/keysd/fido2" "github.com/pkg/errors" ) -func devicesToRPC(ins []*libfido2.DeviceLocation) []*Device { - outs := make([]*Device, 0, len(ins)) +func devicesToRPC(ins []*libfido2.DeviceLocation) []*fido2.Device { + outs := make([]*fido2.Device, 0, len(ins)) for _, in := range ins { - outs = append(outs, &Device{ + outs = append(outs, &fido2.Device{ Path: in.Path, ProductID: int32(in.ProductID), VendorID: int32(in.VendorID), @@ -19,8 +20,8 @@ func devicesToRPC(ins []*libfido2.DeviceLocation) []*Device { return outs } -func deviceInfoToRPC(in *libfido2.DeviceInfo) *DeviceInfo { - return &DeviceInfo{ +func deviceInfoToRPC(in *libfido2.DeviceInfo) *fido2.DeviceInfo { + return &fido2.DeviceInfo{ Versions: in.Versions, Extensions: in.Extensions, AAGUID: in.AAGUID, @@ -28,10 +29,10 @@ func deviceInfoToRPC(in *libfido2.DeviceInfo) *DeviceInfo { } } -func optionsToRPC(ins []libfido2.Option) []*Option { - outs := make([]*Option, 0, len(ins)) +func optionsToRPC(ins []libfido2.Option) []*fido2.Option { + outs := make([]*fido2.Option, 0, len(ins)) for _, in := range ins { - outs = append(outs, &Option{ + outs = append(outs, &fido2.Option{ Name: in.Name, Value: optionValueToRPC(in.Value), }) @@ -39,14 +40,14 @@ func optionsToRPC(ins []libfido2.Option) []*Option { return outs } -func rpFromRPC(rp *RelyingParty) libfido2.RelyingParty { +func rpFromRPC(rp *fido2.RelyingParty) libfido2.RelyingParty { return libfido2.RelyingParty{ ID: rp.ID, Name: rp.Name, } } -func userFromRPC(user *User) libfido2.User { +func userFromRPC(user *fido2.User) libfido2.User { return libfido2.User{ ID: user.ID, Name: user.Name, @@ -55,8 +56,8 @@ func userFromRPC(user *User) libfido2.User { } } -func userToRPC(user libfido2.User) *User { - return &User{ +func userToRPC(user libfido2.User) *fido2.User { + return &fido2.User{ ID: user.ID, Name: user.Name, DisplayName: user.DisplayName, @@ -66,11 +67,11 @@ func userToRPC(user libfido2.User) *User { func credTypeFromRPC(typ string) (libfido2.CredentialType, error) { switch typ { - case "es256": + case "es256", "ES256": return libfido2.ES256, nil - case "eddsa": + case "eddsa", "EDDSA": return libfido2.EDDSA, nil - case "rs256": + case "rs256", "RS256": return libfido2.RS256, nil default: return 0, errors.Errorf("unknown credential type %v", typ) @@ -137,8 +138,8 @@ func extensionFromRPC(s string) (libfido2.Extension, error) { } } -func attestationToRPC(in *libfido2.Attestation) *Attestation { - return &Attestation{ +func attestationToRPC(in *libfido2.Attestation) *fido2.Attestation { + return &fido2.Attestation{ ClientDataHash: in.ClientDataHash, AuthData: in.AuthData, CredID: in.CredID, @@ -150,47 +151,48 @@ func attestationToRPC(in *libfido2.Attestation) *Attestation { } } -func assertionToRPC(in *libfido2.Assertion) *Assertion { - return &Assertion{ +func assertionToRPC(in *libfido2.Assertion) *fido2.Assertion { + return &fido2.Assertion{ AuthData: in.AuthData, Sig: in.Sig, HMACSecret: in.HMACSecret, } } -func credentialsInfoToRPC(in *libfido2.CredentialsInfo) *CredentialsInfo { - return &CredentialsInfo{ +func credentialsInfoToRPC(in *libfido2.CredentialsInfo) *fido2.CredentialsInfo { + return &fido2.CredentialsInfo{ RKExisting: int32(in.RKExisting), RKRemaining: int32(in.RKRemaining), } } -func credentialsToRPC(ins []*libfido2.Credential) []*Credential { - outs := make([]*Credential, 0, len(ins)) +func credentialsToRPC(rp *fido2.RelyingParty, ins []*libfido2.Credential) []*fido2.Credential { + outs := make([]*fido2.Credential, 0, len(ins)) for _, in := range ins { - outs = append(outs, credentialToRPC(in)) + outs = append(outs, credentialToRPC(rp, in)) } return outs } -func credentialToRPC(in *libfido2.Credential) *Credential { - return &Credential{ +func credentialToRPC(rp *fido2.RelyingParty, in *libfido2.Credential) *fido2.Credential { + return &fido2.Credential{ ID: in.ID, Type: credTypeToRPC(in.Type), + RP: rp, User: userToRPC(in.User), } } -func relyingPartiesToRPC(ins []*libfido2.RelyingParty) []*RelyingParty { - outs := make([]*RelyingParty, 0, len(ins)) +func relyingPartiesToRPC(ins []*libfido2.RelyingParty) []*fido2.RelyingParty { + outs := make([]*fido2.RelyingParty, 0, len(ins)) for _, in := range ins { outs = append(outs, relyingPartyToRPC(in)) } return outs } -func relyingPartyToRPC(in *libfido2.RelyingParty) *RelyingParty { - return &RelyingParty{ +func relyingPartyToRPC(in *libfido2.RelyingParty) *fido2.RelyingParty { + return &fido2.RelyingParty{ ID: in.ID, Name: in.Name, } diff --git a/fido2/service.go b/fido2/libfido2/server.go similarity index 57% rename from fido2/service.go rename to fido2/libfido2/server.go index 039e6288..e7302a15 100644 --- a/fido2/service.go +++ b/fido2/libfido2/server.go @@ -1,20 +1,23 @@ -package fido2 +package libfido2 import ( "context" "sort" "github.com/keys-pub/go-libfido2" + "github.com/keys-pub/keysd/fido2" ) -type service struct{} +// Server ... +type Server struct{} // NewAuthenticatorsServer creates an AuthenticatorsServer. -func NewAuthenticatorsServer() AuthenticatorsServer { - return &service{} +func NewAuthenticatorsServer() fido2.AuthenticatorsServer { + return &Server{} } -func (s *service) Devices(ctx context.Context, req *DevicesRequest) (*DevicesResponse, error) { +// Devices ... +func (s *Server) Devices(ctx context.Context, req *fido2.DevicesRequest) (*fido2.DevicesResponse, error) { devices, err := libfido2.DeviceLocations() if err != nil { return nil, err @@ -22,7 +25,7 @@ func (s *service) Devices(ctx context.Context, req *DevicesRequest) (*DevicesRes sort.Slice(devices, func(i, j int) bool { return devices[i].Product < devices[j].Product }) - return &DevicesResponse{ + return &fido2.DevicesResponse{ Devices: devicesToRPC(devices), }, nil } @@ -37,7 +40,8 @@ func findDevice(name string) (*libfido2.Device, error) { return device, nil } -func (s *service) DeviceInfo(ctx context.Context, req *DeviceInfoRequest) (*DeviceInfoResponse, error) { +// DeviceInfo ... +func (s *Server) DeviceInfo(ctx context.Context, req *fido2.DeviceInfoRequest) (*fido2.DeviceInfoResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -49,12 +53,13 @@ func (s *service) DeviceInfo(ctx context.Context, req *DeviceInfoRequest) (*Devi return nil, err } - return &DeviceInfoResponse{ + return &fido2.DeviceInfoResponse{ Info: deviceInfoToRPC(info), }, nil } -func (s *service) MakeCredential(ctx context.Context, req *MakeCredentialRequest) (*MakeCredentialResponse, error) { +// MakeCredential ... +func (s *Server) MakeCredential(ctx context.Context, req *fido2.MakeCredentialRequest) (*fido2.MakeCredentialResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -93,12 +98,13 @@ func (s *service) MakeCredential(ctx context.Context, req *MakeCredentialRequest if err != nil { return nil, err } - return &MakeCredentialResponse{ + return &fido2.MakeCredentialResponse{ Attestation: attestationToRPC(attestation), }, nil } -func (s *service) SetPIN(ctx context.Context, req *SetPINRequest) (*SetPINResponse, error) { +// SetPIN ... +func (s *Server) SetPIN(ctx context.Context, req *fido2.SetPINRequest) (*fido2.SetPINResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -109,10 +115,11 @@ func (s *service) SetPIN(ctx context.Context, req *SetPINRequest) (*SetPINRespon return nil, err } - return &SetPINResponse{}, nil + return &fido2.SetPINResponse{}, nil } -func (s *service) Reset(ctx context.Context, req *ResetRequest) (*ResetResponse, error) { +// Reset ... +func (s *Server) Reset(ctx context.Context, req *fido2.ResetRequest) (*fido2.ResetResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -123,10 +130,11 @@ func (s *service) Reset(ctx context.Context, req *ResetRequest) (*ResetResponse, return nil, err } - return &ResetResponse{}, nil + return &fido2.ResetResponse{}, nil } -func (s *service) RetryCount(ctx context.Context, req *RetryCountRequest) (*RetryCountResponse, error) { +// RetryCount ... +func (s *Server) RetryCount(ctx context.Context, req *fido2.RetryCountRequest) (*fido2.RetryCountResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -138,12 +146,13 @@ func (s *service) RetryCount(ctx context.Context, req *RetryCountRequest) (*Retr return nil, err } - return &RetryCountResponse{ + return &fido2.RetryCountResponse{ Count: int32(count), }, nil } -func (s *service) Assertion(ctx context.Context, req *AssertionRequest) (*AssertionResponse, error) { +// Assertion ... +func (s *Server) Assertion(ctx context.Context, req *fido2.AssertionRequest) (*fido2.AssertionResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -168,12 +177,13 @@ func (s *service) Assertion(ctx context.Context, req *AssertionRequest) (*Assert return nil, err } - return &AssertionResponse{ + return &fido2.AssertionResponse{ Assertion: assertionToRPC(assertion), }, nil } -func (s *service) CredentialsInfo(ctx context.Context, req *CredentialsInfoRequest) (*CredentialsInfoResponse, error) { +// CredentialsInfo ... +func (s *Server) CredentialsInfo(ctx context.Context, req *fido2.CredentialsInfoRequest) (*fido2.CredentialsInfoResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -185,29 +195,48 @@ func (s *service) CredentialsInfo(ctx context.Context, req *CredentialsInfoReque return nil, err } - return &CredentialsInfoResponse{ + return &fido2.CredentialsInfoResponse{ Info: credentialsInfoToRPC(info), }, nil } -func (s *service) Credentials(ctx context.Context, req *CredentialsRequest) (*CredentialsResponse, error) { +// Credentials ... +func (s *Server) Credentials(ctx context.Context, req *fido2.CredentialsRequest) (*fido2.CredentialsResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err } defer device.Close() - credentials, err := device.Credentials(req.RPID, req.PIN) - if err != nil { - return nil, err - } - - return &CredentialsResponse{ - Credentials: credentialsToRPC(credentials), + out := []*fido2.Credential{} + if req.RPID == "" { + rps, err := device.RelyingParties(req.PIN) + if err != nil { + return nil, err + } + for _, rp := range rps { + credentials, err := device.Credentials(rp.ID, req.PIN) + if err != nil { + return nil, err + } + out = append(out, credentialsToRPC(relyingPartyToRPC(rp), credentials)...) + } + } else { + credentials, err := device.Credentials(req.RPID, req.PIN) + if err != nil { + return nil, err + } + rp := &fido2.RelyingParty{ID: req.RPID} // TODO: Name + out = credentialsToRPC(rp, credentials) + } + + return &fido2.CredentialsResponse{ + Credentials: out, }, nil } -func (s *service) RelyingParties(ctx context.Context, req *RelyingPartiesRequest) (*RelyingPartiesResponse, error) { +// RelyingParties ... +func (s *Server) RelyingParties(ctx context.Context, req *fido2.RelyingPartiesRequest) (*fido2.RelyingPartiesResponse, error) { device, err := findDevice(req.Device) if err != nil { return nil, err @@ -219,7 +248,7 @@ func (s *service) RelyingParties(ctx context.Context, req *RelyingPartiesRequest return nil, err } - return &RelyingPartiesResponse{ + return &fido2.RelyingPartiesResponse{ Parties: relyingPartiesToRPC(rps), }, nil } diff --git a/fido2/fido2_test.go b/fido2/libfido2/server_test.go similarity index 85% rename from fido2/fido2_test.go rename to fido2/libfido2/server_test.go index 77651515..e42b1bc1 100644 --- a/fido2/fido2_test.go +++ b/fido2/libfido2/server_test.go @@ -1,4 +1,4 @@ -package fido2_test +package libfido2_test import ( context "context" @@ -7,12 +7,13 @@ import ( "testing" "github.com/keys-pub/keysd/fido2" + "github.com/keys-pub/keysd/fido2/libfido2" "github.com/stretchr/testify/require" ) func TestInfo(t *testing.T) { ctx := context.TODO() - server := fido2.NewAuthenticatorsServer() + server := libfido2.NewAuthenticatorsServer() resp, err := server.Devices(ctx, &fido2.DevicesRequest{}) require.NoError(t, err) @@ -34,7 +35,7 @@ func ExampleAuthenticatorsServer_SetPIN() { } ctx := context.TODO() - server := fido2.NewAuthenticatorsServer() + server := libfido2.NewAuthenticatorsServer() resp, err := server.Devices(ctx, &fido2.DevicesRequest{}) if err != nil { diff --git a/fido2/plugin.go b/fido2/plugin.go new file mode 100644 index 00000000..a75eaca6 --- /dev/null +++ b/fido2/plugin.go @@ -0,0 +1,25 @@ +package fido2 + +import ( + "plugin" + + "github.com/pkg/errors" +) + +// OpenPlugin returns AuthenticatorsServer from shared library. +func OpenPlugin(path string) (AuthenticatorsServer, error) { + plug, err := plugin.Open(path) + if err != nil { + return nil, err + } + symLibrary, err := plug.Lookup("AuthenticatorsServer") + if err != nil { + return nil, err + } + + lib, ok := symLibrary.(AuthenticatorsServer) + if !ok { + return nil, errors.Errorf("not AuthenticatorsServer library") + } + return lib, nil +} diff --git a/fido2/plugin/fido2.go b/fido2/plugin/fido2.go new file mode 100644 index 00000000..9391fe56 --- /dev/null +++ b/fido2/plugin/fido2.go @@ -0,0 +1,8 @@ +package main + +import ( + "github.com/keys-pub/keysd/fido2/libfido2" +) + +// AuthenticatorsServer exported for plugin. +var AuthenticatorsServer = libfido2.Server{} diff --git a/scripts/build.sh b/scripts/build.sh index f5517e5d..2c0f8ae2 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -11,3 +11,9 @@ ver="0.0.0-dev-$ts" BUILD_ONLY=1 DEBUG=1 VERSION=$ver DATE=$date ./gobuild.sh keysd "$dir/../service/keysd" BUILD_ONLY=1 DEBUG=1 VERSION=$ver DATE=$date ./gobuild.sh keys "$dir/../service/keys" + +# FIDO2 +echo "Building FIDO2 plugin" +cd ../fido2/plugin +go build -buildmode=plugin -o fido2.so +mv fido2.so ~/go/bin \ No newline at end of file diff --git a/service/cmd_fido2.go b/service/cmd_fido2.go index 1806a22f..7c10c51d 100644 --- a/service/cmd_fido2.go +++ b/service/cmd_fido2.go @@ -1,20 +1,19 @@ package service import ( - "github.com/keys-pub/keysd/fido2/cmds" "github.com/urfave/cli" ) func fido2Commands(client *Client) []cli.Command { return []cli.Command{ - cli.Command{ - Name: "fido2", - Usage: "FIDO2", - Subcommands: []cli.Command{ - cmds.DevicesFn(client.FIDO2Client), - cmds.DeviceInfoFn(client.FIDO2Client), - cmds.MakeCredentialFn(client.FIDO2Client), - }, - }, + // cli.Command{ + // Name: "fido2", + // Usage: "FIDO2", + // Subcommands: []cli.Command{ + // cmds.DevicesFn(client.FIDO2Client), + // cmds.DeviceInfoFn(client.FIDO2Client), + // cmds.MakeCredentialFn(client.FIDO2Client), + // }, + // }, } } diff --git a/service/go.mod b/service/go.mod index 68378c3a..8c6a061a 100644 --- a/service/go.mod +++ b/service/go.mod @@ -29,7 +29,7 @@ require ( // replace github.com/keys-pub/keysd/db => ../db -// replace github.com/keys-pub/keysd/fido2 => ../fido2 +replace github.com/keys-pub/keysd/fido2 => ../fido2 // replace github.com/keys-pub/go-libfido2 => ../../go-libfido2 // replace github.com/keys-pub/keysd/http/api => ../http/api diff --git a/service/go.sum b/service/go.sum index 9844748b..a8c0c7c4 100644 --- a/service/go.sum +++ b/service/go.sum @@ -133,6 +133,8 @@ github.com/keys-pub/go-libfido2 v0.0.0-20200427035032-3e225c0ecafc h1:KVD8kw82lU github.com/keys-pub/go-libfido2 v0.0.0-20200427035032-3e225c0ecafc/go.mod h1:fTqaHBgT+hk2QptbKZ2KpGtzDXbLLKntOW/hUD0iXR8= github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d h1:xDOACYC0W9SHJO1cxQSQLjh2i9idG1Bph4AoY4XQUwE= github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= +github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 h1:nc1WncWfTKmTQNFNhqvL0fVItI6HE/hut/rrQIvUw1k= +github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab h1:D7YOtUfZ34F99SW9mdZic8lG1LASUUGojHGtxfS6kds= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab/go.mod h1:LWDVrixSjx446s2aLIcJ6ML5ir4vX3kJ3mVvJYXI/Xc= github.com/keys-pub/keys v0.0.0-20200413002436-33c0c3d4ec1b h1:P9+8upxxJyZK95YnG3ONgDceGGJ/e25uabBVeeJslBo= @@ -162,6 +164,7 @@ github.com/keys-pub/keys v0.0.0-20200423195135-6b5d508024d0 h1:abpA+LQ/R2+8HN00I github.com/keys-pub/keys v0.0.0-20200423195135-6b5d508024d0/go.mod h1:K0JoWRBSAgH50/fJpI+6yPgYTj2TCOncJhSVixAa0Xo= github.com/keys-pub/keysd v0.0.36 h1:LJ4icoup2ihQg9gSGCxtoYKem5jzPigf9VB777fuFTc= github.com/keys-pub/keysd v0.0.37-0.20200426184731-707482381542 h1:vKMSbOUlwy38UkH3u27LFwgh4c6McA0RJkh3bKBOjlw= +github.com/keys-pub/keysd v0.0.37 h1:Qx3Dhav0FMpJZGmSCbTcqHFMP6/q37arpdYBzbgseyA= github.com/keys-pub/keysd/db v0.0.0-20200413003215-f85e85366c95 h1:5QzUKnwvuLpei8sBfFjcPZQKJSoIhYzg/yZxVqbvxlE= github.com/keys-pub/keysd/db v0.0.0-20200413003215-f85e85366c95/go.mod h1:zbe7XU3mVmOrFy+aQWU7+Z9Vy03ctb65Vlr3055AZ5c= github.com/keys-pub/keysd/fido2 v0.0.0-20200424173049-a8841c3805aa h1:wz/2Gnsq64zxQAJp9R0KOsD2Q2CUcr0x9j0aYIS7lMA= diff --git a/service/run.go b/service/run.go index b2e33c2c..9741e8f7 100644 --- a/service/run.go +++ b/service/run.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "net" "os" + "path/filepath" "runtime" "runtime/debug" "strconv" @@ -31,7 +32,6 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/reflection" ) type protoService struct { @@ -48,11 +48,6 @@ func newProtoService(cfg *Config, build Build, auth *auth) (*protoService, error return p, nil } -func (s *protoService) Register(grpcServer *grpc.Server) { - RegisterKeysServer(grpcServer, s) - fido2.RegisterAuthenticatorsServer(grpcServer, fido2.NewAuthenticatorsServer()) -} - func setupLogging(cfg *Config, logPath string) (Logger, LogInterceptor) { return setupLogrus(cfg, logPath) } @@ -222,12 +217,23 @@ func NewServiceFn(cfg *Config, build Build, lgi LogInterceptor) (ServeFn, CloseF ) grpcServer := grpc.NewServer(opts...) - service, serviceErr := newProtoService(cfg, build, auth) - if serviceErr != nil { - return nil, nil, serviceErr + service, err := newProtoService(cfg, build, auth) + if err != nil { + return nil, nil, err + } + + // Keys service + logger.Infof("Registering Keys service...") + RegisterKeysServer(grpcServer, service) + + // FIDO2 service + server, err := fido2.OpenPlugin(filepath.Join(exeDir(), "fido2.so")) + if err != nil { + logger.Errorf("fido2 plugin is not available: %v", err) + } else { + logger.Infof("Registering FIDO2 plugin...") + fido2.RegisterAuthenticatorsServer(grpcServer, server) } - service.Register(grpcServer) - reflection.Register(grpcServer) logger.Infof("Listening for connections on port %d", cfg.Port()) lis, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", cfg.Port())) From ecdf142d9dad1177ee5b64dbbaf2097b28b05a1e Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Tue, 28 Apr 2020 19:49:46 -0700 Subject: [PATCH 4/7] fido2: Update go-libfido2 --- fido2/go.mod | 2 +- fido2/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/fido2/go.mod b/fido2/go.mod index d3fa0673..4ec503f9 100644 --- a/fido2/go.mod +++ b/fido2/go.mod @@ -5,7 +5,7 @@ go 1.14 require ( github.com/gogo/protobuf v1.3.1 github.com/golang/protobuf v1.4.0 // indirect - github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 + github.com/keys-pub/go-libfido2 v0.0.0-20200429024018-c64b2b4e5b1c github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.5.0 github.com/stretchr/testify v1.5.1 diff --git a/fido2/go.sum b/fido2/go.sum index 208c5d0a..6e6d8fed 100644 --- a/fido2/go.sum +++ b/fido2/go.sum @@ -45,6 +45,8 @@ github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d h1:xDOACYC0W9 github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 h1:nc1WncWfTKmTQNFNhqvL0fVItI6HE/hut/rrQIvUw1k= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= +github.com/keys-pub/go-libfido2 v0.0.0-20200429024018-c64b2b4e5b1c h1:/WBxgTXH5hm0LA1CICHmpmh1jr7ZNWT8J0Ki3orNU4Y= +github.com/keys-pub/go-libfido2 v0.0.0-20200429024018-c64b2b4e5b1c/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keysd v0.0.36 h1:LJ4icoup2ihQg9gSGCxtoYKem5jzPigf9VB777fuFTc= github.com/keys-pub/keysd v0.0.37 h1:Qx3Dhav0FMpJZGmSCbTcqHFMP6/q37arpdYBzbgseyA= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= From f775ddf7b9162484d11e3cc9d20e617f8cc04c13 Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Tue, 28 Apr 2020 19:54:07 -0700 Subject: [PATCH 5/7] service: Update fido2 --- service/go.mod | 4 ++-- service/go.sum | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/service/go.mod b/service/go.mod index 8c6a061a..04f3913f 100644 --- a/service/go.mod +++ b/service/go.mod @@ -8,7 +8,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 github.com/keys-pub/keys v0.0.0-20200423195135-6b5d508024d0 github.com/keys-pub/keysd/db v0.0.0-20200413003215-f85e85366c95 - github.com/keys-pub/keysd/fido2 v0.0.0-20200427220403-902714bb307e + github.com/keys-pub/keysd/fido2 v0.0.0-20200429024946-ecdf142d9dad github.com/keys-pub/keysd/http/api v0.0.0-20200415010142-cfcd41d36dd1 github.com/keys-pub/keysd/http/client v0.0.0-20200414170516-1e0e72775735 github.com/keys-pub/keysd/http/server v0.0.0-20200419021946-2d1a17136bd0 @@ -29,7 +29,7 @@ require ( // replace github.com/keys-pub/keysd/db => ../db -replace github.com/keys-pub/keysd/fido2 => ../fido2 +// replace github.com/keys-pub/keysd/fido2 => ../fido2 // replace github.com/keys-pub/go-libfido2 => ../../go-libfido2 // replace github.com/keys-pub/keysd/http/api => ../http/api diff --git a/service/go.sum b/service/go.sum index a8c0c7c4..c3c1e1a2 100644 --- a/service/go.sum +++ b/service/go.sum @@ -135,6 +135,7 @@ github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d h1:xDOACYC0W9 github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 h1:nc1WncWfTKmTQNFNhqvL0fVItI6HE/hut/rrQIvUw1k= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= +github.com/keys-pub/go-libfido2 v0.0.0-20200429024018-c64b2b4e5b1c/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab h1:D7YOtUfZ34F99SW9mdZic8lG1LASUUGojHGtxfS6kds= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab/go.mod h1:LWDVrixSjx446s2aLIcJ6ML5ir4vX3kJ3mVvJYXI/Xc= github.com/keys-pub/keys v0.0.0-20200413002436-33c0c3d4ec1b h1:P9+8upxxJyZK95YnG3ONgDceGGJ/e25uabBVeeJslBo= @@ -179,6 +180,8 @@ github.com/keys-pub/keysd/fido2 v0.0.0-20200427035443-641310d59016 h1:qyAU7+iHvf github.com/keys-pub/keysd/fido2 v0.0.0-20200427035443-641310d59016/go.mod h1:Zv1gPZrRHmPAbWt7RCfEGmR4k1Vdp7UicWqhO4D7uN0= github.com/keys-pub/keysd/fido2 v0.0.0-20200427220403-902714bb307e h1:zTB06Dr2NZh25ONzojScyyoDkvjsLShg0X5DwJbADg8= github.com/keys-pub/keysd/fido2 v0.0.0-20200427220403-902714bb307e/go.mod h1:mVqeZwNYUJ/g9uffwEr496Px+tBxY6RopLQCMRRlW54= +github.com/keys-pub/keysd/fido2 v0.0.0-20200429024946-ecdf142d9dad h1:xPqwOQ9aVf7sDeVBygYuGG+E46tvk7gncAMxfA2gi2k= +github.com/keys-pub/keysd/fido2 v0.0.0-20200429024946-ecdf142d9dad/go.mod h1:MlSjttES+lEQpDYT/VS4kf4LHpC/b8s2tkEq5ZfOapM= github.com/keys-pub/keysd/firestore v0.0.0-20200413003414-34e8a825f8fd h1:vhnKWyxGwLgb0bdFSYHGjJ+bgHwxieiLZh3Du+A0xbE= github.com/keys-pub/keysd/firestore v0.0.0-20200413003414-34e8a825f8fd/go.mod h1:9veij84OYGkGSNE7oI6FasAsDuFMm0wtjDoaQ//doIg= github.com/keys-pub/keysd/firestore v0.0.0-20200414165918-c4b40ad4f02d h1:+04LDJiJLkFjCVSiNchSQTdw3syqRHJnT/AEXTQOtCw= From c4bc19b232e6f8a1fb98eac0b548e0e96dc2e075 Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Tue, 28 Apr 2020 20:45:05 -0700 Subject: [PATCH 6/7] service: fido2 status --- scripts/build.sh | 2 +- service/fido2/plugin.go | 8 + service/go.sum | 1 + service/keys.pb.go | 629 +++++++++++++++++++++------------------- service/keys.proto | 2 + service/run.go | 10 +- service/service.go | 2 + service/status.go | 1 + 8 files changed, 351 insertions(+), 304 deletions(-) create mode 100644 service/fido2/plugin.go diff --git a/scripts/build.sh b/scripts/build.sh index 2c0f8ae2..901671ee 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -14,6 +14,6 @@ BUILD_ONLY=1 DEBUG=1 VERSION=$ver DATE=$date ./gobuild.sh keys "$dir/../service # FIDO2 echo "Building FIDO2 plugin" -cd ../fido2/plugin +cd ../service/fido2 go build -buildmode=plugin -o fido2.so mv fido2.so ~/go/bin \ No newline at end of file diff --git a/service/fido2/plugin.go b/service/fido2/plugin.go new file mode 100644 index 00000000..9391fe56 --- /dev/null +++ b/service/fido2/plugin.go @@ -0,0 +1,8 @@ +package main + +import ( + "github.com/keys-pub/keysd/fido2/libfido2" +) + +// AuthenticatorsServer exported for plugin. +var AuthenticatorsServer = libfido2.Server{} diff --git a/service/go.sum b/service/go.sum index c3c1e1a2..3045ce19 100644 --- a/service/go.sum +++ b/service/go.sum @@ -135,6 +135,7 @@ github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d h1:xDOACYC0W9 github.com/keys-pub/go-libfido2 v0.0.0-20200427215944-18592ad89b9d/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1 h1:nc1WncWfTKmTQNFNhqvL0fVItI6HE/hut/rrQIvUw1k= github.com/keys-pub/go-libfido2 v0.0.0-20200428181912-53b2470527d1/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= +github.com/keys-pub/go-libfido2 v0.0.0-20200429024018-c64b2b4e5b1c h1:/WBxgTXH5hm0LA1CICHmpmh1jr7ZNWT8J0Ki3orNU4Y= github.com/keys-pub/go-libfido2 v0.0.0-20200429024018-c64b2b4e5b1c/go.mod h1:P0V19qHwJNY0htZwZDe9Ilvs/nokGhdFX7faKFyZ6+U= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab h1:D7YOtUfZ34F99SW9mdZic8lG1LASUUGojHGtxfS6kds= github.com/keys-pub/keys v0.0.0-20200412190229-71b7a426a7ab/go.mod h1:LWDVrixSjx446s2aLIcJ6ML5ir4vX3kJ3mVvJYXI/Xc= diff --git a/service/keys.pb.go b/service/keys.pb.go index 09bf62b6..5e9bd2f4 100644 --- a/service/keys.pb.go +++ b/service/keys.pb.go @@ -2095,7 +2095,9 @@ type RuntimeStatusResponse struct { // Exe is the service executable path. Exe string `protobuf:"bytes,4,opt,name=exe,proto3" json:"exe,omitempty"` // AuthSetupNeeded if auth needs to be setup. - AuthSetupNeeded bool `protobuf:"varint,5,opt,name=authSetupNeeded,proto3" json:"authSetupNeeded,omitempty"` + AuthSetupNeeded bool `protobuf:"varint,5,opt,name=authSetupNeeded,proto3" json:"authSetupNeeded,omitempty"` + // FIDO2 available. + FIDO2 bool `protobuf:"varint,6,opt,name=fido2,proto3" json:"fido2,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -5570,300 +5572,301 @@ func init() { func init() { proto.RegisterFile("keys.proto", fileDescriptor_9084e97af2346a26) } var fileDescriptor_9084e97af2346a26 = []byte{ - // 4676 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0x4b, 0x6c, 0x1b, 0xc9, - 0x72, 0x1a, 0x52, 0xdf, 0x22, 0x25, 0x8e, 0x46, 0x94, 0x4c, 0xcf, 0xf3, 0x4a, 0xdc, 0xd9, 0xdd, - 0x67, 0xad, 0xd6, 0xf6, 0xda, 0xda, 0xb5, 0x63, 0xef, 0xbe, 0xe7, 0xb7, 0x14, 0x49, 0xc9, 0xb2, - 0x64, 0x52, 0x19, 0x92, 0xf6, 0x3a, 0x0f, 0x81, 0xde, 0x2c, 0xd9, 0x96, 0x06, 0xa2, 0x86, 0xdc, - 0x99, 0xa1, 0xd6, 0x3a, 0x05, 0xd8, 0x4b, 0x1e, 0x88, 0x00, 0x0f, 0xb9, 0x04, 0xb9, 0x30, 0x08, - 0x90, 0x00, 0x39, 0xe4, 0x12, 0x20, 0xb7, 0x20, 0xe7, 0x60, 0x8f, 0x41, 0x4e, 0xef, 0xb4, 0xc8, - 0x1a, 0x39, 0xe4, 0x18, 0x20, 0x40, 0x90, 0x63, 0xd0, 0xbf, 0x99, 0xee, 0xe1, 0x90, 0x92, 0xbd, - 0xde, 0xdc, 0xa6, 0xab, 0xab, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0xbb, 0x6a, 0x00, 0x4e, 0xd0, - 0xb9, 0x77, 0xab, 0xeb, 0x76, 0xfc, 0x8e, 0x36, 0xe3, 0x21, 0xf7, 0xcc, 0x6e, 0x22, 0x3d, 0x7b, - 0xd4, 0x39, 0xea, 0x10, 0xd8, 0xc7, 0xf8, 0x8b, 0x76, 0x1b, 0x26, 0xcc, 0x9a, 0x07, 0xc5, 0xb2, - 0xeb, 0x76, 0x5c, 0x4d, 0x83, 0xc9, 0x66, 0xa7, 0x85, 0x72, 0x4a, 0x5e, 0x59, 0x9f, 0x32, 0xc9, - 0xb7, 0x96, 0x83, 0x99, 0x53, 0xe4, 0x79, 0xd6, 0x11, 0xca, 0x25, 0xf2, 0xca, 0xfa, 0x9c, 0xc9, - 0x9b, 0xb8, 0xa7, 0x85, 0x7c, 0xcb, 0x6e, 0x7b, 0xb9, 0x24, 0xed, 0x61, 0x4d, 0xa3, 0x03, 0xa9, - 0x9a, 0x7d, 0xe4, 0x98, 0xe8, 0xeb, 0x1e, 0xf2, 0x7c, 0xcc, 0xb6, 0x65, 0xf9, 0x16, 0x61, 0x9b, - 0x36, 0xc9, 0xb7, 0xb6, 0x02, 0xd3, 0x9e, 0x7d, 0xe4, 0x20, 0x37, 0x37, 0x45, 0x68, 0x59, 0x0b, - 0x33, 0xb5, 0xdc, 0xd3, 0x8e, 0x8b, 0x5a, 0x39, 0xc8, 0x2b, 0xeb, 0xb3, 0x26, 0x6f, 0x6a, 0x3a, - 0xcc, 0x62, 0xfe, 0xcd, 0x63, 0xd4, 0xca, 0xa5, 0x48, 0x57, 0xd0, 0x36, 0x7e, 0x09, 0x69, 0x3a, - 0xa0, 0xd7, 0xed, 0x38, 0x1e, 0x8a, 0x1d, 0xf1, 0x2a, 0x24, 0x4f, 0xec, 0x16, 0x9d, 0xc4, 0xd6, - 0xcc, 0xab, 0xef, 0xd7, 0x92, 0x7b, 0xbb, 0x25, 0x13, 0xc3, 0x8c, 0x3f, 0x81, 0x79, 0x4c, 0xbe, - 0x6d, 0xb7, 0xd1, 0xae, 0xd3, 0xed, 0xf9, 0xda, 0x02, 0x24, 0x6c, 0x87, 0x50, 0xcf, 0x99, 0x09, - 0xdb, 0xd1, 0x54, 0x48, 0x76, 0x7a, 0x3e, 0x53, 0x00, 0xfe, 0x7c, 0xcb, 0xf2, 0x3f, 0x83, 0x05, - 0x2e, 0x40, 0xb5, 0xe7, 0x63, 0x09, 0x98, 0xb4, 0xca, 0xb0, 0xb4, 0x5a, 0x16, 0xa6, 0xbe, 0x3a, - 0xf7, 0x91, 0x47, 0xc4, 0x99, 0x32, 0x69, 0x03, 0x43, 0xfd, 0x8e, 0x6f, 0xb5, 0xc9, 0x5a, 0x4c, - 0x99, 0xb4, 0x61, 0x3c, 0x87, 0xf9, 0xa7, 0xc8, 0xb5, 0x5f, 0x9c, 0x8f, 0x5b, 0x8b, 0x37, 0x93, - 0xf9, 0x31, 0x2c, 0x70, 0xd6, 0x63, 0xb4, 0xfe, 0x7e, 0xa0, 0x27, 0x2c, 0x6d, 0x6a, 0x33, 0x7d, - 0x8b, 0x99, 0xe3, 0xad, 0x3d, 0x74, 0xce, 0xb5, 0x66, 0x3c, 0x83, 0x65, 0xca, 0xab, 0xc4, 0xb8, - 0x8f, 0x13, 0x57, 0x85, 0xa4, 0x67, 0x1f, 0x11, 0x7e, 0x69, 0x13, 0x7f, 0x8e, 0x9e, 0x80, 0xf1, - 0x10, 0x56, 0xa2, 0x8c, 0x99, 0xb0, 0xa1, 0x60, 0xca, 0x18, 0xc1, 0xde, 0x85, 0x14, 0xa5, 0xa7, - 0x76, 0x11, 0x23, 0x8e, 0xf1, 0x08, 0xd2, 0x14, 0x85, 0xad, 0xdc, 0x9b, 0x6b, 0xe1, 0x09, 0x64, - 0x28, 0xa7, 0xd7, 0x31, 0xc4, 0xd1, 0x73, 0x7f, 0x0c, 0x6a, 0xc8, 0x8e, 0x09, 0x77, 0xa9, 0x59, - 0x0f, 0x8f, 0x62, 0x34, 0xe0, 0x8a, 0xac, 0xc7, 0xb1, 0x22, 0x5e, 0x7a, 0x79, 0x1a, 0xb0, 0x24, - 0xb3, 0x1d, 0xa9, 0xe6, 0xd7, 0x62, 0xfb, 0xcf, 0x0a, 0xcc, 0xd5, 0x7c, 0xcb, 0x47, 0xa7, 0xc8, - 0xf1, 0x39, 0xa5, 0x12, 0x52, 0x72, 0xfe, 0x89, 0x61, 0xf7, 0x90, 0x8c, 0xd9, 0x70, 0x98, 0x01, - 0xfa, 0x3a, 0x37, 0x49, 0x36, 0x16, 0xfe, 0xc4, 0x0c, 0xba, 0x2e, 0x3a, 0x23, 0x7b, 0x3f, 0x6d, - 0x92, 0x6f, 0xec, 0x11, 0x5c, 0x74, 0xd6, 0x39, 0x41, 0xb9, 0x69, 0x82, 0xc8, 0x5a, 0xda, 0x35, - 0x98, 0xf3, 0xed, 0x53, 0xe4, 0xf9, 0xd6, 0x69, 0x37, 0x37, 0x93, 0x57, 0xd6, 0x93, 0x66, 0x08, - 0xc0, 0x9c, 0xfc, 0xf3, 0x2e, 0xca, 0xcd, 0x12, 0xfd, 0x91, 0x6f, 0xe3, 0x06, 0x64, 0x6a, 0xf6, - 0x51, 0xf3, 0xd8, 0xb2, 0x03, 0x17, 0x3a, 0xda, 0x1d, 0x18, 0x2f, 0x40, 0x0d, 0xb1, 0x99, 0x71, - 0xaf, 0x42, 0xf2, 0x04, 0x9d, 0xc7, 0xae, 0x31, 0xee, 0xd0, 0x36, 0x01, 0x3c, 0xae, 0x1f, 0xec, - 0x47, 0x92, 0xeb, 0xa9, 0x4d, 0x2d, 0x40, 0x0b, 0x54, 0x67, 0x0a, 0x58, 0xc6, 0xaf, 0x40, 0x0d, - 0x3b, 0x2e, 0x14, 0x8b, 0x2b, 0x2d, 0x11, 0x28, 0xcd, 0x28, 0xc3, 0xa2, 0xc0, 0x80, 0x49, 0x7a, - 0x1b, 0xe6, 0x82, 0x31, 0x98, 0xbc, 0x71, 0x82, 0x84, 0x48, 0xc6, 0x1f, 0xc3, 0x4a, 0x00, 0x2f, - 0xba, 0xc8, 0xf2, 0xd1, 0x38, 0x67, 0x31, 0xda, 0xeb, 0x63, 0x8f, 0xd9, 0xee, 0x34, 0xad, 0x36, - 0x59, 0xc5, 0x59, 0x93, 0x36, 0x8c, 0x3d, 0xb8, 0x32, 0xc4, 0xfe, 0x8d, 0x65, 0xfd, 0xb5, 0x20, - 0xab, 0x49, 0xcc, 0x81, 0xcb, 0xca, 0xd4, 0xa3, 0x84, 0x36, 0xf5, 0xa3, 0x24, 0xe5, 0xcc, 0xdf, - 0x58, 0xd2, 0xdf, 0xe1, 0x2d, 0x63, 0x1f, 0x39, 0xa3, 0x37, 0x20, 0xdd, 0xe7, 0x89, 0xa8, 0x2b, - 0x4a, 0xfe, 0x54, 0x67, 0xe2, 0xe7, 0x00, 0x58, 0xa0, 0x31, 0x5e, 0x75, 0xcc, 0x89, 0xfe, 0xd7, - 0x0a, 0x2c, 0x94, 0x9d, 0xa6, 0x7b, 0xde, 0xf5, 0xdf, 0xec, 0xe4, 0x5b, 0x05, 0x70, 0x51, 0xd3, - 0xee, 0xda, 0x64, 0x87, 0xa4, 0xf2, 0xc9, 0xf5, 0x39, 0x53, 0x80, 0x90, 0xb9, 0x22, 0xa7, 0x85, - 0xdc, 0x5c, 0x9a, 0xcd, 0x95, 0xb4, 0xb4, 0x75, 0x98, 0x3c, 0xc5, 0x21, 0xd4, 0x7c, 0x5e, 0x59, - 0x5f, 0xd8, 0xcc, 0x06, 0x4a, 0x67, 0xc2, 0x3c, 0xe9, 0xb4, 0x90, 0x49, 0x30, 0x8c, 0x0f, 0x20, - 0x13, 0x48, 0x38, 0xfa, 0x00, 0x35, 0xfe, 0x41, 0x01, 0x95, 0xe1, 0xbd, 0x95, 0x63, 0xe1, 0xff, - 0x61, 0x66, 0xbf, 0x82, 0x45, 0x41, 0x62, 0xb6, 0x80, 0x41, 0xd4, 0xa2, 0xc4, 0x46, 0x2d, 0x09, - 0x31, 0x6a, 0xf9, 0x2b, 0x05, 0xd2, 0x8c, 0xc3, 0x68, 0x7b, 0x14, 0x66, 0x98, 0x18, 0x37, 0xc3, - 0xe4, 0x98, 0x19, 0x4e, 0xc6, 0xce, 0x70, 0xea, 0xc2, 0x19, 0xbe, 0x07, 0xf3, 0x0c, 0x38, 0xda, - 0x3c, 0x8d, 0x63, 0x58, 0x28, 0xa1, 0x1f, 0x61, 0x82, 0x97, 0x57, 0xf8, 0x1e, 0x64, 0x82, 0x91, - 0x2e, 0x88, 0xc5, 0xe8, 0xbc, 0xe3, 0xa3, 0x10, 0xd2, 0x67, 0xbc, 0x04, 0x95, 0x31, 0x7b, 0x3b, - 0xf6, 0x76, 0xf9, 0x69, 0x7c, 0x03, 0x8b, 0xc2, 0xc8, 0x42, 0xc4, 0x42, 0x85, 0x56, 0x46, 0x0b, - 0x1d, 0x23, 0x50, 0x60, 0x6f, 0xc9, 0x58, 0x7b, 0x9b, 0x14, 0xed, 0xcd, 0x80, 0x34, 0x1b, 0x78, - 0x74, 0x98, 0xb7, 0x0b, 0xf3, 0x0c, 0xe7, 0x82, 0x38, 0xef, 0x62, 0x0d, 0xaf, 0x40, 0xd6, 0xec, - 0x39, 0x38, 0x06, 0xc0, 0xae, 0xb8, 0xe7, 0x31, 0xf3, 0x30, 0xfe, 0x54, 0x81, 0xe5, 0x48, 0x07, - 0x5b, 0xcd, 0x1c, 0xcc, 0x9c, 0x21, 0xd7, 0xb3, 0x3b, 0x7c, 0x11, 0x78, 0x93, 0xe8, 0xbd, 0xdb, - 0xad, 0x58, 0xa7, 0xc1, 0xf5, 0x8c, 0x35, 0xb1, 0x4a, 0xd0, 0x4b, 0xc4, 0x4c, 0x1c, 0x7f, 0x6a, - 0xeb, 0x90, 0xb1, 0x7a, 0xfe, 0x71, 0x0d, 0xf9, 0xbd, 0x6e, 0x05, 0xa1, 0x16, 0x6a, 0xb1, 0x03, - 0x25, 0x0a, 0x36, 0xb6, 0x41, 0x2d, 0x70, 0x10, 0x37, 0x5e, 0x1d, 0x66, 0xbb, 0x96, 0xe7, 0x7d, - 0xd3, 0x71, 0xd9, 0x81, 0x6f, 0x06, 0x6d, 0xbc, 0xa3, 0x9a, 0x6d, 0xbc, 0xb9, 0x48, 0xec, 0x33, - 0x67, 0xb2, 0x96, 0x71, 0x07, 0x16, 0x05, 0x3e, 0x6c, 0x32, 0xd7, 0x60, 0x0e, 0x8f, 0x57, 0xef, - 0x9c, 0x20, 0x3e, 0x9d, 0x10, 0x60, 0xec, 0x50, 0x92, 0x86, 0xd3, 0xee, 0x34, 0x4f, 0x5e, 0x6f, - 0xec, 0x84, 0x34, 0xf6, 0x26, 0x68, 0x22, 0xa3, 0x4b, 0x0d, 0xbe, 0x08, 0x19, 0x4c, 0xb3, 0x1f, - 0x0e, 0x6d, 0x68, 0x54, 0x15, 0xfb, 0x02, 0x13, 0xe3, 0x33, 0xd0, 0xf6, 0xd0, 0xf9, 0x0e, 0x72, - 0x90, 0x2b, 0x84, 0x1f, 0xef, 0xb3, 0x50, 0x4e, 0x21, 0x86, 0xae, 0x8a, 0x4b, 0x5f, 0x3f, 0xef, - 0x22, 0x16, 0xdc, 0xdd, 0x86, 0x25, 0x89, 0x96, 0xc9, 0x35, 0x26, 0xc0, 0xdb, 0x05, 0xad, 0xe1, - 0x21, 0xb7, 0x46, 0xd9, 0x5d, 0x22, 0xf4, 0xca, 0x01, 0xbf, 0xf3, 0x73, 0x9b, 0x60, 0x4d, 0xe3, - 0x63, 0x58, 0x92, 0x58, 0x85, 0xe6, 0xc5, 0x09, 0x14, 0x99, 0xe0, 0x8f, 0x20, 0x43, 0x08, 0x84, - 0xdb, 0xfc, 0x9b, 0x0c, 0x8c, 0x37, 0x8b, 0x83, 0x6d, 0x94, 0x46, 0x0b, 0xe4, 0xdb, 0xf8, 0x02, - 0xd4, 0x90, 0x77, 0x28, 0x09, 0x7f, 0x6d, 0x50, 0xe4, 0xd7, 0x06, 0xce, 0x21, 0x21, 0x70, 0xe8, - 0x2b, 0xb0, 0x80, 0x59, 0x14, 0x5a, 0xad, 0xb7, 0x2d, 0x1d, 0x66, 0xd4, 0x73, 0xa9, 0x9f, 0x60, - 0x8c, 0x1a, 0xe6, 0xbe, 0x89, 0x61, 0x23, 0xc2, 0xb1, 0x17, 0x54, 0x55, 0x44, 0x16, 0x36, 0x9b, - 0x77, 0x61, 0xb2, 0xe7, 0x05, 0x9e, 0x6b, 0x3e, 0xb0, 0x08, 0x8c, 0x67, 0x92, 0x2e, 0x39, 0x52, - 0x4b, 0x5c, 0x26, 0x52, 0x73, 0x41, 0xdd, 0x43, 0xe7, 0xe5, 0x97, 0xdd, 0x8e, 0x7b, 0x99, 0x38, - 0x5c, 0xdc, 0x3a, 0x89, 0xc8, 0xd6, 0xb9, 0xce, 0x2c, 0x36, 0x49, 0x2c, 0x76, 0x29, 0x74, 0xcd, - 0x84, 0xb9, 0x60, 0xb4, 0x1f, 0xc1, 0xa2, 0x30, 0x26, 0x9b, 0xdd, 0x0a, 0x4c, 0x23, 0x02, 0x61, - 0x2e, 0x90, 0xb5, 0x8c, 0x87, 0x44, 0xc0, 0xdd, 0x53, 0x51, 0xc0, 0xf0, 0x00, 0x49, 0x93, 0x03, - 0x64, 0x8c, 0x54, 0xc6, 0x2d, 0x32, 0x18, 0xa7, 0xbf, 0x78, 0x7f, 0xdc, 0x24, 0xe3, 0x99, 0xe8, - 0xb4, 0x73, 0x76, 0x89, 0xdd, 0x61, 0x2c, 0x11, 0xf6, 0x1c, 0x9d, 0xed, 0xe8, 0x7f, 0x53, 0x20, - 0xb9, 0x87, 0xce, 0xb5, 0x15, 0x48, 0x04, 0x64, 0xd3, 0xaf, 0xbe, 0x5f, 0x4b, 0xec, 0x96, 0xcc, - 0x84, 0xdd, 0x0a, 0xf6, 0x76, 0x72, 0xdc, 0xde, 0x0e, 0xd6, 0x7b, 0x7a, 0xf4, 0x7a, 0x67, 0x61, - 0xca, 0xb3, 0xce, 0x82, 0x53, 0x92, 0x36, 0xb4, 0x9f, 0xc3, 0x82, 0xc7, 0xee, 0x70, 0xfb, 0xc8, - 0x39, 0xf2, 0x8f, 0x73, 0xeb, 0xe4, 0x7c, 0x8a, 0x40, 0xb5, 0x1b, 0xb0, 0xc8, 0x21, 0x8d, 0x6e, - 0xcb, 0xf2, 0x51, 0xab, 0xe0, 0xe7, 0x3e, 0x24, 0x77, 0xca, 0xe1, 0x0e, 0xe3, 0x0b, 0x00, 0x32, - 0xd3, 0xc0, 0x87, 0xda, 0x2d, 0xe4, 0xf8, 0xb6, 0x7f, 0xce, 0x7d, 0x28, 0x6f, 0xe3, 0xa5, 0xec, - 0x11, 0x32, 0x66, 0xd2, 0xac, 0x65, 0xdc, 0x84, 0x14, 0xe1, 0x70, 0xb9, 0x6b, 0xa5, 0xf1, 0x77, - 0x0a, 0xc1, 0xe7, 0x07, 0x1a, 0x9e, 0xec, 0xd7, 0x3d, 0xe4, 0xf2, 0xf1, 0x68, 0x43, 0xfb, 0x39, - 0x4c, 0x61, 0x6d, 0xd1, 0x7b, 0x67, 0x9c, 0x32, 0x69, 0x37, 0x76, 0xd5, 0x5e, 0xc7, 0xf5, 0xb7, - 0x6d, 0xd4, 0xa6, 0xea, 0x9a, 0x33, 0x43, 0x80, 0xf6, 0x0b, 0x98, 0xc7, 0x8d, 0x92, 0xed, 0xa2, - 0xa6, 0x8f, 0x0f, 0xc6, 0x14, 0x59, 0x9a, 0x95, 0x70, 0xf3, 0x88, 0xbd, 0xa6, 0x8c, 0x6c, 0xfc, - 0x99, 0x02, 0x69, 0x2a, 0x29, 0x9b, 0x5a, 0x1e, 0x26, 0x4f, 0xd0, 0x39, 0x8e, 0x4e, 0x93, 0x43, - 0x73, 0x23, 0x3d, 0x3f, 0xa9, 0x38, 0xdf, 0x26, 0x60, 0xba, 0x86, 0x9a, 0x2e, 0xf2, 0x47, 0x5a, - 0x60, 0x8c, 0xff, 0x1b, 0xb9, 0x7f, 0x29, 0x2b, 0xc1, 0x30, 0x75, 0x98, 0xc5, 0xd6, 0x47, 0x18, - 0x50, 0xd1, 0x83, 0xb6, 0xb4, 0x15, 0x53, 0x11, 0x07, 0xc1, 0x9c, 0x60, 0x36, 0xde, 0x09, 0x3a, - 0x1d, 0x1c, 0x5f, 0xad, 0xd2, 0xb5, 0x25, 0x0d, 0xac, 0xa4, 0x26, 0xb9, 0x34, 0x63, 0xc3, 0x6c, - 0xd1, 0xc7, 0x8e, 0x00, 0x80, 0x7b, 0x7b, 0x81, 0xd9, 0x22, 0xda, 0x1b, 0x00, 0x8c, 0xeb, 0x30, - 0x4f, 0x05, 0xe7, 0xe6, 0x33, 0x42, 0x15, 0xc6, 0x03, 0x58, 0xe0, 0x88, 0x6c, 0xf5, 0xae, 0xe3, - 0xb8, 0x0b, 0x43, 0x98, 0x6d, 0x66, 0x22, 0xaa, 0x30, 0x59, 0xb7, 0xf1, 0x0b, 0x58, 0xa4, 0x90, - 0x9a, 0x15, 0x3a, 0x8b, 0x4b, 0x53, 0xff, 0x12, 0x34, 0x91, 0xfa, 0x75, 0x07, 0xbf, 0x09, 0x4b, - 0x5c, 0x6e, 0xd1, 0x57, 0x8d, 0x9a, 0xe6, 0x0a, 0x64, 0x65, 0x74, 0xe6, 0xab, 0xbe, 0x55, 0xf8, - 0xfc, 0x2f, 0xd8, 0x68, 0x3f, 0xa5, 0xc5, 0xfe, 0xa5, 0x02, 0x99, 0x40, 0x08, 0xa6, 0x88, 0x0f, - 0xf1, 0x01, 0x4b, 0x40, 0x6c, 0x1b, 0x0d, 0x69, 0x82, 0xf7, 0xff, 0xa4, 0xa2, 0x7d, 0x00, 0xa9, - 0x5d, 0x1f, 0x9d, 0x5e, 0xa4, 0xde, 0x3b, 0x90, 0xa6, 0x68, 0xe1, 0x61, 0x6d, 0xfb, 0xe8, 0x74, - 0xe8, 0xb0, 0x26, 0x48, 0xa4, 0xcb, 0x78, 0x9f, 0x92, 0x8c, 0x57, 0xbb, 0xf1, 0x29, 0xcc, 0x33, - 0x2c, 0xc6, 0xf9, 0x3d, 0x98, 0xc2, 0xe4, 0x5c, 0x2b, 0x11, 0xd6, 0xb4, 0xcf, 0xd8, 0x84, 0x49, - 0xdc, 0x1c, 0xb7, 0xff, 0xc9, 0x5e, 0x4f, 0x08, 0x0f, 0x85, 0x5f, 0x42, 0xca, 0xb4, 0x9c, 0x96, - 0xe0, 0xe1, 0x9d, 0xde, 0xe9, 0x96, 0x70, 0xcb, 0x0e, 0xda, 0xda, 0x4d, 0x98, 0x45, 0x4e, 0xb3, - 0xd3, 0xb2, 0x1d, 0xfa, 0x86, 0xba, 0xb0, 0xb9, 0x28, 0xde, 0xc4, 0x48, 0x87, 0x19, 0xa0, 0xe0, - 0x1b, 0x11, 0xe5, 0x1c, 0x73, 0x9d, 0x9c, 0x63, 0x37, 0xa2, 0x9b, 0xb0, 0x84, 0x71, 0x0e, 0x98, - 0xb3, 0x08, 0xf5, 0x3d, 0xdd, 0xa6, 0x67, 0x18, 0x95, 0x81, 0xb5, 0x8c, 0x4d, 0xc8, 0xca, 0xe8, - 0x8c, 0xf5, 0x98, 0xd8, 0xde, 0xf8, 0x10, 0x52, 0x07, 0xbd, 0x76, 0xfb, 0x12, 0x47, 0x98, 0x71, - 0x03, 0xd2, 0x14, 0x35, 0x08, 0xf4, 0x27, 0x4f, 0xec, 0x16, 0xd5, 0xf9, 0xdc, 0xd6, 0xec, 0xab, - 0xef, 0xd7, 0x26, 0xf7, 0x76, 0x4b, 0x9e, 0x49, 0xa0, 0xc6, 0x1e, 0x66, 0xec, 0x1d, 0x5f, 0xe6, - 0x6c, 0xcc, 0x43, 0xca, 0x45, 0xa7, 0x1d, 0x1f, 0x15, 0x8f, 0x51, 0xf3, 0x84, 0xbd, 0x35, 0x88, - 0x20, 0x63, 0x07, 0x0f, 0x8d, 0x99, 0x5d, 0x18, 0xab, 0x60, 0xa9, 0x7a, 0x6e, 0x9b, 0x1e, 0x7d, - 0x4c, 0xaa, 0x86, 0xb9, 0xef, 0x99, 0x04, 0x6a, 0xe4, 0x01, 0x8a, 0x9d, 0x76, 0x9b, 0xda, 0x31, - 0x79, 0x64, 0xb6, 0x98, 0x1a, 0xe7, 0x4c, 0xf2, 0x6d, 0xac, 0x83, 0x16, 0x62, 0x78, 0xc2, 0xbb, - 0xc2, 0x10, 0xe6, 0x3e, 0x2c, 0x49, 0x98, 0x4c, 0xb6, 0xbb, 0x90, 0x6a, 0x86, 0x60, 0x66, 0x91, - 0xe1, 0xc9, 0x11, 0x92, 0x98, 0x22, 0x9e, 0xd1, 0x85, 0xd9, 0x52, 0xa7, 0xd9, 0x23, 0xef, 0xe9, - 0x31, 0xa3, 0xe1, 0x9d, 0x70, 0x66, 0xb5, 0x7b, 0xdc, 0x3c, 0x69, 0x43, 0x3e, 0x0d, 0x60, 0xec, - 0x69, 0x90, 0x8a, 0x9e, 0x06, 0x0f, 0x41, 0xe5, 0x23, 0x8e, 0x9b, 0x27, 0x36, 0xb7, 0xae, 0x8b, - 0x5e, 0xd8, 0x2f, 0xf9, 0xf5, 0x8f, 0xb6, 0x8c, 0x12, 0x2c, 0x0a, 0xf4, 0x6c, 0xf6, 0x1f, 0xc3, - 0x5c, 0x8b, 0x03, 0xd9, 0xdc, 0xc3, 0x6d, 0xc0, 0xd1, 0xcd, 0x10, 0xc7, 0xf8, 0x08, 0x96, 0x39, - 0xb8, 0x84, 0xda, 0x48, 0x7a, 0x6b, 0x1e, 0x52, 0x79, 0x0e, 0x56, 0xa2, 0xc8, 0xcc, 0x65, 0xff, - 0x79, 0x02, 0x26, 0x71, 0x10, 0xf8, 0x5a, 0xa7, 0xfb, 0x6b, 0x65, 0x24, 0x84, 0xcb, 0xcd, 0x94, - 0x7c, 0xb9, 0x61, 0x67, 0xf8, 0x74, 0xcc, 0x19, 0xfe, 0x11, 0x4c, 0x7b, 0xe4, 0xa1, 0x81, 0x2c, - 0x8e, 0x18, 0x41, 0x90, 0x8b, 0x19, 0x7d, 0x83, 0x60, 0x28, 0xda, 0x2a, 0xc0, 0x19, 0x72, 0xed, - 0x17, 0xb6, 0xb0, 0x5e, 0x02, 0x44, 0xce, 0x73, 0xa4, 0xa3, 0x79, 0x0e, 0x15, 0x92, 0xc8, 0x75, - 0x69, 0x24, 0x61, 0xe2, 0x4f, 0xe3, 0x21, 0xa4, 0x48, 0x5c, 0x7c, 0xf1, 0x15, 0x26, 0xb8, 0x6f, - 0x4d, 0x8a, 0xf7, 0xad, 0x3b, 0x90, 0xa6, 0xf4, 0x97, 0xbe, 0x6c, 0x19, 0x0d, 0x58, 0xa4, 0xd7, - 0x5f, 0xcb, 0x6d, 0x1e, 0x8f, 0x3f, 0x3b, 0xf1, 0x98, 0xf6, 0xa9, 0xed, 0xf3, 0xe7, 0x23, 0xd2, - 0x18, 0x21, 0xc9, 0x03, 0x7e, 0x41, 0xa7, 0x6c, 0x43, 0xaf, 0x8f, 0x07, 0x1d, 0xf6, 0xfa, 0x44, - 0x20, 0xda, 0x67, 0x7c, 0x80, 0x63, 0x9e, 0x0b, 0xa5, 0x31, 0x36, 0xf1, 0x89, 0x2f, 0x71, 0xbf, - 0x30, 0x5e, 0x35, 0x16, 0x20, 0xfd, 0xcc, 0xf2, 0x03, 0xce, 0x46, 0x05, 0x80, 0xb4, 0xcb, 0x67, - 0x78, 0x13, 0xdf, 0x08, 0x96, 0x5e, 0x89, 0xbc, 0xcb, 0x11, 0xa4, 0xc8, 0xda, 0x73, 0x6b, 0x4f, - 0x08, 0xd6, 0x9e, 0x81, 0xf9, 0x62, 0xc7, 0x79, 0x61, 0x1f, 0xf1, 0x01, 0x7e, 0xab, 0xc0, 0x02, - 0x87, 0x30, 0x29, 0x3f, 0x87, 0xe9, 0x26, 0x81, 0x30, 0x39, 0xdf, 0x13, 0x1c, 0x8d, 0x88, 0xc8, - 0x9a, 0x65, 0xc7, 0x77, 0xcf, 0x4d, 0x46, 0xa2, 0x3f, 0x80, 0x94, 0x00, 0xc6, 0x16, 0xc4, 0x2f, - 0x1f, 0x73, 0x34, 0x8b, 0x15, 0xeb, 0x74, 0x3e, 0x4b, 0xdc, 0x57, 0x8c, 0xcf, 0x40, 0xa5, 0xa4, - 0xb5, 0x30, 0x9a, 0xbc, 0x24, 0x3d, 0xbe, 0x1f, 0x0a, 0xb4, 0x6c, 0x03, 0xff, 0xa3, 0x02, 0xf3, - 0xcf, 0x3a, 0xee, 0xe9, 0x71, 0x87, 0x3f, 0x89, 0xae, 0x48, 0xef, 0x92, 0xe1, 0x23, 0xf2, 0x35, - 0x98, 0x0b, 0x9e, 0x9a, 0x19, 0xe3, 0x10, 0x80, 0xa9, 0x6c, 0xe7, 0xcc, 0xf6, 0xf9, 0x5b, 0x03, - 0x6b, 0x31, 0xbf, 0x00, 0x71, 0x7e, 0x81, 0x9c, 0xbb, 0x29, 0xe1, 0x91, 0x71, 0x9d, 0x45, 0x02, - 0xe9, 0xc8, 0xc2, 0x15, 0x3b, 0x8e, 0x8f, 0x1c, 0xf1, 0xda, 0x7e, 0x0a, 0x0b, 0x5c, 0x68, 0xf6, - 0x68, 0xb9, 0x21, 0xbf, 0xaf, 0xa4, 0x84, 0xdb, 0xd7, 0x13, 0x0a, 0x0f, 0x5f, 0x5c, 0x3e, 0x0e, - 0x4c, 0x84, 0x06, 0x0c, 0x57, 0x42, 0x13, 0x61, 0x4c, 0x65, 0x2b, 0x31, 0xfe, 0x3e, 0x01, 0x33, - 0x8c, 0xcb, 0x98, 0x8b, 0xf4, 0x25, 0x5e, 0x48, 0xb5, 0x0d, 0x51, 0x89, 0xc9, 0x18, 0x44, 0x41, - 0xa5, 0x5c, 0x1d, 0xd1, 0x57, 0x7b, 0x26, 0x89, 0x70, 0x0b, 0xda, 0x80, 0x99, 0x26, 0xd5, 0x11, - 0xd1, 0xb4, 0x38, 0x79, 0xa6, 0x3b, 0x93, 0x23, 0xc8, 0x47, 0xd7, 0x72, 0xf4, 0xe8, 0xca, 0x43, - 0x0a, 0xbb, 0xb6, 0x92, 0xed, 0x75, 0xdb, 0xd6, 0x79, 0x6e, 0x8d, 0xac, 0xa5, 0x08, 0xc2, 0x18, - 0xf8, 0x24, 0xe3, 0x18, 0x79, 0x8a, 0x21, 0x80, 0x8c, 0x1d, 0x98, 0x61, 0xa3, 0xc6, 0x3e, 0x25, - 0xaf, 0x0b, 0xf1, 0xde, 0xf8, 0x55, 0xb6, 0x60, 0x99, 0xcd, 0xf5, 0xc0, 0x45, 0x5d, 0xcb, 0x15, - 0x2e, 0x16, 0x6f, 0x62, 0xa2, 0x38, 0xd0, 0x44, 0x2f, 0x7d, 0x76, 0x17, 0x24, 0xdf, 0x46, 0x09, - 0x56, 0xa2, 0x43, 0xb0, 0x1d, 0xfe, 0x1a, 0x06, 0x65, 0xfc, 0x06, 0xb2, 0x0c, 0x26, 0xe7, 0x6d, - 0xdf, 0x9e, 0x9c, 0xc5, 0x40, 0x15, 0x91, 0xd4, 0xed, 0xeb, 0x88, 0xb9, 0x03, 0x19, 0x06, 0xf3, - 0x7e, 0x94, 0x84, 0xc6, 0x17, 0xa0, 0x86, 0x8c, 0x98, 0x20, 0x37, 0x60, 0x96, 0x8d, 0xc3, 0x7d, - 0xf7, 0xb0, 0x24, 0x01, 0x86, 0xf1, 0x1b, 0x58, 0x2a, 0xb4, 0x4e, 0x6d, 0xa7, 0x66, 0x1f, 0x39, - 0xf8, 0xd4, 0x16, 0xc4, 0x09, 0xab, 0x38, 0xc2, 0x44, 0xeb, 0x0a, 0x4c, 0x9f, 0x22, 0xff, 0xb8, - 0xc3, 0xdf, 0xd4, 0x58, 0x8b, 0x87, 0x00, 0xc9, 0xe1, 0x10, 0xc0, 0x68, 0x42, 0x56, 0x1e, 0x21, - 0x0c, 0xf8, 0xad, 0x5e, 0x18, 0xdf, 0xe0, 0x6f, 0xce, 0x26, 0x11, 0x13, 0x49, 0x5c, 0x83, 0xc9, - 0x66, 0x38, 0x04, 0x89, 0x6b, 0x8b, 0xb8, 0x93, 0x40, 0x37, 0xfe, 0x42, 0x81, 0x94, 0x90, 0xee, - 0xd1, 0x6e, 0x43, 0xb6, 0x54, 0xde, 0x2e, 0x34, 0xf6, 0xeb, 0x87, 0xe5, 0x4a, 0xd1, 0x7c, 0x7e, - 0x50, 0x3f, 0x7c, 0x52, 0x2d, 0x95, 0xd5, 0x09, 0x7d, 0xa5, 0x3f, 0xc8, 0x6b, 0x25, 0xf4, 0xc2, - 0xea, 0xb5, 0x7d, 0x91, 0xe2, 0x1d, 0x00, 0x8e, 0xf9, 0x74, 0x53, 0x55, 0xf4, 0xf9, 0xfe, 0x20, - 0x3f, 0xc7, 0x10, 0x9e, 0x6e, 0x6a, 0xef, 0x42, 0xba, 0xb6, 0xbb, 0xc3, 0x11, 0xee, 0xa8, 0x09, - 0x3d, 0xd3, 0x1f, 0xe4, 0x49, 0x11, 0x1a, 0x45, 0xb9, 0xa3, 0x2f, 0xfd, 0xf6, 0x6f, 0x56, 0x27, - 0xfe, 0xe9, 0x6f, 0x57, 0x45, 0x41, 0x36, 0xbe, 0x55, 0x00, 0xc2, 0xc7, 0x4e, 0xed, 0x16, 0x2c, - 0x05, 0x72, 0x7d, 0x79, 0x50, 0x35, 0xeb, 0x87, 0xf5, 0xe7, 0x07, 0x58, 0xac, 0xe5, 0xfe, 0x20, - 0xbf, 0xc8, 0xc5, 0x0a, 0xf1, 0x6f, 0x43, 0xb6, 0x56, 0xd8, 0xaf, 0x1f, 0x14, 0x8a, 0x7b, 0x12, - 0x81, 0x42, 0xe7, 0x51, 0xb3, 0xda, 0x7e, 0xd7, 0x6a, 0x9e, 0x84, 0x14, 0xba, 0xc6, 0xa4, 0x10, - 0x46, 0xdd, 0xf8, 0x17, 0x05, 0x66, 0xd8, 0xd3, 0x97, 0xb6, 0x0e, 0x6a, 0xa3, 0xb2, 0x57, 0xa9, - 0x3e, 0xab, 0x1c, 0xee, 0x95, 0x9f, 0xf3, 0xe1, 0xb5, 0xfe, 0x20, 0xbf, 0xd0, 0x70, 0x4e, 0x9c, - 0xce, 0x37, 0x0e, 0xc7, 0xd4, 0x61, 0xb6, 0x5c, 0xfa, 0x72, 0xf3, 0xee, 0xdd, 0x3b, 0x0f, 0x54, - 0xd0, 0xd3, 0xfd, 0x41, 0x7e, 0xb6, 0xdc, 0xa2, 0x6d, 0xed, 0x3a, 0x64, 0x78, 0xdf, 0xe1, 0x41, - 0x63, 0x6b, 0x7f, 0xb7, 0xa8, 0xa6, 0x28, 0x13, 0x8e, 0x72, 0xd0, 0xfb, 0xaa, 0x6d, 0x37, 0xb1, - 0xc1, 0x30, 0x16, 0x59, 0x1d, 0xfa, 0x83, 0x3c, 0x6b, 0x69, 0xef, 0xc1, 0xbc, 0x4c, 0xbe, 0xac, - 0xab, 0xfd, 0x41, 0x3e, 0x2d, 0x12, 0xeb, 0x19, 0x36, 0x17, 0x2e, 0xfc, 0x46, 0x1d, 0xe6, 0xa5, - 0x8b, 0xb9, 0x96, 0x85, 0x64, 0xa1, 0x56, 0x54, 0x27, 0xf4, 0x54, 0x7f, 0x90, 0x9f, 0xc1, 0x7d, - 0x05, 0x0f, 0x0f, 0x3a, 0x59, 0x2a, 0xd7, 0x8a, 0xaa, 0x42, 0xa5, 0x26, 0x24, 0xc8, 0x6b, 0xea, - 0xcb, 0x8c, 0x9f, 0xcc, 0x64, 0xe3, 0x7b, 0x05, 0x20, 0x7c, 0xd0, 0xd2, 0x36, 0x60, 0x89, 0x6b, - 0xa8, 0x56, 0x2e, 0x9a, 0xe5, 0x60, 0x8d, 0x16, 0xfb, 0x83, 0xfc, 0x3c, 0x53, 0x12, 0x7b, 0x4b, - 0xbb, 0x0e, 0x99, 0x83, 0x42, 0xad, 0xf6, 0xac, 0x6a, 0x96, 0x18, 0xb2, 0x0a, 0x54, 0x0f, 0xfc, - 0x16, 0xca, 0x10, 0x3f, 0x80, 0x85, 0x62, 0xb5, 0x52, 0x2f, 0x14, 0xeb, 0x1c, 0x2f, 0x45, 0xf9, - 0x61, 0x6f, 0x6b, 0x35, 0x7d, 0x86, 0xb6, 0x06, 0xa9, 0x62, 0x21, 0xe4, 0x95, 0xd6, 0x17, 0xfa, - 0x83, 0x3c, 0x14, 0xad, 0x80, 0xcf, 0x1a, 0xa4, 0x2a, 0xd5, 0x7a, 0x99, 0x23, 0xcc, 0x53, 0x84, - 0x4a, 0xc7, 0x47, 0x14, 0x21, 0x5c, 0xff, 0x70, 0x46, 0x1b, 0xbf, 0x57, 0x60, 0x96, 0x5f, 0xc1, - 0x71, 0x94, 0xf2, 0xa8, 0xfc, 0xa5, 0x3a, 0xa1, 0xcf, 0xf4, 0x07, 0xf9, 0xe4, 0x23, 0xf4, 0x12, - 0xaf, 0xd1, 0x56, 0xa1, 0x56, 0xbe, 0x87, 0xcd, 0x9e, 0xac, 0xd1, 0x96, 0xe5, 0xa1, 0x7b, 0x9b, - 0x1c, 0x7e, 0xf7, 0xbe, 0x9a, 0x08, 0xe1, 0x77, 0xef, 0x73, 0xf8, 0x27, 0x9b, 0x6a, 0x32, 0x84, - 0x7f, 0x12, 0xe0, 0xdf, 0xb9, 0xa7, 0x4e, 0x86, 0xf0, 0x3b, 0xf7, 0x02, 0xfe, 0x9f, 0xaa, 0x53, - 0x02, 0xff, 0x4f, 0xb1, 0x81, 0x71, 0xe3, 0x56, 0xa7, 0xd9, 0x52, 0x31, 0x83, 0xc6, 0x91, 0xd3, - 0xd6, 0xee, 0xc1, 0x27, 0x0f, 0xd4, 0x19, 0x7d, 0xae, 0x3f, 0xc8, 0xd3, 0x86, 0xae, 0xb2, 0xc9, - 0x05, 0xb3, 0xd9, 0xf8, 0xef, 0x04, 0x40, 0x78, 0x95, 0xd0, 0xae, 0x43, 0xba, 0x51, 0x2b, 0x9b, - 0x87, 0x6c, 0x01, 0xf9, 0xc6, 0x0a, 0x31, 0xd8, 0xf2, 0x69, 0xef, 0xc0, 0x0c, 0x41, 0xac, 0xee, - 0xa9, 0x0a, 0xb5, 0xbc, 0x10, 0xa7, 0xba, 0xa7, 0x7d, 0x0e, 0x57, 0x48, 0xb7, 0x59, 0xae, 0x55, - 0x1b, 0x66, 0xb1, 0x7c, 0x58, 0xa9, 0xd6, 0x0f, 0xb7, 0xab, 0x8d, 0x4a, 0x49, 0xcd, 0xea, 0xab, - 0xfd, 0x41, 0x5e, 0x17, 0xee, 0x2f, 0xc8, 0xeb, 0xf4, 0xdc, 0x26, 0xaa, 0x74, 0xfc, 0xed, 0x4e, - 0xcf, 0x69, 0x69, 0x0f, 0x60, 0x85, 0x10, 0xe3, 0x05, 0x2f, 0x57, 0xea, 0x02, 0xed, 0xaa, 0xfe, - 0x4e, 0x7f, 0x90, 0xbf, 0x1a, 0xd2, 0xb2, 0xb3, 0x36, 0x20, 0xbd, 0x07, 0x59, 0x89, 0x74, 0xb7, - 0xf2, 0xb4, 0xb0, 0xbf, 0x5b, 0x52, 0xd7, 0xf4, 0x6b, 0xfd, 0x41, 0x3e, 0x37, 0x44, 0xb8, 0xeb, - 0x9c, 0x59, 0x6d, 0xbb, 0xa5, 0xdd, 0x86, 0x45, 0x4e, 0x57, 0x39, 0xdc, 0x2e, 0xec, 0xee, 0x37, - 0xcc, 0xb2, 0xba, 0xae, 0x5f, 0xed, 0x0f, 0xf2, 0xcb, 0x12, 0x91, 0xb3, 0x6d, 0xd9, 0xed, 0x9e, - 0x8b, 0x02, 0x4d, 0x71, 0xe4, 0xcd, 0xa8, 0xa6, 0x18, 0x62, 0x68, 0x50, 0x61, 0xd7, 0xc6, 0xff, - 0x28, 0x90, 0x12, 0xa2, 0x78, 0x6d, 0x1d, 0xd2, 0xcf, 0x0a, 0xf5, 0xe2, 0xa3, 0xc3, 0x06, 0x57, - 0x3b, 0x71, 0x4f, 0x02, 0x0a, 0xd7, 0xfb, 0x75, 0x8e, 0x59, 0x6d, 0xd4, 0x0b, 0x3b, 0x65, 0x35, - 0x4d, 0x87, 0x15, 0x30, 0xab, 0x3d, 0x1f, 0x87, 0x77, 0x37, 0x21, 0x43, 0x11, 0x4b, 0xbb, 0x35, - 0xb3, 0x71, 0x50, 0x2f, 0x97, 0xd4, 0x79, 0x3d, 0xd7, 0x1f, 0xe4, 0xb3, 0x02, 0x6e, 0xc9, 0xf6, - 0xdc, 0x5e, 0xd7, 0x47, 0x2d, 0xed, 0x23, 0x58, 0xa0, 0xe8, 0xb5, 0x7a, 0xc1, 0xac, 0xef, 0x56, - 0x76, 0xd4, 0x05, 0xfd, 0x4a, 0x7f, 0x90, 0x5f, 0x12, 0xb0, 0x6b, 0xbe, 0xe5, 0xfa, 0x78, 0x0b, - 0xbc, 0x07, 0xc0, 0x78, 0x17, 0xea, 0x05, 0x55, 0xd5, 0x97, 0xfa, 0x83, 0x7c, 0x46, 0x64, 0x6b, - 0xf9, 0x56, 0xe8, 0xce, 0x85, 0x8e, 0x8d, 0xff, 0x48, 0x84, 0x01, 0x2f, 0x9b, 0xfb, 0x87, 0xa0, - 0x3e, 0xab, 0x9a, 0x4f, 0x1e, 0x55, 0xf7, 0xcb, 0x87, 0xcc, 0xb7, 0xab, 0x13, 0x8c, 0x25, 0xc3, - 0x64, 0x7e, 0x5d, 0xfb, 0x08, 0x16, 0x03, 0xd4, 0x40, 0x4e, 0xd0, 0xb3, 0xfd, 0x41, 0x5e, 0x15, - 0xb8, 0x52, 0x21, 0x45, 0xe4, 0xea, 0xf6, 0x76, 0xd9, 0xc4, 0xc8, 0x59, 0x19, 0xb9, 0xfa, 0xe2, - 0x05, 0x72, 0x31, 0xf2, 0x4d, 0xd0, 0x02, 0xe4, 0x42, 0xa5, 0xf6, 0x8c, 0x62, 0x2f, 0x33, 0xe5, - 0x32, 0xec, 0x82, 0xe3, 0x7d, 0x33, 0x8c, 0xfe, 0xa8, 0x50, 0x29, 0xd5, 0x1e, 0x15, 0xf6, 0xb0, - 0xbd, 0x48, 0xe8, 0x8f, 0x2c, 0xa7, 0xe5, 0x1d, 0x5b, 0x27, 0x48, 0x42, 0xc7, 0x16, 0x56, 0x2e, - 0xe2, 0xe5, 0x68, 0xc9, 0xe8, 0xd8, 0xb8, 0x50, 0xd3, 0x27, 0xf5, 0x18, 0x99, 0x10, 0x7d, 0xbf, - 0x5a, 0x2b, 0x97, 0xd4, 0xef, 0x14, 0xea, 0x15, 0x03, 0xe4, 0x76, 0xc7, 0x43, 0x2d, 0x7d, 0x85, - 0xe9, 0x38, 0xa2, 0xd3, 0x8d, 0x36, 0xb9, 0x98, 0xf1, 0x28, 0x14, 0x3b, 0xcf, 0xad, 0xdd, 0x4a, - 0xc1, 0x7c, 0xce, 0xf7, 0x05, 0x77, 0xc6, 0x5b, 0xb6, 0x63, 0xb9, 0xe7, 0x3c, 0xc8, 0x7d, 0x17, - 0xd2, 0x8d, 0xfa, 0xf6, 0xfd, 0x00, 0x49, 0xa1, 0x67, 0x34, 0x86, 0x31, 0x94, 0x70, 0x51, 0x05, - 0xf6, 0x1b, 0xbf, 0x53, 0x20, 0x25, 0xc4, 0xf2, 0x98, 0xcf, 0x93, 0x72, 0xad, 0x56, 0xd8, 0xc1, - 0x6e, 0x96, 0x0c, 0x46, 0xf8, 0x30, 0x94, 0x1a, 0x1e, 0xea, 0x3a, 0x64, 0x38, 0xca, 0x41, 0xb9, - 0x52, 0xc2, 0xca, 0x66, 0x33, 0xe4, 0x51, 0x2c, 0x72, 0x88, 0xb7, 0x5d, 0x83, 0x14, 0x47, 0xc4, - 0x6e, 0x2e, 0x41, 0xfd, 0x35, 0x43, 0x2a, 0x34, 0x4f, 0x42, 0x89, 0x04, 0x09, 0x36, 0xff, 0x37, - 0x0f, 0x93, 0x7b, 0xe8, 0xdc, 0xd3, 0x1e, 0x93, 0x74, 0x17, 0xcf, 0xe5, 0x6b, 0x3f, 0x13, 0xaf, - 0x28, 0x91, 0xea, 0x00, 0xfd, 0x5a, 0x7c, 0x27, 0xbb, 0x5f, 0x4e, 0x68, 0x77, 0x19, 0xcf, 0xac, - 0x88, 0xc7, 0x03, 0x50, 0x7d, 0x39, 0x02, 0x0d, 0xc8, 0x36, 0x69, 0xde, 0x72, 0x49, 0xba, 0x1d, - 0x31, 0xa2, 0xac, 0x0c, 0x0c, 0x68, 0x4a, 0x30, 0x17, 0x24, 0x58, 0xb5, 0xab, 0x22, 0x92, 0x94, - 0xb4, 0xd5, 0xf5, 0xb8, 0xae, 0x08, 0x17, 0x1a, 0xc7, 0xc8, 0x5c, 0xa4, 0xdc, 0xb4, 0xcc, 0x45, - 0x4e, 0x21, 0x07, 0x5c, 0x68, 0x86, 0x43, 0xe6, 0x22, 0x25, 0x49, 0x64, 0x2e, 0x91, 0x84, 0x08, - 0x51, 0x1e, 0x8e, 0xf5, 0x04, 0xe5, 0x09, 0x15, 0x0b, 0x82, 0xf2, 0xc4, 0x5a, 0x03, 0x63, 0x42, - 0x2b, 0xc0, 0x2c, 0x2f, 0xbb, 0xd7, 0x56, 0x24, 0xa4, 0xa0, 0xf4, 0x49, 0xbf, 0x32, 0x04, 0xa7, - 0x57, 0x69, 0x63, 0x62, 0x5d, 0xb9, 0xad, 0x68, 0xac, 0x4a, 0xb1, 0xe6, 0xbb, 0xc8, 0x3a, 0xd5, - 0x34, 0x09, 0x99, 0x32, 0x58, 0x92, 0x60, 0x11, 0xe2, 0x69, 0x5a, 0xfe, 0x2c, 0x8c, 0x2e, 0x95, - 0xeb, 0x0b, 0xa3, 0xcb, 0xb5, 0xf6, 0xc6, 0x84, 0xb6, 0x03, 0x10, 0x96, 0x77, 0x6b, 0xb9, 0x08, - 0x62, 0x38, 0x81, 0xab, 0x31, 0x3d, 0x92, 0x14, 0x05, 0x5e, 0xc0, 0xce, 0x26, 0x91, 0x8d, 0x10, - 0x50, 0x36, 0xcb, 0x11, 0xa8, 0xc4, 0xe2, 0x11, 0xaf, 0xe3, 0x2e, 0xd0, 0xa2, 0xaf, 0x37, 0xe7, - 0x54, 0xe3, 0x7f, 0x15, 0xf0, 0x8a, 0x70, 0x6d, 0x35, 0x82, 0x1e, 0xf9, 0x45, 0x40, 0x5f, 0x1b, - 0xd9, 0x1f, 0xa8, 0xea, 0xd7, 0xa0, 0x0d, 0x57, 0xaf, 0x6b, 0xf9, 0x11, 0x84, 0xa1, 0xea, 0x2e, - 0x66, 0xbd, 0xae, 0x68, 0xcf, 0x21, 0x2b, 0xf7, 0xb2, 0xc9, 0x5f, 0x1b, 0x41, 0xfc, 0x1a, 0xac, - 0x1f, 0xc2, 0x0c, 0xbb, 0xad, 0x68, 0x57, 0xa2, 0x75, 0x73, 0x7c, 0xfa, 0xb9, 0xe1, 0x0e, 0x61, - 0x73, 0xf1, 0x32, 0x45, 0x26, 0xd3, 0x72, 0x14, 0x99, 0x0a, 0xb3, 0x12, 0x05, 0x4b, 0x4b, 0xf2, - 0x38, 0xb8, 0xbc, 0x11, 0xb5, 0x5d, 0x8d, 0x22, 0x87, 0xfa, 0xd2, 0xe3, 0xba, 0x24, 0x5e, 0x0f, - 0x61, 0x86, 0x55, 0xd1, 0x09, 0x33, 0x92, 0xab, 0x24, 0x85, 0x19, 0x45, 0x8a, 0x1a, 0x8d, 0x09, - 0x2c, 0x8b, 0x50, 0x22, 0x28, 0xc8, 0x12, 0x2d, 0x59, 0x14, 0x64, 0x19, 0xaa, 0x29, 0x64, 0xb2, - 0x94, 0x82, 0x8a, 0xbe, 0x21, 0xed, 0x88, 0xd5, 0x80, 0x82, 0x76, 0xa4, 0x02, 0x40, 0xc6, 0x65, - 0x0f, 0xb2, 0x0c, 0x2c, 0xdb, 0xfe, 0x1b, 0x31, 0x7b, 0x0c, 0x4b, 0xc1, 0x9d, 0xb5, 0xda, 0x45, - 0xce, 0x8f, 0xe1, 0xf5, 0x87, 0xa0, 0x4b, 0xbc, 0xde, 0x82, 0x78, 0xd4, 0x5f, 0x92, 0x2a, 0x13, - 0xc1, 0xe1, 0x44, 0xfe, 0x55, 0x10, 0x1c, 0x4e, 0xf4, 0xbf, 0x04, 0xea, 0xef, 0xc3, 0x3f, 0x33, - 0xae, 0xc6, 0x54, 0x3a, 0x0d, 0xf9, 0xfb, 0xa1, 0x7f, 0x06, 0x8c, 0x09, 0xed, 0x29, 0x64, 0x22, - 0x45, 0xfa, 0xda, 0xda, 0x30, 0x81, 0xf4, 0xca, 0xa4, 0xe7, 0x47, 0x23, 0xc4, 0xf2, 0xa5, 0x25, - 0xf5, 0x71, 0x7c, 0xa5, 0x4a, 0xfe, 0x38, 0xbe, 0x72, 0x35, 0x3e, 0x3d, 0x9f, 0x48, 0xfa, 0x27, - 0x2b, 0x27, 0x01, 0x86, 0xce, 0x27, 0x31, 0xa1, 0x41, 0x5d, 0x7c, 0x98, 0x58, 0xd0, 0x74, 0x39, - 0x3b, 0x23, 0xa6, 0x0d, 0xf4, 0x9f, 0xc5, 0xf6, 0x89, 0xdb, 0x46, 0xa8, 0xfb, 0xd3, 0xa2, 0xd8, - 0x62, 0x61, 0xa1, 0x10, 0xa8, 0xc4, 0x94, 0x0a, 0xd2, 0x43, 0x93, 0x97, 0xed, 0x09, 0x46, 0x10, - 0xa9, 0x12, 0x14, 0x8c, 0x20, 0x5a, 0xe3, 0x67, 0x4c, 0x60, 0x2f, 0xc0, 0x4a, 0xe5, 0x04, 0x2f, - 0x20, 0x17, 0xf2, 0xe9, 0xb9, 0xe1, 0x8e, 0x80, 0xfe, 0x73, 0x98, 0x66, 0x3a, 0x11, 0x4e, 0x6d, - 0x49, 0x1f, 0x57, 0x86, 0xe0, 0x32, 0x31, 0x2d, 0xb5, 0x89, 0x96, 0x27, 0xc4, 0x10, 0x8b, 0x65, - 0x26, 0x74, 0x45, 0xc2, 0x0a, 0x10, 0x61, 0x45, 0x86, 0x8a, 0x4a, 0x84, 0x15, 0x19, 0x2e, 0x19, - 0x31, 0x26, 0xb4, 0x27, 0x90, 0x16, 0x8b, 0x3b, 0x84, 0xd3, 0x22, 0xa6, 0x44, 0x44, 0x7f, 0x67, - 0x44, 0xaf, 0xa8, 0x51, 0x56, 0x8d, 0xa1, 0x45, 0xa5, 0xf7, 0x86, 0x35, 0x1a, 0x29, 0xdc, 0xa0, - 0x06, 0x4a, 0xaa, 0x0f, 0xb2, 0x72, 0x6d, 0xc2, 0x90, 0x81, 0x8a, 0x15, 0x13, 0xc6, 0x84, 0x76, - 0x1f, 0xa6, 0x48, 0xa9, 0x83, 0x26, 0x63, 0x04, 0x43, 0xae, 0x44, 0xc1, 0xe2, 0x80, 0x07, 0xbd, - 0x76, 0x5b, 0x18, 0x50, 0x48, 0xf4, 0x0b, 0x03, 0x8a, 0x39, 0x7d, 0x4e, 0xe6, 0x1d, 0x4b, 0x64, - 0x41, 0x1a, 0x5f, 0x22, 0xf3, 0x22, 0x6b, 0x4e, 0x73, 0x3a, 0xc2, 0x9a, 0x4b, 0xc9, 0x2b, 0x61, - 0xcd, 0xe5, 0xcc, 0x14, 0x75, 0x59, 0x41, 0x42, 0x48, 0x70, 0x59, 0xd1, 0x04, 0x93, 0xe0, 0xb2, - 0x86, 0xf3, 0x47, 0x64, 0xdb, 0xf0, 0x6b, 0x94, 0x20, 0x84, 0x94, 0x53, 0xd2, 0x87, 0x33, 0x2c, - 0x91, 0x03, 0x6b, 0x2e, 0xa8, 0xa6, 0x16, 0x04, 0x89, 0x56, 0x6a, 0x0b, 0x82, 0x0c, 0x15, 0x5f, - 0x53, 0x13, 0x0e, 0xeb, 0xa2, 0x35, 0x19, 0x57, 0xaa, 0xba, 0x16, 0x4c, 0x78, 0xb8, 0x90, 0x9a, - 0xce, 0x88, 0x57, 0x46, 0x0b, 0x8e, 0x20, 0x52, 0x3f, 0xad, 0x5f, 0x8d, 0xe9, 0x09, 0x58, 0x1c, - 0xc0, 0xbc, 0x54, 0xf0, 0xae, 0x85, 0x86, 0x1e, 0x57, 0x21, 0xaf, 0xaf, 0x8e, 0xea, 0x16, 0x0d, - 0xc4, 0xb4, 0x9c, 0x96, 0x60, 0x20, 0x42, 0x85, 0x8c, 0x60, 0x20, 0x62, 0x75, 0x0b, 0xdd, 0x8e, - 0x62, 0x71, 0x8a, 0xb0, 0x1d, 0x63, 0x4a, 0x5c, 0x84, 0xed, 0x18, 0x57, 0xd1, 0x42, 0xfd, 0xad, - 0x50, 0x7c, 0x21, 0xf8, 0xdb, 0xe1, 0xe2, 0x0d, 0xc1, 0xdf, 0xc6, 0xd4, 0x6b, 0x50, 0xf3, 0x0b, - 0x0a, 0x19, 0xc4, 0x80, 0x27, 0x52, 0x1c, 0x21, 0x06, 0x3c, 0xd1, 0xba, 0x07, 0x63, 0x02, 0xc7, - 0xd5, 0x72, 0x6d, 0x82, 0x10, 0x57, 0xc7, 0x56, 0x38, 0x08, 0x11, 0xea, 0x88, 0xa2, 0x06, 0xa2, - 0x35, 0x31, 0x79, 0x20, 0x68, 0x2d, 0x26, 0x6b, 0x21, 0x68, 0x2d, 0x2e, 0xe3, 0x40, 0x65, 0x94, - 0xb3, 0x4c, 0x82, 0x8c, 0xb1, 0x19, 0x2e, 0x41, 0xc6, 0xf8, 0xf4, 0x14, 0x35, 0x31, 0x29, 0x25, - 0x24, 0x98, 0x58, 0x5c, 0x32, 0x4a, 0x5f, 0x1d, 0xd5, 0x2d, 0xda, 0x3d, 0x4f, 0xeb, 0x08, 0x76, - 0x1f, 0x49, 0x19, 0x09, 0x76, 0x1f, 0xcd, 0x01, 0x19, 0x13, 0xda, 0x1f, 0xc0, 0x14, 0x79, 0xb7, - 0x12, 0xfc, 0xa6, 0x98, 0xab, 0x17, 0xee, 0x8c, 0x61, 0xca, 0xde, 0x98, 0xb8, 0xad, 0x6c, 0x5d, - 0xfb, 0xee, 0x87, 0xd5, 0x89, 0xdf, 0xff, 0xb0, 0xaa, 0xfc, 0xd7, 0x0f, 0xab, 0xca, 0x77, 0xaf, - 0x56, 0x95, 0x7f, 0x7d, 0xb5, 0xaa, 0xfc, 0xfb, 0xab, 0x55, 0xe5, 0x3f, 0x5f, 0xad, 0x2a, 0x5f, - 0x4d, 0x93, 0x5f, 0xfa, 0x3f, 0xf9, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe1, 0x70, 0xb1, 0x81, - 0xff, 0x3f, 0x00, 0x00, + // 4700 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0x4b, 0x6c, 0x23, 0xc7, + 0x72, 0x1a, 0x52, 0x3f, 0x16, 0x29, 0x71, 0x34, 0xa2, 0xb4, 0xdc, 0x79, 0x6b, 0x89, 0x1e, 0xdb, + 0x6f, 0x65, 0xd9, 0x6b, 0xef, 0xca, 0x5e, 0xc7, 0x6b, 0xbf, 0xb7, 0xcf, 0x14, 0x49, 0x69, 0x65, + 0x69, 0x49, 0x65, 0x48, 0x7a, 0xbd, 0x79, 0x08, 0xf4, 0xc6, 0x64, 0x4b, 0x1a, 0x88, 0x1a, 0xd2, + 0x33, 0x43, 0x79, 0x75, 0x0a, 0xe0, 0xd3, 0x03, 0x11, 0xe0, 0x21, 0x97, 0x20, 0x17, 0x06, 0x01, + 0x12, 0x20, 0x01, 0x72, 0x09, 0x90, 0x5b, 0x90, 0x73, 0xe0, 0x63, 0x90, 0xd3, 0x3b, 0x19, 0xf1, + 0x22, 0x87, 0x1c, 0x03, 0x04, 0x08, 0x72, 0x0c, 0xfa, 0x37, 0xd3, 0x3d, 0x1c, 0x52, 0xda, 0xf5, + 0x3a, 0xb7, 0xe9, 0xea, 0xaa, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xae, 0x1a, 0x80, 0x33, 0x74, + 0xe9, 0xbd, 0xd7, 0x73, 0xbb, 0x7e, 0x57, 0x9b, 0xf3, 0x90, 0x7b, 0x61, 0xb7, 0x90, 0x9e, 0x3b, + 0xe9, 0x9e, 0x74, 0x09, 0xec, 0x7d, 0xfc, 0x45, 0xbb, 0x0d, 0x13, 0xe6, 0xcd, 0xc3, 0x52, 0xc5, + 0x75, 0xbb, 0xae, 0xa6, 0xc1, 0x74, 0xab, 0xdb, 0x46, 0x79, 0xa5, 0xa0, 0x6c, 0xcc, 0x98, 0xe4, + 0x5b, 0xcb, 0xc3, 0xdc, 0x39, 0xf2, 0x3c, 0xeb, 0x04, 0xe5, 0x13, 0x05, 0x65, 0x23, 0x65, 0xf2, + 0x26, 0xee, 0x69, 0x23, 0xdf, 0xb2, 0x3b, 0x5e, 0x3e, 0x49, 0x7b, 0x58, 0xd3, 0xe8, 0x42, 0xba, + 0x6e, 0x9f, 0x38, 0x26, 0xfa, 0xba, 0x8f, 0x3c, 0x1f, 0xb3, 0x6d, 0x5b, 0xbe, 0x45, 0xd8, 0x66, + 0x4c, 0xf2, 0xad, 0xad, 0xc2, 0xac, 0x67, 0x9f, 0x38, 0xc8, 0xcd, 0xcf, 0x10, 0x5a, 0xd6, 0xc2, + 0x4c, 0x2d, 0xf7, 0xbc, 0xeb, 0xa2, 0x76, 0x1e, 0x0a, 0xca, 0xc6, 0xbc, 0xc9, 0x9b, 0x9a, 0x0e, + 0xf3, 0x98, 0x7f, 0xeb, 0x14, 0xb5, 0xf3, 0x69, 0xd2, 0x15, 0xb4, 0x8d, 0x5f, 0x42, 0x86, 0x0e, + 0xe8, 0xf5, 0xba, 0x8e, 0x87, 0x62, 0x47, 0xbc, 0x09, 0xc9, 0x33, 0xbb, 0x4d, 0x27, 0xb1, 0x3d, + 0xf7, 0xfc, 0xfb, 0xf5, 0xe4, 0xfe, 0x5e, 0xd9, 0xc4, 0x30, 0xe3, 0x4f, 0x60, 0x01, 0x93, 0xef, + 0xd8, 0x1d, 0xb4, 0xe7, 0xf4, 0xfa, 0xbe, 0xb6, 0x08, 0x09, 0xdb, 0x21, 0xd4, 0x29, 0x33, 0x61, + 0x3b, 0x9a, 0x0a, 0xc9, 0x6e, 0xdf, 0x67, 0x0a, 0xc0, 0x9f, 0xaf, 0x58, 0xfe, 0x27, 0xb0, 0xc8, + 0x05, 0xa8, 0xf5, 0x7d, 0x2c, 0x01, 0x93, 0x56, 0x19, 0x95, 0x56, 0xcb, 0xc1, 0xcc, 0x57, 0x97, + 0x3e, 0xf2, 0x88, 0x38, 0x33, 0x26, 0x6d, 0x60, 0xa8, 0xdf, 0xf5, 0xad, 0x0e, 0x59, 0x8b, 0x19, + 0x93, 0x36, 0x8c, 0xa7, 0xb0, 0xf0, 0x05, 0x72, 0xed, 0xe3, 0xcb, 0x49, 0x6b, 0xf1, 0x72, 0x32, + 0x7f, 0x0e, 0x8b, 0x9c, 0xf5, 0x04, 0xad, 0xbf, 0x19, 0xe8, 0x09, 0x4b, 0x9b, 0xde, 0xca, 0xbc, + 0xc7, 0xcc, 0xf1, 0xbd, 0x7d, 0x74, 0xc9, 0xb5, 0x66, 0x3c, 0x81, 0x15, 0xca, 0xab, 0xcc, 0xb8, + 0x4f, 0x12, 0x57, 0x85, 0xa4, 0x67, 0x9f, 0x10, 0x7e, 0x19, 0x13, 0x7f, 0x8e, 0x9f, 0x80, 0xf1, + 0x10, 0x56, 0xa3, 0x8c, 0x99, 0xb0, 0xa1, 0x60, 0xca, 0x04, 0xc1, 0x5e, 0x87, 0x34, 0xa5, 0xa7, + 0x76, 0x11, 0x23, 0x8e, 0xf1, 0x08, 0x32, 0x14, 0x85, 0xad, 0xdc, 0xcb, 0x6b, 0xe1, 0x31, 0x64, + 0x29, 0xa7, 0x17, 0x31, 0xc4, 0xf1, 0x73, 0xff, 0x1c, 0xd4, 0x90, 0x1d, 0x13, 0xee, 0x5a, 0xb3, + 0x1e, 0x1d, 0xc5, 0x68, 0xc2, 0x0d, 0x59, 0x8f, 0x13, 0x45, 0xbc, 0xf6, 0xf2, 0x34, 0x61, 0x59, + 0x66, 0x3b, 0x56, 0xcd, 0x2f, 0xc4, 0xf6, 0x9f, 0x15, 0x48, 0xd5, 0x7d, 0xcb, 0x47, 0xe7, 0xc8, + 0xf1, 0x39, 0xa5, 0x12, 0x52, 0x72, 0xfe, 0x89, 0x51, 0xf7, 0x90, 0x8c, 0xd9, 0x70, 0x98, 0x01, + 0xfa, 0x3a, 0x3f, 0x4d, 0x36, 0x16, 0xfe, 0xc4, 0x0c, 0x7a, 0x2e, 0xba, 0x20, 0x7b, 0x3f, 0x63, + 0x92, 0x6f, 0xec, 0x11, 0x5c, 0x74, 0xd1, 0x3d, 0x43, 0xf9, 0x59, 0x82, 0xc8, 0x5a, 0xda, 0x2d, + 0x48, 0xf9, 0xf6, 0x39, 0xf2, 0x7c, 0xeb, 0xbc, 0x97, 0x9f, 0x2b, 0x28, 0x1b, 0x49, 0x33, 0x04, + 0x60, 0x4e, 0xfe, 0x65, 0x0f, 0xe5, 0xe7, 0x89, 0xfe, 0xc8, 0xb7, 0xf1, 0x2e, 0x64, 0xeb, 0xf6, + 0x49, 0xeb, 0xd4, 0xb2, 0x03, 0x17, 0x3a, 0xde, 0x1d, 0x18, 0xc7, 0xa0, 0x86, 0xd8, 0xcc, 0xb8, + 0xd7, 0x20, 0x79, 0x86, 0x2e, 0x63, 0xd7, 0x18, 0x77, 0x68, 0x5b, 0x00, 0x1e, 0xd7, 0x0f, 0xf6, + 0x23, 0xc9, 0x8d, 0xf4, 0x96, 0x16, 0xa0, 0x05, 0xaa, 0x33, 0x05, 0x2c, 0xe3, 0x57, 0xa0, 0x86, + 0x1d, 0x57, 0x8a, 0xc5, 0x95, 0x96, 0x08, 0x94, 0x66, 0x54, 0x60, 0x49, 0x60, 0xc0, 0x24, 0xbd, + 0x0b, 0xa9, 0x60, 0x0c, 0x26, 0x6f, 0x9c, 0x20, 0x21, 0x92, 0xf1, 0xc7, 0xb0, 0x1a, 0xc0, 0x4b, + 0x2e, 0xb2, 0x7c, 0x34, 0xc9, 0x59, 0x8c, 0xf7, 0xfa, 0xd8, 0x63, 0x76, 0xba, 0x2d, 0xab, 0x43, + 0x56, 0x71, 0xde, 0xa4, 0x0d, 0x63, 0x1f, 0x6e, 0x8c, 0xb0, 0x7f, 0x69, 0x59, 0x7f, 0x2d, 0xc8, + 0x6a, 0x12, 0x73, 0xe0, 0xb2, 0x32, 0xf5, 0x28, 0xa1, 0x4d, 0xfd, 0x28, 0x49, 0x39, 0xf3, 0x97, + 0x96, 0xf4, 0x77, 0x78, 0xcb, 0xd8, 0x27, 0xce, 0xf8, 0x0d, 0x48, 0xf7, 0x79, 0x22, 0xea, 0x8a, + 0x92, 0x3f, 0xd5, 0x99, 0xf8, 0x29, 0x00, 0x16, 0x68, 0x82, 0x57, 0x9d, 0x70, 0xa2, 0xff, 0x95, + 0x02, 0x8b, 0x15, 0xa7, 0xe5, 0x5e, 0xf6, 0xfc, 0x97, 0x3b, 0xf9, 0xd6, 0x00, 0x5c, 0xd4, 0xb2, + 0x7b, 0x36, 0xd9, 0x21, 0xe9, 0x42, 0x72, 0x23, 0x65, 0x0a, 0x10, 0x32, 0x57, 0xe4, 0xb4, 0x91, + 0x9b, 0xcf, 0xb0, 0xb9, 0x92, 0x96, 0xb6, 0x01, 0xd3, 0xe7, 0x38, 0x84, 0x5a, 0x28, 0x28, 0x1b, + 0x8b, 0x5b, 0xb9, 0x40, 0xe9, 0x4c, 0x98, 0xc7, 0xdd, 0x36, 0x32, 0x09, 0x86, 0xf1, 0x16, 0x64, + 0x03, 0x09, 0xc7, 0x1f, 0xa0, 0xc6, 0x3f, 0x28, 0xa0, 0x32, 0xbc, 0x57, 0x72, 0x2c, 0xfc, 0x3f, + 0xcc, 0xec, 0x57, 0xb0, 0x24, 0x48, 0xcc, 0x16, 0x30, 0x88, 0x5a, 0x94, 0xd8, 0xa8, 0x25, 0x21, + 0x46, 0x2d, 0x7f, 0xa9, 0x40, 0x86, 0x71, 0x18, 0x6f, 0x8f, 0xc2, 0x0c, 0x13, 0x93, 0x66, 0x98, + 0x9c, 0x30, 0xc3, 0xe9, 0xd8, 0x19, 0xce, 0x5c, 0x39, 0xc3, 0x37, 0x60, 0x81, 0x01, 0xc7, 0x9b, + 0xa7, 0x71, 0x0a, 0x8b, 0x65, 0xf4, 0x23, 0x4c, 0xf0, 0xfa, 0x0a, 0xdf, 0x87, 0x6c, 0x30, 0xd2, + 0x15, 0xb1, 0x18, 0x9d, 0x77, 0x7c, 0x14, 0x42, 0xfa, 0x8c, 0x67, 0xa0, 0x32, 0x66, 0xaf, 0xc6, + 0xde, 0xae, 0x3f, 0x8d, 0x6f, 0x60, 0x49, 0x18, 0x59, 0x88, 0x58, 0xa8, 0xd0, 0xca, 0x78, 0xa1, + 0x63, 0x04, 0x0a, 0xec, 0x2d, 0x19, 0x6b, 0x6f, 0xd3, 0xa2, 0xbd, 0x19, 0x90, 0x61, 0x03, 0x8f, + 0x0f, 0xf3, 0xf6, 0x60, 0x81, 0xe1, 0x5c, 0x11, 0xe7, 0x5d, 0xad, 0xe1, 0x55, 0xc8, 0x99, 0x7d, + 0x07, 0xc7, 0x00, 0xd8, 0x15, 0xf7, 0x3d, 0x66, 0x1e, 0xc6, 0xdf, 0x29, 0xb0, 0x12, 0xe9, 0x60, + 0xab, 0x99, 0x87, 0xb9, 0x0b, 0xe4, 0x7a, 0x76, 0x97, 0x2f, 0x02, 0x6f, 0x12, 0xbd, 0xf7, 0x7a, + 0x55, 0xeb, 0x3c, 0xb8, 0x9e, 0xb1, 0x26, 0x56, 0x09, 0x7a, 0x86, 0x98, 0x89, 0xe3, 0x4f, 0x6d, + 0x03, 0xb2, 0x56, 0xdf, 0x3f, 0xad, 0x23, 0xbf, 0xdf, 0xab, 0x22, 0xd4, 0x46, 0x6d, 0x76, 0xa0, + 0x44, 0xc1, 0xda, 0x3a, 0xcc, 0x1c, 0xdb, 0xed, 0xee, 0x16, 0x09, 0x65, 0xe6, 0xb7, 0x53, 0xcf, + 0xbf, 0x5f, 0x9f, 0xd9, 0xd9, 0x2b, 0xd7, 0xb6, 0x4c, 0x0a, 0x37, 0x76, 0x40, 0x2d, 0x72, 0x1a, + 0x6e, 0xdd, 0x3a, 0xcc, 0xf7, 0x2c, 0xcf, 0xfb, 0xa6, 0xeb, 0xb2, 0x88, 0xc0, 0x0c, 0xda, 0x78, + 0xcb, 0xb5, 0x3a, 0x78, 0xf7, 0x11, 0x8e, 0x29, 0x93, 0xb5, 0x8c, 0x7b, 0xb0, 0x24, 0xf0, 0x61, + 0xb3, 0xbd, 0x05, 0x29, 0x2c, 0x50, 0xa3, 0x7b, 0x86, 0xf8, 0x7c, 0x43, 0x80, 0xb1, 0x4b, 0x49, + 0x9a, 0x4e, 0xa7, 0xdb, 0x3a, 0x7b, 0xb1, 0xb1, 0x13, 0xd2, 0xd8, 0x5b, 0xa0, 0x89, 0x8c, 0xae, + 0x35, 0xf8, 0x12, 0x64, 0x31, 0xcd, 0x41, 0x38, 0xb4, 0xa1, 0x51, 0x55, 0x1c, 0x08, 0x4c, 0x8c, + 0x4f, 0x40, 0xdb, 0x47, 0x97, 0xbb, 0xc8, 0x41, 0xae, 0x10, 0x9f, 0xbc, 0xc9, 0x62, 0x3d, 0x85, + 0xec, 0x04, 0x55, 0xb4, 0x8d, 0xc6, 0x65, 0x0f, 0xb1, 0xe8, 0xef, 0x2e, 0x2c, 0x4b, 0xb4, 0x4c, + 0xae, 0x09, 0x11, 0xe0, 0x1e, 0x68, 0x4d, 0x0f, 0xb9, 0x75, 0xca, 0xee, 0x1a, 0xb1, 0x59, 0x1e, + 0xf8, 0xa3, 0x00, 0x37, 0x1a, 0xd6, 0x34, 0xde, 0x87, 0x65, 0x89, 0x55, 0x68, 0x7f, 0x9c, 0x40, + 0x91, 0x09, 0xfe, 0x08, 0xb2, 0x84, 0x40, 0xb8, 0xee, 0xbf, 0xcc, 0xc0, 0x78, 0x37, 0x39, 0xd8, + 0x88, 0x69, 0x38, 0x41, 0xbe, 0x8d, 0xcf, 0x40, 0x0d, 0x79, 0x87, 0x92, 0xf0, 0xe7, 0x08, 0x45, + 0x7e, 0x8e, 0xe0, 0x1c, 0x12, 0x02, 0x87, 0x81, 0x02, 0x8b, 0x98, 0x45, 0xb1, 0xdd, 0x7e, 0xd5, + 0xd2, 0x61, 0x46, 0x7d, 0x97, 0x3a, 0x12, 0xc6, 0xa8, 0x69, 0x1e, 0x98, 0x18, 0x36, 0x26, 0x5e, + 0x3b, 0xa6, 0xaa, 0x22, 0xb2, 0xb0, 0xd9, 0xbc, 0x0e, 0xd3, 0x7d, 0x2f, 0x70, 0x6d, 0x0b, 0x81, + 0x45, 0x60, 0x3c, 0x93, 0x74, 0xc9, 0xa1, 0x5c, 0xe2, 0x3a, 0xa1, 0x9c, 0x0b, 0xea, 0x3e, 0xba, + 0xac, 0x3c, 0xeb, 0x75, 0xdd, 0xeb, 0x04, 0xea, 0xe2, 0xd6, 0x49, 0x44, 0xb6, 0xce, 0x6d, 0x66, + 0xb1, 0x49, 0x62, 0xb1, 0xcb, 0xa1, 0xef, 0x26, 0xcc, 0x05, 0xa3, 0x7d, 0x07, 0x96, 0x84, 0x31, + 0xd9, 0xec, 0x56, 0x61, 0x16, 0x11, 0x08, 0xf3, 0x91, 0xac, 0x65, 0x3c, 0x24, 0x02, 0xee, 0x9d, + 0x8b, 0x02, 0x86, 0x27, 0x4c, 0x86, 0x9c, 0x30, 0x13, 0xa4, 0x32, 0xde, 0x23, 0x83, 0x71, 0xfa, + 0xab, 0xf7, 0xc7, 0x1d, 0x32, 0x9e, 0x89, 0xce, 0xbb, 0x17, 0xd7, 0xd8, 0x1d, 0xc6, 0x32, 0x61, + 0xcf, 0xd1, 0xd9, 0x8e, 0xfe, 0x37, 0x05, 0x92, 0xfb, 0xe8, 0x52, 0x5b, 0x85, 0x44, 0x40, 0x36, + 0xfb, 0xfc, 0xfb, 0xf5, 0xc4, 0x5e, 0xd9, 0x4c, 0xd8, 0xed, 0x60, 0x6f, 0x27, 0x27, 0xed, 0xed, + 0x60, 0xbd, 0x67, 0xc7, 0xaf, 0x77, 0x0e, 0x66, 0x3c, 0xeb, 0x22, 0x38, 0x46, 0x69, 0x43, 0xfb, + 0x39, 0x2c, 0x7a, 0xec, 0x92, 0x77, 0x80, 0x9c, 0x13, 0xff, 0x34, 0xbf, 0x41, 0x0e, 0xb0, 0x08, + 0x54, 0x7b, 0x17, 0x96, 0x38, 0xa4, 0xd9, 0x6b, 0x5b, 0x3e, 0x6a, 0x17, 0xfd, 0xfc, 0xdb, 0xe4, + 0xd2, 0x39, 0xda, 0x61, 0x7c, 0x06, 0x40, 0x66, 0x1a, 0xf8, 0x50, 0xbb, 0x8d, 0x1c, 0xdf, 0xf6, + 0x2f, 0xb9, 0x0f, 0xe5, 0x6d, 0xbc, 0x94, 0x7d, 0x42, 0xc6, 0x4c, 0x9a, 0xb5, 0x8c, 0x3b, 0x90, + 0x26, 0x1c, 0xae, 0x77, 0xef, 0x34, 0xfe, 0x56, 0x21, 0xf8, 0xfc, 0xc4, 0xc3, 0x93, 0xfd, 0xba, + 0x8f, 0x5c, 0x3e, 0x1e, 0x6d, 0x68, 0x3f, 0x87, 0x19, 0xac, 0x2d, 0x7a, 0x31, 0x8d, 0x53, 0x26, + 0xed, 0xc6, 0xae, 0xda, 0xeb, 0xba, 0xfe, 0x8e, 0x8d, 0x3a, 0x54, 0x5d, 0x29, 0x33, 0x04, 0x68, + 0xbf, 0x80, 0x05, 0xdc, 0x28, 0xdb, 0x2e, 0x6a, 0xf9, 0xf8, 0xe4, 0x4c, 0x93, 0xa5, 0x59, 0x0d, + 0x37, 0x8f, 0xd8, 0x6b, 0xca, 0xc8, 0xc6, 0x9f, 0x2a, 0x90, 0xa1, 0x92, 0xb2, 0xa9, 0x15, 0x60, + 0xfa, 0x0c, 0x5d, 0xe2, 0xf0, 0x35, 0x39, 0x32, 0x37, 0xd2, 0xf3, 0x93, 0x8a, 0xf3, 0x6d, 0x02, + 0x66, 0xeb, 0xa8, 0xe5, 0x22, 0x7f, 0xac, 0x05, 0xc6, 0xf8, 0xbf, 0xb1, 0xfb, 0x97, 0xb2, 0x12, + 0x0c, 0x53, 0x87, 0x79, 0x6c, 0x7d, 0x84, 0x01, 0x15, 0x3d, 0x68, 0x4b, 0x5b, 0x31, 0x1d, 0x71, + 0x10, 0xcc, 0x09, 0xe6, 0xe2, 0x9d, 0xa0, 0xd3, 0xc5, 0x01, 0xd8, 0x1a, 0x5d, 0x5b, 0xd2, 0xc0, + 0x4a, 0x6a, 0x91, 0x5b, 0x35, 0x36, 0xcc, 0x36, 0x7d, 0x0d, 0x09, 0x00, 0xb8, 0xb7, 0x1f, 0x98, + 0x2d, 0xa2, 0xbd, 0x01, 0xc0, 0xb8, 0x0d, 0x0b, 0x54, 0x70, 0x6e, 0x3e, 0x63, 0x54, 0x61, 0x3c, + 0x80, 0x45, 0x8e, 0xc8, 0x56, 0xef, 0x36, 0x0e, 0xcc, 0x30, 0x84, 0xd9, 0x66, 0x36, 0xa2, 0x0a, + 0x93, 0x75, 0x1b, 0xbf, 0x80, 0x25, 0x0a, 0xa9, 0x5b, 0xa1, 0xb3, 0xb8, 0x36, 0xf5, 0x2f, 0x41, + 0x13, 0xa9, 0x5f, 0x74, 0xf0, 0x3b, 0xb0, 0xcc, 0xe5, 0x16, 0x7d, 0xd5, 0xb8, 0x69, 0xae, 0x42, + 0x4e, 0x46, 0x67, 0xbe, 0xea, 0x5b, 0x85, 0xcf, 0xff, 0x8a, 0x8d, 0xf6, 0x53, 0x5a, 0xec, 0x5f, + 0x28, 0x90, 0x0d, 0x84, 0x60, 0x8a, 0x78, 0x1b, 0x1f, 0xb0, 0x04, 0xc4, 0xb6, 0xd1, 0x88, 0x26, + 0x78, 0xff, 0x4f, 0x2a, 0xda, 0x5b, 0x90, 0xde, 0xf3, 0xd1, 0xf9, 0x55, 0xea, 0xbd, 0x07, 0x19, + 0x8a, 0x16, 0x1e, 0xd6, 0xb6, 0x8f, 0xce, 0x47, 0x0e, 0x6b, 0x82, 0x44, 0xba, 0x8c, 0x37, 0x29, + 0xc9, 0x64, 0xb5, 0x1b, 0x1f, 0xc2, 0x02, 0xc3, 0x62, 0x9c, 0xdf, 0x80, 0x19, 0x4c, 0xce, 0xb5, + 0x12, 0x61, 0x4d, 0xfb, 0x8c, 0x2d, 0x98, 0xc6, 0xcd, 0x49, 0xfb, 0x9f, 0xec, 0xf5, 0x84, 0xf0, + 0x92, 0xf8, 0x25, 0xa4, 0x4d, 0xcb, 0x69, 0x0b, 0x1e, 0xde, 0xe9, 0x9f, 0x6f, 0x0b, 0xd7, 0xf0, + 0xa0, 0xad, 0xdd, 0x81, 0x79, 0xe4, 0xb4, 0xba, 0x6d, 0xdb, 0xa1, 0x8f, 0xac, 0x8b, 0x5b, 0x4b, + 0xe2, 0x55, 0x8d, 0x74, 0x98, 0x01, 0x0a, 0xbe, 0x32, 0x51, 0xce, 0x31, 0xf7, 0xcd, 0x14, 0xbb, + 0x32, 0xdd, 0x81, 0x65, 0x8c, 0x73, 0xc8, 0x9c, 0x45, 0xa8, 0xef, 0xd9, 0x0e, 0x3d, 0xc3, 0xa8, + 0x0c, 0xac, 0x65, 0x6c, 0x41, 0x4e, 0x46, 0x67, 0xac, 0x27, 0xc4, 0xf6, 0xc6, 0xdb, 0x90, 0x3e, + 0xec, 0x77, 0x3a, 0xd7, 0x38, 0xc2, 0x8c, 0x77, 0x21, 0x43, 0x51, 0x83, 0x40, 0x7f, 0xfa, 0xcc, + 0x6e, 0x53, 0x9d, 0xa7, 0xb6, 0xe7, 0x9f, 0x7f, 0xbf, 0x3e, 0xbd, 0xbf, 0x57, 0xf6, 0x4c, 0x02, + 0x35, 0xf6, 0x31, 0x63, 0xef, 0xf4, 0x3a, 0x67, 0x63, 0x01, 0xd2, 0x2e, 0x3a, 0xef, 0xfa, 0xa8, + 0x74, 0x8a, 0x5a, 0x67, 0xec, 0x31, 0x42, 0x04, 0x19, 0xbb, 0x78, 0x68, 0xcc, 0xec, 0xca, 0x58, + 0x05, 0x4b, 0xd5, 0x77, 0x3b, 0xf4, 0xe8, 0x63, 0x52, 0x35, 0xcd, 0x03, 0xcf, 0x24, 0x50, 0xa3, + 0x00, 0x50, 0xea, 0x76, 0x3a, 0xd4, 0x8e, 0xc9, 0x2b, 0xb4, 0xc5, 0xd4, 0x98, 0x32, 0xc9, 0xb7, + 0xb1, 0x01, 0x5a, 0x88, 0xe1, 0x09, 0x0f, 0x0f, 0x23, 0x98, 0x07, 0xb0, 0x2c, 0x61, 0x32, 0xd9, + 0xee, 0x43, 0xba, 0x15, 0x82, 0x99, 0x45, 0x86, 0x27, 0x47, 0x48, 0x62, 0x8a, 0x78, 0x46, 0x0f, + 0xe6, 0xcb, 0xdd, 0x56, 0x9f, 0x3c, 0xb8, 0xc7, 0x8c, 0x86, 0x77, 0xc2, 0x85, 0xd5, 0xe9, 0x73, + 0xf3, 0xa4, 0x0d, 0xf9, 0x34, 0x80, 0x89, 0xa7, 0x41, 0x3a, 0x7a, 0x1a, 0x3c, 0x04, 0x95, 0x8f, + 0x38, 0x69, 0x9e, 0xd8, 0xdc, 0x7a, 0x2e, 0x3a, 0xb6, 0x9f, 0xf1, 0xeb, 0x1f, 0x6d, 0x19, 0x65, + 0x58, 0x12, 0xe8, 0xd9, 0xec, 0xdf, 0x87, 0x54, 0x9b, 0x03, 0xd9, 0xdc, 0xc3, 0x6d, 0xc0, 0xd1, + 0xcd, 0x10, 0xc7, 0x78, 0x07, 0x56, 0x38, 0xb8, 0x8c, 0x3a, 0x48, 0x7a, 0x8c, 0x1e, 0x51, 0x79, + 0x1e, 0x56, 0xa3, 0xc8, 0xcc, 0x65, 0xff, 0x59, 0x02, 0xa6, 0x71, 0x10, 0xf8, 0x42, 0xa7, 0xfb, + 0x0b, 0xa5, 0x2c, 0x84, 0xcb, 0xcd, 0x8c, 0x7c, 0xb9, 0x61, 0x67, 0xf8, 0x6c, 0xcc, 0x19, 0xfe, + 0x0e, 0xcc, 0x7a, 0xe4, 0x25, 0x82, 0x2c, 0x8e, 0x18, 0x41, 0x90, 0x8b, 0x19, 0x7d, 0xa4, 0x60, + 0x28, 0xda, 0x1a, 0xc0, 0x05, 0x72, 0xed, 0x63, 0x5b, 0x58, 0x2f, 0x01, 0x22, 0x27, 0x42, 0x32, + 0xd1, 0x44, 0x88, 0x0a, 0x49, 0xe4, 0xba, 0x34, 0x92, 0x30, 0xf1, 0xa7, 0xf1, 0x10, 0xd2, 0x24, + 0x2e, 0xbe, 0xfa, 0x0a, 0x13, 0xdc, 0xb7, 0xa6, 0xc5, 0xfb, 0xd6, 0x3d, 0xc8, 0x50, 0xfa, 0x6b, + 0x5f, 0xb6, 0x8c, 0x26, 0x2c, 0xd1, 0xeb, 0xaf, 0xe5, 0xb6, 0x4e, 0x27, 0x9f, 0x9d, 0x78, 0x4c, + 0xfb, 0xdc, 0xf6, 0xf9, 0xfb, 0x12, 0x69, 0x8c, 0x91, 0xe4, 0x01, 0xbf, 0xa0, 0x53, 0xb6, 0xa1, + 0xd7, 0xc7, 0x83, 0x8e, 0x7a, 0x7d, 0x22, 0x10, 0xed, 0x33, 0xde, 0xc2, 0x31, 0xcf, 0x95, 0xd2, + 0x18, 0x5b, 0xf8, 0xc4, 0x97, 0xb8, 0x5f, 0x19, 0xaf, 0x1a, 0x8b, 0x90, 0x79, 0x62, 0xf9, 0x01, + 0x67, 0xa3, 0x0a, 0x40, 0xda, 0x95, 0x0b, 0xbc, 0x89, 0xdf, 0x0d, 0x96, 0x5e, 0x89, 0x3c, 0xdc, + 0x11, 0xa4, 0xc8, 0xda, 0x73, 0x6b, 0x4f, 0x08, 0xd6, 0x9e, 0x85, 0x85, 0x52, 0xd7, 0x39, 0xb6, + 0x4f, 0xf8, 0x00, 0xbf, 0x55, 0x60, 0x91, 0x43, 0x98, 0x94, 0x9f, 0xc2, 0x6c, 0x8b, 0x40, 0x98, + 0x9c, 0x6f, 0x08, 0x8e, 0x46, 0x44, 0x64, 0xcd, 0x8a, 0xe3, 0xbb, 0x97, 0x26, 0x23, 0xd1, 0x1f, + 0x40, 0x5a, 0x00, 0x63, 0x0b, 0xe2, 0x97, 0x8f, 0x14, 0x4d, 0x73, 0xc5, 0x3a, 0x9d, 0x4f, 0x12, + 0x1f, 0x2b, 0xc6, 0x27, 0xa0, 0x52, 0xd2, 0x7a, 0x18, 0x4d, 0x5e, 0x93, 0x1e, 0xdf, 0x0f, 0x05, + 0x5a, 0xb6, 0x81, 0xff, 0x51, 0x81, 0x85, 0x27, 0x5d, 0xf7, 0xfc, 0xb4, 0xcb, 0xdf, 0x4c, 0x57, + 0xa5, 0x87, 0xcb, 0xf0, 0x95, 0xf9, 0x16, 0xa4, 0x82, 0xb7, 0x68, 0xc6, 0x38, 0x04, 0x60, 0x2a, + 0xdb, 0xb9, 0xb0, 0x7d, 0xfe, 0xd6, 0xc0, 0x5a, 0xcc, 0x2f, 0x40, 0x9c, 0x5f, 0x20, 0xe7, 0x6e, + 0x5a, 0x78, 0x85, 0xdc, 0x60, 0x91, 0x40, 0x26, 0xb2, 0x70, 0xa5, 0xae, 0xe3, 0x23, 0x47, 0xbc, + 0xb6, 0x9f, 0xc3, 0x22, 0x17, 0x9a, 0xbd, 0x6a, 0x6e, 0xca, 0xef, 0x2b, 0x69, 0xe1, 0xf6, 0xf5, + 0x98, 0xc2, 0xc3, 0x17, 0x97, 0xf7, 0x03, 0x13, 0xa1, 0x01, 0xc3, 0x8d, 0xd0, 0x44, 0x18, 0x53, + 0xd9, 0x4a, 0x8c, 0xbf, 0x4f, 0xc0, 0x1c, 0xe3, 0x32, 0xe1, 0x22, 0x7d, 0x8d, 0x27, 0x54, 0x6d, + 0x53, 0x54, 0x62, 0x32, 0x06, 0x51, 0x50, 0x29, 0x57, 0x47, 0xf4, 0x59, 0x9f, 0x49, 0x22, 0xdc, + 0x82, 0x36, 0x61, 0xae, 0x45, 0x75, 0x44, 0x34, 0x2d, 0x4e, 0x9e, 0xe9, 0xce, 0xe4, 0x08, 0xf2, + 0xd1, 0xb5, 0x12, 0x3d, 0xba, 0x0a, 0x90, 0xc6, 0xae, 0xad, 0x6c, 0x7b, 0xbd, 0x8e, 0x75, 0x99, + 0x5f, 0x27, 0x6b, 0x29, 0x82, 0x30, 0x06, 0x3e, 0xc9, 0x38, 0x46, 0x81, 0x62, 0x08, 0x20, 0x63, + 0x17, 0xe6, 0xd8, 0xa8, 0xb1, 0x6f, 0xcd, 0x1b, 0x42, 0xbc, 0x37, 0x79, 0x95, 0x2d, 0x58, 0x61, + 0x73, 0x3d, 0x74, 0x51, 0xcf, 0x72, 0x85, 0x8b, 0xc5, 0xcb, 0x98, 0x28, 0x0e, 0x34, 0xd1, 0x33, + 0x9f, 0xdd, 0x05, 0xc9, 0xb7, 0x51, 0x86, 0xd5, 0xe8, 0x10, 0x6c, 0x87, 0xbf, 0x80, 0x41, 0x19, + 0xbf, 0x81, 0x1c, 0x83, 0xc9, 0x89, 0xdd, 0x57, 0x27, 0x67, 0x29, 0x50, 0x45, 0x24, 0xb7, 0xfb, + 0x22, 0x62, 0xee, 0x42, 0x96, 0xc1, 0xbc, 0x1f, 0x25, 0xa1, 0xf1, 0x19, 0xa8, 0x21, 0x23, 0x26, + 0xc8, 0xbb, 0x30, 0xcf, 0xc6, 0xe1, 0xbe, 0x7b, 0x54, 0x92, 0x00, 0xc3, 0xf8, 0x0d, 0x2c, 0x17, + 0xdb, 0xe7, 0xb6, 0x53, 0xb7, 0x4f, 0x1c, 0x7c, 0x6a, 0x0b, 0xe2, 0x84, 0x65, 0x1e, 0x61, 0x26, + 0x76, 0x15, 0x66, 0xcf, 0x91, 0x7f, 0xda, 0xe5, 0x6f, 0x6a, 0xac, 0xc5, 0x43, 0x80, 0xe4, 0x68, + 0x08, 0x60, 0xb4, 0x20, 0x27, 0x8f, 0x10, 0x06, 0xfc, 0x56, 0x3f, 0x8c, 0x6f, 0xf0, 0x37, 0x67, + 0x93, 0x88, 0x89, 0x24, 0x6e, 0xc1, 0x74, 0x2b, 0x1c, 0x82, 0xc4, 0xb5, 0x25, 0xdc, 0x49, 0xa0, + 0x9b, 0x7f, 0xae, 0x40, 0x5a, 0xc8, 0x07, 0x69, 0x77, 0x21, 0x57, 0xae, 0xec, 0x14, 0x9b, 0x07, + 0x8d, 0xa3, 0x4a, 0xb5, 0x64, 0x3e, 0x3d, 0x6c, 0x1c, 0x3d, 0xae, 0x95, 0x2b, 0xea, 0x94, 0xbe, + 0x3a, 0x18, 0x16, 0xb4, 0x32, 0x3a, 0xb6, 0xfa, 0x1d, 0x5f, 0xa4, 0x78, 0x0d, 0x80, 0x63, 0x7e, + 0xb1, 0xa5, 0x2a, 0xfa, 0xc2, 0x60, 0x58, 0x48, 0x31, 0x84, 0x2f, 0xb6, 0xb4, 0xd7, 0x21, 0x53, + 0xdf, 0xdb, 0xe5, 0x08, 0xf7, 0xd4, 0x84, 0x9e, 0x1d, 0x0c, 0x0b, 0xa4, 0x4a, 0x8d, 0xa2, 0xdc, + 0xd3, 0x97, 0x7f, 0xfb, 0xd7, 0x6b, 0x53, 0xff, 0xf4, 0x37, 0x6b, 0xa2, 0x20, 0x9b, 0xdf, 0x2a, + 0x00, 0xe1, 0x63, 0xa7, 0xf6, 0x1e, 0x2c, 0x07, 0x72, 0x7d, 0x79, 0x58, 0x33, 0x1b, 0x47, 0x8d, + 0xa7, 0x87, 0x58, 0xac, 0x95, 0xc1, 0xb0, 0xb0, 0xc4, 0xc5, 0x0a, 0xf1, 0xef, 0x42, 0xae, 0x5e, + 0x3c, 0x68, 0x1c, 0x16, 0x4b, 0xfb, 0x12, 0x81, 0x42, 0xe7, 0x51, 0xb7, 0x3a, 0x7e, 0xcf, 0x6a, + 0x9d, 0x85, 0x14, 0xba, 0xc6, 0xa4, 0x10, 0x46, 0xdd, 0xfc, 0x17, 0x05, 0xe6, 0xd8, 0xd3, 0x97, + 0xb6, 0x01, 0x6a, 0xb3, 0xba, 0x5f, 0xad, 0x3d, 0xa9, 0x1e, 0xed, 0x57, 0x9e, 0xf2, 0xe1, 0xb5, + 0xc1, 0xb0, 0xb0, 0xd8, 0x74, 0xce, 0x9c, 0xee, 0x37, 0x0e, 0xc7, 0xd4, 0x61, 0xbe, 0x52, 0xfe, + 0x72, 0xeb, 0xfe, 0xfd, 0x7b, 0x0f, 0x54, 0xd0, 0x33, 0x83, 0x61, 0x61, 0xbe, 0xd2, 0xa6, 0x6d, + 0xed, 0x36, 0x64, 0x79, 0xdf, 0xd1, 0x61, 0x73, 0xfb, 0x60, 0xaf, 0xa4, 0xa6, 0x29, 0x13, 0x8e, + 0x72, 0xd8, 0xff, 0xaa, 0x63, 0xb7, 0xb0, 0xc1, 0x30, 0x16, 0x39, 0x1d, 0x06, 0xc3, 0x02, 0x6b, + 0x69, 0x6f, 0xc0, 0x82, 0x4c, 0xbe, 0xa2, 0xab, 0x83, 0x61, 0x21, 0x23, 0x12, 0xeb, 0x59, 0x36, + 0x17, 0x2e, 0xfc, 0x66, 0x03, 0x16, 0xa4, 0x8b, 0xb9, 0x96, 0x83, 0x64, 0xb1, 0x5e, 0x52, 0xa7, + 0xf4, 0xf4, 0x60, 0x58, 0x98, 0xc3, 0x7d, 0x45, 0x0f, 0x0f, 0x3a, 0x5d, 0xae, 0xd4, 0x4b, 0xaa, + 0x42, 0xa5, 0x26, 0x24, 0xc8, 0x6b, 0xe9, 0x2b, 0x8c, 0x9f, 0xcc, 0x64, 0xf3, 0x7b, 0x05, 0x20, + 0x7c, 0xd0, 0xd2, 0x36, 0x61, 0x99, 0x6b, 0xa8, 0x5e, 0x29, 0x99, 0x95, 0x60, 0x8d, 0x96, 0x06, + 0xc3, 0xc2, 0x02, 0x53, 0x12, 0x7b, 0x4b, 0xbb, 0x0d, 0xd9, 0xc3, 0x62, 0xbd, 0xfe, 0xa4, 0x66, + 0x96, 0x19, 0xb2, 0x0a, 0x54, 0x0f, 0xfc, 0x16, 0xca, 0x10, 0xdf, 0x82, 0xc5, 0x52, 0xad, 0xda, + 0x28, 0x96, 0x1a, 0x1c, 0x2f, 0x4d, 0xf9, 0x61, 0x6f, 0x6b, 0xb5, 0x7c, 0x86, 0xb6, 0x0e, 0xe9, + 0x52, 0x31, 0xe4, 0x95, 0xd1, 0x17, 0x07, 0xc3, 0x02, 0x94, 0xac, 0x80, 0xcf, 0x3a, 0xa4, 0xab, + 0xb5, 0x46, 0x85, 0x23, 0x2c, 0x50, 0x84, 0x6a, 0xd7, 0x47, 0x14, 0x21, 0x5c, 0xff, 0x70, 0x46, + 0x9b, 0xbf, 0x57, 0x60, 0x9e, 0x5f, 0xc1, 0x71, 0x94, 0xf2, 0xa8, 0xf2, 0xa5, 0x3a, 0xa5, 0xcf, + 0x0d, 0x86, 0x85, 0xe4, 0x23, 0xf4, 0x0c, 0xaf, 0xd1, 0x76, 0xb1, 0x5e, 0xf9, 0x08, 0x9b, 0x3d, + 0x59, 0xa3, 0x6d, 0xcb, 0x43, 0x1f, 0x6d, 0x71, 0xf8, 0xfd, 0x8f, 0xd5, 0x44, 0x08, 0xbf, 0xff, + 0x31, 0x87, 0x7f, 0xb0, 0xa5, 0x26, 0x43, 0xf8, 0x07, 0x01, 0xfe, 0xbd, 0x8f, 0xd4, 0xe9, 0x10, + 0x7e, 0xef, 0xa3, 0x80, 0xff, 0x87, 0xea, 0x8c, 0xc0, 0xff, 0x43, 0x6c, 0x60, 0xdc, 0xb8, 0xd5, + 0x59, 0xb6, 0x54, 0xcc, 0xa0, 0x71, 0xe4, 0xb4, 0xbd, 0x77, 0xf8, 0xc1, 0x03, 0x75, 0x4e, 0x4f, + 0x0d, 0x86, 0x05, 0xda, 0xd0, 0x55, 0x36, 0xb9, 0x60, 0x36, 0x9b, 0xff, 0x9d, 0x00, 0x08, 0xaf, + 0x12, 0xda, 0x6d, 0xc8, 0x34, 0xeb, 0x15, 0xf3, 0x88, 0x2d, 0x20, 0xdf, 0x58, 0x21, 0x06, 0x5b, + 0x3e, 0xed, 0x35, 0x98, 0x23, 0x88, 0xb5, 0x7d, 0x55, 0xa1, 0x96, 0x17, 0xe2, 0xd4, 0xf6, 0xb5, + 0x4f, 0xe1, 0x06, 0xe9, 0x36, 0x2b, 0xf5, 0x5a, 0xd3, 0x2c, 0x55, 0x8e, 0xaa, 0xb5, 0xc6, 0xd1, + 0x4e, 0xad, 0x59, 0x2d, 0xab, 0x39, 0x7d, 0x6d, 0x30, 0x2c, 0xe8, 0xc2, 0xfd, 0x05, 0x79, 0xdd, + 0xbe, 0xdb, 0x42, 0xd5, 0xae, 0xbf, 0xd3, 0xed, 0x3b, 0x6d, 0xed, 0x01, 0xac, 0x12, 0x62, 0xbc, + 0xe0, 0x95, 0x6a, 0x43, 0xa0, 0x5d, 0xd3, 0x5f, 0x1b, 0x0c, 0x0b, 0x37, 0x43, 0x5a, 0x76, 0xd6, + 0x06, 0xa4, 0x1f, 0x41, 0x4e, 0x22, 0xdd, 0xab, 0x7e, 0x51, 0x3c, 0xd8, 0x2b, 0xab, 0xeb, 0xfa, + 0xad, 0xc1, 0xb0, 0x90, 0x1f, 0x21, 0xdc, 0x73, 0x2e, 0xac, 0x8e, 0xdd, 0xd6, 0xee, 0xc2, 0x12, + 0xa7, 0xab, 0x1e, 0xed, 0x14, 0xf7, 0x0e, 0x9a, 0x66, 0x45, 0xdd, 0xd0, 0x6f, 0x0e, 0x86, 0x85, + 0x15, 0x89, 0xc8, 0xd9, 0xb1, 0xec, 0x4e, 0xdf, 0x45, 0x81, 0xa6, 0x38, 0xf2, 0x56, 0x54, 0x53, + 0x0c, 0x31, 0x34, 0xa8, 0xb0, 0x6b, 0xf3, 0x7f, 0x14, 0x48, 0x0b, 0x51, 0xbc, 0xb6, 0x01, 0x99, + 0x27, 0xc5, 0x46, 0xe9, 0xd1, 0x51, 0x93, 0xab, 0x9d, 0xb8, 0x27, 0x01, 0x85, 0xeb, 0xfd, 0x36, + 0xc7, 0xac, 0x35, 0x1b, 0xc5, 0xdd, 0x8a, 0x9a, 0xa1, 0xc3, 0x0a, 0x98, 0xb5, 0xbe, 0x8f, 0xc3, + 0xbb, 0x3b, 0x90, 0xa5, 0x88, 0xe5, 0xbd, 0xba, 0xd9, 0x3c, 0x6c, 0x54, 0xca, 0xea, 0x82, 0x9e, + 0x1f, 0x0c, 0x0b, 0x39, 0x01, 0xb7, 0x6c, 0x7b, 0x6e, 0xbf, 0xe7, 0xa3, 0xb6, 0xf6, 0x0e, 0x2c, + 0x52, 0xf4, 0x7a, 0xa3, 0x68, 0x36, 0xf6, 0xaa, 0xbb, 0xea, 0xa2, 0x7e, 0x63, 0x30, 0x2c, 0x2c, + 0x0b, 0xd8, 0x75, 0xdf, 0x72, 0x7d, 0xbc, 0x05, 0xde, 0x00, 0x60, 0xbc, 0x8b, 0x8d, 0xa2, 0xaa, + 0xea, 0xcb, 0x83, 0x61, 0x21, 0x2b, 0xb2, 0xb5, 0x7c, 0x2b, 0x74, 0xe7, 0x42, 0xc7, 0xe6, 0x7f, + 0x24, 0xc2, 0x80, 0x97, 0xcd, 0xfd, 0x6d, 0x50, 0x9f, 0xd4, 0xcc, 0xc7, 0x8f, 0x6a, 0x07, 0x95, + 0x23, 0xe6, 0xdb, 0xd5, 0x29, 0xc6, 0x92, 0x61, 0x32, 0xbf, 0xae, 0xbd, 0x03, 0x4b, 0x01, 0x6a, + 0x20, 0x27, 0xe8, 0xb9, 0xc1, 0xb0, 0xa0, 0x0a, 0x5c, 0xa9, 0x90, 0x22, 0x72, 0x6d, 0x67, 0xa7, + 0x62, 0x62, 0xe4, 0x9c, 0x8c, 0x5c, 0x3b, 0x3e, 0x46, 0x2e, 0x46, 0xbe, 0x03, 0x5a, 0x80, 0x5c, + 0xac, 0xd6, 0x9f, 0x50, 0xec, 0x15, 0xa6, 0x5c, 0x86, 0x5d, 0x74, 0xbc, 0x6f, 0x46, 0xd1, 0x1f, + 0x15, 0xab, 0xe5, 0xfa, 0xa3, 0xe2, 0x3e, 0xb6, 0x17, 0x09, 0xfd, 0x91, 0xe5, 0xb4, 0xbd, 0x53, + 0xeb, 0x0c, 0x49, 0xe8, 0xd8, 0xc2, 0x2a, 0x25, 0xbc, 0x1c, 0x6d, 0x19, 0x1d, 0x1b, 0x17, 0x6a, + 0xf9, 0xa4, 0x60, 0x23, 0x1b, 0xa2, 0x1f, 0xd4, 0xea, 0x95, 0xb2, 0xfa, 0x9d, 0x42, 0xbd, 0x62, + 0x80, 0xdc, 0xe9, 0x7a, 0xa8, 0xad, 0xaf, 0x32, 0x1d, 0x47, 0x74, 0xba, 0xd9, 0x21, 0x17, 0x33, + 0x1e, 0x85, 0x62, 0xe7, 0xb9, 0xbd, 0x57, 0x2d, 0x9a, 0x4f, 0xf9, 0xbe, 0xe0, 0xce, 0x78, 0xdb, + 0x76, 0x2c, 0xf7, 0x92, 0x07, 0xb9, 0xaf, 0x43, 0xa6, 0xd9, 0xd8, 0xf9, 0x38, 0x40, 0x52, 0xe8, + 0x19, 0x8d, 0x61, 0x0c, 0x25, 0x5c, 0x54, 0x81, 0xfd, 0xe6, 0xef, 0x14, 0x48, 0x0b, 0xb1, 0x3c, + 0xe6, 0xf3, 0xb8, 0x52, 0xaf, 0x17, 0x77, 0xb1, 0x9b, 0x25, 0x83, 0x11, 0x3e, 0x0c, 0xa5, 0x8e, + 0x87, 0xba, 0x0d, 0x59, 0x8e, 0x72, 0x58, 0xa9, 0x96, 0xb1, 0xb2, 0xd9, 0x0c, 0x79, 0x14, 0x8b, + 0x1c, 0xe2, 0x6d, 0xd7, 0x21, 0xcd, 0x11, 0xb1, 0x9b, 0x4b, 0x50, 0x7f, 0xcd, 0x90, 0x8a, 0xad, + 0xb3, 0x50, 0x22, 0x41, 0x82, 0xad, 0xff, 0x2d, 0xc0, 0xf4, 0x3e, 0xba, 0xf4, 0xb4, 0xcf, 0x49, + 0xba, 0x8b, 0xe7, 0xf2, 0xb5, 0x9f, 0x89, 0x57, 0x94, 0x48, 0x75, 0x80, 0x7e, 0x2b, 0xbe, 0x93, + 0xdd, 0x2f, 0xa7, 0xb4, 0xfb, 0x8c, 0x67, 0x4e, 0xc4, 0xe3, 0x01, 0xa8, 0xbe, 0x12, 0x81, 0x06, + 0x64, 0x5b, 0x34, 0x6f, 0xb9, 0x2c, 0xdd, 0x8e, 0x18, 0x51, 0x4e, 0x06, 0x06, 0x34, 0x65, 0x48, + 0x05, 0x09, 0x56, 0xed, 0xa6, 0x88, 0x24, 0x25, 0x6d, 0x75, 0x3d, 0xae, 0x2b, 0xc2, 0x85, 0xc6, + 0x31, 0x32, 0x17, 0x29, 0x37, 0x2d, 0x73, 0x91, 0x53, 0xc8, 0x01, 0x17, 0x9a, 0xe1, 0x90, 0xb9, + 0x48, 0x49, 0x12, 0x99, 0x4b, 0x24, 0x21, 0x42, 0x94, 0x87, 0x63, 0x3d, 0x41, 0x79, 0x42, 0xc5, + 0x82, 0xa0, 0x3c, 0xb1, 0xd6, 0xc0, 0x98, 0xd2, 0x8a, 0x30, 0xcf, 0xeb, 0xf2, 0xb5, 0x55, 0x09, + 0x29, 0xa8, 0x8d, 0xd2, 0x6f, 0x8c, 0xc0, 0xe9, 0x55, 0xda, 0x98, 0xda, 0x50, 0xee, 0x2a, 0x1a, + 0x2b, 0x63, 0xac, 0xfb, 0x2e, 0xb2, 0xce, 0x35, 0x4d, 0x42, 0xa6, 0x0c, 0x96, 0x25, 0x58, 0x84, + 0x78, 0x96, 0xd6, 0x47, 0x0b, 0xa3, 0x4b, 0xf5, 0xfc, 0xc2, 0xe8, 0x72, 0x31, 0xbe, 0x31, 0xa5, + 0xed, 0x02, 0x84, 0xf5, 0xdf, 0x5a, 0x3e, 0x82, 0x18, 0x4e, 0xe0, 0x66, 0x4c, 0x8f, 0x24, 0x45, + 0x91, 0x57, 0xb8, 0xb3, 0x49, 0xe4, 0x22, 0x04, 0x94, 0xcd, 0x4a, 0x04, 0x2a, 0xb1, 0x78, 0xc4, + 0x0b, 0xbd, 0x8b, 0xb4, 0x2a, 0xec, 0xe5, 0x39, 0xd5, 0xf9, 0x6f, 0x07, 0xbc, 0x64, 0x5c, 0x5b, + 0x8b, 0xa0, 0x47, 0xfe, 0x21, 0xd0, 0xd7, 0xc7, 0xf6, 0x07, 0xaa, 0xfa, 0x35, 0x68, 0xa3, 0xe5, + 0xed, 0x5a, 0x61, 0x0c, 0x61, 0xa8, 0xba, 0xab, 0x59, 0x6f, 0x28, 0xda, 0x53, 0xc8, 0xc9, 0xbd, + 0x6c, 0xf2, 0xb7, 0xc6, 0x10, 0xbf, 0x00, 0xeb, 0x87, 0x30, 0xc7, 0x6e, 0x2b, 0xda, 0x8d, 0x68, + 0x61, 0x1d, 0x9f, 0x7e, 0x7e, 0xb4, 0x43, 0xd8, 0x5c, 0xbc, 0x8e, 0x91, 0xc9, 0xb4, 0x12, 0x45, + 0xa6, 0xc2, 0xac, 0x46, 0xc1, 0xd2, 0x92, 0x7c, 0x1e, 0x5c, 0xde, 0x88, 0xda, 0x6e, 0x46, 0x91, + 0x43, 0x7d, 0xe9, 0x71, 0x5d, 0x12, 0xaf, 0x87, 0x30, 0xc7, 0xca, 0xec, 0x84, 0x19, 0xc9, 0x65, + 0x94, 0xc2, 0x8c, 0x22, 0x55, 0x8f, 0xc6, 0x14, 0x96, 0x45, 0xa8, 0x21, 0x14, 0x64, 0x89, 0xd6, + 0x34, 0x0a, 0xb2, 0x8c, 0x14, 0x1d, 0x32, 0x59, 0xca, 0x41, 0xc9, 0xdf, 0x88, 0x76, 0xc4, 0x72, + 0x41, 0x41, 0x3b, 0x52, 0x85, 0x20, 0xe3, 0xb2, 0x0f, 0x39, 0x06, 0x96, 0x6d, 0xff, 0xa5, 0x98, + 0x7d, 0x0e, 0xcb, 0xc1, 0x9d, 0xb5, 0xd6, 0x43, 0xce, 0x8f, 0xe1, 0xf5, 0x87, 0xa0, 0x4b, 0xbc, + 0x5e, 0x81, 0x78, 0xd4, 0x5f, 0x92, 0x2a, 0x13, 0xc1, 0xe1, 0x44, 0x7e, 0x66, 0x10, 0x1c, 0x4e, + 0xf4, 0xc7, 0x05, 0xea, 0xef, 0xc3, 0x5f, 0x37, 0x6e, 0xc6, 0x54, 0x3a, 0x8d, 0xf8, 0xfb, 0x91, + 0x9f, 0x0a, 0x8c, 0x29, 0xed, 0x0b, 0xc8, 0x46, 0xaa, 0xf8, 0xb5, 0xf5, 0x51, 0x02, 0xe9, 0x95, + 0x49, 0x2f, 0x8c, 0x47, 0x88, 0xe5, 0x4b, 0x6b, 0xee, 0xe3, 0xf8, 0x4a, 0xa5, 0xfe, 0x71, 0x7c, + 0xe5, 0x72, 0x7d, 0x7a, 0x3e, 0x91, 0xf4, 0x4f, 0x4e, 0x4e, 0x02, 0x8c, 0x9c, 0x4f, 0x62, 0x42, + 0x83, 0xba, 0xf8, 0x30, 0xb1, 0xa0, 0xe9, 0x72, 0x76, 0x46, 0x4c, 0x1b, 0xe8, 0x3f, 0x8b, 0xed, + 0x13, 0xb7, 0x8d, 0x50, 0xf7, 0xa7, 0x45, 0xb1, 0xc5, 0xc2, 0x42, 0x21, 0x50, 0x89, 0x29, 0x15, + 0xa4, 0x87, 0x26, 0x2f, 0xdb, 0x13, 0x8c, 0x20, 0x52, 0x25, 0x28, 0x18, 0x41, 0xb4, 0xc6, 0xcf, + 0x98, 0xc2, 0x5e, 0x80, 0x95, 0xca, 0x09, 0x5e, 0x40, 0x2e, 0xe4, 0xd3, 0xf3, 0xa3, 0x1d, 0x01, + 0xfd, 0xa7, 0x30, 0xcb, 0x74, 0x22, 0x9c, 0xda, 0x92, 0x3e, 0x6e, 0x8c, 0xc0, 0x65, 0x62, 0x5a, + 0x6a, 0x13, 0x2d, 0x4f, 0x88, 0x21, 0x16, 0xcb, 0x4c, 0xe8, 0x8a, 0x84, 0x15, 0x20, 0xc2, 0x8a, + 0x8c, 0x14, 0x95, 0x08, 0x2b, 0x32, 0x5a, 0x32, 0x62, 0x4c, 0x69, 0x8f, 0x21, 0x23, 0x16, 0x77, + 0x08, 0xa7, 0x45, 0x4c, 0x89, 0x88, 0xfe, 0xda, 0x98, 0x5e, 0x51, 0xa3, 0xac, 0x1a, 0x43, 0x8b, + 0x4a, 0xef, 0x8d, 0x6a, 0x34, 0x52, 0xb8, 0x41, 0x0d, 0x94, 0x54, 0x1f, 0xe4, 0xe4, 0xda, 0x84, + 0x11, 0x03, 0x15, 0x2b, 0x26, 0x8c, 0x29, 0xed, 0x63, 0x98, 0x21, 0xa5, 0x0e, 0x9a, 0x8c, 0x11, + 0x0c, 0xb9, 0x1a, 0x05, 0x8b, 0x03, 0x1e, 0xf6, 0x3b, 0x1d, 0x61, 0x40, 0x21, 0xd1, 0x2f, 0x0c, + 0x28, 0xe6, 0xf4, 0x39, 0x99, 0x77, 0x2a, 0x91, 0x05, 0x69, 0x7c, 0x89, 0xcc, 0x8b, 0xac, 0x39, + 0xcd, 0xe9, 0x08, 0x6b, 0x2e, 0x25, 0xaf, 0x84, 0x35, 0x97, 0x33, 0x53, 0xd4, 0x65, 0x05, 0x09, + 0x21, 0xc1, 0x65, 0x45, 0x13, 0x4c, 0x82, 0xcb, 0x1a, 0xcd, 0x1f, 0x91, 0x6d, 0xc3, 0xaf, 0x51, + 0x82, 0x10, 0x52, 0x4e, 0x49, 0x1f, 0xcd, 0xb0, 0x44, 0x0e, 0xac, 0x54, 0x50, 0x4d, 0x2d, 0x08, + 0x12, 0xad, 0xd4, 0x16, 0x04, 0x19, 0x29, 0xbe, 0xa6, 0x26, 0x1c, 0xd6, 0x45, 0x6b, 0x32, 0xae, + 0x54, 0x75, 0x2d, 0x98, 0xf0, 0x68, 0x21, 0x35, 0x9d, 0x11, 0xaf, 0x8c, 0x16, 0x1c, 0x41, 0xa4, + 0x7e, 0x5a, 0xbf, 0x19, 0xd3, 0x13, 0xb0, 0x38, 0x84, 0x05, 0xa9, 0x22, 0x5e, 0x0b, 0x0d, 0x3d, + 0xae, 0x84, 0x5e, 0x5f, 0x1b, 0xd7, 0x2d, 0x1a, 0x88, 0x69, 0x39, 0x6d, 0xc1, 0x40, 0x84, 0x0a, + 0x19, 0xc1, 0x40, 0xc4, 0xea, 0x16, 0xba, 0x1d, 0xc5, 0xe2, 0x14, 0x61, 0x3b, 0xc6, 0x94, 0xb8, + 0x08, 0xdb, 0x31, 0xae, 0xa2, 0x85, 0xfa, 0x5b, 0xa1, 0xf8, 0x42, 0xf0, 0xb7, 0xa3, 0xc5, 0x1b, + 0x82, 0xbf, 0x8d, 0xa9, 0xd7, 0xa0, 0xe6, 0x17, 0x14, 0x32, 0x88, 0x01, 0x4f, 0xa4, 0x38, 0x42, + 0x0c, 0x78, 0xa2, 0x75, 0x0f, 0xc6, 0x14, 0x8e, 0xab, 0xe5, 0xda, 0x04, 0x21, 0xae, 0x8e, 0xad, + 0x70, 0x10, 0x22, 0xd4, 0x31, 0x45, 0x0d, 0x44, 0x6b, 0x62, 0xf2, 0x40, 0xd0, 0x5a, 0x4c, 0xd6, + 0x42, 0xd0, 0x5a, 0x5c, 0xc6, 0x81, 0xca, 0x28, 0x67, 0x99, 0x04, 0x19, 0x63, 0x33, 0x5c, 0x82, + 0x8c, 0xf1, 0xe9, 0x29, 0x6a, 0x62, 0x52, 0x4a, 0x48, 0x30, 0xb1, 0xb8, 0x64, 0x94, 0xbe, 0x36, + 0xae, 0x5b, 0xb4, 0x7b, 0x9e, 0xd6, 0x11, 0xec, 0x3e, 0x92, 0x32, 0x12, 0xec, 0x3e, 0x9a, 0x03, + 0x32, 0xa6, 0xb4, 0x3f, 0x80, 0x19, 0xf2, 0x6e, 0x25, 0xf8, 0x4d, 0x31, 0x57, 0x2f, 0xdc, 0x19, + 0xc3, 0x94, 0xbd, 0x31, 0x75, 0x57, 0xd9, 0xbe, 0xf5, 0xdd, 0x0f, 0x6b, 0x53, 0xbf, 0xff, 0x61, + 0x4d, 0xf9, 0xaf, 0x1f, 0xd6, 0x94, 0xef, 0x9e, 0xaf, 0x29, 0xff, 0xfa, 0x7c, 0x4d, 0xf9, 0xf7, + 0xe7, 0x6b, 0xca, 0x7f, 0x3e, 0x5f, 0x53, 0xbe, 0x9a, 0x25, 0xff, 0xfc, 0x7f, 0xf0, 0x7f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0xd1, 0x4c, 0x07, 0x45, 0x20, 0x40, 0x00, 0x00, } func (this *RPCError) GoString() string { @@ -6468,12 +6471,13 @@ func (this *RuntimeStatusResponse) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 8) + s := make([]string, 0, 9) s = append(s, "&service.RuntimeStatusResponse{") s = append(s, "Version: "+fmt.Sprintf("%#v", this.Version)+",\n") s = append(s, "AppName: "+fmt.Sprintf("%#v", this.AppName)+",\n") s = append(s, "Exe: "+fmt.Sprintf("%#v", this.Exe)+",\n") s = append(s, "AuthSetupNeeded: "+fmt.Sprintf("%#v", this.AuthSetupNeeded)+",\n") + s = append(s, "FIDO2: "+fmt.Sprintf("%#v", this.FIDO2)+",\n") if this.XXX_unrecognized != nil { s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") } @@ -12293,6 +12297,16 @@ func (m *RuntimeStatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.FIDO2 { + i-- + if m.FIDO2 { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } if m.AuthSetupNeeded { i-- if m.AuthSetupNeeded { @@ -16601,6 +16615,9 @@ func (m *RuntimeStatusResponse) Size() (n int) { if m.AuthSetupNeeded { n += 2 } + if m.FIDO2 { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -23472,6 +23489,26 @@ func (m *RuntimeStatusResponse) Unmarshal(dAtA []byte) error { } } m.AuthSetupNeeded = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FIDO2", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FIDO2 = bool(v != 0) default: iNdEx = preIndex skippy, err := skipKeys(dAtA[iNdEx:]) diff --git a/service/keys.proto b/service/keys.proto index 1afdbeb3..b735d367 100644 --- a/service/keys.proto +++ b/service/keys.proto @@ -404,6 +404,8 @@ message RuntimeStatusResponse { string exe = 4; // AuthSetupNeeded if auth needs to be setup. bool authSetupNeeded = 5; + // FIDO2 available. + bool fido2 = 6 [(gogoproto.customname) = "FIDO2"]; } message AuthSetupRequest { diff --git a/service/run.go b/service/run.go index 9741e8f7..57f1f48c 100644 --- a/service/run.go +++ b/service/run.go @@ -34,18 +34,13 @@ import ( "google.golang.org/grpc/credentials" ) -type protoService struct { - *service -} - -func newProtoService(cfg *Config, build Build, auth *auth) (*protoService, error) { +func newProtoService(cfg *Config, build Build, auth *auth) (*service, error) { req := util.NewHTTPRequestor() srv, err := newService(cfg, build, auth, req, time.Now) if err != nil { return nil, err } - p := &protoService{srv} - return p, nil + return srv, nil } func setupLogging(cfg *Config, logPath string) (Logger, LogInterceptor) { @@ -233,6 +228,7 @@ func NewServiceFn(cfg *Config, build Build, lgi LogInterceptor) (ServeFn, CloseF } else { logger.Infof("Registering FIDO2 plugin...") fido2.RegisterAuthenticatorsServer(grpcServer, server) + service.fido2 = true } logger.Infof("Listening for connections on port %d", cfg.Port()) diff --git a/service/service.go b/service/service.go index 2cbe42cb..d11aa6c9 100644 --- a/service/service.go +++ b/service/service.go @@ -34,6 +34,8 @@ type service struct { open bool openMtx sync.Mutex + fido2 bool + watchLast *ds.WatchEvent watchLn ds.WatchLn watchWg *sync.WaitGroup diff --git a/service/status.go b/service/status.go index 3bb78e83..87380da8 100644 --- a/service/status.go +++ b/service/status.go @@ -21,6 +21,7 @@ func (s *service) RuntimeStatus(ctx context.Context, req *RuntimeStatusRequest) AppName: s.cfg.AppName(), Exe: exe, AuthSetupNeeded: !authed, + FIDO2: s.fido2, } logger.Infof("Runtime status, %s", resp.String()) return &resp, nil From 672c75982d02c5792de19c5013d2d779bdf9d442 Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Tue, 28 Apr 2020 20:50:47 -0700 Subject: [PATCH 7/7] service: fido2Commands --- service/cmd_fido2.go | 59 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/service/cmd_fido2.go b/service/cmd_fido2.go index 7c10c51d..d18fc640 100644 --- a/service/cmd_fido2.go +++ b/service/cmd_fido2.go @@ -1,19 +1,60 @@ package service import ( + "context" + "encoding/json" + "fmt" + + "github.com/keys-pub/keysd/fido2" "github.com/urfave/cli" ) func fido2Commands(client *Client) []cli.Command { return []cli.Command{ - // cli.Command{ - // Name: "fido2", - // Usage: "FIDO2", - // Subcommands: []cli.Command{ - // cmds.DevicesFn(client.FIDO2Client), - // cmds.DeviceInfoFn(client.FIDO2Client), - // cmds.MakeCredentialFn(client.FIDO2Client), - // }, - // }, + cli.Command{ + Name: "fido2", + Usage: "FIDO2", + Subcommands: []cli.Command{ + cli.Command{ + Name: "devices", + Usage: "Show devices", + Flags: []cli.Flag{}, + Action: func(c *cli.Context) error { + req := &fido2.DevicesRequest{} + resp, err := client.FIDO2Client().Devices(context.TODO(), req) + if err != nil { + return err + } + printResponse(resp) + return nil + }, + }, + cli.Command{ + Name: "device-info", + Usage: "Device info", + Flags: []cli.Flag{}, + ArgsUsage: "", + Action: func(c *cli.Context) error { + req := fido2.DeviceInfoRequest{ + Device: c.Args().First(), + } + resp, err := client.FIDO2Client().DeviceInfo(context.TODO(), &req) + if err != nil { + return err + } + printResponse(resp) + return nil + }, + }, + }, + }, + } +} + +func printResponse(i interface{}) { + b, err := json.MarshalIndent(i, "", " ") + if err != nil { + panic(err) } + fmt.Println(string(b)) }