Le mer. 2 avr. 2025 à 10:39, Simon Josefsson <si...@josefsson.org> a écrit :
> A short-term fix to resolve the RC bug may be to simply add a > 'Conflicts: golang-step-crypto-dev' to > golang-github-smallstep-crypto-dev? Or is there a need to be able to > co-install these two packages? > > Meanwhile I looked into updating golang-github-smallstep-certificates to > latest version and ran into what I think is a build dependency issue > with golang-step-linkedca which would needs a package rename/reupload to > get the latest version. The name name ought to be > golang-github-smallstep-linkedca instead which is the new namespace. It > seems most if not all of go.step.sm moved to github.com/smallstep > namespace. I doubt we can finish that transition before trixie though. I had a look at another approach, just upgrading the dependency to golang-github-smallstep-crypto-dev for these two packages: - golang-step-cli-utils: all fine, level1 - golang-github-smallstep-certificates: level 2, needs the previous one rebuilt first, and the attached patch. There are probably mistakes in that patch. This would allow removal of golang-step-crypto-dev.
--- a/authority/provisioners.go +++ b/authority/provisioners.go @@ -10,7 +10,6 @@ "os" "github.com/pkg/errors" - "gopkg.in/square/go-jose.v2/jwt" "go.step.sm/cli-utils/step" "go.step.sm/cli-utils/ui" @@ -89,7 +88,7 @@ // LoadProvisionerByToken returns an interface to the provisioner that // provisioned the token. -func (a *Authority) LoadProvisionerByToken(token *jwt.JSONWebToken, claims *jwt.Claims) (provisioner.Interface, error) { +func (a *Authority) LoadProvisionerByToken(token *jose.JSONWebToken, claims *jose.Claims) (provisioner.Interface, error) { a.adminMutex.RLock() defer a.adminMutex.RUnlock() p, ok := a.provisioners.LoadByToken(token, claims) --- a/authority/provisioner/jwk_test.go +++ b/authority/provisioner/jwk_test.go @@ -171,10 +171,10 @@ {"fail-token", p1, args{failTok}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; error parsing jwk token")}, {"fail-key", p1, args{failKey}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; error parsing jwk claims")}, {"fail-claims", p1, args{failClaims}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; error parsing jwk claims")}, - {"fail-signature", p1, args{failSig}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; error parsing jwk claims: square/go-jose: error in cryptographic primitive")}, - {"fail-issuer", p1, args{failIss}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk claims: square/go-jose/jwt: validation failed, invalid issuer claim (iss)")}, - {"fail-expired", p1, args{failExp}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk claims: square/go-jose/jwt: validation failed, token is expired (exp)")}, - {"fail-not-before", p1, args{failNbf}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk claims: square/go-jose/jwt: validation failed, token not valid yet (nbf)")}, + {"fail-signature", p1, args{failSig}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; error parsing jwk claims: go-jose/go-jose: error in cryptographic primitive")}, + {"fail-issuer", p1, args{failIss}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk claims: go-jose/go-jose/jwt: validation failed, invalid issuer claim (iss)")}, + {"fail-expired", p1, args{failExp}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk claims: go-jose/go-jose/jwt: validation failed, token is expired (exp)")}, + {"fail-not-before", p1, args{failNbf}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk claims: go-jose/go-jose/jwt: validation failed, token not valid yet (nbf)")}, {"fail-audience", p1, args{failAud}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; invalid jwk token audience claim (aud)")}, {"fail-subject", p1, args{failSub}, http.StatusUnauthorized, errors.New("jwk.authorizeToken; jwk token subject cannot be empty")}, {"ok", p1, args{t1}, http.StatusOK, nil}, @@ -218,7 +218,7 @@ code int err error }{ - {"fail-signature", p1, args{failSig}, http.StatusUnauthorized, errors.New("jwk.AuthorizeRevoke: jwk.authorizeToken; error parsing jwk claims: square/go-jose: error in cryptographic primitive")}, + {"fail-signature", p1, args{failSig}, http.StatusUnauthorized, errors.New("jwk.AuthorizeRevoke: jwk.authorizeToken; error parsing jwk claims: go-jose/go-jose: error in cryptographic primitive")}, {"ok", p1, args{t1}, http.StatusOK, nil}, } for _, tt := range tests { @@ -266,7 +266,7 @@ prov: p1, args: args{failSig}, code: http.StatusUnauthorized, - err: errors.New("jwk.AuthorizeSign: jwk.authorizeToken; error parsing jwk claims: square/go-jose: error in cryptographic primitive"), + err: errors.New("jwk.AuthorizeSign: jwk.authorizeToken; error parsing jwk claims: go-jose/go-jose: error in cryptographic primitive"), }, { name: "ok-sans", --- a/authority/provisioner/k8sSA_test.go +++ b/authority/provisioner/k8sSA_test.go @@ -97,7 +97,7 @@ p: p, token: tok, code: http.StatusUnauthorized, - err: errors.New("k8ssa.authorizeToken; invalid k8sSA token claims: square/go-jose/jwt: validation failed, invalid issuer claim (iss)"), + err: errors.New("k8ssa.authorizeToken; invalid k8sSA token claims: go-jose/go-jose/jwt: validation failed, invalid issuer claim (iss)"), } }, "ok": func(t *testing.T) test { --- a/acme/account_test.go +++ b/acme/account_test.go @@ -25,7 +25,7 @@ jwk.Key = "foo" return test{ jwk: jwk, - err: NewErrorISE("error generating jwk thumbprint: square/go-jose: unknown key type 'string'"), + err: NewErrorISE("error generating jwk thumbprint: go-jose/go-jose: unknown key type 'string'"), } }, "ok": func(t *testing.T) test { --- a/acme/api/middleware_test.go +++ b/acme/api/middleware_test.go @@ -358,7 +358,7 @@ return test{ body: strings.NewReader("foo"), statusCode: 400, - err: acme.NewError(acme.ErrorMalformedType, "failed to parse JWS from request body: square/go-jose: compact JWS format must have three parts"), + err: acme.NewError(acme.ErrorMalformedType, "failed to parse JWS from request body: go-jose/go-jose: compact JWS format must have three parts"), } }, "ok": func(t *testing.T) test { @@ -483,7 +483,7 @@ return test{ ctx: ctx, statusCode: 400, - err: acme.NewError(acme.ErrorMalformedType, "error verifying jws: square/go-jose: error in cryptographic primitive"), + err: acme.NewError(acme.ErrorMalformedType, "error verifying jws: go-jose/go-jose: error in cryptographic primitive"), } }, "fail/algorithm-mismatch": func(t *testing.T) test { --- a/acme/api/revoke_test.go +++ b/acme/api/revoke_test.go @@ -1281,7 +1281,7 @@ } }, "wrap-subject": func(t *testing.T) test { - acmeErr := acme.NewError(acme.ErrorUnauthorizedType, "verification of jws using certificate public key failed: square/go-jose: error in cryptographic primitive") + acmeErr := acme.NewError(acme.ErrorUnauthorizedType, "verification of jws using certificate public key failed: go-jose/go-jose: error in cryptographic primitive") acmeErr.Status = http.StatusForbidden acmeErr.Detail = "No authorization provided for name test.example.com" cert := &x509.Certificate{ @@ -1290,7 +1290,7 @@ }, } return test{ - err: errors.New("square/go-jose: error in cryptographic primitive"), + err: errors.New("go-jose/go-jose: error in cryptographic primitive"), cert: cert, unauthorizedIdentifiers: []acme.Identifier{}, msg: "verification of jws using certificate public key failed", --- a/acme/challenge_test.go +++ b/acme/challenge_test.go @@ -196,7 +196,7 @@ return test{ token: "1234", jwk: jwk, - err: NewErrorISE("error generating JWK thumbprint: square/go-jose: unknown key type 'string'"), + err: NewErrorISE("error generating JWK thumbprint: go-jose/go-jose: unknown key type 'string'"), } }, "ok": func(t *testing.T) test { @@ -725,7 +725,7 @@ }, }, jwk: jwk, - err: NewErrorISE("error generating JWK thumbprint: square/go-jose: unknown key type 'string'"), + err: NewErrorISE("error generating JWK thumbprint: go-jose/go-jose: unknown key type 'string'"), } }, "ok/key-auth-mismatch": func(t *testing.T) test { @@ -1021,7 +1021,7 @@ }, }, jwk: jwk, - err: NewErrorISE("error generating JWK thumbprint: square/go-jose: unknown key type 'string'"), + err: NewErrorISE("error generating JWK thumbprint: go-jose/go-jose: unknown key type 'string'"), } }, "fail/key-auth-mismatch-store-error": func(t *testing.T) test { @@ -1758,7 +1758,7 @@ }, srv: srv, jwk: jwk, - err: NewErrorISE("error generating JWK thumbprint: square/go-jose: unknown key type 'string'"), + err: NewErrorISE("error generating JWK thumbprint: go-jose/go-jose: unknown key type 'string'"), } }, "ok/error-no-extension": func(t *testing.T) test { --- a/authority/policy_test.go +++ b/authority/policy_test.go @@ -7,9 +7,9 @@ "testing" "github.com/stretchr/testify/assert" - "gopkg.in/square/go-jose.v2" "go.step.sm/linkedca" + "go.step.sm/crypto/jose" "github.com/smallstep/certificates/authority/admin" "github.com/smallstep/certificates/authority/administrator" --- a/authority/tls_test.go +++ b/authority/tls_test.go @@ -18,8 +18,6 @@ "testing" "time" - "gopkg.in/square/go-jose.v2/jwt" - "go.step.sm/crypto/jose" "go.step.sm/crypto/keyutil" "go.step.sm/crypto/pemutil" @@ -1327,15 +1325,15 @@ } }, "fail/nil-db": func() test { - cl := jwt.Claims{ + cl := jose.Claims{ Subject: "sn", Issuer: validIssuer, - NotBefore: jwt.NewNumericDate(now), - Expiry: jwt.NewNumericDate(now.Add(time.Minute)), + NotBefore: jose.NewNumericDate(now), + Expiry: jose.NewNumericDate(now.Add(time.Minute)), Audience: validAudience, ID: "44", } - raw, err := jwt.Signed(sig).Claims(cl).CompactSerialize() + raw, err := jose.Signed(sig).Claims(cl).CompactSerialize() assert.FatalError(t, err) return test{ @@ -1367,15 +1365,15 @@ Err: errors.New("force"), })) - cl := jwt.Claims{ + cl := jose.Claims{ Subject: "sn", Issuer: validIssuer, - NotBefore: jwt.NewNumericDate(now), - Expiry: jwt.NewNumericDate(now.Add(time.Minute)), + NotBefore: jose.NewNumericDate(now), + Expiry: jose.NewNumericDate(now.Add(time.Minute)), Audience: validAudience, ID: "44", } - raw, err := jwt.Signed(sig).Claims(cl).CompactSerialize() + raw, err := jose.Signed(sig).Claims(cl).CompactSerialize() assert.FatalError(t, err) return test{ @@ -1407,15 +1405,15 @@ Err: db.ErrAlreadyExists, })) - cl := jwt.Claims{ + cl := jose.Claims{ Subject: "sn", Issuer: validIssuer, - NotBefore: jwt.NewNumericDate(now), - Expiry: jwt.NewNumericDate(now.Add(time.Minute)), + NotBefore: jose.NewNumericDate(now), + Expiry: jose.NewNumericDate(now.Add(time.Minute)), Audience: validAudience, ID: "44", } - raw, err := jwt.Signed(sig).Claims(cl).CompactSerialize() + raw, err := jose.Signed(sig).Claims(cl).CompactSerialize() assert.FatalError(t, err) return test{ @@ -1446,15 +1444,15 @@ }, })) - cl := jwt.Claims{ + cl := jose.Claims{ Subject: "sn", Issuer: validIssuer, - NotBefore: jwt.NewNumericDate(now), - Expiry: jwt.NewNumericDate(now.Add(time.Minute)), + NotBefore: jose.NewNumericDate(now), + Expiry: jose.NewNumericDate(now.Add(time.Minute)), Audience: validAudience, ID: "44", } - raw, err := jwt.Signed(sig).Claims(cl).CompactSerialize() + raw, err := jose.Signed(sig).Claims(cl).CompactSerialize() assert.FatalError(t, err) return test{ auth: _a, @@ -1538,15 +1536,15 @@ }, })) - cl := jwt.Claims{ + cl := jose.Claims{ Subject: "sn", Issuer: validIssuer, - NotBefore: jwt.NewNumericDate(now), - Expiry: jwt.NewNumericDate(now.Add(time.Minute)), + NotBefore: jose.NewNumericDate(now), + Expiry: jose.NewNumericDate(now.Add(time.Minute)), Audience: validAudience, ID: "44", } - raw, err := jwt.Signed(sig).Claims(cl).CompactSerialize() + raw, err := jose.Signed(sig).Claims(cl).CompactSerialize() assert.FatalError(t, err) return test{ auth: a, --- a/ca/acmeClient.go +++ b/ca/acmeClient.go @@ -173,7 +173,7 @@ } signed, err := signer.Sign(payload) if err != nil { - return nil, errors.Errorf("error signing payload: %s", strings.TrimPrefix(err.Error(), "square/go-jose: ")) + return nil, errors.Errorf("error signing payload: %s", strings.TrimPrefix(err.Error(), "go-jose/go-jose: ")) } raw, err := serialize(signed) if err != nil { --- a/ca/client.go +++ b/ca/client.go @@ -35,7 +35,6 @@ "golang.org/x/net/http2" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" - "gopkg.in/square/go-jose.v2/jwt" ) // DisableIdentity is a global variable to disable the identity. @@ -1207,7 +1206,7 @@ // CreateSignRequest is a helper function that given an x509 OTT returns a // simple but secure sign request as well as the private key used. func CreateSignRequest(ott string) (*api.SignRequest, crypto.PrivateKey, error) { - token, err := jwt.ParseSigned(ott) + token, err := jose.ParseSigned(ott) if err != nil { return nil, nil, errors.Wrap(err, "error parsing ott") } --- a/kms/azurekms/key_vault_test.go +++ b/kms/azurekms/key_vault_test.go @@ -16,7 +16,6 @@ "github.com/smallstep/certificates/kms/apiv1" "github.com/smallstep/certificates/kms/azurekms/internal/mock" "go.step.sm/crypto/keyutil" - "gopkg.in/square/go-jose.v2" ) var errTest = fmt.Errorf("test error") --- a/authority/provisioner/options_test.go +++ b/authority/provisioner/options_test.go @@ -159,7 +159,7 @@ func TestCustomTemplateOptions(t *testing.T) { csr := parseCertificateRequest(t, "testdata/certs/ecdsa.csr") - csrCertificate := `{"version":0,"subject":{"commonName":"foo"},"dnsNames":["foo"],"emailAddresses":null,"ipAddresses":null,"uris":null,"sans":null,"extensions":[{"id":"2.5.29.17","critical":false,"value":"MAWCA2Zvbw=="}],"signatureAlgorithm":""}` + csrCertificate := `{"version":0,"subject":{"commonName":"foo"},"rawSubject":"MA4xDDAKBgNVBAMTA2Zvbw==","dnsNames":["foo"],"emailAddresses":null,"ipAddresses":null,"uris":null,"sans":null,"extensions":[{"id":"2.5.29.17","critical":false,"value":"MAWCA2Zvbw=="}],"signatureAlgorithm":""}` data := x509util.TemplateData{ x509util.SubjectKey: x509util.Subject{ CommonName: "foobar", --- a/cas/stepcas/x5c_issuer_test.go +++ b/cas/stepcas/x5c_issuer_test.go @@ -53,7 +53,7 @@ sans []string } type claims struct { - Aud []string `json:"aud"` + Aud string `json:"aud"` Sub string `json:"sub"` Sans []string `json:"sans"` } @@ -87,7 +87,7 @@ } var c claims want := claims{ - Aud: []string{tt.fields.caURL.String() + "/1.0/sign#x5c/X5C"}, + Aud: string{tt.fields.caURL.String() + "/1.0/sign#x5c/X5C"}, Sub: tt.args.subject, Sans: tt.args.sans, } @@ -117,7 +117,7 @@ subject string } type claims struct { - Aud []string `json:"aud"` + Aud string `json:"aud"` Sub string `json:"sub"` Sans []string `json:"sans"` } @@ -152,7 +152,7 @@ } var c claims want := claims{ - Aud: []string{tt.fields.caURL.String() + "/1.0/revoke#x5c/X5C"}, + Aud: string{tt.fields.caURL.String() + "/1.0/revoke#x5c/X5C"}, Sub: tt.args.subject, } if err := jwt.Claims(testX5CKey.Public(), &c); err != nil { --- a/authority/authority_test.go +++ b/authority/authority_test.go @@ -109,7 +109,7 @@ c.Root = []string{"foo"} return &newTest{ config: c, - err: errors.New("error reading foo: no such file or directory"), + err: errors.New("error reading \"foo\": no such file or directory"), } }, "fail bad password": func(t *testing.T) *newTest { @@ -127,7 +127,7 @@ c.IntermediateCert = "wrong" return &newTest{ config: c, - err: errors.New("error reading wrong: no such file or directory"), + err: errors.New("error reading \"wrong\": no such file or directory"), } }, }