blob: a8ca7d4699ebe63020bdb82e1b03d97bbee10a85 [file] [log] [blame]
/*
* Copyright 2014 Google Inc. All rights reserved.
*
* 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.
*/
// Utility class to parse and verify {@link SecureMessage} protos. Verifies the
// signature on the message, and decrypts "signcrypted" messages (while
// simultaneously verifying the signature).
//
// @see SecureMessageBuilder
#include "securemessage/secure_message_parser.h"
#include "securemessage/raw_secure_message_parser.h"
#include "securemessage/util.h"
namespace securemessage {
std::unique_ptr<Header> SecureMessageParser::GetUnverifiedHeader(
const SecureMessage& secmsg) {
if (!secmsg.has_header_and_body()) {
Util::LogError("message must have header and body");
return nullptr;
}
HeaderAndBody header_and_body;
if (!header_and_body.ParseFromString(secmsg.header_and_body())) {
Util::LogError("Invalid header and body string");
return nullptr;
}
if (!header_and_body.IsInitialized() || !header_and_body.has_header()) {
Util::LogError("Header missing from header and body");
return nullptr;
}
std::unique_ptr<Header> header(new Header(header_and_body.header()));
if (!header->has_signature_scheme()) {
Util::LogError("Header must have a valid signature scheme");
return nullptr;
}
if (!header->has_encryption_scheme()) {
Util::LogError("Header must have a valid encryption scheme");
return nullptr;
}
return header;
}
std::unique_ptr<HeaderAndBody> SecureMessageParser::ParseSignedCleartextMessage(
const SecureMessage& secmsg, const CryptoOps::Key& verification_key,
CryptoOps::SigType sig_type) {
// associated_data is not used here, so we pass in an empty string
return ParseSignedCleartextMessage(secmsg, verification_key, sig_type,
string());
}
std::unique_ptr<HeaderAndBody> SecureMessageParser::ParseSignedCleartextMessage(
const SecureMessage& secmsg, const CryptoOps::Key& verification_key,
CryptoOps::SigType sig_type, const string& associated_data) {
if (!secmsg.has_header_and_body()) {
Util::LogError("message must have header and body");
return nullptr;
}
if (!secmsg.has_signature()) {
Util::LogError("message must have signature");
return nullptr;
}
std::unique_ptr<string> header_and_body_bytes =
RawSecureMessageParser::ParseSignedCleartextMessage(
secmsg.signature(), secmsg.header_and_body(),
verification_key, sig_type, associated_data);
if (header_and_body_bytes != nullptr) {
HeaderAndBody *header_and_body = new HeaderAndBody();
header_and_body->ParseFromString(*header_and_body_bytes);
return std::unique_ptr<HeaderAndBody>(header_and_body);
} else {
return nullptr;
}
}
std::unique_ptr<HeaderAndBody> SecureMessageParser::ParseSignCryptedMessage(
const SecureMessage& secmsg, const CryptoOps::Key& verification_key,
CryptoOps::SigType sig_type, const CryptoOps::SecretKey& decryption_key,
CryptoOps::EncType enc_type, const string& associated_data) {
if (!secmsg.has_header_and_body()) {
Util::LogError("message must have header and body");
return nullptr;
}
if (!secmsg.has_signature()) {
Util::LogError("message must have signature");
return nullptr;
}
std::unique_ptr<string> header_and_body_bytes =
RawSecureMessageParser::ParseSignCryptedMessage(
secmsg.signature(), secmsg.header_and_body(),
verification_key, sig_type, decryption_key, enc_type,
associated_data);
if (header_and_body_bytes != nullptr) {
HeaderAndBody *header_and_body = new HeaderAndBody();
header_and_body->ParseFromString(*header_and_body_bytes);
return std::unique_ptr<HeaderAndBody>(header_and_body);
} else {
return nullptr;
}
}
// Constructor and Destructor are never used
SecureMessageParser::SecureMessageParser() {}
SecureMessageParser::~SecureMessageParser() {}
} // namespace securemessage