• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ////////////////////////////////////////////////////////////////////////////////
16 
17 package com.google.crypto.tink.testing;
18 
19 import com.google.crypto.tink.prf.Prf;
20 import com.google.crypto.tink.prf.PrfSet;
21 import com.google.crypto.tink.testing.proto.CreationRequest;
22 import com.google.crypto.tink.testing.proto.CreationResponse;
23 import com.google.crypto.tink.testing.proto.PrfSetComputeRequest;
24 import com.google.crypto.tink.testing.proto.PrfSetComputeResponse;
25 import com.google.crypto.tink.testing.proto.PrfSetGrpc.PrfSetImplBase;
26 import com.google.crypto.tink.testing.proto.PrfSetKeyIdsRequest;
27 import com.google.crypto.tink.testing.proto.PrfSetKeyIdsResponse;
28 import com.google.protobuf.ByteString;
29 import io.grpc.stub.StreamObserver;
30 import java.security.GeneralSecurityException;
31 import java.util.Map;
32 
33 /** Implements a gRPC Aead Testing service. */
34 public final class PrfSetServiceImpl extends PrfSetImplBase {
35 
PrfSetServiceImpl()36   public PrfSetServiceImpl() throws GeneralSecurityException {
37   }
38 
39   @Override
create(CreationRequest request, StreamObserver<CreationResponse> responseObserver)40   public void create(CreationRequest request, StreamObserver<CreationResponse> responseObserver) {
41     Util.createPrimitiveForRpc(request, responseObserver, PrfSet.class);
42   }
43 
keyIds( PrfSetKeyIdsRequest request)44   private PrfSetKeyIdsResponse keyIds(
45       PrfSetKeyIdsRequest request) throws GeneralSecurityException {
46     try {
47       PrfSet prfSet =
48           Util.parseBinaryProtoKeyset(request.getAnnotatedKeyset())
49               .getPrimitive(PrfSet.class);
50       PrfSetKeyIdsResponse.Output output = PrfSetKeyIdsResponse.Output.newBuilder()
51           .setPrimaryKeyId(prfSet.getPrimaryId())
52           .addAllKeyId(prfSet.getPrfs().keySet())
53           .build();
54       return PrfSetKeyIdsResponse.newBuilder().setOutput(output).build();
55     } catch (GeneralSecurityException e)  {
56       return PrfSetKeyIdsResponse.newBuilder().setErr(e.toString()).build();
57     }
58   }
59 
60   @Override
keyIds( PrfSetKeyIdsRequest request, StreamObserver<PrfSetKeyIdsResponse> responseObserver)61   public void keyIds(
62       PrfSetKeyIdsRequest request,
63       StreamObserver<PrfSetKeyIdsResponse> responseObserver) {
64     try {
65       responseObserver.onNext(keyIds(request));
66       responseObserver.onCompleted();
67     } catch (GeneralSecurityException e) {
68       responseObserver.onError(e);
69     }
70   }
71 
72   /** Computes the output of one PRF. */
compute(PrfSetComputeRequest request)73   private PrfSetComputeResponse compute(PrfSetComputeRequest request)
74       throws GeneralSecurityException {
75     try {
76       PrfSet prfSet =
77           Util.parseBinaryProtoKeyset(request.getAnnotatedKeyset())
78               .getPrimitive(PrfSet.class);
79       Map<Integer, Prf> prfs = prfSet.getPrfs();
80       if (!prfs.containsKey(request.getKeyId())) {
81         return PrfSetComputeResponse.newBuilder().setErr("Unknown Key ID.").build();
82       } else {
83         byte[] output =
84             prfs.get(request.getKeyId())
85                 .compute(request.getInputData().toByteArray(), request.getOutputLength());
86         return
87             PrfSetComputeResponse.newBuilder().setOutput(ByteString.copyFrom(output)).build();
88       }
89     } catch (GeneralSecurityException e) {
90       return PrfSetComputeResponse.newBuilder().setErr(e.toString()).build();
91     }
92   }
93 
94   @Override
compute( PrfSetComputeRequest request, StreamObserver<PrfSetComputeResponse> responseObserver)95   public void compute(
96       PrfSetComputeRequest request,
97       StreamObserver<PrfSetComputeResponse> responseObserver) {
98     try {
99       responseObserver.onNext(compute(request));
100       responseObserver.onCompleted();
101     } catch (GeneralSecurityException e) {
102       responseObserver.onError(e);
103     }
104   }
105 }
106