xref: /aosp_15_r20/external/tink/go/jwt/jwk_converter_test.go (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang// Copyright 2022 Google LLC
2*e7b1675dSTing-Kang Chang//
3*e7b1675dSTing-Kang Chang// Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang// you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang// You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang//
7*e7b1675dSTing-Kang Chang//      http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang//
9*e7b1675dSTing-Kang Chang// Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang// distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang// See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang// limitations under the License.
14*e7b1675dSTing-Kang Chang//
15*e7b1675dSTing-Kang Chang////////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang
17*e7b1675dSTing-Kang Changpackage jwt_test
18*e7b1675dSTing-Kang Chang
19*e7b1675dSTing-Kang Changimport (
20*e7b1675dSTing-Kang Chang	"bytes"
21*e7b1675dSTing-Kang Chang	"fmt"
22*e7b1675dSTing-Kang Chang	"testing"
23*e7b1675dSTing-Kang Chang
24*e7b1675dSTing-Kang Chang	spb "google.golang.org/protobuf/types/known/structpb"
25*e7b1675dSTing-Kang Chang	"github.com/google/go-cmp/cmp"
26*e7b1675dSTing-Kang Chang	"google.golang.org/protobuf/proto"
27*e7b1675dSTing-Kang Chang	"google.golang.org/protobuf/testing/protocmp"
28*e7b1675dSTing-Kang Chang	"github.com/google/tink/go/jwt"
29*e7b1675dSTing-Kang Chang	"github.com/google/tink/go/keyset"
30*e7b1675dSTing-Kang Chang	"github.com/google/tink/go/testkeyset"
31*e7b1675dSTing-Kang Chang	jepb "github.com/google/tink/go/proto/jwt_ecdsa_go_proto"
32*e7b1675dSTing-Kang Chang	jrsppb "github.com/google/tink/go/proto/jwt_rsa_ssa_pkcs1_go_proto"
33*e7b1675dSTing-Kang Chang	jrpsspb "github.com/google/tink/go/proto/jwt_rsa_ssa_pss_go_proto"
34*e7b1675dSTing-Kang Chang	tinkpb "github.com/google/tink/go/proto/tink_go_proto"
35*e7b1675dSTing-Kang Chang)
36*e7b1675dSTing-Kang Chang
37*e7b1675dSTing-Kang Changtype jwkSetTestCase struct {
38*e7b1675dSTing-Kang Chang	tag           string
39*e7b1675dSTing-Kang Chang	jwkSet        string
40*e7b1675dSTing-Kang Chang	privateKeyset string
41*e7b1675dSTing-Kang Chang	publicKeyset  string
42*e7b1675dSTing-Kang Chang}
43*e7b1675dSTing-Kang Chang
44*e7b1675dSTing-Kang Chang// synchronized with tests cases from JWK converter for C++
45*e7b1675dSTing-Kang Changvar jwkSetTestCases = []jwkSetTestCase{
46*e7b1675dSTing-Kang Chang	{
47*e7b1675dSTing-Kang Chang		tag: "ES256",
48*e7b1675dSTing-Kang Chang		jwkSet: `{
49*e7b1675dSTing-Kang Chang			"keys":[{
50*e7b1675dSTing-Kang Chang			"kty":"EC",
51*e7b1675dSTing-Kang Chang			"crv":"P-256",
52*e7b1675dSTing-Kang Chang			"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
53*e7b1675dSTing-Kang Chang			"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
54*e7b1675dSTing-Kang Chang			"use":"sig","alg":"ES256","key_ops":["verify"],
55*e7b1675dSTing-Kang Chang			"kid":"EhuduQ"}]
56*e7b1675dSTing-Kang Chang		}`,
57*e7b1675dSTing-Kang Chang		privateKeyset: `{
58*e7b1675dSTing-Kang Chang				"primaryKeyId": 303799737,
59*e7b1675dSTing-Kang Chang				"key": [
60*e7b1675dSTing-Kang Chang				{
61*e7b1675dSTing-Kang Chang					"keyData": {
62*e7b1675dSTing-Kang Chang					"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPrivateKey",
63*e7b1675dSTing-Kang Chang					"value": "GiA2S/eedsXqu0DhnOlCJugsHugdpPaAGr/byxXXsZBiVRJGIiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ==",
64*e7b1675dSTing-Kang Chang					"keyMaterialType": "ASYMMETRIC_PRIVATE"
65*e7b1675dSTing-Kang Chang					},
66*e7b1675dSTing-Kang Chang					"status": "ENABLED",
67*e7b1675dSTing-Kang Chang					"keyId": 303799737,
68*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
69*e7b1675dSTing-Kang Chang				}
70*e7b1675dSTing-Kang Chang			]
71*e7b1675dSTing-Kang Chang		}`,
72*e7b1675dSTing-Kang Chang	},
73*e7b1675dSTing-Kang Chang	{
74*e7b1675dSTing-Kang Chang		tag: "ES384",
75*e7b1675dSTing-Kang Chang		jwkSet: `{
76*e7b1675dSTing-Kang Chang			"keys":[{"kty":"EC","crv":"P-384",
77*e7b1675dSTing-Kang Chang			"x":"AEUCTkKhRDEgJ2pTiyPoSsIOERywrB2xjBDgUH8LLg0Ao9xT2SxKadxLdRFIr8Ll",
78*e7b1675dSTing-Kang Chang			"y":"wQcqkI9pV66PJFmJVyZ7BsqvFaqoWT-jAFvYNjsgdvAIpyB3MHWXkxNhlPYcpEIf",
79*e7b1675dSTing-Kang Chang			"use":"sig","alg":"ES384","key_ops":["verify"],"kid":"f-fUcw"}]
80*e7b1675dSTing-Kang Chang		}`,
81*e7b1675dSTing-Kang Chang		privateKeyset: `{
82*e7b1675dSTing-Kang Chang			"primaryKeyId": 2145899635,
83*e7b1675dSTing-Kang Chang			"key": [
84*e7b1675dSTing-Kang Chang				{
85*e7b1675dSTing-Kang Chang					"keyData": {
86*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPrivateKey",
87*e7b1675dSTing-Kang Chang						"value": "GjCfHcFYHsiwTcBCATSyjOyJ64iy4LGa4OuFaR9wZqkYTuYrY1I3ssxO4UK11j/IUe4SZiIwwQcqkI9pV66PJFmJVyZ7BsqvFaqoWT+jAFvYNjsgdvAIpyB3MHWXkxNhlPYcpEIfGjAARQJOQqFEMSAnalOLI+hKwg4RHLCsHbGMEOBQfwsuDQCj3FPZLEpp3Et1EUivwuUQAg==",
88*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
89*e7b1675dSTing-Kang Chang					},
90*e7b1675dSTing-Kang Chang					"status": "ENABLED",
91*e7b1675dSTing-Kang Chang					"keyId": 2145899635,
92*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
93*e7b1675dSTing-Kang Chang				}
94*e7b1675dSTing-Kang Chang			]
95*e7b1675dSTing-Kang Chang		}`,
96*e7b1675dSTing-Kang Chang	},
97*e7b1675dSTing-Kang Chang	{
98*e7b1675dSTing-Kang Chang		tag: "ES512",
99*e7b1675dSTing-Kang Chang		jwkSet: `{
100*e7b1675dSTing-Kang Chang			"keys":[{"kty":"EC","crv":"P-521",
101*e7b1675dSTing-Kang Chang			"x":"AKRFrHHoTaFAO-d4sCOw78KyUlZijBgqfp2rXtkLZ_QQGLtDM2nScAilkryvw3c_4fM39CEygtSunFLI9xyUyE3m",
102*e7b1675dSTing-Kang Chang			"y":"ANZK5JjTcNAKtezmXFvDSkrxdxPiuX2uPq6oR3M0pb2wqnfDL-nWeWcKb2nAOxYSyydsrZ98bxBL60lEr20x1Gc_",
103*e7b1675dSTing-Kang Chang			"use":"sig","alg":"ES512","key_ops":["verify"],"kid":"WDqzeQ"}]
104*e7b1675dSTing-Kang Chang		}`,
105*e7b1675dSTing-Kang Chang		privateKeyset: `{
106*e7b1675dSTing-Kang Chang			"primaryKeyId": 1480242041,
107*e7b1675dSTing-Kang Chang			"key": [
108*e7b1675dSTing-Kang Chang				{
109*e7b1675dSTing-Kang Chang					"keyData": {
110*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPrivateKey",
111*e7b1675dSTing-Kang Chang						"value": "GkIBnhWq6UrOj8hKwGovjSsLT+dtAGlRqoIkQ2FzMeKxIApx0dT3O4yHrmi6v5sElZHM6BsLz47IopAOajVRYGh48b0SigEiQgDWSuSY03DQCrXs5lxbw0pK8XcT4rl9rj6uqEdzNKW9sKp3wy/p1nlnCm9pwDsWEssnbK2ffG8QS+tJRK9tMdRnPxpCAKRFrHHoTaFAO+d4sCOw78KyUlZijBgqfp2rXtkLZ/QQGLtDM2nScAilkryvw3c/4fM39CEygtSunFLI9xyUyE3mEAM=",
112*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
113*e7b1675dSTing-Kang Chang					},
114*e7b1675dSTing-Kang Chang					"status": "ENABLED",
115*e7b1675dSTing-Kang Chang					"keyId": 1480242041,
116*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
117*e7b1675dSTing-Kang Chang				}
118*e7b1675dSTing-Kang Chang			]
119*e7b1675dSTing-Kang Chang		}`,
120*e7b1675dSTing-Kang Chang	},
121*e7b1675dSTing-Kang Chang	{
122*e7b1675dSTing-Kang Chang		tag: "ES256_NO_KID",
123*e7b1675dSTing-Kang Chang		jwkSet: `{
124*e7b1675dSTing-Kang Chang			"keys":[{
125*e7b1675dSTing-Kang Chang			"kty":"EC",
126*e7b1675dSTing-Kang Chang			"crv":"P-256",
127*e7b1675dSTing-Kang Chang			"x":"ytH8MlvqTx3X-eL0pdx4ULKUb2YOi2DPnIPpSaIk28M",
128*e7b1675dSTing-Kang Chang			"y":"AO5TMe5lNcjJpuGjjGtHd4gX9POG9dh_vG-8ptp7HJs",
129*e7b1675dSTing-Kang Chang			"use":"sig","alg":"ES256","key_ops":["verify"]}]
130*e7b1675dSTing-Kang Chang		}`,
131*e7b1675dSTing-Kang Chang		privateKeyset: `{
132*e7b1675dSTing-Kang Chang			"primaryKeyId": 765975903,
133*e7b1675dSTing-Kang Chang			"key": [
134*e7b1675dSTing-Kang Chang				{
135*e7b1675dSTing-Kang Chang					"keyData": {
136*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPrivateKey",
137*e7b1675dSTing-Kang Chang						"value": "GiCbUAItoAVleOSwYdPWs563CCFhGHSdX4t/C2xBY2J/ERJGIiAA7lMx7mU1yMmm4aOMa0d3iBf084b12H+8b7ym2nscmxogytH8MlvqTx3X+eL0pdx4ULKUb2YOi2DPnIPpSaIk28MQAQ==",
138*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
139*e7b1675dSTing-Kang Chang					},
140*e7b1675dSTing-Kang Chang					"status": "ENABLED",
141*e7b1675dSTing-Kang Chang					"keyId": 765975903,
142*e7b1675dSTing-Kang Chang					"outputPrefixType": "RAW"
143*e7b1675dSTing-Kang Chang				}
144*e7b1675dSTing-Kang Chang			]
145*e7b1675dSTing-Kang Chang		}`,
146*e7b1675dSTing-Kang Chang	},
147*e7b1675dSTing-Kang Chang	{
148*e7b1675dSTing-Kang Chang		tag: "multiple keys",
149*e7b1675dSTing-Kang Chang		jwkSet: `{
150*e7b1675dSTing-Kang Chang			"keys":[
151*e7b1675dSTing-Kang Chang				{
152*e7b1675dSTing-Kang Chang					"kty":"EC",
153*e7b1675dSTing-Kang Chang					"crv":"P-256",
154*e7b1675dSTing-Kang Chang					"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
155*e7b1675dSTing-Kang Chang					"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
156*e7b1675dSTing-Kang Chang					"use":"sig","alg":"ES256","key_ops":["verify"],
157*e7b1675dSTing-Kang Chang					"kid":"EhuduQ"
158*e7b1675dSTing-Kang Chang				},
159*e7b1675dSTing-Kang Chang				{
160*e7b1675dSTing-Kang Chang					"kty":"EC",
161*e7b1675dSTing-Kang Chang					"crv":"P-384",
162*e7b1675dSTing-Kang Chang					"x":"AEUCTkKhRDEgJ2pTiyPoSsIOERywrB2xjBDgUH8LLg0Ao9xT2SxKadxLdRFIr8Ll",
163*e7b1675dSTing-Kang Chang					"y":"wQcqkI9pV66PJFmJVyZ7BsqvFaqoWT-jAFvYNjsgdvAIpyB3MHWXkxNhlPYcpEIf",
164*e7b1675dSTing-Kang Chang					"use":"sig","alg":"ES384","key_ops":["verify"],
165*e7b1675dSTing-Kang Chang					"kid":"f-fUcw"
166*e7b1675dSTing-Kang Chang				}
167*e7b1675dSTing-Kang Chang			]
168*e7b1675dSTing-Kang Chang		}`,
169*e7b1675dSTing-Kang Chang		privateKeyset: `{
170*e7b1675dSTing-Kang Chang				"primaryKeyId": 303799737,
171*e7b1675dSTing-Kang Chang				"key": [
172*e7b1675dSTing-Kang Chang				{
173*e7b1675dSTing-Kang Chang					"keyData": {
174*e7b1675dSTing-Kang Chang					"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPrivateKey",
175*e7b1675dSTing-Kang Chang					"value": "GiA2S/eedsXqu0DhnOlCJugsHugdpPaAGr/byxXXsZBiVRJGIiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ==",
176*e7b1675dSTing-Kang Chang					"keyMaterialType": "ASYMMETRIC_PRIVATE"
177*e7b1675dSTing-Kang Chang					},
178*e7b1675dSTing-Kang Chang					"status": "ENABLED",
179*e7b1675dSTing-Kang Chang					"keyId": 303799737,
180*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
181*e7b1675dSTing-Kang Chang				},
182*e7b1675dSTing-Kang Chang				{
183*e7b1675dSTing-Kang Chang					"keyData": {
184*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPrivateKey",
185*e7b1675dSTing-Kang Chang						"value": "GjCfHcFYHsiwTcBCATSyjOyJ64iy4LGa4OuFaR9wZqkYTuYrY1I3ssxO4UK11j/IUe4SZiIwwQcqkI9pV66PJFmJVyZ7BsqvFaqoWT+jAFvYNjsgdvAIpyB3MHWXkxNhlPYcpEIfGjAARQJOQqFEMSAnalOLI+hKwg4RHLCsHbGMEOBQfwsuDQCj3FPZLEpp3Et1EUivwuUQAg==",
186*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
187*e7b1675dSTing-Kang Chang					},
188*e7b1675dSTing-Kang Chang					"status": "ENABLED",
189*e7b1675dSTing-Kang Chang					"keyId": 2145899635,
190*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
191*e7b1675dSTing-Kang Chang				}
192*e7b1675dSTing-Kang Chang			]
193*e7b1675dSTing-Kang Chang		}`,
194*e7b1675dSTing-Kang Chang	},
195*e7b1675dSTing-Kang Chang	{
196*e7b1675dSTing-Kang Chang		tag: "RS256",
197*e7b1675dSTing-Kang Chang		jwkSet: `{
198*e7b1675dSTing-Kang Chang			"keys":[{
199*e7b1675dSTing-Kang Chang				"kty":"RSA",
200*e7b1675dSTing-Kang Chang				"n": "vmUOa62TYrxj7N8rZVAzoEdSnmsRQaNWBMAdB8adGa8n4ycGiYWoGv0uZWc8vH2jn6l3Pa_72bb2IHf3-KD2UaTwLk1x3yShXybEoS5ZF9bemzrn2ohNixGoN7Ofj7wPb61Z-F1Nv53nq308z-RI1WeyIH-9HjuIcuUxaWY0VevsXzCehMJP5g7kVzyl55bYcRi28didkVazrzVgNG35yNNMEL32oW1Vfvvp7hfQHtxSwkFOPzJgzIPHbJFbxALGrrgXHsoq7UtDQdS9vvoEp4_JzQhCtnCEKahgkTwOWyT96OlRGYiPJSFHWTujy1Qnd6OKc8LGEspAX4oD6Zl-YQ",
201*e7b1675dSTing-Kang Chang				"e":"AQAB",
202*e7b1675dSTing-Kang Chang				"use":"sig",
203*e7b1675dSTing-Kang Chang				"alg":"RS256",
204*e7b1675dSTing-Kang Chang				"key_ops":["verify"],
205*e7b1675dSTing-Kang Chang				"kid":"TCGiGw"
206*e7b1675dSTing-Kang Chang			}]
207*e7b1675dSTing-Kang Chang		}`,
208*e7b1675dSTing-Kang Chang		privateKeyset: `{
209*e7b1675dSTing-Kang Chang			"primaryKeyId":1277272603,
210*e7b1675dSTing-Kang Chang			"key":[{
211*e7b1675dSTing-Kang Chang				"keyData":{
212*e7b1675dSTing-Kang Chang					"typeUrl":
213*e7b1675dSTing-Kang Chang							"type.googleapis.com/google.crypto.tink.JwtRsaSsaPkcs1PrivateKey",
214*e7b1675dSTing-Kang Chang					"value":"QoABP3S5U0JiFQcqcMFT0Ysqk7FK2NunBCY9o+EAE+svaQi6zWQq2ODFoxB2NU9nqa3ZbhRiCdKNLz6o+jOTIpemKx8Gh/7GufRGLFAjjMchZYs3ripiTNSMaqXgm6ECt8DqrAZbMQ7D3Ha1vArcZG97pbE9t3m4M87zhLs3wPYd/kQ6gAEFPE2GLD5ai8VYd/Q0ePZR0ttLgkJ/2yIig5T8YyJaoZEPjK+v3zVFQuGguJApnl2tC0S7OqOtqsDZ5Dux0H3Cx85FLeyB2STHlXtq9GUGI2VrC/TP3OASc6ap75WMKZRpowEVaip8wWehAOL+VIgTajiFf0yXdSodc4ZjJKreiTKAAd6ahHQiVJapNKY6XANgA+JmluAWq/Fk1LmEnTybWVelcODbppwIvhJ6Xuz6kjuEhhxsUtkPO4vuZJfEF8DWAH5L/FHjJpgP3NnDoNVzGOL5w8SdgIfgCS0UqBLSv2/KhlIEijuL9NYaqydN1cPcjdeadSMcDSIwKjNASRVaPZDJKoABx1/CfOqCbE8eh450YvGwYvII+ro8tR+uusnt2QuQZux3wvl9eto9Dr+5Iq/0bKqpMMgvYHIT+mlkgK6SYLcynZx+SYMAtbixa0nH1lJnnBodOJS6zdMRTcFkpI4g/CbCvzTp5gF5EkfBSbVToVLqICydokKnTvNK6chX3MEUjskigAH0eGwQwn174yJzJTUWH4cRxDredI6LkjADm/ikza76AHT8qRJHJkmwSXL88p3M2bYFN+g9Z/FTL21Ylc0mxn/iII3vabfZWZTWK9QGR7YjAicFyLDeu/ZccCkCXgTFzqqlZ7w4Sv05hWz57xxm81JyxftzapeflfAmjRircFXG2RqAAgub/Z28+SFSf6zSPFMKiYVWx//DI0ubbiuuu65tUse9xYq9JtHEobgYk0dJXNuY9RzPkGblZ8/SD06yRf9l8DMRAbivDfgXY5QZ2PBDk1jn6A2y0S+i80h9MILJ+/sfkljiyvtBFDQwiI9tPOOnxbWmg6bl5xYUdvjbhxBoVB1fgOtAid6gGuLstbf8ycV+DkaWg3mo4054ge9BBT4eWKGC/LHctSaQ/OBs5cbGW+UqZxIjSN9YeOTkbvNKO4l4jGTg0BUBPB3GH8KQPtE4sbBhUDyjYYgAZZcSaRq7AfhLUkiDSfIVcKAIoEOaTS63vf2BQlbW8/HuNlWNUX0M+hkSigIiAwEAARqAAr5lDmutk2K8Y+zfK2VQM6BHUp5rEUGjVgTAHQfGnRmvJ+MnBomFqBr9LmVnPLx9o5+pdz2v+9m29iB39/ig9lGk8C5Ncd8koV8mxKEuWRfW3ps659qITYsRqDezn4+8D2+tWfhdTb+d56t9PM/kSNVnsiB/vR47iHLlMWlmNFXr7F8wnoTCT+YO5Fc8peeW2HEYtvHYnZFWs681YDRt+cjTTBC99qFtVX776e4X0B7cUsJBTj8yYMyDx2yRW8QCxq64Fx7KKu1LQ0HUvb76BKePyc0IQrZwhCmoYJE8Dlsk/ejpURmIjyUhR1k7o8tUJ3ejinPCxhLKQF+KA+mZfmEQAQ==",
215*e7b1675dSTing-Kang Chang					"keyMaterialType":"ASYMMETRIC_PRIVATE"
216*e7b1675dSTing-Kang Chang				},
217*e7b1675dSTing-Kang Chang				"status":"ENABLED",
218*e7b1675dSTing-Kang Chang				"keyId":1277272603,
219*e7b1675dSTing-Kang Chang				"outputPrefixType":"TINK"
220*e7b1675dSTing-Kang Chang			}]
221*e7b1675dSTing-Kang Chang		}`,
222*e7b1675dSTing-Kang Chang	},
223*e7b1675dSTing-Kang Chang	{
224*e7b1675dSTing-Kang Chang		tag: "RS384",
225*e7b1675dSTing-Kang Chang		jwkSet: `{
226*e7b1675dSTing-Kang Chang			"keys":[{
227*e7b1675dSTing-Kang Chang				"kty":"RSA",
228*e7b1675dSTing-Kang Chang				"n":"AI83_8Uy0v4xS6kDZKqcqzSbeyksy2C67ajtI41J2KMDtO9jUaEAQ9uDhMubjZzPYh1wf_gtJgAC5PSiI3fOLUG0AHCbi_yXVfH3_1U_Yl4b_e8yx_NPyuIvwHwXwE5a32hiss9PuY2-qEivH5LK4AXxPiTiUc9x4gh1OwZaSTYWT7SRO-0ROwYwCwpg4Uf0IMLtmHou_NmNw0uOlOgKfx-EFmMzV-5pspEnwsHq_ijFSxmHNAdy5S0n4u1LIKKmgXJIyUu3AKfAJMydn6nTKzrOcpX0yMnxPq9yP8xKuK_mXysFyNvmS0Sq5c-grOETFeMFScweoUpWVnYOCCSyZ93yAhsTUWnDjZd7iuji9Y7zUo4PWlKXyRRz_aSpxrsn70LOZNLLUjILVeyfCRs2JXptfxCNg3wg6FVAH0xTORmPGICgWDmwOFgP1Y6tW-p0cnK8LwVkuRclyKAMvTtYm9xZZHUSjw86rHEnB2VfsPTIn0_WAVnJ2OAKhuVMtwjB7Q",
229*e7b1675dSTing-Kang Chang				"e":"AQAB",
230*e7b1675dSTing-Kang Chang				"use":"sig",
231*e7b1675dSTing-Kang Chang				"alg":"RS384",
232*e7b1675dSTing-Kang Chang				"key_ops":["verify"],
233*e7b1675dSTing-Kang Chang				"kid":"FVLRIg"
234*e7b1675dSTing-Kang Chang			}]
235*e7b1675dSTing-Kang Chang		}`,
236*e7b1675dSTing-Kang Chang		privateKeyset: `{
237*e7b1675dSTing-Kang Chang			"primaryKeyId":357749026,
238*e7b1675dSTing-Kang Chang			"key":[{
239*e7b1675dSTing-Kang Chang				"keyData":{
240*e7b1675dSTing-Kang Chang					"typeUrl":
241*e7b1675dSTing-Kang Chang							"type.googleapis.com/google.crypto.tink.JwtRsaSsaPkcs1PrivateKey",
242*e7b1675dSTing-Kang Chang					"value":"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",
243*e7b1675dSTing-Kang Chang					"keyMaterialType":"ASYMMETRIC_PRIVATE"
244*e7b1675dSTing-Kang Chang				},
245*e7b1675dSTing-Kang Chang				"status":"ENABLED",
246*e7b1675dSTing-Kang Chang				"keyId":357749026,
247*e7b1675dSTing-Kang Chang				"outputPrefixType":"TINK"
248*e7b1675dSTing-Kang Chang			}]
249*e7b1675dSTing-Kang Chang		}`,
250*e7b1675dSTing-Kang Chang	},
251*e7b1675dSTing-Kang Chang	{
252*e7b1675dSTing-Kang Chang		tag: "RS512",
253*e7b1675dSTing-Kang Chang		jwkSet: `{
254*e7b1675dSTing-Kang Chang			"keys":[{
255*e7b1675dSTing-Kang Chang				"kty":"RSA",
256*e7b1675dSTing-Kang Chang				"n":"AKZtuHAGYy-1Mc78sdp1gOV3jMCJtO7NmhyLSproWcBnqSN1g9mB2EdB22-WLWhB_U_JlZRCdHT6CxPHSid0c9JJc-2CmiV9zU2sVTJUkCytOVS0hrcPEz5JK6a6VVy-Skc_1-I0D2YurXd0aRByDALC8heHMok6VQXW8qwHgRyc0Jr1RcbY-CF_SMlRXn88g4e3bnk1AJiPcmHsJOcwkanwlWxq46DxPv5ff0ruXN4gPDYU-6_J6yZJreYjwrl-LhkqzOkz6e-LE4sdI5WFJQR9cGGRMf4ktgF3kqFtcFNFkGtdOvw5MdLe0eaENDzZ8TZyQDgiHYl878x8uPPpmoeif5af_ZUAsrv_bV-h3RpSoTdTP4SlQMmP-3y2R2LxvUs_CiUahoVFwTt_bRHO0Qy-QwpTvAdJX8CzrK2auqycFawYm8xYjj_epTFSwBCJuZjamxpZSa29zTDqP4AXwt2-9LO-70j5muzDQL35czpBgaXSAEJkrM9du91OjkJ2vtYFVLjWougN5uVpEBx1Isk_KgreOgl3lF1vs2EjTuihaxJhM-17alJLmDL06ZEDsht2Uhu_ZExEfPwTKaR_-kfjlamuoLUvTtVhzNZuOHD_XAOrGafMjM9WVq_D5XjqF7WFnb_t4YIOQNmGeOeIFLb4LlR5nHB1HIHUpAWazrvl",
257*e7b1675dSTing-Kang Chang				"e":"AQAB",
258*e7b1675dSTing-Kang Chang				"use":"sig",
259*e7b1675dSTing-Kang Chang				"alg":"RS512",
260*e7b1675dSTing-Kang Chang				"key_ops":["verify"],
261*e7b1675dSTing-Kang Chang				"kid":"fVf-Qw"
262*e7b1675dSTing-Kang Chang			}]
263*e7b1675dSTing-Kang Chang		}`,
264*e7b1675dSTing-Kang Chang		privateKeyset: `{
265*e7b1675dSTing-Kang Chang			"primaryKeyId":2102918723,
266*e7b1675dSTing-Kang Chang			"key":[{
267*e7b1675dSTing-Kang Chang				"keyData":{
268*e7b1675dSTing-Kang Chang					"typeUrl":
269*e7b1675dSTing-Kang Chang							"type.googleapis.com/google.crypto.tink.JwtRsaSsaPkcs1PrivateKey",
270*e7b1675dSTing-Kang Chang					"value":"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",
271*e7b1675dSTing-Kang Chang					"keyMaterialType":"ASYMMETRIC_PRIVATE"
272*e7b1675dSTing-Kang Chang				},
273*e7b1675dSTing-Kang Chang				"status":"ENABLED",
274*e7b1675dSTing-Kang Chang				"keyId":2102918723,
275*e7b1675dSTing-Kang Chang				"outputPrefixType":"TINK"
276*e7b1675dSTing-Kang Chang			}]
277*e7b1675dSTing-Kang Chang		}`,
278*e7b1675dSTing-Kang Chang	},
279*e7b1675dSTing-Kang Chang	{
280*e7b1675dSTing-Kang Chang		tag: "RS256_NO_KID",
281*e7b1675dSTing-Kang Chang		jwkSet: `{
282*e7b1675dSTing-Kang Chang			"keys":[{
283*e7b1675dSTing-Kang Chang				"kty":"RSA",
284*e7b1675dSTing-Kang Chang				"n":"AImrUP3PDttint7alBxKexY-Oe4nCj0TOZ06yuKgq7UQu-3Gc8KJyQHO5SzPlMBy6FjcWqOzz-kkNm9sej3AsdGhTJCcOCYDoLgArYCaMQoMLOOjMQJTVbHeiPpyVgHzvpG9Xw_IVNPbRJhsT4mzqHuyopUEEexVQcFo6F3U8zE1kppxzoMvIiz5-Zm6dFX8EozolMD2TLDh4NZFAb-6uJs8TYzS8Od6V0BVh1CfHL1CuIpvIirkgki2RGXNE1r57bhJfMZUWtqAUXb5SM2IFhLUcgGLV-PfxP2cxcJ7HHhk5-lFf5794CmqcFa4mliR2tJRnhUR2vmlgxqUjzwK3HE",
285*e7b1675dSTing-Kang Chang				"e":"AQAB",
286*e7b1675dSTing-Kang Chang				"use":"sig",
287*e7b1675dSTing-Kang Chang				"alg":"RS256",
288*e7b1675dSTing-Kang Chang				"key_ops":["verify"]
289*e7b1675dSTing-Kang Chang			}]
290*e7b1675dSTing-Kang Chang		}`,
291*e7b1675dSTing-Kang Chang		privateKeyset: `{
292*e7b1675dSTing-Kang Chang			"primaryKeyId":234505441,
293*e7b1675dSTing-Kang Chang			"key":[{
294*e7b1675dSTing-Kang Chang				"keyData":{
295*e7b1675dSTing-Kang Chang					"typeUrl":
296*e7b1675dSTing-Kang Chang							"type.googleapis.com/google.crypto.tink.JwtRsaSsaPkcs1PrivateKey",
297*e7b1675dSTing-Kang Chang					"value":"EosCEAEagQIAiatQ/c8O22Ke3tqUHEp7Fj457icKPRM5nTrK4qCrtRC77cZzwonJAc7lLM+UwHLoWNxao7PP6SQ2b2x6PcCx0aFMkJw4JgOguACtgJoxCgws46MxAlNVsd6I+nJWAfO+kb1fD8hU09tEmGxPibOoe7KilQQR7FVBwWjoXdTzMTWSmnHOgy8iLPn5mbp0VfwSjOiUwPZMsOHg1kUBv7q4mzxNjNLw53pXQFWHUJ8cvUK4im8iKuSCSLZEZc0TWvntuEl8xlRa2oBRdvlIzYgWEtRyAYtX49/E/ZzFwnsceGTn6UV/nv3gKapwVriaWJHa0lGeFRHa+aWDGpSPPArccSIDAQABGoACOgE5vcbpLpxt7d3Qu97R37xWMja2xKb+BnZIF5a04jRryjJsgdIGJEHlI61Osot3xEEL25+egU/ls6rUEoLHKVk55lA8BCBRLlXyxJWzBdW9cChJNP6hw7DMrCFShb4KVGOi0waIXz8qtsIj/RP6cCwC/qBZYOdHLlOiXC6mTNv0blQ2Cb9yfZZ1Lz855DH0l2/GMdZYXwb6JElM+u/vR7lxTp4Wc6kq/31PULDH7G+Ps+QpXxHMIqghgSWyRsJ9+SHv5yo7JxA58eTQEUXkI6RCJJQ3pSXjdveBzzPyN6ZCmjz91Np3oPh36dZtknW0UspZ6Jnpc5GLphkvG8GblSKBAQC/vcua6r6FGW0VO2yD93nWgX1qepmULYGw7lv+mfOvodPUr+8EqDZXaRzUqCHynhVfb1BDEsoxP9aLoPVFZoJbL1MqBnUx6X0FXoKu2FzqsEJYw2qnl4VLhFn7xebnR+vwv+MMYf+yvnIdcMfmrZhWmCS4hTFQlJDfxji2SPSdByqBAQC3znfJnB2xC7eDUCTSH49h/xW1YWaS6nTqXvk3LJeq4tX2WGBWxfCLh6xpNpzF31xCDdYlt+yGcy6UUBKr4TteePrWf6jY9TWJZO7FvAqIIIxaQv3a/0A4/sgzYcrr2ansWzhNtfCESxOaPFVfLE1wh/PpJBzbcltRbG/mEY3UxzKBAQCfvXhN5Pm6m1c0lCAwxVE88v5QYjlmqI7en4YG062gCbsX+0au45D6O7joNfaqUSdPLcZ5SsMmSp/sDbmpCuDZJNEtNtoWLgaZHYbUMa8fWp67onpNiz9ija4Fwnc/Ab1AAi0fGNnUyTL68gWoWcGLiw80pspR7qPPui1vN9KKqzqAASl2qg8Q6KHHwt4cdjHwbKfuozcHgdwih71XL2EC7jPed+XaieEJRfoz4PDbIQKCII3GEUjw9Kpf0WIjrhKX/IyTPgKlSbGnnywfWL3CbZ3HueGiuyFr81DoKMFujhgmQe7PpSPipx8w0Hs6oQeXNuDryloNi3T1lyQHEjcUPqqBQoABcIm6r6QyTlBactKBKEqyhkXF1tCvw7YR9herJoubM/xklWzU5J8bgSQ1h4dutlANutXFqeOInUufyPChP3inQhcirp3CccJFaMP9uevRMMhUxyOyQkpOfxnAe7hvCjRsDDZZqh5bi5siNzeIEnU1s7sq/0XvzZA7G5fGZgb+dZs=",
298*e7b1675dSTing-Kang Chang					"keyMaterialType":"ASYMMETRIC_PRIVATE"
299*e7b1675dSTing-Kang Chang				},
300*e7b1675dSTing-Kang Chang				"status":"ENABLED",
301*e7b1675dSTing-Kang Chang				"keyId":234505441,
302*e7b1675dSTing-Kang Chang				"outputPrefixType":"RAW"
303*e7b1675dSTing-Kang Chang			}]
304*e7b1675dSTing-Kang Chang		}`,
305*e7b1675dSTing-Kang Chang	},
306*e7b1675dSTing-Kang Chang	{
307*e7b1675dSTing-Kang Chang		tag: "PS256",
308*e7b1675dSTing-Kang Chang		jwkSet: `{
309*e7b1675dSTing-Kang Chang		"keys":[{
310*e7b1675dSTing-Kang Chang			"kty":"RSA",
311*e7b1675dSTing-Kang Chang			"n":"0JqDlgy_KaDpCWhaB95cKdLsyBGCbh865tHHK3LM1Iv5qlt4eqO9n2Bn5R5_ZHrMEGvVoBmwpkfnWmaMxqZg-69k8id0dN4PKeBuIYeO5C2IE3D0uO1UWzsPi4XHtXf3CYmwYOUHJ5DT8q_jgMXYCefys4OvYkRcfSpWVvFtF1PzBSijQaxDQUx0rdJvi0JZTQOXHl4MwgzrFoERTdZswAXh21MK1Uav68Aa_Z8TZU3R_qY-TX78qhBCv8T_1wrooprF_xaJqpywXktUnQxVgu-aG6-yooqrICvobc_LHdF_8R-Qp2pYfsHSmPDSKu-5JqyyIIoxfXpLdUsrDl4HDw",
312*e7b1675dSTing-Kang Chang			"e":"AQAB",
313*e7b1675dSTing-Kang Chang			"use":"sig",
314*e7b1675dSTing-Kang Chang			"alg":"PS256",
315*e7b1675dSTing-Kang Chang			"key_ops":["verify"],
316*e7b1675dSTing-Kang Chang			"kid":"a4D_hA"
317*e7b1675dSTing-Kang Chang			}]
318*e7b1675dSTing-Kang Chang		}`,
319*e7b1675dSTing-Kang Chang		privateKeyset: `{
320*e7b1675dSTing-Kang Chang			"primaryKeyId": 1803616132,
321*e7b1675dSTing-Kang Chang			"key": [
322*e7b1675dSTing-Kang Chang				{
323*e7b1675dSTing-Kang Chang					"keyData": {
324*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtRsaSsaPssPrivateKey",
325*e7b1675dSTing-Kang Chang						"value": "QoABPzsxHq7K5f91YucwaXUDk7ERgE8pqLSc8w34gEnc/wo5vk0BamvQaWRVQQdzEfK+eqVbrHmWi5mhY9QXpOv0dhuhyvo8ZS0ya60cT6DYSu2LBLDHFa68Wp6SWbIwFN4X5uGC8DYvWpJU9PCYg6XUu67T37FhGFekGHTSXDLf9Ko6gAFm7TJOM/v8MbHkCpY5NTtda7fb09XBXFDSC2XFGKvOkfQrGEKdEAvOCffpTBHsyvZAEJag/p2OZ+4W2D3upPNFkrmtS9MSGU39o0kn2fd6Cw90w5S1gjfxgWDbZpzs4AvbpU436Zy2wZYjJSIG6xbjDuYwizrflPX/sq5GUpuCuTKAAW+ovScT/DR/doxZm+xykUTTfEr2W4pd5PpLQiI1gUA2UTnY6p0svW+IbbSaj6vTE8s6+STsTGYAteUgdFBo7Ao501XbAJpJQX4ONI6o66BUvvzy0S6VLs+YQ6MWpArvNnnzRo5NbznO6IESyumWNm+8HQMaJ12sAqpWOoH4bz1xKoAB02eSVf5ZSDiYa4uF85NvvAVvEVPOPAd2gOqXzOWH+AXtTHJ8n/gcvUMnFR3W7cdZdyY2HslV0qphvkL7mCwsoOUBH5dA+F10Ebmk4hU9XEkeQvgFVgffzyqKjG521WOnAXQXudhOkJgXqGoTB/fESyRvSqA7ZKwPL1dvZnpJRv8igAH8m64q3qJFFcHWsnUb3hS58BXm8aTuk8Reju8XDXjBa9DPy5UySS0P/Chyh8HF5PAIwWSXTYDtFvdve3UN28oxTzhZ1xsz86BOeF2lFHpZ1y8/uNzwLRTIYWCXhbAS+bGpQOUR4JJDjSyivJCBqrkMCDUWAXQSqIZzHnyD+wbP8RqAAkukY+fCuoTpXOd06ASnbIsb+ZF4y++LsoulcQ//wmemVEOihJcQDgAfcL0j6HTylFG2EJJMDoLVWv6sZgrYpR1O1g97IB8KsLvyLm1JHxb9rbTDBnKSWL72NSZWPfs/Q5y5SXRxSD1gJoL/pcL5uuOosJjIvQ2olVMryYAgbnsA5UHZP7N8YpX0njZxBl9/PFNrTkWBMr15+A0VqOGh0TGnE/D4iAAduMJn1f4a3ZYVC4FgxKVxLxkB3oOLZz+QXKvs61slwRjotY3BXoKeImedOFmZoOJCA9qD+9rT01mQ113Fi9ylkBD1VGqtvIoB1CZa4tZZkRyoAeIMU7vMUpESigIiAwEAARqAAtCag5YMvymg6QloWgfeXCnS7MgRgm4fOubRxytyzNSL+apbeHqjvZ9gZ+Uef2R6zBBr1aAZsKZH51pmjMamYPuvZPIndHTeDyngbiGHjuQtiBNw9LjtVFs7D4uFx7V39wmJsGDlByeQ0/Kv44DF2Ann8rODr2JEXH0qVlbxbRdT8wUoo0GsQ0FMdK3Sb4tCWU0Dlx5eDMIM6xaBEU3WbMAF4dtTCtVGr+vAGv2fE2VN0f6mPk1+/KoQQr/E/9cK6KKaxf8WiaqcsF5LVJ0MVYLvmhuvsqKKqyAr6G3Pyx3Rf/EfkKdqWH7B0pjw0irvuSassiCKMX16S3VLKw5eBw8QAQ==",
326*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
327*e7b1675dSTing-Kang Chang					},
328*e7b1675dSTing-Kang Chang					"status": "ENABLED",
329*e7b1675dSTing-Kang Chang					"keyId": 1803616132,
330*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
331*e7b1675dSTing-Kang Chang				}
332*e7b1675dSTing-Kang Chang			]
333*e7b1675dSTing-Kang Chang		}`,
334*e7b1675dSTing-Kang Chang	},
335*e7b1675dSTing-Kang Chang	{
336*e7b1675dSTing-Kang Chang		tag: "PS384",
337*e7b1675dSTing-Kang Chang		jwkSet: `{
338*e7b1675dSTing-Kang Chang			 "keys":[{
339*e7b1675dSTing-Kang Chang				 "kty":"RSA",
340*e7b1675dSTing-Kang Chang				 "n":"rMnTRrTk3zWf0ZqukmshN9GH9UsCcD0a2WlmO-0q7x_k31JIe2wtqhlQRwszfuOJmL5M4cpsvkDBT8th5yDqzzHMJRAs61Jq6ACNepj3_0hK8GszxiyxFQL3msxmu8e3F14M-V35n9aLr0meRHk9tzm968-wvp7I_IXlv1hbzHejh_gD14gy-GjdiJYGwg1oWINL6YzSv5DISxIAv9HLu5fmBLtoVyvU9iZLHfUJdq3Rlj5iCBUEFMJVb68PfWiB_xoA7nj3vpgAfGjDzQ62bVrVaOHOg2I4X2OxJBWJ8uFw6RRocpAfD_lEZBet-w6FaMHXh_iVwxPWNuNTbVHlerfdUHTMHO2jCR1JKKkI5px7aVM7fQUVtYSBk754LINhShkMCO9o--k7sZOFL_VohaCHtE9fRxIM5MYOKPyvPTf38EyCrAqreFd4ol0FCPea8n89BwV371GrXgP5C_9BdoG2uY6rxRwTzMNiLxzxWpkvlprNRxAsdRSZPEzKOI_t",
341*e7b1675dSTing-Kang Chang				 "e":"AQAB",
342*e7b1675dSTing-Kang Chang				 "use":"sig",
343*e7b1675dSTing-Kang Chang				 "alg":"PS384",
344*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
345*e7b1675dSTing-Kang Chang				 "kid":"LFa3bw"
346*e7b1675dSTing-Kang Chang			 }]
347*e7b1675dSTing-Kang Chang		}`,
348*e7b1675dSTing-Kang Chang		privateKeyset: `{
349*e7b1675dSTing-Kang Chang			"primaryKeyId": 743880559,
350*e7b1675dSTing-Kang Chang			"key": [
351*e7b1675dSTing-Kang Chang				{
352*e7b1675dSTing-Kang Chang					"keyData": {
353*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtRsaSsaPssPrivateKey",
354*e7b1675dSTing-Kang Chang						"value": "QsABGgBRiQlPP7T0l7qjag22t5qPSbLa/PkaEnEatcxTqtJ18qo9ncTqNa7Ts851twenilUdELx+HLARFmRtmYcJuanBNMIrJ4ua/I0+rWY2rU/NwxB39x3SglT2T/wvwOx0fZAhXPNqgF6m2aGLMsppgDN6TKrvWZdC8YTC1e+ZoDlq4miBuU+NEOOsrS6Zv0SW/ZI5OxUqvGqQwaaiiy0VCsIzpJjO8GkaPntCYnA6Z1MNZTREOUcncMg2MsPEmYslOsABxBOOesQfs2aiCmt50XjN9bUvTlu/Z9z6/k327kwLpWloxZuzZWz1LMpbchnmrNvl8uj+N8qSvaIk6/Gq2y6w5TtDEdELZuuNcCkUqnnOaUJyVqkZ10PwILL0Ig+tt4GSIGlEFmdt1cL9tdU8Za/IQTkYzDQG11iG6h6llYPmj4aJxeDc/wnon5dT1pMuW93uFygwXpSkYMIvzDBQys6sUGtRbPVjNRsndRVl9w8oiF5wvEeLMtAMpAUgFxmXdC5JMsABHN4zpQrc8qsuYZa57/5gCmi4qGhECQNdsJlu7YjqjScBcRQZEK5F4pUZl2lY4zGQlClRnXUgx/g6F9FGW/ENnHebfYQ63eg2wL/EqvWBujDdYjYvs1oUBXcMFSG66VAkOYkkS8a8JnQpOfEPCkvo4/Hmz32YXjExEZWe450v8KhE4JYsaEolyoH/EoDAfG++NoIfUR6A+slyXqeQlnWK8+GMitoLKaN6EMdc31YeVsioEhn/rFfzd7p5FlLbjqBJKsABzisQA/QhytqNUWQhnhYFSs9QF+Z10ZCuUxwaSZKmD8SV4JTiHcMy7LK7RGt3Btlf76HmTNVOtTTsjXbBftVv4HDNamPmtzg1ggZi05cjPYi3STFZu3lUVAv2tJP5gdjuMe7slW+MqECUfPyz7OkJRBVAPQl0fbH/FSeSb529H6R+/1uXQ9nmXmikUFEt5PvY77li7Qyb6p67B1krBQusW0Lk2SL1Fs8Y8bj/lkjJar86sxGIGl2JNfSwajyK/waJIsAB1o1XIXWE82dw1r/TmkhY+bF4vvApYMYSz7lhsK5shZcY6VeQMXNUY/SCMTTndHzUNmbwdi4NCbnNt/vEOvmZnvQ2Q3YNphd6BLfeZxEmBcPzUMDTKXNaZBLbe8j1HUtaOHoaCfVuLhxxDT8knntNZNIJNuGhAK8YweR96qKQSDyL1zZRXBqnPZlGNnVCDVx0ijMmAmAY43IC5/XCR5h03TwbiJTQ5tG3FImoSXqA7RmwTSr1ynR4EKmRWt34uiVFGoADF4o9gu4FGlXDarpwmxkGQwUESUpJUEI65LDD0Vk71q0ZMMWUg2AXDov5UFx5zQkxx0Hx1ncN/pNy4qyaL3NgGg82OTxtajflwarFm5S4gKp4Ly3jtVWEYJDxa8D6JA4O5xuUl+qSJhEEIcLdUYXU/x/aPISklyupxSF2ze07QG1yNYV3/IadLxOWTtPlos1R0HE+x9g8JAYVC4kt2fQ6ldmZaD6h9fJORqSr6i5mdikzGw1vrJs0XaGmIxuN+C9jAS031tkD15BgK9vd6wrlT9d5C/KDJT7zJShYnNTJ2E9vRXBby7AaiOGjeRx/E67oPzdWH/8qwsLNfkS4eYLT9nbwmIMQ7pWVxcatnWKzuQuYLpCR/O2iJlaSoO76Xuy8RklES38lB2+FNzHuHtN2xAPms74WAUX+dLrIlcA7ceWwUqeF8iyXL9vmCuMmd5kHZGxUJbzVpLOkRUdcDNtc1qXm8qufzWABOUtzVnkn1CuejH/Xv9IpbuCHhQEv8o4REooDIgMBAAEagAOsydNGtOTfNZ/Rmq6SayE30Yf1SwJwPRrZaWY77SrvH+TfUkh7bC2qGVBHCzN+44mYvkzhymy+QMFPy2HnIOrPMcwlECzrUmroAI16mPf/SErwazPGLLEVAveazGa7x7cXXgz5Xfmf1ouvSZ5EeT23Ob3rz7C+nsj8heW/WFvMd6OH+APXiDL4aN2IlgbCDWhYg0vpjNK/kMhLEgC/0cu7l+YEu2hXK9T2Jksd9Ql2rdGWPmIIFQQUwlVvrw99aIH/GgDuePe+mAB8aMPNDrZtWtVo4c6DYjhfY7EkFYny4XDpFGhykB8P+URkF637DoVowdeH+JXDE9Y241NtUeV6t91QdMwc7aMJHUkoqQjmnHtpUzt9BRW1hIGTvngsg2FKGQwI72j76Tuxk4Uv9WiFoIe0T19HEgzkxg4o/K89N/fwTIKsCqt4V3iiXQUI95ryfz0HBXfvUateA/kL/0F2gba5jqvFHBPMw2IvHPFamS+Wms1HECx1FJk8TMo4j+0QAg==",
355*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
356*e7b1675dSTing-Kang Chang					},
357*e7b1675dSTing-Kang Chang					"status": "ENABLED",
358*e7b1675dSTing-Kang Chang					"keyId": 743880559,
359*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
360*e7b1675dSTing-Kang Chang				}
361*e7b1675dSTing-Kang Chang			]
362*e7b1675dSTing-Kang Chang		}`,
363*e7b1675dSTing-Kang Chang	},
364*e7b1675dSTing-Kang Chang	{
365*e7b1675dSTing-Kang Chang		tag: "PS512",
366*e7b1675dSTing-Kang Chang		jwkSet: `{
367*e7b1675dSTing-Kang Chang			"keys":[{
368*e7b1675dSTing-Kang Chang				"kty":"RSA",
369*e7b1675dSTing-Kang Chang				"n":"ubM3lgyGn8IyKO-56q18hvuJkkxPrDXgalRWNmnA3QEseglU_9tp598dlq04eF1G4Xkrmk9OVyVSCuRdvMoko6wP4Jum-3cn42_Gsk8PdTwm3WD-yEBg_Usa_omLGiTfktyqqoZhh1TeOOBtNpD1U_p1wQxP3-bLl4__uR75CqlK9FYdBrIuqLP3nqa3_OAFuPBX77BuD1kcr5pUxPZkXBNAWpnvsW56swyIMZF2GRhfv2n2bZJgT4iybQcmEnvt1wfY3ecO5ZMSX2QNKpnRRejlIEqR9uAQa4wIJMViL8jDbAV-ZvUjMM1G0aAyMHPQzb2Hfkr9OtEi-_xyUCwqF2IUZfUb0-mCjOutpbBlSfkYULOrwd9RQTaLeNe3GhRjYWTJ-gLDS8DUWz8AcpCI7xoQSfuZLmBwxslqsObMYolxQJXej1IDmGX-Rjr4ro80EpMkv67gxYQwjP8p7FMHfK7FSDZMtT-h4mO7AD68vwHd99c9ALDJfPO7tAMG53opzD7YEZU-ySKRcMBIFRe5Kxj-m1fbN9q2ictzoQOvKh8TBlCsPLRbF5WVheUtE9anKiIik5zQInihoZidH5YJksdipMVWLeRs1Qk5J8ddv7n2dlbW7zoC60sh3ubLQ_MDm-eHlXoeKGioCMjDABRdokqal4wugvQUZyQcBBtfWT0",
370*e7b1675dSTing-Kang Chang				"e":"AQAB",
371*e7b1675dSTing-Kang Chang				"use":"sig",
372*e7b1675dSTing-Kang Chang				"alg":"PS512",
373*e7b1675dSTing-Kang Chang				"key_ops":["verify"],
374*e7b1675dSTing-Kang Chang				"kid":"L-LcIw"
375*e7b1675dSTing-Kang Chang			 }]
376*e7b1675dSTing-Kang Chang		}`,
377*e7b1675dSTing-Kang Chang		privateKeyset: `{
378*e7b1675dSTing-Kang Chang			"primaryKeyId": 803396643,
379*e7b1675dSTing-Kang Chang			"key": [
380*e7b1675dSTing-Kang Chang				{
381*e7b1675dSTing-Kang Chang					"keyData": {
382*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtRsaSsaPssPrivateKey",
383*e7b1675dSTing-Kang Chang						"value": "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",
384*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
385*e7b1675dSTing-Kang Chang					},
386*e7b1675dSTing-Kang Chang					"status": "ENABLED",
387*e7b1675dSTing-Kang Chang					"keyId": 803396643,
388*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK"
389*e7b1675dSTing-Kang Chang				}
390*e7b1675dSTing-Kang Chang			]
391*e7b1675dSTing-Kang Chang		}`,
392*e7b1675dSTing-Kang Chang	},
393*e7b1675dSTing-Kang Chang	{
394*e7b1675dSTing-Kang Chang		tag: "PS256_NO_KID",
395*e7b1675dSTing-Kang Chang		jwkSet: `{
396*e7b1675dSTing-Kang Chang		"keys":[{
397*e7b1675dSTing-Kang Chang			"kty":"RSA",
398*e7b1675dSTing-Kang Chang			"n":"rzu_DRFtzFpMUy-tXC98YxtyASy-3hVtM1X9KiwAoahSfd7VfzIlIXcbn3VewkZBtKGC98sGQJSQWA-EagOjMDua4rAGVCZ9Cj011Mxy1e2j6w7qRCudtWaMormfMpP6n2ht61HkZkQDZIlbdRvr20Glf2KWgd8KgSoEZKS7AjIHvoGbJCU7A7ajbONyKuicrYq1XYs4b1dYSqQ4VIZaei5NQM7_tddYJl-lSKN3mLEPhdWKHWf1rVfDbJNobAbqN7C70rUKJS3DZkwo-q3-QOoZleJXKTXurdRAhT66nfa-1f7idmIO37LwReX8zrgDWmMZPZ2mpfA86dIlkkk89Q",
399*e7b1675dSTing-Kang Chang			"e":"AQAB",
400*e7b1675dSTing-Kang Chang			"use":"sig",
401*e7b1675dSTing-Kang Chang			"alg":"PS256",
402*e7b1675dSTing-Kang Chang			"key_ops":["verify"]
403*e7b1675dSTing-Kang Chang			}]
404*e7b1675dSTing-Kang Chang		}`,
405*e7b1675dSTing-Kang Chang		privateKeyset: `{
406*e7b1675dSTing-Kang Chang			"primaryKeyId": 1629784556,
407*e7b1675dSTing-Kang Chang			"key": [
408*e7b1675dSTing-Kang Chang				{
409*e7b1675dSTing-Kang Chang					"keyData": {
410*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtRsaSsaPssPrivateKey",
411*e7b1675dSTing-Kang Chang						"value": "QoABP9TTJpZ3lfj28Zh9hqHMNydjyJGup+Q8xjYubqsE+E3AlnSIvRDp9r0VVHZzsHBEdKtQQgCW4FT0I7Cy4z4W3ecKskuJWFYYn0PYOXLZoFo2MF3yZ0wI04aWhRS2+Zwl3BSr1eu84jiCm9rTsODyZ0MQORvpeBVaX9Y2IOPclvQ6gAGBpXDhI/1yKJq6vlymUBwKS2FG9Tf3as3YkH2B0b7wtv1Ir+WEa78ub52BwxnOKsf3V57WLnuQppLiw/bvHFxKVDNuWGiGTzEVhJW2qK3RgryXtqzkACm6cjL1FT22B9VmVx/GqWOOOLX4He1pq+UYkboWgXVkAdP0OaPv2hWIMTKAASnEMbcFq+ZbOJIJBwZXsSmrdSnfg8A2kwuatK2U2Of7/YCE5i11CUjWUvi99plk8g/mAinYu0Gfw6YSRgbWsAvK4GsIJ4322WT1yy4g6XuncL8MKC2rCYIkhFWpI1qcsS/PxU3zWMYodV6GjK31HXvqczlJfBYNEBo9HxeYDtchKoAB0vRt2QsYTMSVYw1gIDeKdHnhMDaakaIazjc4o+DCQSk+dU0EStSn8GHON0nIrEA8A5UHqF8/yh1mW+M0mkSaSiBp+7CLAowEu72wgdrymK/e6eIELH+joEDDgWpcF/WMEWSvls2a0q1atiYvC2ERLuSxSFjoJ8IRKVfVmjPi53EigAHUpqb3E/I863RAT2ocS5CnT7A8PBgttZqIyR1H8iC2bocre8H+8z8fVf4SeYsLhqvuBcTPXxZSUT+ZVf+LeELfmcd54savTU/yTQJ27s8WIkuLeTj+80FWCVtengLwP+Bte7nyzqbuXSWHUTUSVTCMK5PiBdWrOElVYlp3JxvTxRqAAgNrTEVGQYjy+xnFbKHHmGr7olwVAi1lqCGQDDZKMQH2fZOQqURH13MhdpPEL8LlKYuLejl5B+hzLaTWOqxx4TmD9Df3nMwAC0ELpDUAfz4e2quvuRD28+cR9u0G560ON53sJPbqPGVlbtaDmpn8nzvCOmczpoGmtzcBeZ/4GeEHThzq1sRE+tBJ6B4oS8R4LUtldg+FBUnZgqJvSC1gYYHO7oySCPC5V0R3EhpWDcVbYf7PyMC7oaxIPmCAu5Wc4DFirh13BAZI2FKW+Np/heZAjYUKa4Gtb0dMxvLwz3OcPPa/AQKSjko6aMRAQvjgd/UgQ+Sr496td45I4JGandESigIiAwEAARqAAq87vw0RbcxaTFMvrVwvfGMbcgEsvt4VbTNV/SosAKGoUn3e1X8yJSF3G591XsJGQbShgvfLBkCUkFgPhGoDozA7muKwBlQmfQo9NdTMctXto+sO6kQrnbVmjKK5nzKT+p9obetR5GZEA2SJW3Ub69tBpX9iloHfCoEqBGSkuwIyB76BmyQlOwO2o2zjcironK2KtV2LOG9XWEqkOFSGWnouTUDO/7XXWCZfpUijd5ixD4XVih1n9a1Xw2yTaGwG6jewu9K1CiUtw2ZMKPqt/kDqGZXiVyk17q3UQIU+up32vtX+4nZiDt+y8EXl/M64A1pjGT2dpqXwPOnSJZJJPPUQAQ==",
412*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PRIVATE"
413*e7b1675dSTing-Kang Chang					},
414*e7b1675dSTing-Kang Chang					"status": "ENABLED",
415*e7b1675dSTing-Kang Chang					"keyId": 1629784556,
416*e7b1675dSTing-Kang Chang					"outputPrefixType": "RAW"
417*e7b1675dSTing-Kang Chang				}
418*e7b1675dSTing-Kang Chang			]
419*e7b1675dSTing-Kang Chang		}`,
420*e7b1675dSTing-Kang Chang	},
421*e7b1675dSTing-Kang Chang}
422*e7b1675dSTing-Kang Chang
423*e7b1675dSTing-Kang Changfunc TestToPublicKeysetHandle(t *testing.T) {
424*e7b1675dSTing-Kang Chang	for _, tc := range jwkSetTestCases {
425*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
426*e7b1675dSTing-Kang Chang			ks, err := jwt.JWKSetToPublicKeysetHandle([]byte(tc.jwkSet))
427*e7b1675dSTing-Kang Chang			if err != nil {
428*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
429*e7b1675dSTing-Kang Chang			}
430*e7b1675dSTing-Kang Chang			jwkSet, err := jwt.JWKSetFromPublicKeysetHandle(ks)
431*e7b1675dSTing-Kang Chang			if err != nil {
432*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetFromPublicKeysetHandle() err = %v, want nil", err)
433*e7b1675dSTing-Kang Chang			}
434*e7b1675dSTing-Kang Chang			want := &spb.Struct{}
435*e7b1675dSTing-Kang Chang			if err := want.UnmarshalJSON([]byte(tc.jwkSet)); err != nil {
436*e7b1675dSTing-Kang Chang				t.Fatalf("want.UnmarshalJSON() err = %v, want nil", err)
437*e7b1675dSTing-Kang Chang			}
438*e7b1675dSTing-Kang Chang			got := &spb.Struct{}
439*e7b1675dSTing-Kang Chang			if err := got.UnmarshalJSON(jwkSet); err != nil {
440*e7b1675dSTing-Kang Chang				t.Fatalf("got.UnmarshalJSON() err = %v, want nil", err)
441*e7b1675dSTing-Kang Chang			}
442*e7b1675dSTing-Kang Chang			if !cmp.Equal(want, got, protocmp.Transform()) {
443*e7b1675dSTing-Kang Chang				t.Errorf("mismatch in jwk sets: diff (-want,+got): %v", cmp.Diff(want, got, protocmp.Transform()))
444*e7b1675dSTing-Kang Chang			}
445*e7b1675dSTing-Kang Chang		})
446*e7b1675dSTing-Kang Chang	}
447*e7b1675dSTing-Kang Chang}
448*e7b1675dSTing-Kang Chang
449*e7b1675dSTing-Kang Changfunc createKeysetHandle(key string) (*keyset.Handle, error) {
450*e7b1675dSTing-Kang Chang	ks, err := keyset.NewJSONReader(bytes.NewReader([]byte(key))).Read()
451*e7b1675dSTing-Kang Chang	if err != nil {
452*e7b1675dSTing-Kang Chang		return nil, fmt.Errorf("keyset.NewJSONReader().Read() err = %v, want nil", err)
453*e7b1675dSTing-Kang Chang	}
454*e7b1675dSTing-Kang Chang	return testkeyset.NewHandle(ks)
455*e7b1675dSTing-Kang Chang}
456*e7b1675dSTing-Kang Chang
457*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetHandleVerifyValidJWT(t *testing.T) {
458*e7b1675dSTing-Kang Chang	rawJWT, err := jwt.NewRawJWT(&jwt.RawJWTOptions{WithoutExpiration: true})
459*e7b1675dSTing-Kang Chang	if err != nil {
460*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.NewRawJWT() err = %v, want nil", err)
461*e7b1675dSTing-Kang Chang	}
462*e7b1675dSTing-Kang Chang	validator, err := jwt.NewValidator(&jwt.ValidatorOpts{AllowMissingExpiration: true})
463*e7b1675dSTing-Kang Chang	if err != nil {
464*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.NewValidator() err = %v, want nil", err)
465*e7b1675dSTing-Kang Chang	}
466*e7b1675dSTing-Kang Chang	for _, tc := range jwkSetTestCases {
467*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
468*e7b1675dSTing-Kang Chang			privateHandle, err := createKeysetHandle(tc.privateKeyset)
469*e7b1675dSTing-Kang Chang			if err != nil {
470*e7b1675dSTing-Kang Chang				t.Fatalf("createKeysetHandle() err = %v, want nil", err)
471*e7b1675dSTing-Kang Chang			}
472*e7b1675dSTing-Kang Chang			signer, err := jwt.NewSigner(privateHandle)
473*e7b1675dSTing-Kang Chang			if err != nil {
474*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.NewSigner() err = %v, want nil", err)
475*e7b1675dSTing-Kang Chang			}
476*e7b1675dSTing-Kang Chang			compact, err := signer.SignAndEncode(rawJWT)
477*e7b1675dSTing-Kang Chang			if err != nil {
478*e7b1675dSTing-Kang Chang				t.Fatalf("signer.SignAndEncode() err = %v, want nil", err)
479*e7b1675dSTing-Kang Chang			}
480*e7b1675dSTing-Kang Chang			pubHandle, err := jwt.JWKSetToPublicKeysetHandle([]byte(tc.jwkSet))
481*e7b1675dSTing-Kang Chang			if err != nil {
482*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
483*e7b1675dSTing-Kang Chang			}
484*e7b1675dSTing-Kang Chang			verifier, err := jwt.NewVerifier(pubHandle)
485*e7b1675dSTing-Kang Chang			if err != nil {
486*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.NewVerifier() err = %v, want nil", err)
487*e7b1675dSTing-Kang Chang			}
488*e7b1675dSTing-Kang Chang			if _, err := verifier.VerifyAndDecode(compact, validator); err != nil {
489*e7b1675dSTing-Kang Chang				t.Errorf("verifier.VerifyAndDecode() err = %v, want nil", err)
490*e7b1675dSTing-Kang Chang			}
491*e7b1675dSTing-Kang Chang		})
492*e7b1675dSTing-Kang Chang	}
493*e7b1675dSTing-Kang Chang}
494*e7b1675dSTing-Kang Chang
495*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetHandleInvalidJSONFails(t *testing.T) {
496*e7b1675dSTing-Kang Chang	if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(`({[}])`)); err == nil {
497*e7b1675dSTing-Kang Chang		t.Errorf("jwt.JWKSetToPublicKeysetHandle() err = nil, want error")
498*e7b1675dSTing-Kang Chang	}
499*e7b1675dSTing-Kang Chang}
500*e7b1675dSTing-Kang Chang
501*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetPrimitivePS256SmallModulusFails(t *testing.T) {
502*e7b1675dSTing-Kang Chang	jwk := `{"keys":[
503*e7b1675dSTing-Kang Chang		{"kty":"RSA",
504*e7b1675dSTing-Kang Chang		 "n":"AQAB",
505*e7b1675dSTing-Kang Chang		 "e":"AQAB",
506*e7b1675dSTing-Kang Chang		 "use":"sig",
507*e7b1675dSTing-Kang Chang		 "alg":"PS256",
508*e7b1675dSTing-Kang Chang		 "key_ops":["verify"],
509*e7b1675dSTing-Kang Chang		 "kid":"DfpE4Q"
510*e7b1675dSTing-Kang Chang		}]
511*e7b1675dSTing-Kang Chang	}`
512*e7b1675dSTing-Kang Chang	// Keys in the keyset are validated when the primitive is generated.
513*e7b1675dSTing-Kang Chang	// JWKSetToPublicKeysetHandle doesn't fail, but NewVerifier will fail.
514*e7b1675dSTing-Kang Chang	pubHandle, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwk))
515*e7b1675dSTing-Kang Chang	if err != nil {
516*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
517*e7b1675dSTing-Kang Chang	}
518*e7b1675dSTing-Kang Chang	if _, err := jwt.NewVerifier(pubHandle); err == nil {
519*e7b1675dSTing-Kang Chang		t.Errorf("jwt.NewVerifier() err = nil, want error")
520*e7b1675dSTing-Kang Chang	}
521*e7b1675dSTing-Kang Chang}
522*e7b1675dSTing-Kang Chang
523*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetPS256CorrectlySetsKID(t *testing.T) {
524*e7b1675dSTing-Kang Chang	jwkSet := `{"keys":[
525*e7b1675dSTing-Kang Chang      {"kty":"RSA",
526*e7b1675dSTing-Kang Chang       "n":"AQAB",
527*e7b1675dSTing-Kang Chang       "e":"AQAB",
528*e7b1675dSTing-Kang Chang       "use":"sig",
529*e7b1675dSTing-Kang Chang       "alg":"PS256",
530*e7b1675dSTing-Kang Chang       "key_ops":["verify"],
531*e7b1675dSTing-Kang Chang       "kid":"DfpE4Q"
532*e7b1675dSTing-Kang Chang      }]}`
533*e7b1675dSTing-Kang Chang	kh, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwkSet))
534*e7b1675dSTing-Kang Chang	if err != nil {
535*e7b1675dSTing-Kang Chang		t.Fatalf("JWKSetToPublicKeysetHandle() err = %v, want nil", err)
536*e7b1675dSTing-Kang Chang	}
537*e7b1675dSTing-Kang Chang	ks := testkeyset.KeysetMaterial(kh)
538*e7b1675dSTing-Kang Chang	key := ks.GetKey()[0]
539*e7b1675dSTing-Kang Chang	if key.GetOutputPrefixType() != tinkpb.OutputPrefixType_RAW {
540*e7b1675dSTing-Kang Chang		t.Errorf("key.GetOutputPrefixType() got %q, want %q", key.GetOutputPrefixType(), tinkpb.OutputPrefixType_RAW)
541*e7b1675dSTing-Kang Chang	}
542*e7b1675dSTing-Kang Chang	if key.GetKeyData() == nil {
543*e7b1675dSTing-Kang Chang		t.Fatalf("GetKeyData() got nil, want *tinkpb.KeyData")
544*e7b1675dSTing-Kang Chang	}
545*e7b1675dSTing-Kang Chang	pubKey := &jrpsspb.JwtRsaSsaPssPublicKey{}
546*e7b1675dSTing-Kang Chang	if err := proto.Unmarshal(key.GetKeyData().GetValue(), pubKey); err != nil {
547*e7b1675dSTing-Kang Chang		t.Fatalf("proto.Unmarshal() err = %v, want nil", err)
548*e7b1675dSTing-Kang Chang	}
549*e7b1675dSTing-Kang Chang	if pubKey.GetCustomKid().GetValue() != "DfpE4Q" {
550*e7b1675dSTing-Kang Chang		t.Errorf("pubKey.GetCustomKid().GetValue() = %q, want %q", pubKey.GetCustomKid().GetValue(), "DfpE4Q")
551*e7b1675dSTing-Kang Chang	}
552*e7b1675dSTing-Kang Chang}
553*e7b1675dSTing-Kang Chang
554*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetPS256WithoutOptionalFieldsSucceeds(t *testing.T) {
555*e7b1675dSTing-Kang Chang	jwkSet := `{"keys":[
556*e7b1675dSTing-Kang Chang      {"kty":"RSA",
557*e7b1675dSTing-Kang Chang       "n":"AQAB",
558*e7b1675dSTing-Kang Chang       "e":"AQAB",
559*e7b1675dSTing-Kang Chang       "alg":"PS256"
560*e7b1675dSTing-Kang Chang      }]}`
561*e7b1675dSTing-Kang Chang	if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwkSet)); err != nil {
562*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
563*e7b1675dSTing-Kang Chang	}
564*e7b1675dSTing-Kang Chang}
565*e7b1675dSTing-Kang Chang
566*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetInvalidPS256JWKSet(t *testing.T) {
567*e7b1675dSTing-Kang Chang	for _, tc := range []jwkSetTestCase{
568*e7b1675dSTing-Kang Chang		{
569*e7b1675dSTing-Kang Chang			tag: "PS256 without kty",
570*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
571*e7b1675dSTing-Kang Chang				{"n":"AQAB",
572*e7b1675dSTing-Kang Chang				 "e":"AQAB",
573*e7b1675dSTing-Kang Chang				 "use":"sig",
574*e7b1675dSTing-Kang Chang				 "alg":"PS256",
575*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
576*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
577*e7b1675dSTing-Kang Chang				}]
578*e7b1675dSTing-Kang Chang			}`,
579*e7b1675dSTing-Kang Chang		},
580*e7b1675dSTing-Kang Chang		{
581*e7b1675dSTing-Kang Chang			tag: "PS256 without alg",
582*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
583*e7b1675dSTing-Kang Chang				{"kty":"RSA",
584*e7b1675dSTing-Kang Chang				 "n":"AQAB",
585*e7b1675dSTing-Kang Chang				 "e":"AQAB",
586*e7b1675dSTing-Kang Chang				 "use":"sig",
587*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
588*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
589*e7b1675dSTing-Kang Chang				}]
590*e7b1675dSTing-Kang Chang			}`,
591*e7b1675dSTing-Kang Chang		},
592*e7b1675dSTing-Kang Chang		{
593*e7b1675dSTing-Kang Chang			tag: "PS256 invalid kty",
594*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
595*e7b1675dSTing-Kang Chang				{"kty":"EC",
596*e7b1675dSTing-Kang Chang				 "n":"AQAB",
597*e7b1675dSTing-Kang Chang				 "e":"AQAB",
598*e7b1675dSTing-Kang Chang				 "use":"sig",
599*e7b1675dSTing-Kang Chang				 "alg":"PS256",
600*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
601*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
602*e7b1675dSTing-Kang Chang				}]
603*e7b1675dSTing-Kang Chang			}`,
604*e7b1675dSTing-Kang Chang		},
605*e7b1675dSTing-Kang Chang		{
606*e7b1675dSTing-Kang Chang			tag: "PS256 invalid key ops",
607*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
608*e7b1675dSTing-Kang Chang				{"kty":"RSA",
609*e7b1675dSTing-Kang Chang				 "n":"AQAB",
610*e7b1675dSTing-Kang Chang				 "e":"AQAB",
611*e7b1675dSTing-Kang Chang				 "use":"sig",
612*e7b1675dSTing-Kang Chang				 "alg":"PS256",
613*e7b1675dSTing-Kang Chang				 "key_ops":["verify "],
614*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
615*e7b1675dSTing-Kang Chang				}]
616*e7b1675dSTing-Kang Chang			}`,
617*e7b1675dSTing-Kang Chang		},
618*e7b1675dSTing-Kang Chang		{
619*e7b1675dSTing-Kang Chang			tag: "PS invalid alg",
620*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
621*e7b1675dSTing-Kang Chang				{"kty":"RSA",
622*e7b1675dSTing-Kang Chang				 "n":"AQAB",
623*e7b1675dSTing-Kang Chang				 "e":"AQAB",
624*e7b1675dSTing-Kang Chang				 "use":"sig",
625*e7b1675dSTing-Kang Chang				 "alg":"PS257",
626*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
627*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
628*e7b1675dSTing-Kang Chang				}]
629*e7b1675dSTing-Kang Chang			}`,
630*e7b1675dSTing-Kang Chang		},
631*e7b1675dSTing-Kang Chang		{
632*e7b1675dSTing-Kang Chang			tag: "PS256 invalid key ops type",
633*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
634*e7b1675dSTing-Kang Chang				{"kty":"RSA",
635*e7b1675dSTing-Kang Chang				 "n":"AQAB",
636*e7b1675dSTing-Kang Chang				 "e":"AQAB",
637*e7b1675dSTing-Kang Chang				 "use":"sig",
638*e7b1675dSTing-Kang Chang				 "alg":"PS256",
639*e7b1675dSTing-Kang Chang				 "key_ops":"verify",
640*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
641*e7b1675dSTing-Kang Chang				}]
642*e7b1675dSTing-Kang Chang			}`,
643*e7b1675dSTing-Kang Chang		},
644*e7b1675dSTing-Kang Chang		{
645*e7b1675dSTing-Kang Chang			tag: "PS256 invalid use",
646*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
647*e7b1675dSTing-Kang Chang				{"kty":"RSA",
648*e7b1675dSTing-Kang Chang				 "n":"AQAB",
649*e7b1675dSTing-Kang Chang				 "e":"AQAB",
650*e7b1675dSTing-Kang Chang				 "use":"zag",
651*e7b1675dSTing-Kang Chang				 "alg":"PS256",
652*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
653*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
654*e7b1675dSTing-Kang Chang				}]
655*e7b1675dSTing-Kang Chang			}	`,
656*e7b1675dSTing-Kang Chang		},
657*e7b1675dSTing-Kang Chang		{
658*e7b1675dSTing-Kang Chang			tag: "PS256 without modulus",
659*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
660*e7b1675dSTing-Kang Chang				{"kty":"RSA",
661*e7b1675dSTing-Kang Chang				 "e":"AQAB",
662*e7b1675dSTing-Kang Chang				 "use":"sig",
663*e7b1675dSTing-Kang Chang				 "alg":"PS256",
664*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
665*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
666*e7b1675dSTing-Kang Chang				}]
667*e7b1675dSTing-Kang Chang			}`,
668*e7b1675dSTing-Kang Chang		},
669*e7b1675dSTing-Kang Chang		{
670*e7b1675dSTing-Kang Chang			tag: "PSS256 without exponent",
671*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
672*e7b1675dSTing-Kang Chang				{"kty":"RSA",
673*e7b1675dSTing-Kang Chang				 "n":"AQAB",
674*e7b1675dSTing-Kang Chang				 "use":"sig",
675*e7b1675dSTing-Kang Chang				 "alg":"PS256",
676*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
677*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
678*e7b1675dSTing-Kang Chang				}]
679*e7b1675dSTing-Kang Chang			}`,
680*e7b1675dSTing-Kang Chang		},
681*e7b1675dSTing-Kang Chang	} {
682*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
683*e7b1675dSTing-Kang Chang			if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(tc.jwkSet)); err == nil {
684*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = nil, want error")
685*e7b1675dSTing-Kang Chang			}
686*e7b1675dSTing-Kang Chang		})
687*e7b1675dSTing-Kang Chang	}
688*e7b1675dSTing-Kang Chang}
689*e7b1675dSTing-Kang Chang
690*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetPrimitiveRS256SmallModulusFails(t *testing.T) {
691*e7b1675dSTing-Kang Chang	jwk := `{"keys":[
692*e7b1675dSTing-Kang Chang		{"kty":"RSA",
693*e7b1675dSTing-Kang Chang		 "n":"AQAB",
694*e7b1675dSTing-Kang Chang		 "e":"AQAB",
695*e7b1675dSTing-Kang Chang		 "use":"sig",
696*e7b1675dSTing-Kang Chang		 "alg":"RS256",
697*e7b1675dSTing-Kang Chang		 "key_ops":["verify"],
698*e7b1675dSTing-Kang Chang		 "kid":"DfpE4Q"
699*e7b1675dSTing-Kang Chang		}]
700*e7b1675dSTing-Kang Chang	}`
701*e7b1675dSTing-Kang Chang	// Keys in the keyset are validated when the primitive is generated.
702*e7b1675dSTing-Kang Chang	// JWKSetToPublicKeysetHandle but NewVerifier will fail.
703*e7b1675dSTing-Kang Chang	pubHandle, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwk))
704*e7b1675dSTing-Kang Chang	if err != nil {
705*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
706*e7b1675dSTing-Kang Chang	}
707*e7b1675dSTing-Kang Chang	if _, err := jwt.NewVerifier(pubHandle); err == nil {
708*e7b1675dSTing-Kang Chang		t.Errorf("jwt.NewVerifier() err = nil, want error")
709*e7b1675dSTing-Kang Chang	}
710*e7b1675dSTing-Kang Chang}
711*e7b1675dSTing-Kang Chang
712*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetRS256CorrectlySetsKID(t *testing.T) {
713*e7b1675dSTing-Kang Chang	jwkSet := `{"keys":[
714*e7b1675dSTing-Kang Chang      {"kty":"RSA",
715*e7b1675dSTing-Kang Chang       "n":"AQAB",
716*e7b1675dSTing-Kang Chang       "e":"AQAB",
717*e7b1675dSTing-Kang Chang       "use":"sig",
718*e7b1675dSTing-Kang Chang       "alg":"RS256",
719*e7b1675dSTing-Kang Chang       "key_ops":["verify"],
720*e7b1675dSTing-Kang Chang       "kid":"DfpE4Q"
721*e7b1675dSTing-Kang Chang      }]}`
722*e7b1675dSTing-Kang Chang	kh, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwkSet))
723*e7b1675dSTing-Kang Chang	if err != nil {
724*e7b1675dSTing-Kang Chang		t.Fatalf("JWKSetToPublicKeysetHandle() err = %v, want nil", err)
725*e7b1675dSTing-Kang Chang	}
726*e7b1675dSTing-Kang Chang	ks := testkeyset.KeysetMaterial(kh)
727*e7b1675dSTing-Kang Chang	key := ks.GetKey()[0]
728*e7b1675dSTing-Kang Chang	if key.GetOutputPrefixType() != tinkpb.OutputPrefixType_RAW {
729*e7b1675dSTing-Kang Chang		t.Errorf("key.GetOutputPrefixType() got %q, want %q", key.GetOutputPrefixType(), tinkpb.OutputPrefixType_RAW)
730*e7b1675dSTing-Kang Chang	}
731*e7b1675dSTing-Kang Chang	if key.GetKeyData() == nil {
732*e7b1675dSTing-Kang Chang		t.Fatalf("GetKeyData() got nil, want *tinkpb.KeyData")
733*e7b1675dSTing-Kang Chang	}
734*e7b1675dSTing-Kang Chang	pubKey := &jrsppb.JwtRsaSsaPkcs1PublicKey{}
735*e7b1675dSTing-Kang Chang	if err := proto.Unmarshal(key.GetKeyData().GetValue(), pubKey); err != nil {
736*e7b1675dSTing-Kang Chang		t.Fatalf("proto.Unmarshal() err = %v, want nil", err)
737*e7b1675dSTing-Kang Chang	}
738*e7b1675dSTing-Kang Chang	if pubKey.GetCustomKid().GetValue() != "DfpE4Q" {
739*e7b1675dSTing-Kang Chang		t.Errorf("pubKey.GetCustomKid().GetValue() = %q, want %q", pubKey.GetCustomKid().GetValue(), "DfpE4Q")
740*e7b1675dSTing-Kang Chang	}
741*e7b1675dSTing-Kang Chang}
742*e7b1675dSTing-Kang Chang
743*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetRS256WithoutOptionalFieldsSucceeds(t *testing.T) {
744*e7b1675dSTing-Kang Chang	jwkSet := `{"keys":[
745*e7b1675dSTing-Kang Chang      {"kty":"RSA",
746*e7b1675dSTing-Kang Chang       "n":"AQAB",
747*e7b1675dSTing-Kang Chang       "e":"AQAB",
748*e7b1675dSTing-Kang Chang       "alg":"RS256"
749*e7b1675dSTing-Kang Chang      }]}`
750*e7b1675dSTing-Kang Chang	if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwkSet)); err != nil {
751*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
752*e7b1675dSTing-Kang Chang	}
753*e7b1675dSTing-Kang Chang}
754*e7b1675dSTing-Kang Chang
755*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetInvalidRS256JWKSet(t *testing.T) {
756*e7b1675dSTing-Kang Chang	for _, tc := range []jwkSetTestCase{
757*e7b1675dSTing-Kang Chang		{
758*e7b1675dSTing-Kang Chang			tag: "RS256 without kty",
759*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
760*e7b1675dSTing-Kang Chang				{"n":"AQAB",
761*e7b1675dSTing-Kang Chang				 "e":"AQAB",
762*e7b1675dSTing-Kang Chang				 "use":"sig",
763*e7b1675dSTing-Kang Chang				 "alg":"RS256",
764*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
765*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
766*e7b1675dSTing-Kang Chang				}]
767*e7b1675dSTing-Kang Chang			}`,
768*e7b1675dSTing-Kang Chang		},
769*e7b1675dSTing-Kang Chang		{
770*e7b1675dSTing-Kang Chang			tag: "RS256 without alg",
771*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
772*e7b1675dSTing-Kang Chang				{"kty":"RSA",
773*e7b1675dSTing-Kang Chang				 "n":"AQAB",
774*e7b1675dSTing-Kang Chang				 "e":"AQAB",
775*e7b1675dSTing-Kang Chang				 "use":"sig",
776*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
777*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
778*e7b1675dSTing-Kang Chang				}]
779*e7b1675dSTing-Kang Chang			}`,
780*e7b1675dSTing-Kang Chang		},
781*e7b1675dSTing-Kang Chang		{
782*e7b1675dSTing-Kang Chang			tag: "RS256 invalid kty",
783*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
784*e7b1675dSTing-Kang Chang				{"kty":"EC",
785*e7b1675dSTing-Kang Chang				 "n":"AQAB",
786*e7b1675dSTing-Kang Chang				 "e":"AQAB",
787*e7b1675dSTing-Kang Chang				 "use":"sig",
788*e7b1675dSTing-Kang Chang				 "alg":"RS256",
789*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
790*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
791*e7b1675dSTing-Kang Chang				}]
792*e7b1675dSTing-Kang Chang			}`,
793*e7b1675dSTing-Kang Chang		},
794*e7b1675dSTing-Kang Chang		{
795*e7b1675dSTing-Kang Chang			tag: "RS256 invalid key ops",
796*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
797*e7b1675dSTing-Kang Chang				{"kty":"RSA",
798*e7b1675dSTing-Kang Chang				 "n":"AQAB",
799*e7b1675dSTing-Kang Chang				 "e":"AQAB",
800*e7b1675dSTing-Kang Chang				 "use":"sig",
801*e7b1675dSTing-Kang Chang				 "alg":"RS256",
802*e7b1675dSTing-Kang Chang				 "key_ops":["verify "],
803*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
804*e7b1675dSTing-Kang Chang				}]
805*e7b1675dSTing-Kang Chang			}`,
806*e7b1675dSTing-Kang Chang		},
807*e7b1675dSTing-Kang Chang		{
808*e7b1675dSTing-Kang Chang			tag: "RS invalid alg",
809*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
810*e7b1675dSTing-Kang Chang				{"kty":"RSA",
811*e7b1675dSTing-Kang Chang				 "n":"AQAB",
812*e7b1675dSTing-Kang Chang				 "e":"AQAB",
813*e7b1675dSTing-Kang Chang				 "use":"sig",
814*e7b1675dSTing-Kang Chang				 "alg":"RS257",
815*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
816*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
817*e7b1675dSTing-Kang Chang				}]
818*e7b1675dSTing-Kang Chang			}`,
819*e7b1675dSTing-Kang Chang		},
820*e7b1675dSTing-Kang Chang		{
821*e7b1675dSTing-Kang Chang			tag: "RS256 invalid key ops type",
822*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
823*e7b1675dSTing-Kang Chang				{"kty":"RSA",
824*e7b1675dSTing-Kang Chang				 "n":"AQAB",
825*e7b1675dSTing-Kang Chang				 "e":"AQAB",
826*e7b1675dSTing-Kang Chang				 "use":"sig",
827*e7b1675dSTing-Kang Chang				 "alg":"RS256",
828*e7b1675dSTing-Kang Chang				 "key_ops":"verify",
829*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
830*e7b1675dSTing-Kang Chang				}]
831*e7b1675dSTing-Kang Chang			}`,
832*e7b1675dSTing-Kang Chang		},
833*e7b1675dSTing-Kang Chang		{
834*e7b1675dSTing-Kang Chang			tag: "RS256 invalid use",
835*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
836*e7b1675dSTing-Kang Chang				{"kty":"RSA",
837*e7b1675dSTing-Kang Chang				 "n":"AQAB",
838*e7b1675dSTing-Kang Chang				 "e":"AQAB",
839*e7b1675dSTing-Kang Chang				 "use":"zag",
840*e7b1675dSTing-Kang Chang				 "alg":"RS256",
841*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
842*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
843*e7b1675dSTing-Kang Chang				}]
844*e7b1675dSTing-Kang Chang			}	`,
845*e7b1675dSTing-Kang Chang		},
846*e7b1675dSTing-Kang Chang		{
847*e7b1675dSTing-Kang Chang			tag: "RS256 without modulus",
848*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
849*e7b1675dSTing-Kang Chang				{"kty":"RSA",
850*e7b1675dSTing-Kang Chang				 "e":"AQAB",
851*e7b1675dSTing-Kang Chang				 "use":"sig",
852*e7b1675dSTing-Kang Chang				 "alg":"RS256",
853*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
854*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
855*e7b1675dSTing-Kang Chang				}]
856*e7b1675dSTing-Kang Chang			}`,
857*e7b1675dSTing-Kang Chang		},
858*e7b1675dSTing-Kang Chang		{
859*e7b1675dSTing-Kang Chang			tag: "RSS256 without exponent",
860*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[
861*e7b1675dSTing-Kang Chang				{"kty":"RSA",
862*e7b1675dSTing-Kang Chang				 "n":"AQAB",
863*e7b1675dSTing-Kang Chang				 "use":"sig",
864*e7b1675dSTing-Kang Chang				 "alg":"RS256",
865*e7b1675dSTing-Kang Chang				 "key_ops":["verify"],
866*e7b1675dSTing-Kang Chang				 "kid":"DfpE4Q"
867*e7b1675dSTing-Kang Chang				}]
868*e7b1675dSTing-Kang Chang			}`,
869*e7b1675dSTing-Kang Chang		},
870*e7b1675dSTing-Kang Chang	} {
871*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
872*e7b1675dSTing-Kang Chang			if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(tc.jwkSet)); err == nil {
873*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = nil, want error")
874*e7b1675dSTing-Kang Chang			}
875*e7b1675dSTing-Kang Chang		})
876*e7b1675dSTing-Kang Chang	}
877*e7b1675dSTing-Kang Chang}
878*e7b1675dSTing-Kang Chang
879*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetES256WithSmallXPrimitiveFails(t *testing.T) {
880*e7b1675dSTing-Kang Chang	jwk := `{
881*e7b1675dSTing-Kang Chang    "keys":[{
882*e7b1675dSTing-Kang Chang    "kty":"EC",
883*e7b1675dSTing-Kang Chang    "crv":"P-256",
884*e7b1675dSTing-Kang Chang    "x":"wO6uIxh8Sk",
885*e7b1675dSTing-Kang Chang    "y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
886*e7b1675dSTing-Kang Chang    "use":"sig","alg":"ES256","key_ops":["verify"]}],
887*e7b1675dSTing-Kang Chang    "kid":"EhuduQ"
888*e7b1675dSTing-Kang Chang  }`
889*e7b1675dSTing-Kang Chang	// Keys in the keyset are validated when the primitive is generated.
890*e7b1675dSTing-Kang Chang	// JWKSetToPublicKeysetHandle but NewVerifier will fail.
891*e7b1675dSTing-Kang Chang	pubHandle, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwk))
892*e7b1675dSTing-Kang Chang	if err != nil {
893*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
894*e7b1675dSTing-Kang Chang	}
895*e7b1675dSTing-Kang Chang	if _, err := jwt.NewVerifier(pubHandle); err == nil {
896*e7b1675dSTing-Kang Chang		t.Errorf("jwt.NewVerifier() err = nil, want error")
897*e7b1675dSTing-Kang Chang	}
898*e7b1675dSTing-Kang Chang}
899*e7b1675dSTing-Kang Chang
900*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetES256WithSmallYFails(t *testing.T) {
901*e7b1675dSTing-Kang Chang	jwk := `{
902*e7b1675dSTing-Kang Chang    "keys":[{
903*e7b1675dSTing-Kang Chang    "kty":"EC",
904*e7b1675dSTing-Kang Chang    "crv":"P-256",
905*e7b1675dSTing-Kang Chang    "x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
906*e7b1675dSTing-Kang Chang    "y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB27",
907*e7b1675dSTing-Kang Chang    "use":"sig","alg":"ES256","key_ops":["verify"]}],
908*e7b1675dSTing-Kang Chang    "kid":"EhuduQ"
909*e7b1675dSTing-Kang Chang  }`
910*e7b1675dSTing-Kang Chang	// Keys in the keyset are validated when the primitive is generated.
911*e7b1675dSTing-Kang Chang	// JWKSetToPublicKeysetHandle but NewVerifier will fail.
912*e7b1675dSTing-Kang Chang	pubHandle, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwk))
913*e7b1675dSTing-Kang Chang	if err != nil {
914*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
915*e7b1675dSTing-Kang Chang	}
916*e7b1675dSTing-Kang Chang	if _, err := jwt.NewVerifier(pubHandle); err == nil {
917*e7b1675dSTing-Kang Chang		t.Errorf("jwt.NewVerifier() err = nil, want error")
918*e7b1675dSTing-Kang Chang	}
919*e7b1675dSTing-Kang Chang}
920*e7b1675dSTing-Kang Chang
921*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetES256CorrectlySetsKID(t *testing.T) {
922*e7b1675dSTing-Kang Chang	jwk := `{
923*e7b1675dSTing-Kang Chang    "keys":[{
924*e7b1675dSTing-Kang Chang    "kty":"EC",
925*e7b1675dSTing-Kang Chang    "crv":"P-256",
926*e7b1675dSTing-Kang Chang    "x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
927*e7b1675dSTing-Kang Chang    "y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
928*e7b1675dSTing-Kang Chang    "use":"sig","alg":"ES256","key_ops":["verify"],
929*e7b1675dSTing-Kang Chang    "kid":"EhuduQ"}]
930*e7b1675dSTing-Kang Chang  }`
931*e7b1675dSTing-Kang Chang	pubHandle, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwk))
932*e7b1675dSTing-Kang Chang	if err != nil {
933*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
934*e7b1675dSTing-Kang Chang	}
935*e7b1675dSTing-Kang Chang	ks := testkeyset.KeysetMaterial(pubHandle)
936*e7b1675dSTing-Kang Chang
937*e7b1675dSTing-Kang Chang	if len(ks.GetKey()) != 1 {
938*e7b1675dSTing-Kang Chang		t.Errorf("len(ks.GetKey()) got %d keys, want 1", len(ks.GetKey()))
939*e7b1675dSTing-Kang Chang	}
940*e7b1675dSTing-Kang Chang	key := ks.GetKey()[0]
941*e7b1675dSTing-Kang Chang	if key.GetOutputPrefixType() != tinkpb.OutputPrefixType_RAW {
942*e7b1675dSTing-Kang Chang		t.Errorf("key.GetOutputPrefixType() got %q, want %q", key.GetOutputPrefixType(), tinkpb.OutputPrefixType_RAW)
943*e7b1675dSTing-Kang Chang	}
944*e7b1675dSTing-Kang Chang	if key.GetKeyData() == nil {
945*e7b1675dSTing-Kang Chang		t.Fatalf("invalid key")
946*e7b1675dSTing-Kang Chang	}
947*e7b1675dSTing-Kang Chang	pubKey := &jepb.JwtEcdsaPublicKey{}
948*e7b1675dSTing-Kang Chang	if err := proto.Unmarshal(key.GetKeyData().GetValue(), pubKey); err != nil {
949*e7b1675dSTing-Kang Chang		t.Fatalf("proto.Unmarshal(key.GetKeyData(), pubKey) err = %v, want nil", err)
950*e7b1675dSTing-Kang Chang	}
951*e7b1675dSTing-Kang Chang	if pubKey.GetCustomKid().GetValue() != "EhuduQ" {
952*e7b1675dSTing-Kang Chang		t.Errorf("key.GetCustomKid() got %q, want EhuduQ", pubKey.GetCustomKid())
953*e7b1675dSTing-Kang Chang	}
954*e7b1675dSTing-Kang Chang}
955*e7b1675dSTing-Kang Chang
956*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetES256WithoutOptionalFieldsSucceeds(t *testing.T) {
957*e7b1675dSTing-Kang Chang	jwk := `{
958*e7b1675dSTing-Kang Chang    "keys":[{
959*e7b1675dSTing-Kang Chang    "kty":"EC",
960*e7b1675dSTing-Kang Chang    "crv":"P-256",
961*e7b1675dSTing-Kang Chang    "x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
962*e7b1675dSTing-Kang Chang    "y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
963*e7b1675dSTing-Kang Chang    "alg":"ES256"}]
964*e7b1675dSTing-Kang Chang  }`
965*e7b1675dSTing-Kang Chang	if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(jwk)); err != nil {
966*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = %v, want nil", err)
967*e7b1675dSTing-Kang Chang	}
968*e7b1675dSTing-Kang Chang}
969*e7b1675dSTing-Kang Chang
970*e7b1675dSTing-Kang Changfunc TestJWKSetToPublicKeysetInvalidES256PublicKeys(t *testing.T) {
971*e7b1675dSTing-Kang Chang	for _, tc := range []jwkSetTestCase{
972*e7b1675dSTing-Kang Chang		{
973*e7b1675dSTing-Kang Chang			tag:    "jwk set is not a json",
974*e7b1675dSTing-Kang Chang			jwkSet: `5`,
975*e7b1675dSTing-Kang Chang		},
976*e7b1675dSTing-Kang Chang		{
977*e7b1675dSTing-Kang Chang			tag:    "empty jwk set",
978*e7b1675dSTing-Kang Chang			jwkSet: `{}`,
979*e7b1675dSTing-Kang Chang		},
980*e7b1675dSTing-Kang Chang		{
981*e7b1675dSTing-Kang Chang			tag:    "no keys in jwk set",
982*e7b1675dSTing-Kang Chang			jwkSet: `{"keys": []}`,
983*e7b1675dSTing-Kang Chang		},
984*e7b1675dSTing-Kang Chang		{
985*e7b1675dSTing-Kang Chang			tag:    "keys of wrong type in jwk set",
986*e7b1675dSTing-Kang Chang			jwkSet: `{"keys": "value"}`,
987*e7b1675dSTing-Kang Chang		},
988*e7b1675dSTing-Kang Chang		{
989*e7b1675dSTing-Kang Chang			tag:    "keys not a json object",
990*e7b1675dSTing-Kang Chang			jwkSet: `{"keys":[1]}`,
991*e7b1675dSTing-Kang Chang		},
992*e7b1675dSTing-Kang Chang		{
993*e7b1675dSTing-Kang Chang			tag: "without kty",
994*e7b1675dSTing-Kang Chang			jwkSet: `{
995*e7b1675dSTing-Kang Chang				"keys":[{
996*e7b1675dSTing-Kang Chang				"crv":"P-256",
997*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
998*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
999*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":["verify"],
1000*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1001*e7b1675dSTing-Kang Chang			}`,
1002*e7b1675dSTing-Kang Chang		},
1003*e7b1675dSTing-Kang Chang		{
1004*e7b1675dSTing-Kang Chang			tag: "without algorithm",
1005*e7b1675dSTing-Kang Chang			jwkSet: `{
1006*e7b1675dSTing-Kang Chang				"keys":[{
1007*e7b1675dSTing-Kang Chang				"kty":"EC",
1008*e7b1675dSTing-Kang Chang				"crv":"P-256",
1009*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1010*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1011*e7b1675dSTing-Kang Chang				"use":"sig","key_ops":["verify"],
1012*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1013*e7b1675dSTing-Kang Chang			}`,
1014*e7b1675dSTing-Kang Chang		},
1015*e7b1675dSTing-Kang Chang		{
1016*e7b1675dSTing-Kang Chang			tag: "empty algorithm",
1017*e7b1675dSTing-Kang Chang			jwkSet: `{
1018*e7b1675dSTing-Kang Chang				"keys":[{
1019*e7b1675dSTing-Kang Chang				"kty":"EC",
1020*e7b1675dSTing-Kang Chang				"crv":"P-256",
1021*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1022*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1023*e7b1675dSTing-Kang Chang				"use":"sig", "alg":"", "key_ops":["verify"],
1024*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1025*e7b1675dSTing-Kang Chang			}`,
1026*e7b1675dSTing-Kang Chang		},
1027*e7b1675dSTing-Kang Chang		{
1028*e7b1675dSTing-Kang Chang			tag: "invalid algorthm prefix",
1029*e7b1675dSTing-Kang Chang			jwkSet: `{
1030*e7b1675dSTing-Kang Chang				"keys":[{
1031*e7b1675dSTing-Kang Chang				"kty":"EC",
1032*e7b1675dSTing-Kang Chang				"crv":"P-256",
1033*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1034*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1035*e7b1675dSTing-Kang Chang				"use":"sig", "alg":"SS256", "key_ops":["verify"],
1036*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1037*e7b1675dSTing-Kang Chang			}`,
1038*e7b1675dSTing-Kang Chang		},
1039*e7b1675dSTing-Kang Chang		{
1040*e7b1675dSTing-Kang Chang			tag: "invalid algorithm",
1041*e7b1675dSTing-Kang Chang			jwkSet: `{
1042*e7b1675dSTing-Kang Chang				"keys":[{
1043*e7b1675dSTing-Kang Chang				"kty":"EC",
1044*e7b1675dSTing-Kang Chang				"crv":"P-256",
1045*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1046*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1047*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES257","key_ops":["verify"],
1048*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1049*e7b1675dSTing-Kang Chang			}`,
1050*e7b1675dSTing-Kang Chang		},
1051*e7b1675dSTing-Kang Chang		{
1052*e7b1675dSTing-Kang Chang			tag: "algorithm not a string",
1053*e7b1675dSTing-Kang Chang			jwkSet: `{
1054*e7b1675dSTing-Kang Chang				"keys":[{
1055*e7b1675dSTing-Kang Chang				"kty":"EC",
1056*e7b1675dSTing-Kang Chang				"crv":"P-256",
1057*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1058*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1059*e7b1675dSTing-Kang Chang				"use":"sig","alg":256,"key_ops":["verify"],
1060*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1061*e7b1675dSTing-Kang Chang			}`,
1062*e7b1675dSTing-Kang Chang		},
1063*e7b1675dSTing-Kang Chang		{
1064*e7b1675dSTing-Kang Chang			tag: "invalid curve and algorithm",
1065*e7b1675dSTing-Kang Chang			jwkSet: `{
1066*e7b1675dSTing-Kang Chang				"keys":[{
1067*e7b1675dSTing-Kang Chang				"kty":"EC",
1068*e7b1675dSTing-Kang Chang				"crv":"P-384",
1069*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1070*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1071*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES512","key_ops":["verify"],
1072*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1073*e7b1675dSTing-Kang Chang			}`,
1074*e7b1675dSTing-Kang Chang		},
1075*e7b1675dSTing-Kang Chang		{
1076*e7b1675dSTing-Kang Chang			tag: "without curve",
1077*e7b1675dSTing-Kang Chang			jwkSet: `{
1078*e7b1675dSTing-Kang Chang				"keys":[{
1079*e7b1675dSTing-Kang Chang				"kty":"EC",
1080*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1081*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1082*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES512","key_ops":["verify"],
1083*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1084*e7b1675dSTing-Kang Chang			}`,
1085*e7b1675dSTing-Kang Chang		},
1086*e7b1675dSTing-Kang Chang		{
1087*e7b1675dSTing-Kang Chang			tag: "invalid key ops",
1088*e7b1675dSTing-Kang Chang			jwkSet: `{
1089*e7b1675dSTing-Kang Chang				"keys":[{
1090*e7b1675dSTing-Kang Chang				"kty":"EC",
1091*e7b1675dSTing-Kang Chang				"crv":"P-256",
1092*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1093*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1094*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":["verify "],
1095*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1096*e7b1675dSTing-Kang Chang			}`,
1097*e7b1675dSTing-Kang Chang		},
1098*e7b1675dSTing-Kang Chang		{
1099*e7b1675dSTing-Kang Chang			tag: "multiple key ops",
1100*e7b1675dSTing-Kang Chang			jwkSet: `{
1101*e7b1675dSTing-Kang Chang				"keys":[{
1102*e7b1675dSTing-Kang Chang				"kty":"EC",
1103*e7b1675dSTing-Kang Chang				"crv":"P-256",
1104*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1105*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1106*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":["verify", "sign"],
1107*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1108*e7b1675dSTing-Kang Chang			}`,
1109*e7b1675dSTing-Kang Chang		},
1110*e7b1675dSTing-Kang Chang		{
1111*e7b1675dSTing-Kang Chang			tag: "invalid key ops type",
1112*e7b1675dSTing-Kang Chang			jwkSet: `{
1113*e7b1675dSTing-Kang Chang				"keys":[{
1114*e7b1675dSTing-Kang Chang				"kty":"EC",
1115*e7b1675dSTing-Kang Chang				"crv":"P-256",
1116*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1117*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1118*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":"verify",
1119*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1120*e7b1675dSTing-Kang Chang			}`,
1121*e7b1675dSTing-Kang Chang		},
1122*e7b1675dSTing-Kang Chang		{
1123*e7b1675dSTing-Kang Chang			tag: "invalid key ops type inside list",
1124*e7b1675dSTing-Kang Chang			jwkSet: `{
1125*e7b1675dSTing-Kang Chang				"keys":[{
1126*e7b1675dSTing-Kang Chang				"kty":"EC",
1127*e7b1675dSTing-Kang Chang				"crv":"P-256",
1128*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1129*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1130*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":[1],
1131*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1132*e7b1675dSTing-Kang Chang			}`,
1133*e7b1675dSTing-Kang Chang		},
1134*e7b1675dSTing-Kang Chang		{
1135*e7b1675dSTing-Kang Chang			tag: "invalid use",
1136*e7b1675dSTing-Kang Chang			jwkSet: `{
1137*e7b1675dSTing-Kang Chang				"keys":[{
1138*e7b1675dSTing-Kang Chang				"kty":"EC",
1139*e7b1675dSTing-Kang Chang				"crv":"P-256",
1140*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1141*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1142*e7b1675dSTing-Kang Chang				"use":"zag","alg":"ES256","key_ops":["verify"],
1143*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1144*e7b1675dSTing-Kang Chang			}`,
1145*e7b1675dSTing-Kang Chang		},
1146*e7b1675dSTing-Kang Chang		{
1147*e7b1675dSTing-Kang Chang			tag: "without x coordinate",
1148*e7b1675dSTing-Kang Chang			jwkSet: `{
1149*e7b1675dSTing-Kang Chang				"keys":[{
1150*e7b1675dSTing-Kang Chang				"kty":"EC",
1151*e7b1675dSTing-Kang Chang				"crv":"P-256",
1152*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1153*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":["verify"],
1154*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1155*e7b1675dSTing-Kang Chang			}`,
1156*e7b1675dSTing-Kang Chang		},
1157*e7b1675dSTing-Kang Chang		{
1158*e7b1675dSTing-Kang Chang			tag: "without y coordinate",
1159*e7b1675dSTing-Kang Chang			jwkSet: `{
1160*e7b1675dSTing-Kang Chang				"keys":[{
1161*e7b1675dSTing-Kang Chang				"kty":"EC",
1162*e7b1675dSTing-Kang Chang				"crv":"P-256",
1163*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1164*e7b1675dSTing-Kang Chang				"use":"sig","alg":"ES256","key_ops":["verify"],
1165*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1166*e7b1675dSTing-Kang Chang			}`,
1167*e7b1675dSTing-Kang Chang		},
1168*e7b1675dSTing-Kang Chang		{
1169*e7b1675dSTing-Kang Chang			tag: "kid of invalid type",
1170*e7b1675dSTing-Kang Chang			jwkSet: `{
1171*e7b1675dSTing-Kang Chang			"keys":[{
1172*e7b1675dSTing-Kang Chang			"kty":"EC",
1173*e7b1675dSTing-Kang Chang			"crv":"P-256",
1174*e7b1675dSTing-Kang Chang			"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1175*e7b1675dSTing-Kang Chang			"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1176*e7b1675dSTing-Kang Chang			"use":"sig","alg":"ES256","key_ops":["verify"],
1177*e7b1675dSTing-Kang Chang			"kid":5}]
1178*e7b1675dSTing-Kang Chang			}`,
1179*e7b1675dSTing-Kang Chang		},
1180*e7b1675dSTing-Kang Chang		{
1181*e7b1675dSTing-Kang Chang			tag: "with private key",
1182*e7b1675dSTing-Kang Chang			jwkSet: `{
1183*e7b1675dSTing-Kang Chang				"keys":[{
1184*e7b1675dSTing-Kang Chang				"kty":"EC",
1185*e7b1675dSTing-Kang Chang				"crv":"P-256",
1186*e7b1675dSTing-Kang Chang				"alg":"ES256",
1187*e7b1675dSTing-Kang Chang				"x":"SVqB4JcUD6lsfvqMr-OKUNUphdNn64Eay60978ZlL74",
1188*e7b1675dSTing-Kang Chang				"y":"lf0u0pMj4lGAzZix5u4Cm5CMQIgMNpkwy163wtKYVKI",
1189*e7b1675dSTing-Kang Chang				"d":"0g5vAEKzugrXaRbgKG0Tj2qJ5lMP4Bezds1_sTybkfk"
1190*e7b1675dSTing-Kang Chang				}]
1191*e7b1675dSTing-Kang Chang			}`,
1192*e7b1675dSTing-Kang Chang		},
1193*e7b1675dSTing-Kang Chang	} {
1194*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
1195*e7b1675dSTing-Kang Chang			if _, err := jwt.JWKSetToPublicKeysetHandle([]byte(tc.jwkSet)); err == nil {
1196*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetToPublicKeysetHandle() err = nil, want error")
1197*e7b1675dSTing-Kang Chang			}
1198*e7b1675dSTing-Kang Chang		})
1199*e7b1675dSTing-Kang Chang	}
1200*e7b1675dSTing-Kang Chang}
1201*e7b1675dSTing-Kang Chang
1202*e7b1675dSTing-Kang Changfunc TestJWKSetFromPublicKeysetNonEnabledKeysAreIgnored(t *testing.T) {
1203*e7b1675dSTing-Kang Chang	key := `{
1204*e7b1675dSTing-Kang Chang      "primaryKeyId": 303799737,
1205*e7b1675dSTing-Kang Chang      "key": [
1206*e7b1675dSTing-Kang Chang          {
1207*e7b1675dSTing-Kang Chang              "keyId": 303799737,
1208*e7b1675dSTing-Kang Chang              "status": "DISABLED",
1209*e7b1675dSTing-Kang Chang              "outputPrefixType": "TINK",
1210*e7b1675dSTing-Kang Chang              "keyData": {
1211*e7b1675dSTing-Kang Chang                  "typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPublicKey",
1212*e7b1675dSTing-Kang Chang                  "keyMaterialType": "ASYMMETRIC_PUBLIC",
1213*e7b1675dSTing-Kang Chang                  "value": "IiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ=="
1214*e7b1675dSTing-Kang Chang              }
1215*e7b1675dSTing-Kang Chang          }
1216*e7b1675dSTing-Kang Chang      ]
1217*e7b1675dSTing-Kang Chang  }`
1218*e7b1675dSTing-Kang Chang	handle, err := createKeysetHandle(key)
1219*e7b1675dSTing-Kang Chang	if err != nil {
1220*e7b1675dSTing-Kang Chang		t.Fatalf("createKeysetHandle() err = %v, want nil", err)
1221*e7b1675dSTing-Kang Chang	}
1222*e7b1675dSTing-Kang Chang	jwkSet, err := jwt.JWKSetFromPublicKeysetHandle(handle)
1223*e7b1675dSTing-Kang Chang	if err != nil {
1224*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetFromPublicKeysetHandle() err = %v, want nil", err)
1225*e7b1675dSTing-Kang Chang	}
1226*e7b1675dSTing-Kang Chang	want := `{"keys":[]}`
1227*e7b1675dSTing-Kang Chang	if string(jwkSet) != want {
1228*e7b1675dSTing-Kang Chang		t.Fatalf("jwt.JWKSetFromPublicKeysetHandle() = %q, want %q", string(jwkSet), want)
1229*e7b1675dSTing-Kang Chang	}
1230*e7b1675dSTing-Kang Chang}
1231*e7b1675dSTing-Kang Chang
1232*e7b1675dSTing-Kang Changfunc TestJWKSetFromPublicKeysetHandleTinkOutputPrefixHasKID(t *testing.T) {
1233*e7b1675dSTing-Kang Chang	for _, tc := range []jwkSetTestCase{
1234*e7b1675dSTing-Kang Chang		{
1235*e7b1675dSTing-Kang Chang			tag: "JwtEcdsaPublicKey",
1236*e7b1675dSTing-Kang Chang			publicKeyset: `{
1237*e7b1675dSTing-Kang Chang					"primaryKeyId": 303799737,
1238*e7b1675dSTing-Kang Chang					"key": [
1239*e7b1675dSTing-Kang Chang							{
1240*e7b1675dSTing-Kang Chang									"keyId": 303799737,
1241*e7b1675dSTing-Kang Chang									"status": "ENABLED",
1242*e7b1675dSTing-Kang Chang									"outputPrefixType": "TINK",
1243*e7b1675dSTing-Kang Chang									"keyData": {
1244*e7b1675dSTing-Kang Chang											"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPublicKey",
1245*e7b1675dSTing-Kang Chang											"keyMaterialType": "ASYMMETRIC_PUBLIC",
1246*e7b1675dSTing-Kang Chang											"value": "IiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ=="
1247*e7b1675dSTing-Kang Chang									}
1248*e7b1675dSTing-Kang Chang							}
1249*e7b1675dSTing-Kang Chang					]
1250*e7b1675dSTing-Kang Chang			}`,
1251*e7b1675dSTing-Kang Chang			jwkSet: `{
1252*e7b1675dSTing-Kang Chang				"keys":[{
1253*e7b1675dSTing-Kang Chang				"kty":"EC",
1254*e7b1675dSTing-Kang Chang				"crv":"P-256",
1255*e7b1675dSTing-Kang Chang				"x":"wO6uIxh8SkKOO8VjZXNRTteRcwCPE4_4JElKyaa0fcQ",
1256*e7b1675dSTing-Kang Chang				"y":"7oRiYhnmkP6nqrdXWgtsWUWq5uFRLJkhyVFiWPRB278",
1257*e7b1675dSTing-Kang Chang				"use":"sig",
1258*e7b1675dSTing-Kang Chang				"alg":"ES256",
1259*e7b1675dSTing-Kang Chang				"key_ops":["verify"],
1260*e7b1675dSTing-Kang Chang				"kid":"EhuduQ"}]
1261*e7b1675dSTing-Kang Chang			}`,
1262*e7b1675dSTing-Kang Chang		},
1263*e7b1675dSTing-Kang Chang		{
1264*e7b1675dSTing-Kang Chang			tag: "JwtRsaSsaPkcs1PublicKey",
1265*e7b1675dSTing-Kang Chang			publicKeyset: `{
1266*e7b1675dSTing-Kang Chang				"primaryKeyId": 1277272603,
1267*e7b1675dSTing-Kang Chang				"key": [
1268*e7b1675dSTing-Kang Chang					{
1269*e7b1675dSTing-Kang Chang						"keyData": {
1270*e7b1675dSTing-Kang Chang							"typeUrl": "type.googleapis.com/google.crypto.tink.JwtRsaSsaPkcs1PublicKey",
1271*e7b1675dSTing-Kang Chang							"value": "IgMBAAEagAK+ZQ5rrZNivGPs3ytlUDOgR1KeaxFBo1YEwB0Hxp0ZryfjJwaJhaga/S5lZzy8faOfqXc9r/vZtvYgd/f4oPZRpPAuTXHfJKFfJsShLlkX1t6bOufaiE2LEag3s5+PvA9vrVn4XU2/neerfTzP5EjVZ7Igf70eO4hy5TFpZjRV6+xfMJ6Ewk/mDuRXPKXnlthxGLbx2J2RVrOvNWA0bfnI00wQvfahbVV+++nuF9Ae3FLCQU4/MmDMg8dskVvEAsauuBceyirtS0NB1L2++gSnj8nNCEK2cIQpqGCRPA5bJP3o6VEZiI8lIUdZO6PLVCd3o4pzwsYSykBfigPpmX5hEAE=",
1272*e7b1675dSTing-Kang Chang							"keyMaterialType": "ASYMMETRIC_PUBLIC"
1273*e7b1675dSTing-Kang Chang						},
1274*e7b1675dSTing-Kang Chang						"status": "ENABLED",
1275*e7b1675dSTing-Kang Chang						"keyId": 1277272603,
1276*e7b1675dSTing-Kang Chang						"outputPrefixType": "TINK"
1277*e7b1675dSTing-Kang Chang					}
1278*e7b1675dSTing-Kang Chang				]
1279*e7b1675dSTing-Kang Chang			}`,
1280*e7b1675dSTing-Kang Chang			jwkSet: `{
1281*e7b1675dSTing-Kang Chang				"keys":[{
1282*e7b1675dSTing-Kang Chang					"kty":"RSA",
1283*e7b1675dSTing-Kang Chang					"n": "vmUOa62TYrxj7N8rZVAzoEdSnmsRQaNWBMAdB8adGa8n4ycGiYWoGv0uZWc8vH2jn6l3Pa_72bb2IHf3-KD2UaTwLk1x3yShXybEoS5ZF9bemzrn2ohNixGoN7Ofj7wPb61Z-F1Nv53nq308z-RI1WeyIH-9HjuIcuUxaWY0VevsXzCehMJP5g7kVzyl55bYcRi28didkVazrzVgNG35yNNMEL32oW1Vfvvp7hfQHtxSwkFOPzJgzIPHbJFbxALGrrgXHsoq7UtDQdS9vvoEp4_JzQhCtnCEKahgkTwOWyT96OlRGYiPJSFHWTujy1Qnd6OKc8LGEspAX4oD6Zl-YQ",
1284*e7b1675dSTing-Kang Chang					"e":"AQAB",
1285*e7b1675dSTing-Kang Chang					"use":"sig",
1286*e7b1675dSTing-Kang Chang					"alg":"RS256",
1287*e7b1675dSTing-Kang Chang					"key_ops":["verify"],
1288*e7b1675dSTing-Kang Chang					"kid":"TCGiGw"
1289*e7b1675dSTing-Kang Chang				}]
1290*e7b1675dSTing-Kang Chang			}`,
1291*e7b1675dSTing-Kang Chang		},
1292*e7b1675dSTing-Kang Chang	} {
1293*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
1294*e7b1675dSTing-Kang Chang			handle, err := createKeysetHandle(tc.publicKeyset)
1295*e7b1675dSTing-Kang Chang			if err != nil {
1296*e7b1675dSTing-Kang Chang				t.Fatalf("createKeysetHandle() err = %v, want nil", err)
1297*e7b1675dSTing-Kang Chang			}
1298*e7b1675dSTing-Kang Chang			js, err := jwt.JWKSetFromPublicKeysetHandle(handle)
1299*e7b1675dSTing-Kang Chang			if err != nil {
1300*e7b1675dSTing-Kang Chang				t.Fatalf("jwt.JWKSetFromPublicKeysetHandle() err = %v, want nil", err)
1301*e7b1675dSTing-Kang Chang			}
1302*e7b1675dSTing-Kang Chang			got := &spb.Struct{}
1303*e7b1675dSTing-Kang Chang			if err := got.UnmarshalJSON(js); err != nil {
1304*e7b1675dSTing-Kang Chang				t.Fatalf("got.UnmarshalJSON() err = %v, want nil", err)
1305*e7b1675dSTing-Kang Chang			}
1306*e7b1675dSTing-Kang Chang			want := &spb.Struct{}
1307*e7b1675dSTing-Kang Chang			if err := want.UnmarshalJSON([]byte(tc.jwkSet)); err != nil {
1308*e7b1675dSTing-Kang Chang				t.Fatalf("want.UnmarshalJSON() err = %v, want nil", err)
1309*e7b1675dSTing-Kang Chang			}
1310*e7b1675dSTing-Kang Chang			if !cmp.Equal(want, got, protocmp.Transform()) {
1311*e7b1675dSTing-Kang Chang				t.Errorf("mismatch in jwk sets: diff (-want,+got): %v", cmp.Diff(want, got, protocmp.Transform()))
1312*e7b1675dSTing-Kang Chang			}
1313*e7b1675dSTing-Kang Chang		})
1314*e7b1675dSTing-Kang Chang	}
1315*e7b1675dSTing-Kang Chang}
1316*e7b1675dSTing-Kang Chang
1317*e7b1675dSTing-Kang Changfunc TestJWKSetFromPublicKeysetHandleInvalidKeysetsFails(t *testing.T) {
1318*e7b1675dSTing-Kang Chang	for _, tc := range []jwkSetTestCase{
1319*e7b1675dSTing-Kang Chang		{
1320*e7b1675dSTing-Kang Chang			tag: "invalid output prefix",
1321*e7b1675dSTing-Kang Chang			publicKeyset: `{
1322*e7b1675dSTing-Kang Chang      "primaryKeyId": 303799737,
1323*e7b1675dSTing-Kang Chang      "key": [
1324*e7b1675dSTing-Kang Chang          {
1325*e7b1675dSTing-Kang Chang              "keyId": 303799737,
1326*e7b1675dSTing-Kang Chang              "status": "ENABLED",
1327*e7b1675dSTing-Kang Chang              "outputPrefixType": "LEGACY",
1328*e7b1675dSTing-Kang Chang              "keyData": {
1329*e7b1675dSTing-Kang Chang                  "typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPublicKey",
1330*e7b1675dSTing-Kang Chang                  "keyMaterialType": "ASYMMETRIC_PUBLIC",
1331*e7b1675dSTing-Kang Chang                  "value": "IiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ=="
1332*e7b1675dSTing-Kang Chang              }
1333*e7b1675dSTing-Kang Chang          }
1334*e7b1675dSTing-Kang Chang      ]
1335*e7b1675dSTing-Kang Chang  	}`,
1336*e7b1675dSTing-Kang Chang		},
1337*e7b1675dSTing-Kang Chang		{
1338*e7b1675dSTing-Kang Chang			tag: "JwtEcdsaPublicKey unknown algorithm", // The algorithm is set in the base64 encoded value of the key data.
1339*e7b1675dSTing-Kang Chang			publicKeyset: `{
1340*e7b1675dSTing-Kang Chang			"primaryKeyId": 303799737,
1341*e7b1675dSTing-Kang Chang			"key": [
1342*e7b1675dSTing-Kang Chang				{
1343*e7b1675dSTing-Kang Chang					"keyId": 303799737,
1344*e7b1675dSTing-Kang Chang					"status": "ENABLED",
1345*e7b1675dSTing-Kang Chang					"outputPrefixType": "TINK",
1346*e7b1675dSTing-Kang Chang					"keyData": {
1347*e7b1675dSTing-Kang Chang						"typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPublicKey",
1348*e7b1675dSTing-Kang Chang						"value": "IiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQ=",
1349*e7b1675dSTing-Kang Chang						"keyMaterialType": "ASYMMETRIC_PUBLIC"
1350*e7b1675dSTing-Kang Chang					}
1351*e7b1675dSTing-Kang Chang				}
1352*e7b1675dSTing-Kang Chang			]
1353*e7b1675dSTing-Kang Chang		}`,
1354*e7b1675dSTing-Kang Chang		},
1355*e7b1675dSTing-Kang Chang		{
1356*e7b1675dSTing-Kang Chang			tag: "private ecdsa keyset",
1357*e7b1675dSTing-Kang Chang			publicKeyset: `{
1358*e7b1675dSTing-Kang Chang      "primaryKeyId": 303799737,
1359*e7b1675dSTing-Kang Chang      "key": [
1360*e7b1675dSTing-Kang Chang          {
1361*e7b1675dSTing-Kang Chang              "keyId": 303799737,
1362*e7b1675dSTing-Kang Chang              "status": "ENABLED",
1363*e7b1675dSTing-Kang Chang              "outputPrefixType": "TINK",
1364*e7b1675dSTing-Kang Chang              "keyData": {
1365*e7b1675dSTing-Kang Chang                  "typeUrl": "type.googleapis.com/google.crypto.tink.JwtEcdsaPublicKey",
1366*e7b1675dSTing-Kang Chang                  "keyMaterialType": "ASYMMETRIC_PRIVATE",
1367*e7b1675dSTing-Kang Chang                  "value": "IiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ=="
1368*e7b1675dSTing-Kang Chang              }
1369*e7b1675dSTing-Kang Chang          }
1370*e7b1675dSTing-Kang Chang      ]
1371*e7b1675dSTing-Kang Chang  }`,
1372*e7b1675dSTing-Kang Chang		},
1373*e7b1675dSTing-Kang Chang		{
1374*e7b1675dSTing-Kang Chang			tag: "unknown key type",
1375*e7b1675dSTing-Kang Chang			publicKeyset: `{
1376*e7b1675dSTing-Kang Chang      "primaryKeyId": 303799737,
1377*e7b1675dSTing-Kang Chang      "key": [
1378*e7b1675dSTing-Kang Chang          {
1379*e7b1675dSTing-Kang Chang              "keyId": 303799737,
1380*e7b1675dSTing-Kang Chang              "status": "ENABLED",
1381*e7b1675dSTing-Kang Chang              "outputPrefixType": "TINK",
1382*e7b1675dSTing-Kang Chang              "keyData": {
1383*e7b1675dSTing-Kang Chang                  "typeUrl": "type.googleapis.com/google.crypto.tink.Unknown",
1384*e7b1675dSTing-Kang Chang                  "keyMaterialType": "ASYMMETRIC_PUBLIC",
1385*e7b1675dSTing-Kang Chang                  "value": "IiDuhGJiGeaQ/qeqt1daC2xZRarm4VEsmSHJUWJY9EHbvxogwO6uIxh8SkKOO8VjZXNRTteRcwCPE4/4JElKyaa0fcQQAQ=="
1386*e7b1675dSTing-Kang Chang              }
1387*e7b1675dSTing-Kang Chang          }
1388*e7b1675dSTing-Kang Chang      ]
1389*e7b1675dSTing-Kang Chang  }`,
1390*e7b1675dSTing-Kang Chang		},
1391*e7b1675dSTing-Kang Chang		{
1392*e7b1675dSTing-Kang Chang			tag: "JwtRsaSsaPkcs1 unknown algorithm", // The algorithm is set in the base64 encoded value of the key data.
1393*e7b1675dSTing-Kang Chang			publicKeyset: `{
1394*e7b1675dSTing-Kang Chang				"primaryKeyId": 1277272603,
1395*e7b1675dSTing-Kang Chang				"key": [
1396*e7b1675dSTing-Kang Chang					{
1397*e7b1675dSTing-Kang Chang						"keyData": {
1398*e7b1675dSTing-Kang Chang							"typeUrl": "type.googleapis.com/google.crypto.tink.JwtRsaSsaPkcs1PublicKey",
1399*e7b1675dSTing-Kang Chang							"value": "IgMBAAEagAK+ZQ5rrZNivGPs3ytlUDOgR1KeaxFBo1YEwB0Hxp0ZryfjJwaJhaga/S5lZzy8faOfqXc9r/vZtvYgd/f4oPZRpPAuTXHfJKFfJsShLlkX1t6bOufaiE2LEag3s5+PvA9vrVn4XU2/neerfTzP5EjVZ7Igf70eO4hy5TFpZjRV6+xfMJ6Ewk/mDuRXPKXnlthxGLbx2J2RVrOvNWA0bfnI00wQvfahbVV+++nuF9Ae3FLCQU4/MmDMg8dskVvEAsauuBceyirtS0NB1L2++gSnj8nNCEK2cIQpqGCRPA5bJP3o6VEZiI8lIUdZO6PLVCd3o4pzwsYSykBfigPpmX5h",
1400*e7b1675dSTing-Kang Chang							"keyMaterialType": "ASYMMETRIC_PUBLIC"
1401*e7b1675dSTing-Kang Chang						},
1402*e7b1675dSTing-Kang Chang						"status": "ENABLED",
1403*e7b1675dSTing-Kang Chang						"keyId": 1277272603,
1404*e7b1675dSTing-Kang Chang						"outputPrefixType": "TINK"
1405*e7b1675dSTing-Kang Chang					}
1406*e7b1675dSTing-Kang Chang				]
1407*e7b1675dSTing-Kang Chang			}`,
1408*e7b1675dSTing-Kang Chang		},
1409*e7b1675dSTing-Kang Chang	} {
1410*e7b1675dSTing-Kang Chang		t.Run(tc.tag, func(t *testing.T) {
1411*e7b1675dSTing-Kang Chang			handle, err := createKeysetHandle(tc.publicKeyset)
1412*e7b1675dSTing-Kang Chang			if err != nil {
1413*e7b1675dSTing-Kang Chang				t.Fatalf("createKeysetHandle() err = %v, want nil", err)
1414*e7b1675dSTing-Kang Chang			}
1415*e7b1675dSTing-Kang Chang			if _, err := jwt.JWKSetFromPublicKeysetHandle(handle); err == nil {
1416*e7b1675dSTing-Kang Chang				t.Errorf("jwt.JWKSetFromPublicKeysetHandle() err = nil, want error")
1417*e7b1675dSTing-Kang Chang			}
1418*e7b1675dSTing-Kang Chang		})
1419*e7b1675dSTing-Kang Chang	}
1420*e7b1675dSTing-Kang Chang}
1421