• 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.DeterministicAead;
20 import com.google.crypto.tink.testing.proto.CreationRequest;
21 import com.google.crypto.tink.testing.proto.CreationResponse;
22 import com.google.crypto.tink.testing.proto.DeterministicAeadDecryptRequest;
23 import com.google.crypto.tink.testing.proto.DeterministicAeadDecryptResponse;
24 import com.google.crypto.tink.testing.proto.DeterministicAeadEncryptRequest;
25 import com.google.crypto.tink.testing.proto.DeterministicAeadEncryptResponse;
26 import com.google.crypto.tink.testing.proto.DeterministicAeadGrpc.DeterministicAeadImplBase;
27 import com.google.protobuf.ByteString;
28 import io.grpc.stub.StreamObserver;
29 import java.security.GeneralSecurityException;
30 
31 /** Implements a gRPC DeterministicAead Testing service. */
32 public final class DeterministicAeadServiceImpl extends DeterministicAeadImplBase {
33 
DeterministicAeadServiceImpl()34   public DeterministicAeadServiceImpl() throws GeneralSecurityException {}
35 
36   @Override
create(CreationRequest request, StreamObserver<CreationResponse> responseObserver)37   public void create(CreationRequest request, StreamObserver<CreationResponse> responseObserver) {
38     Util.createPrimitiveForRpc(request, responseObserver, DeterministicAead.class);
39   }
40 
encryptDeterministically( DeterministicAeadEncryptRequest request)41   private DeterministicAeadEncryptResponse encryptDeterministically(
42       DeterministicAeadEncryptRequest request) throws GeneralSecurityException {
43     DeterministicAead daead =
44         Util.parseBinaryProtoKeyset(request.getAnnotatedKeyset())
45             .getPrimitive(DeterministicAead.class);
46     try {
47       byte[] ciphertext =
48           daead.encryptDeterministically(
49               request.getPlaintext().toByteArray(), request.getAssociatedData().toByteArray());
50       return DeterministicAeadEncryptResponse.newBuilder()
51           .setCiphertext(ByteString.copyFrom(ciphertext))
52           .build();
53     } catch (GeneralSecurityException e) {
54       return DeterministicAeadEncryptResponse.newBuilder().setErr(e.toString()).build();
55     }
56   }
57 
58   @Override
encryptDeterministically( DeterministicAeadEncryptRequest request, StreamObserver<DeterministicAeadEncryptResponse> responseObserver)59   public void encryptDeterministically(
60       DeterministicAeadEncryptRequest request,
61       StreamObserver<DeterministicAeadEncryptResponse> responseObserver) {
62     try {
63       DeterministicAeadEncryptResponse response = encryptDeterministically(request);
64       responseObserver.onNext(response);
65       responseObserver.onCompleted();
66     } catch (Exception e) {
67       responseObserver.onError(e);
68     }
69   }
70 
decryptDeterministically( DeterministicAeadDecryptRequest request)71   private DeterministicAeadDecryptResponse decryptDeterministically(
72       DeterministicAeadDecryptRequest request) throws GeneralSecurityException {
73     DeterministicAead daead =
74         Util.parseBinaryProtoKeyset(request.getAnnotatedKeyset())
75             .getPrimitive(DeterministicAead.class);
76     try {
77       byte[] plaintext =
78           daead.decryptDeterministically(
79               request.getCiphertext().toByteArray(), request.getAssociatedData().toByteArray());
80       return DeterministicAeadDecryptResponse.newBuilder()
81           .setPlaintext(ByteString.copyFrom(plaintext))
82           .build();
83     } catch (GeneralSecurityException e) {
84       return DeterministicAeadDecryptResponse.newBuilder().setErr(e.toString()).build();
85     }
86   }
87 
88   @Override
decryptDeterministically( DeterministicAeadDecryptRequest request, StreamObserver<DeterministicAeadDecryptResponse> responseObserver)89   public void decryptDeterministically(
90       DeterministicAeadDecryptRequest request,
91       StreamObserver<DeterministicAeadDecryptResponse> responseObserver) {
92     try {
93       DeterministicAeadDecryptResponse response = decryptDeterministically(request);
94       responseObserver.onNext(response);
95       responseObserver.onCompleted();
96     } catch (Exception e) {
97       responseObserver.onError(e);
98     }
99   }
100 }
101