util: backport C++20 std::span and use it in various APIs
Implementation taken from span-lite by Martin Moene,
commit 337af6e23f6d3264136c16565546244da23159ba
Change-Id: Icfd0ba6841cbf6ef7870c31c881df940da9faf7e
diff --git a/tests/unit/security/tpm/back-end.t.cpp b/tests/unit/security/tpm/back-end.t.cpp
index 3b08c62..0b22d54 100644
--- a/tests/unit/security/tpm/back-end.t.cpp
+++ b/tests/unit/security/tpm/back-end.t.cpp
@@ -121,37 +121,34 @@
Name keyName = key->getKeyName();
transform::PublicKey pubKey;
- ConstBufferPtr pubKeyBits = key->derivePublicKey();
- pubKey.loadPkcs8(pubKeyBits->data(), pubKeyBits->size());
+ auto pubKeyBits = key->derivePublicKey();
+ pubKey.loadPkcs8(*pubKeyBits);
- // Sign using single buffer API
+ // Sign a single buffer
const uint8_t content1[] = {0x01, 0x02, 0x03, 0x04};
- auto sigValueSingle = key->sign(DigestAlgorithm::SHA256, content1, sizeof(content1));
+ auto sigValueSingle = key->sign(DigestAlgorithm::SHA256, {content1});
BOOST_REQUIRE(sigValueSingle != nullptr);
bool resultSingle;
{
using namespace transform;
- bufferSource(content1, sizeof(content1)) >>
- verifierFilter(DigestAlgorithm::SHA256, pubKey,
- sigValueSingle->data(), sigValueSingle->size()) >>
- boolSink(resultSingle);
+ bufferSource(content1)
+ >> verifierFilter(DigestAlgorithm::SHA256, pubKey, sigValueSingle->data(), sigValueSingle->size())
+ >> boolSink(resultSingle);
}
BOOST_CHECK_EQUAL(resultSingle, true);
- // Sign using vectored API
+ // Sign multiple buffers
const uint8_t content2[] = {0x05, 0x06, 0x07, 0x08};
- auto sigValueVector = key->sign(DigestAlgorithm::SHA256, {{content1, sizeof(content1)},
- {content2, sizeof(content2)}});
+ auto sigValueVector = key->sign(DigestAlgorithm::SHA256, {content1, content2});
BOOST_REQUIRE(sigValueVector != nullptr);
bool resultVector;
{
using namespace transform;
- bufferSource({{content1, sizeof(content1)}, {content2, sizeof(content2)}}) >>
- verifierFilter(DigestAlgorithm::SHA256, pubKey,
- sigValueVector->data(), sigValueVector->size()) >>
- boolSink(resultVector);
+ bufferSource(InputBuffers{content1, content2})
+ >> verifierFilter(DigestAlgorithm::SHA256, pubKey, sigValueVector->data(), sigValueVector->size())
+ >> boolSink(resultVector);
}
BOOST_CHECK_EQUAL(resultVector, true);
@@ -172,11 +169,11 @@
const uint8_t content[] = {0x01, 0x02, 0x03, 0x04};
transform::PublicKey pubKey;
- ConstBufferPtr pubKeyBits = key->derivePublicKey();
- pubKey.loadPkcs8(pubKeyBits->data(), pubKeyBits->size());
+ auto pubKeyBits = key->derivePublicKey();
+ pubKey.loadPkcs8(*pubKeyBits);
- ConstBufferPtr cipherText = pubKey.encrypt(content, sizeof(content));
- ConstBufferPtr plainText = key->decrypt(cipherText->data(), cipherText->size());
+ ConstBufferPtr cipherText = pubKey.encrypt(content);
+ ConstBufferPtr plainText = key->decrypt(*cipherText);
BOOST_CHECK_EQUAL_COLLECTIONS(content, content + sizeof(content),
plainText->begin(), plainText->end());
@@ -196,37 +193,34 @@
Name ecKeyName = key->getKeyName();
transform::PublicKey pubKey;
- ConstBufferPtr pubKeyBits = key->derivePublicKey();
- pubKey.loadPkcs8(pubKeyBits->data(), pubKeyBits->size());
+ auto pubKeyBits = key->derivePublicKey();
+ pubKey.loadPkcs8(*pubKeyBits);
- // Sign using single buffer API
+ // Sign a single buffer
const uint8_t content1[] = {0x01, 0x02, 0x03, 0x04};
- auto sigValueSingle = key->sign(DigestAlgorithm::SHA256, content1, sizeof(content1));
+ auto sigValueSingle = key->sign(DigestAlgorithm::SHA256, {content1});
BOOST_REQUIRE(sigValueSingle != nullptr);
bool resultSingle;
{
using namespace transform;
- bufferSource(content1, sizeof(content1)) >>
- verifierFilter(DigestAlgorithm::SHA256, pubKey,
- sigValueSingle->data(), sigValueSingle->size()) >>
- boolSink(resultSingle);
+ bufferSource(content1)
+ >> verifierFilter(DigestAlgorithm::SHA256, pubKey, sigValueSingle->data(), sigValueSingle->size())
+ >> boolSink(resultSingle);
}
BOOST_CHECK_EQUAL(resultSingle, true);
- // Sign using vectored API
+ // Sign multiple buffers
const uint8_t content2[] = {0x05, 0x06, 0x07, 0x08};
- auto sigValueVector = key->sign(DigestAlgorithm::SHA256, {{content1, sizeof(content1)},
- {content2, sizeof(content2)}});
+ auto sigValueVector = key->sign(DigestAlgorithm::SHA256, {content1, content2});
BOOST_REQUIRE(sigValueVector != nullptr);
bool resultVector;
{
using namespace transform;
- bufferSource({{content1, sizeof(content1)}, {content2, sizeof(content2)}}) >>
- verifierFilter(DigestAlgorithm::SHA256, pubKey,
- sigValueVector->data(), sigValueVector->size()) >>
- boolSink(resultVector);
+ bufferSource(InputBuffers{content1, content2})
+ >> verifierFilter(DigestAlgorithm::SHA256, pubKey, sigValueVector->data(), sigValueVector->size())
+ >> boolSink(resultVector);
}
BOOST_CHECK_EQUAL(resultVector, true);
@@ -245,23 +239,18 @@
unique_ptr<KeyHandle> key = tpm.createKey(identity, HmacKeyParams());
Name hmacKeyName = key->getKeyName();
- // Sign and verify using single buffer API
+ // Sign and verify a single buffer
const uint8_t content1[] = {0x01, 0x02, 0x03, 0x04};
- auto sigValueSingle = key->sign(DigestAlgorithm::SHA256, content1, sizeof(content1));
+ auto sigValueSingle = key->sign(DigestAlgorithm::SHA256, {content1});
BOOST_REQUIRE(sigValueSingle != nullptr);
- bool resultSingle = key->verify(DigestAlgorithm::SHA256, content1, sizeof(content1),
- sigValueSingle->data(), sigValueSingle->size());
+ bool resultSingle = key->verify(DigestAlgorithm::SHA256, {content1}, *sigValueSingle);
BOOST_CHECK_EQUAL(resultSingle, true);
- // Sign and verify using vectored API
+ // Sign and verify multiple buffers
const uint8_t content2[] = {0x05, 0x06, 0x07, 0x08};
- auto sigValueVector = key->sign(DigestAlgorithm::SHA256, {{content1, sizeof(content1)},
- {content2, sizeof(content2)}});
+ auto sigValueVector = key->sign(DigestAlgorithm::SHA256, {content1, content2});
BOOST_REQUIRE(sigValueVector != nullptr);
- bool resultVector = key->verify(DigestAlgorithm::SHA256,
- {{content1, sizeof(content1)},
- {content2, sizeof(content2)}},
- sigValueVector->data(), sigValueVector->size());
+ bool resultVector = key->verify(DigestAlgorithm::SHA256, {content1, content2}, *sigValueVector);
BOOST_CHECK_EQUAL(resultVector, true);
tpm.deleteKey(hmacKeyName);
@@ -308,22 +297,22 @@
BOOST_REQUIRE_EQUAL(tpm.hasKey(keyName), false);
transform::PrivateKey sKey;
- sKey.loadPkcs1Base64(reinterpret_cast<const uint8_t*>(privKeyPkcs1.data()), privKeyPkcs1.size());
+ sKey.loadPkcs1Base64({reinterpret_cast<const uint8_t*>(privKeyPkcs1.data()), privKeyPkcs1.size()});
OBufferStream os;
sKey.savePkcs8(os, password.data(), password.size());
auto pkcs8 = os.buf();
// import with wrong password
- BOOST_CHECK_THROW(tpm.importKey(keyName, pkcs8->data(), pkcs8->size(), wrongPassword.data(), wrongPassword.size()),
+ BOOST_CHECK_THROW(tpm.importKey(keyName, *pkcs8, wrongPassword.data(), wrongPassword.size()),
Tpm::Error);
BOOST_CHECK_EQUAL(tpm.hasKey(keyName), false);
// import with correct password
- tpm.importKey(keyName, pkcs8->data(), pkcs8->size(), password.data(), password.size());
+ tpm.importKey(keyName, *pkcs8, password.data(), password.size());
BOOST_CHECK_EQUAL(tpm.hasKey(keyName), true);
// import already present key
- BOOST_CHECK_THROW(tpm.importKey(keyName, pkcs8->data(), pkcs8->size(), password.data(), password.size()),
+ BOOST_CHECK_THROW(tpm.importKey(keyName, *pkcs8, password.data(), password.size()),
Tpm::Error);
// test derivePublicKey with the imported key
@@ -336,7 +325,7 @@
BOOST_CHECK_EQUAL(tpm.hasKey(keyName), true);
transform::PrivateKey sKey2;
- sKey2.loadPkcs8(exportedKey->data(), exportedKey->size(), password.data(), password.size());
+ sKey2.loadPkcs8(*exportedKey, password.data(), password.size());
OBufferStream os2;
sKey.savePkcs1Base64(os2);
auto pkcs1 = os2.buf();