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