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": "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", 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": "QoACUsRKIPRhEtXtTxcFVM0/KMBMyzrafB6NNwb8cHSM0N9XGZEbeUh6EF5JGsbI0PndFyMk2wdhkCdtpdH7Bc/n7hLlW7yVR9fvPQMDoG6mITa0E2XXDkW/iJZ1cZhkiR4ptWMgNKm2xLlxOUTGcVr8+jKQ0Tb1TMsvojs3GeBLJ5jDtzq3HE6kcNY611L/hzft1aOb3+zJGRZpLcN3CuXVbhluTyrccl4V3jWN1KSejvj32zn5l0hRMYES9Ek2h686a+gqK4RYkbeP4QL7ZnT2tkG0rxfi5HlklmLn620YTzrlYpGd9x3ID7NnMjDfTz0mR/910p6JzVBloCbJ6Ai/JTqAApRrAvbP7oGaPN25FupqEWCrTZfpmOZuH2NT4h6KiB6/RxyrbRQWSh6bpRXsS/C8aHlnSj83nFT+G1j7qLINDbqHlrYD8aycRRuiLm5WWNtO6wQzpXmWmrSYutln9Yj6QWtIOIA0Pn4b1u1Aj7DudBpKhd8feihkZa9AHqmsolOi9FKILQ2FwAfmEGDXHtRjP6KrB6bMbg1XuLXrJT6xEBLyfSswsk/UnlHG3+q++jDp5tLPJnmqDgPcZ017PY71JoHE8QyNu2d4+Ng8+wOZxyYWPOvfgC12ZFaGso8do3+vG8C+HEIiHM9+brv4SyWaVZxFt3jn/aezXDlXbIsG4nMygAIJ7xT/Qz6vOVZSAvqRSVMXS20Awi1TnsgxHbUzImi6KMBRrlyFud0ltpQcZw98jlo5qB11d34HFnXTK1TOvNiB61Z2olr2+4Nt2MFPRu26r3uR3mhpacHW+TfkHw5whudHpybXkFc2asiL8auAToS2i2pr1hSOqKUDI0B6qy+qjDjWUCDziJE+IcpWjTEY74UpE5rREBIer5Xci8FPCP4FFjfomAtZZSGgS3DHwnCh9NfqyLZTGdDVJe+MEMlAFFmFUcCAk708H16bqJ8UuJMdGoFqvxU9bJrLGDkAg/CttX0BI6OCs5DR4Rqy+XKHYIkIvy6DVFja3mmhIhAVXXQHKoACvAckkJ1ayoNwbcV11yOBd0qNmPl0+NWdGlkc7+Aft6rLAR25t2tpfEjsFFYEaNCQIlzJNLAXa41Ac7cGdOLx+nRAJI3d/ExRLXhJrbAD95YM6WSM8cXf0dsR+q3hoTE0522T1XwSXICXb1Z2hzfmghL5WigezMdsEolqF/pRpQUcnZug/mpa0P40evFEIsoiPpMJYwS67iETxKeeEJv55z1W5GkT5reEeRwkQIuJm3kZB2r95p2sU82PFyXMVjgnqcqUAKWudi+oRp3jhzd0IUMQg6gcm62kpF7XgQmobMPYloc2c5VIEM1NS52s4arADR7dFxU6R28paLea8LsCByKAAvzUpants7GpQz2rJ7Gl9x0uQjr48yetqeTyzxInjezcKGgO7s85c2GzO3MkeaYcT+68NXHtdUVXrXJYerAiH+PAA2CdouEg8ra/ZOl0t3x9402kkFYcwbzmI1O0TLV4kv6NONapFj7U2WYfj0IdVILYoJWS4PSvvMWrDzP2SlZ7alSZ0zqCUGYa47Mz9d9A7d2teQ6z3UdzrUw3EBWz83szslYXQg6QDtsF+PYUhNx0tBuAdUtF4kVFXPSZoaOzaKdYwxb9TApmRheVsmOVAqb7xtwo9WmqUuJgDADjlfxwA9cam+uggvogd7Ta3i48SbJG6RXboaydht1F0AYeKZsagAQVZNwC5x8yE/nFakDyvtlO5SHR/1qvzhE0ZCepOIEmCmGTubQs5JwMllGJWhwxucVVv/5Rq9CsYjn+fpV8uj6DC2qqMiSIag+SuKjymACBktQuGGOiByYQExwMC8/ry326ehPAy588K9SM8ZuDeCswvp/cWs0aUDOlGsuXtJrKgKXdr8zDnbmZvrTIzA+nDC7R7Kv6NaBTF613XwIPIw0oPSDij0OPHy72+9BLraTRJVQP8GbvSWLb0YraMW2lyYNQN7Djd8rpO2AYKfsJAmmax/HFyPGMuKm2SjlnSxo8bmvH69DGjyK7wkU7bLJQ5Lbp98DpauhGY3EdXispU2fnJkoa9DaDmEzArRGa+T05YCyuzezuYE4eBUlxXJj2QY5ABDH5VkxcnWPSftKUUG5TSRwnIKZQ2Ab2ONNOQDafSOsg2KYDBKmLw4ZxUp2I2izXPeICfCJ2sBW2IOwSK5tRcvno8QoMvkz+9Ci8QNRpNLYTiCgbxXaoW/eLayvKt3qhkj+rKMded7yzWjq2dNv3HfvPUIwtSlAHGSqEhGkuzSijHhp2s2LN5OB6mfQt6d4pzvlh5w+pxaK3sH/wsLoVsdvUg4OBaH+KBFVYRZ9eAQMU8a6fmoFreMpSiNS6B0jY7XPsCL3mgSAuzkojCx2YBh79VB9SjcKrGGdRYLot/RKKBCIDAQABGoAEubM3lgyGn8IyKO+56q18hvuJkkxPrDXgalRWNmnA3QEseglU/9tp598dlq04eF1G4Xkrmk9OVyVSCuRdvMoko6wP4Jum+3cn42/Gsk8PdTwm3WD+yEBg/Usa/omLGiTfktyqqoZhh1TeOOBtNpD1U/p1wQxP3+bLl4//uR75CqlK9FYdBrIuqLP3nqa3/OAFuPBX77BuD1kcr5pUxPZkXBNAWpnvsW56swyIMZF2GRhfv2n2bZJgT4iybQcmEnvt1wfY3ecO5ZMSX2QNKpnRRejlIEqR9uAQa4wIJMViL8jDbAV+ZvUjMM1G0aAyMHPQzb2Hfkr9OtEi+/xyUCwqF2IUZfUb0+mCjOutpbBlSfkYULOrwd9RQTaLeNe3GhRjYWTJ+gLDS8DUWz8AcpCI7xoQSfuZLmBwxslqsObMYolxQJXej1IDmGX+Rjr4ro80EpMkv67gxYQwjP8p7FMHfK7FSDZMtT+h4mO7AD68vwHd99c9ALDJfPO7tAMG53opzD7YEZU+ySKRcMBIFRe5Kxj+m1fbN9q2ictzoQOvKh8TBlCsPLRbF5WVheUtE9anKiIik5zQInihoZidH5YJksdipMVWLeRs1Qk5J8ddv7n2dlbW7zoC60sh3ubLQ/MDm+eHlXoeKGioCMjDABRdokqal4wugvQUZyQcBBtfWT0QAw==", 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