blob: 63b147a9cb1de4d34cd4031260bc4b53ad36e21e [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package com.google.crypto.tink;
import com.google.crypto.tink.annotations.Alpha;
import com.google.crypto.tink.proto.KeyData;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.MessageLite;
import java.security.GeneralSecurityException;
/**
* Implementation of the {@link PrivateKeyManager} interface based on an {@link
* PrivateKeyTypeManager} and the corresponding public key manager, implemented by an {@link
* KeyTypeManager}.
*
* <p>Choosing {@code PrimitiveT} equal to {@link java.lang.Void} is valid; in this case the
* functions {@link #getPrimitive} will throw if invoked.
* TODO(tholenst) Reduce visibility to package visible once all managers have been migrated.
*/
@Alpha
public class PrivateKeyManagerImpl<
PrimitiveT, KeyProtoT extends MessageLite, PublicKeyProtoT extends MessageLite>
extends KeyManagerImpl<PrimitiveT, KeyProtoT> implements PrivateKeyManager<PrimitiveT> {
private final PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> privateKeyManager;
private final KeyTypeManager<PublicKeyProtoT> publicKeyManager;
public PrivateKeyManagerImpl(
PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> privateKeyManager,
KeyTypeManager<PublicKeyProtoT> publicKeyManager,
Class<PrimitiveT> primitiveClass) {
super(privateKeyManager, primitiveClass);
this.privateKeyManager = privateKeyManager;
this.publicKeyManager = publicKeyManager;
}
@Override
public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
try {
KeyProtoT privKeyProto = privateKeyManager.parseKey(serializedKey);
privateKeyManager.validateKey(privKeyProto);
PublicKeyProtoT publicKeyProto = privateKeyManager.getPublicKey(privKeyProto);
publicKeyManager.validateKey(publicKeyProto);
return KeyData.newBuilder()
.setTypeUrl(publicKeyManager.getKeyType())
.setValue(publicKeyProto.toByteString())
.setKeyMaterialType(publicKeyManager.keyMaterialType())
.build();
} catch (InvalidProtocolBufferException e) {
throw new GeneralSecurityException("expected serialized proto of type ", e);
}
}
}