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