Use signerFilter instead of the deprecated hmacFilter
Refs: #4960
Change-Id: Icfc1e38ee8bf4be507b9715a28ea660298f216c6
diff --git a/src/crypto-support/crypto-helper.cpp b/src/crypto-support/crypto-helper.cpp
index 915f17c..c93a29c 100644
--- a/src/crypto-support/crypto-helper.cpp
+++ b/src/crypto-support/crypto-helper.cpp
@@ -1,5 +1,5 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
* Copyright (c) 2017-2019, Regents of the University of California.
*
* This file is part of ndncert, a certificate management system based on NDN.
@@ -20,18 +20,18 @@
#include "crypto-helper.hpp"
#include "../logging.hpp"
-#include <openssl/pem.h>
-#include <openssl/rand.h>
+
#include <openssl/err.h>
-#include <ndn-cxx/security/transform/block-cipher.hpp>
+#include <openssl/pem.h>
+
+#include <ndn-cxx/encoding/buffer-stream.hpp>
#include <ndn-cxx/security/transform/base64-decode.hpp>
#include <ndn-cxx/security/transform/base64-encode.hpp>
#include <ndn-cxx/security/transform/buffer-source.hpp>
+#include <ndn-cxx/security/transform/private-key.hpp>
+#include <ndn-cxx/security/transform/signer-filter.hpp>
#include <ndn-cxx/security/transform/step-source.hpp>
#include <ndn-cxx/security/transform/stream-sink.hpp>
-#include <ndn-cxx/util/random.hpp>
-#include <ndn-cxx/encoding/buffer-stream.hpp>
-#include <ndn-cxx/security/transform/hmac-filter.hpp>
namespace ndn {
namespace ndncert {
@@ -139,12 +139,16 @@
std::string
ECDHState::getBase64PubKey()
{
+ namespace t = ndn::security::transform;
+
if (context->publicKeyLen == 0) {
this->getRawSelfPubKey();
}
- std::stringstream os;
- security::transform::bufferSource(context->publicKey, context->publicKeyLen)
- >> security::transform::base64Encode() >> security::transform::streamSink(os);
+
+ std::ostringstream os;
+ t::bufferSource(context->publicKey, context->publicKeyLen)
+ >> t::base64Encode()
+ >> t::streamSink(os);
return os.str();
}
@@ -177,35 +181,41 @@
ECDHState::deriveSecret(const std::string& peerKeyStr)
{
namespace t = ndn::security::transform;
+
OBufferStream os;
- security::transform::bufferSource(peerKeyStr)
- >> security::transform::base64Decode()
- >> security::transform::streamSink(os);
- ConstBufferPtr result = os.buf();
+ t::bufferSource(peerKeyStr) >> t::base64Decode() >> t::streamSink(os);
+ auto result = os.buf();
+
return this->deriveSecret(result->data(), result->size());
}
-int ndn_compute_hmac_sha256 (const uint8_t *data, const unsigned data_length,
- const uint8_t *key, const unsigned key_length,
- uint8_t *prk) {
+int
+ndn_compute_hmac_sha256(const uint8_t *data, const unsigned data_length,
+ const uint8_t *key, const unsigned key_length,
+ uint8_t *prk)
+{
+ namespace t = ndn::security::transform;
+
+ t::PrivateKey privKey;
+ privKey.loadRaw(KeyType::HMAC, key, key_length);
OBufferStream os;
- security::transform::bufferSource(data, data_length) >>
- security::transform::hmacFilter(
- DigestAlgorithm::SHA256, key, key_length) >>
- security::transform::streamSink(os);
+ t::bufferSource(data, data_length)
+ >> t::signerFilter(DigestAlgorithm::SHA256, privKey)
+ >> t::streamSink(os);
- auto result = os.buf();
- memcpy(prk, result->data(), HASH_SIZE);
+ memcpy(prk, os.buf()->data(), HASH_SIZE);
return 0;
}
-//removed dependency of OpenSSL@1.1
+// avoid dependency on OpenSSL >= 1.1
int
hkdf(const uint8_t* secret, int secretLen, const uint8_t* salt,
int saltLen, uint8_t* okm, int okm_len,
const uint8_t* info, int info_len)
{
+ namespace t = ndn::security::transform;
+
// hkdf generate prk
uint8_t prk[HASH_SIZE];
ndn_compute_hmac_sha256(salt, saltLen, secret, secretLen, prk);
@@ -213,32 +223,32 @@
// hkdf expand
uint8_t prev[HASH_SIZE] = {0};
int done_len = 0, dig_len = HASH_SIZE, n = okm_len / dig_len;
- if (okm_len % dig_len) n++;
- if (n > 255 || okm == nullptr) return 0;
+ if (okm_len % dig_len)
+ n++;
+ if (n > 255 || okm == nullptr)
+ return 0;
+
for (int i = 1; i <= n; i++) {
size_t copy_len;
const uint8_t ctr = i;
- OBufferStream os;
- security::transform::StepSource source;
- source >> security::transform::hmacFilter(DigestAlgorithm::SHA256, prk, dig_len)
- >> security::transform::streamSink(os);
+ t::StepSource source;
+ t::PrivateKey privKey;
+ privKey.loadRaw(KeyType::HMAC, prk, dig_len);
+ OBufferStream os;
+ source >> t::signerFilter(DigestAlgorithm::SHA256, privKey)
+ >> t::streamSink(os);
if (i > 1) {
source.write(prev, dig_len);
}
-
source.write(info, info_len);
source.write(&ctr, 1);
source.end();
auto result = os.buf();
memcpy(prev, result->data(), dig_len);
-
- copy_len = (done_len + dig_len > okm_len) ?
- okm_len - done_len :
- dig_len;
-
+ copy_len = (done_len + dig_len > okm_len) ? okm_len - done_len : dig_len;
memcpy(okm + done_len, prev, copy_len);
done_len += copy_len;
}
diff --git a/tests/unit-tests/crypto-helper.t.cpp b/tests/unit-tests/crypto-helper.t.cpp
index dc2dd66..6638515 100644
--- a/tests/unit-tests/crypto-helper.t.cpp
+++ b/tests/unit-tests/crypto-helper.t.cpp
@@ -72,57 +72,7 @@
bobResult, bobResult + 32);
}
-BOOST_AUTO_TEST_CASE(HmacSha256)
-{
- uint8_t secret[] = {0x00,0x01,0x02,0x03,0x04,0x05,
- 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c};
-
- uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b};
-
- uint8_t result[32];
-
- uint8_t expected[] = {0x07,0x77,0x09,0x36,0x2c,0x2e,0x32,
- 0xdf,0x0d,0xdc,0x3f,0x0d,0xc4,0x7b,
- 0xba,0x63,0x90,0xb6,0xc7,0x3b,0xb5,
- 0x0f,0x9c,0x31,0x22,0xec,0x84,0x4a,
- 0xd7,0xc2,0xb3,0xe5};
-
- ndn_compute_hmac_sha256(salt, sizeof(salt), secret, sizeof(secret), result);
- BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0);
-}
-
-BOOST_AUTO_TEST_CASE(HkdfIetf1)
-{
- uint8_t secret[] = {0x00,0x01,0x02,0x03,0x04,0x05,
- 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c};
-
- uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b};
-
- uint8_t info[] = {0xf0,0xf1,0xf2,0xf3,0xf4,
- 0xf5,0xf6,0xf7,0xf8,0xf9};
-
- uint8_t result[42];
- uint8_t expected[] = {0x3c,0xb2,0x5f,0x25,0xfa,0xac,0xd5,0x7a,0x90,0x43,
- 0x4f,0x64,0xd0,0x36,0x2f,0x2a,0x2d,0x2d,0x0a,0x90,
- 0xcf,0x1a,0x5a,0x4c,0x5d,0xb0,0x2d,0x56,0xec,0xc4,
- 0xc5,0xbf,0x34,0x00,0x72,0x08,0xd5,0xb8,0x87,0x18,
- 0x58,0x65};
-
- auto resultLen = hkdf(secret, sizeof(secret),
- salt,sizeof(salt),
- result, sizeof(result),
- info, sizeof(info));
-
- BOOST_CHECK(resultLen != 0);
- BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0);
-}
-
+// Test case 2 from RFC 5869
BOOST_AUTO_TEST_CASE(HkdfIetf2)
{
uint8_t secret[] = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
@@ -158,7 +108,6 @@
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
- uint8_t result[82];
uint8_t expected[] = {0xb1,0x1e,0x39,0x8d,0xc8,0x03,0x27,
0xa1,0xc8,0xe7,0xf7,0x8c,0x59,0x6a,
0x49,0x34,0x4f,0x01,0x2e,0xda,0x2d,
@@ -172,40 +121,15 @@
0x3e,0x87,0xc1,0x4c,0x01,0xd5,0xc1,
0xf3,0x43,0x4f,0x1d,0x87};
+ uint8_t result[82];
auto resultLen = hkdf(secret, sizeof(secret),
salt,sizeof(salt),
result, sizeof(result),
info, sizeof(info));
- BOOST_CHECK(resultLen != 0);
- BOOST_CHECK(memcmp(expected, result, 42) == 0);
-}
-
-BOOST_AUTO_TEST_CASE(HkdfIetf3)
-{
- //uint8_t secret[] = {}; secret is empty in this test
-
- uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
- 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b};
-
- //uint8_t info[] = {}; info is empty in this test
-
- uint8_t result[42];
- uint8_t expected[] = {0x8d,0xa4,0xe7,0x75,0xa5,0x63,0xc1,0x8f,
- 0x71,0x5f,0x80,0x2a,0x06,0x3c,0x5a,0x31,
- 0xb8,0xa1,0x1f,0x5c,0x5e,0xe1,0x87,0x9e,
- 0xc3,0x45,0x4e,0x5f,0x3c,0x73,0x8d,0x2d,
- 0x9d,0x20,0x13,0x95,0xfa,0xa4,0xb6,0x1a,
- 0x96,0xc8};
-
- auto resultLen = hkdf(nullptr, 0,
- salt,sizeof(salt),
- result, sizeof(result),
- nullptr, 0);
-
- BOOST_CHECK(resultLen != 0);
- BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0);
+ BOOST_CHECK_EQUAL(resultLen, 82);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result),
+ expected, expected + sizeof(expected));
}
BOOST_AUTO_TEST_SUITE_END()