• 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.HybridDecrypt;
20 import com.google.crypto.tink.HybridEncrypt;
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.HybridDecryptRequest;
24 import com.google.crypto.tink.testing.proto.HybridDecryptResponse;
25 import com.google.crypto.tink.testing.proto.HybridEncryptRequest;
26 import com.google.crypto.tink.testing.proto.HybridEncryptResponse;
27 import com.google.crypto.tink.testing.proto.HybridGrpc.HybridImplBase;
28 import com.google.protobuf.ByteString;
29 import io.grpc.stub.StreamObserver;
30 import java.security.GeneralSecurityException;
31 
32 /** Implements a gRPC Hybrid Encryption Testing service. */
33 public final class HybridServiceImpl extends HybridImplBase {
34 
HybridServiceImpl()35   public HybridServiceImpl() throws GeneralSecurityException {}
36 
37   @Override
createHybridEncrypt( CreationRequest request, StreamObserver<CreationResponse> responseObserver)38   public void createHybridEncrypt(
39       CreationRequest request, StreamObserver<CreationResponse> responseObserver) {
40     Util.createPrimitiveForRpc(request, responseObserver, HybridEncrypt.class);
41   }
42 
43   @Override
createHybridDecrypt( CreationRequest request, StreamObserver<CreationResponse> responseObserver)44   public void createHybridDecrypt(
45       CreationRequest request, StreamObserver<CreationResponse> responseObserver) {
46     Util.createPrimitiveForRpc(request, responseObserver, HybridDecrypt.class);
47   }
48 
49 
encrypt(HybridEncryptRequest request)50   private HybridEncryptResponse encrypt(HybridEncryptRequest request)
51       throws GeneralSecurityException {
52     HybridEncrypt hybridEncrypt =
53         Util.parseBinaryProtoKeyset(request.getPublicAnnotatedKeyset())
54             .getPrimitive(HybridEncrypt.class);
55     try {
56       byte[] ciphertext =
57           hybridEncrypt.encrypt(
58               request.getPlaintext().toByteArray(), request.getContextInfo().toByteArray());
59       return HybridEncryptResponse.newBuilder()
60           .setCiphertext(ByteString.copyFrom(ciphertext))
61           .build();
62     } catch (GeneralSecurityException e) {
63       return HybridEncryptResponse.newBuilder().setErr(e.toString()).build();
64     }
65   }
66 
67   @Override
encrypt( HybridEncryptRequest request, StreamObserver<HybridEncryptResponse> responseObserver)68   public void encrypt(
69       HybridEncryptRequest request, StreamObserver<HybridEncryptResponse> responseObserver) {
70     try {
71       HybridEncryptResponse response = encrypt(request);
72       responseObserver.onNext(response);
73       responseObserver.onCompleted();
74     } catch (GeneralSecurityException e) {
75       responseObserver.onError(e);
76     }
77   }
78 
decrypt(HybridDecryptRequest request)79   private HybridDecryptResponse decrypt(HybridDecryptRequest request)
80       throws GeneralSecurityException {
81     HybridDecrypt hybridDecrypt =
82         Util.parseBinaryProtoKeyset(request.getPrivateAnnotatedKeyset())
83             .getPrimitive(HybridDecrypt.class);
84     try {
85       byte[] plaintext =
86           hybridDecrypt.decrypt(
87               request.getCiphertext().toByteArray(), request.getContextInfo().toByteArray());
88       return HybridDecryptResponse.newBuilder()
89           .setPlaintext(ByteString.copyFrom(plaintext))
90           .build();
91     } catch (GeneralSecurityException e) {
92       return HybridDecryptResponse.newBuilder().setErr(e.toString()).build();
93     }
94   }
95 
96   @Override
decrypt( HybridDecryptRequest request, StreamObserver<HybridDecryptResponse> responseObserver)97   public void decrypt(
98       HybridDecryptRequest request, StreamObserver<HybridDecryptResponse> responseObserver) {
99     try {
100       HybridDecryptResponse response = decrypt(request);
101       responseObserver.onNext(response);
102       responseObserver.onCompleted();
103     } catch (GeneralSecurityException e) {
104       responseObserver.onError(e);
105     }
106   }
107 }
108