diff options
author | Mauro Sardara <msardara@cisco.com> | 2019-02-12 00:07:11 +0100 |
---|---|---|
committer | Mauro Sardara <msardara@cisco.com> | 2019-02-12 16:17:06 +0000 |
commit | 45ae2768f2842cc55f153a71fa66b1d3e25e9ab7 (patch) | |
tree | 64c37894239daf920cd50d886e918271106d14b8 /libtransport/src/hicn/transport/utils/signer.cc | |
parent | fbd4dd9c5eba6f8f10bcc0db30a72ea3378c149b (diff) |
[HICN-52] Fix signature computation and verification in libtransport
Change-Id: I9b30a9c9e95e2cb2f135fe7efd43e633235196d9
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Diffstat (limited to 'libtransport/src/hicn/transport/utils/signer.cc')
-rw-r--r-- | libtransport/src/hicn/transport/utils/signer.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/libtransport/src/hicn/transport/utils/signer.cc b/libtransport/src/hicn/transport/utils/signer.cc index 22bdf54d0..d3a322a5e 100644 --- a/libtransport/src/hicn/transport/utils/signer.cc +++ b/libtransport/src/hicn/transport/utils/signer.cc @@ -87,12 +87,17 @@ void Signer::sign(Packet &packet) { throw errors::MalformedAHPacketException(); } + packet.setSignatureSize(sign_len_bytes); + // Copy IP+TCP/ICMP header before zeroing them hicn_header_t header_copy; - if (format & HFO_INET) { - memcpy(&header_copy, hicn_packet, sizeof(hicn_v4_hdr_t)); - } else if (format & HFO_INET6) { - memcpy(&header_copy, hicn_packet, sizeof(hicn_v6_hdr_t)); + if (format == HF_INET_TCP_AH) { + memcpy(&header_copy, hicn_packet, HICN_V4_TCP_HDRLEN); + } else if (format == HF_INET6_TCP_AH) { + memcpy(&header_copy, hicn_packet, HICN_V6_TCP_HDRLEN); + } else { + throw errors::RuntimeException( + "Signer::sign -- Packet format not expected."); } std::size_t header_len = Packet::getHeaderSizeFromFormat(format); @@ -104,7 +109,6 @@ void Signer::sign(Packet &packet) { auto now = duration_cast<milliseconds>(system_clock::now().time_since_epoch()) .count(); packet.setSignatureTimestamp(now); - packet.setValidationAlgorithm( CryptoSuite(parcSigner_GetCryptoSuite(this->signer_))); @@ -117,7 +121,6 @@ void Signer::sign(Packet &packet) { utils::CryptoHasher hasher(parcSigner_GetCryptoHasher(signer_)); hasher.init(); hasher.updateBytes(hicn_packet, header_len + sign_len_bytes); - // hasher.updateBytes(zeros, sign_len_bytes); for (utils::MemBuf *current = payload_chain; current != header_chain; current = current->next()) { @@ -126,10 +129,10 @@ void Signer::sign(Packet &packet) { utils::CryptoHash hash = hasher.finalize(); - PARCSignature *signature = - parcSigner_SignDigest(this->signer_, hash.hash_, packet.getSignature(), - (uint32_t)sign_len_bytes); + PARCSignature *signature = parcSigner_SignDigest( + this->signer_, hash.hash_, packet.getSignature(), sign_len_bytes); PARCBuffer *buffer = parcSignature_GetSignature(signature); + size_t bytes_len = parcBuffer_Remaining(buffer); if (bytes_len > sign_len_bytes) { @@ -138,9 +141,9 @@ void Signer::sign(Packet &packet) { /* Restore the resetted fields */ if (format & HFO_INET) { - memcpy(hicn_packet, &header_copy, sizeof(hicn_v4_hdr_t)); + memcpy(hicn_packet, &header_copy, HICN_V4_TCP_HDRLEN); } else if (format & HFO_INET6) { - memcpy(hicn_packet, &header_copy, sizeof(hicn_v6_hdr_t)); + memcpy(hicn_packet, &header_copy, HICN_V6_TCP_HDRLEN); } } |