2626import com .google .crypto .tink .internal .PrimitiveWrapper ;
2727import com .google .errorprone .annotations .Immutable ;
2828import java .security .GeneralSecurityException ;
29+ import java .util .ArrayList ;
30+ import java .util .List ;
2931
3032/**
3133 * JwtMacWrapper is the implementation of {@link PrimitiveWrapper} for the {@link JwtMac} primitive.
3234 */
3335class JwtMacWrapper implements PrimitiveWrapper <JwtMac , JwtMac > {
36+ private static class JwtMacWithId {
37+ JwtMacWithId (JwtMac jwtMac , int id ) {
38+ this .jwtMac = jwtMac ;
39+ this .id = id ;
40+ }
41+
42+ final JwtMac jwtMac ;
43+ final int id ;
44+ }
3445
3546 private static final JwtMacWrapper WRAPPER = new JwtMacWrapper ();
3647
@@ -42,35 +53,34 @@ private static void validate(PrimitiveSet<JwtMac> primitiveSet) throws GeneralSe
4253
4354 @ Immutable
4455 private static class WrappedJwtMac implements JwtMac {
56+ @ SuppressWarnings ("Immutable" )
57+ private final JwtMacWithId primary ;
58+
4559 @ SuppressWarnings ("Immutable" ) // We do not mutate the primitive set.
46- private final PrimitiveSet < JwtMac > primitives ;
60+ private final List < JwtMacWithId > allMacs ;
4761
4862 @ SuppressWarnings ("Immutable" )
4963 private final MonitoringClient .Logger computeLogger ;
5064
5165 @ SuppressWarnings ("Immutable" )
5266 private final MonitoringClient .Logger verifyLogger ;
5367
54- private WrappedJwtMac (PrimitiveSet <JwtMac > primitives ) {
55- this .primitives = primitives ;
56- if (!primitives .getAnnotations ().isEmpty ()) {
57- MonitoringClient client = MutableMonitoringRegistry .globalInstance ().getMonitoringClient ();
58- MonitoringKeysetInfo keysetInfo = MonitoringUtil .getMonitoringKeysetInfo (primitives );
59- this .computeLogger = client .createLogger (keysetInfo , "jwtmac" , "compute" );
60- this .verifyLogger = client .createLogger (keysetInfo , "jwtmac" , "verify" );
61- } else {
62- this .computeLogger = MonitoringUtil .DO_NOTHING_LOGGER ;
63- this .verifyLogger = MonitoringUtil .DO_NOTHING_LOGGER ;
64- }
68+ private WrappedJwtMac (
69+ JwtMacWithId primary ,
70+ List <JwtMacWithId > allMacs ,
71+ MonitoringClient .Logger computeLogger ,
72+ MonitoringClient .Logger verifyLogger ) {
73+ this .primary = primary ;
74+ this .allMacs = allMacs ;
75+ this .computeLogger = computeLogger ;
76+ this .verifyLogger = verifyLogger ;
6577 }
6678
6779 @ Override
6880 public String computeMacAndEncode (RawJwt token ) throws GeneralSecurityException {
6981 try {
70- KeysetHandleInterface .Entry primary = primitives .getKeysetHandle ().getPrimary ();
71- JwtMac primaryJwtMac = primitives .getPrimitiveForEntry (primary );
72- String result = primaryJwtMac .computeMacAndEncode (token );
73- computeLogger .log (primary .getId (), 1 );
82+ String result = primary .jwtMac .computeMacAndEncode (token );
83+ computeLogger .log (primary .id , 1 );
7484 return result ;
7585 } catch (GeneralSecurityException e ) {
7686 computeLogger .logFailure ();
@@ -82,13 +92,10 @@ public String computeMacAndEncode(RawJwt token) throws GeneralSecurityException
8292 public VerifiedJwt verifyMacAndDecode (String compact , JwtValidator validator )
8393 throws GeneralSecurityException {
8494 GeneralSecurityException interestingException = null ;
85- KeysetHandleInterface keysetHandle = primitives .getKeysetHandle ();
86- for (int i = 0 ; i < keysetHandle .size (); i ++) {
87- KeysetHandleInterface .Entry entry = keysetHandle .getAt (i );
88- JwtMac jwtMac = primitives .getPrimitiveForEntry (entry );
95+ for (JwtMacWithId macAndId : allMacs ) {
8996 try {
90- VerifiedJwt result = jwtMac .verifyMacAndDecode (compact , validator );
91- verifyLogger .log (entry . getId () , 1 );
97+ VerifiedJwt result = macAndId . jwtMac .verifyMacAndDecode (compact , validator );
98+ verifyLogger .log (macAndId . id , 1 );
9299 return result ;
93100 } catch (GeneralSecurityException e ) {
94101 if (e instanceof JwtInvalidException ) {
@@ -111,7 +118,31 @@ public VerifiedJwt verifyMacAndDecode(String compact, JwtValidator validator)
111118 @ Override
112119 public JwtMac wrap (final PrimitiveSet <JwtMac > primitives ) throws GeneralSecurityException {
113120 validate (primitives );
114- return new WrappedJwtMac (primitives );
121+ KeysetHandleInterface keysetHandle = primitives .getKeysetHandle ();
122+ List <JwtMacWithId > allMacs = new ArrayList <>(keysetHandle .size ());
123+ for (int i = 0 ; i < keysetHandle .size (); i ++) {
124+ KeysetHandleInterface .Entry entry = keysetHandle .getAt (i );
125+ JwtMac jwtMac = primitives .getPrimitiveForEntry (entry );
126+ allMacs .add (new JwtMacWithId (jwtMac , entry .getId ()));
127+ }
128+ MonitoringClient .Logger computeLogger ;
129+ MonitoringClient .Logger verifyLogger ;
130+ if (!primitives .getAnnotations ().isEmpty ()) {
131+ MonitoringClient client = MutableMonitoringRegistry .globalInstance ().getMonitoringClient ();
132+ MonitoringKeysetInfo keysetInfo = MonitoringUtil .getMonitoringKeysetInfo (primitives );
133+ computeLogger = client .createLogger (keysetInfo , "jwtmac" , "compute" );
134+ verifyLogger = client .createLogger (keysetInfo , "jwtmac" , "verify" );
135+ } else {
136+ computeLogger = MonitoringUtil .DO_NOTHING_LOGGER ;
137+ verifyLogger = MonitoringUtil .DO_NOTHING_LOGGER ;
138+ }
139+ JwtMac primaryMac = primitives .getPrimitiveForEntry (keysetHandle .getPrimary ());
140+
141+ return new WrappedJwtMac (
142+ new JwtMacWithId (primaryMac , keysetHandle .getPrimary ().getId ()),
143+ allMacs ,
144+ computeLogger ,
145+ verifyLogger );
115146 }
116147
117148 @ Override
0 commit comments