1 #ifndef NDNPH_KEYCHAIN_EC_HPP
2 #define NDNPH_KEYCHAIN_EC_HPP
4 #include "../port/ec/port.hpp"
20 static const uint8_t bytes[] = {
23 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01,
24 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07,
27 static const tlv::Value value(bytes,
sizeof(bytes));
49 if (content.size() < PubLen::value) {
54 auto found = std::search(content.begin(), content.end(), oid.begin(), oid.end());
55 if (found == content.end()) {
59 return content.end() - PubLen::value;
70 explicit operator bool()
const {
71 return m_key !=
nullptr;
80 bool import(
const Name& name,
const uint8_t raw[KeyLen::value]) {
85 m_key.reset(
new port::Ec::PublicKey());
86 if (!m_key->import(raw)) {
92 std::copy_n(raw,
sizeof(m_raw), m_raw);
104 if (raw ==
nullptr) {
113 return import(name, raw);
126 template<
typename Signer>
128 const Signer& signer)
const {
131 size_t spkiLen = spkiHdr.size() + KeyLen::value;
132 uint8_t* spki = region.
alloc(spkiLen);
133 if (spki ==
nullptr) {
137 auto pos = std::copy_n(spkiHdr.begin(), spkiHdr.size(), spki);
138 std::copy_n(m_raw, KeyLen::value, pos);
153 template<
typename Signer>
155 const Signer& signer)
const {
165 bool verify(std::initializer_list<tlv::Value> chunks,
const uint8_t* sig,
166 size_t sigLen)
const final {
167 if (m_key ==
nullptr) {
175 std::unique_ptr<port::Ec::PublicKey> m_key;
176 uint8_t m_raw[KeyLen::value];
186 explicit operator bool()
const {
187 return m_key !=
nullptr;
194 bool import(
const Name& name,
const uint8_t raw[KeyLen::value]) {
199 m_key.reset(
new port::Ec::PrivateKey());
200 if (!m_key->import(raw)) {
210 return MaxSigLen::value;
213 ssize_t
sign(std::initializer_list<tlv::Value> chunks, uint8_t* sig)
const final {
214 if (m_key ==
nullptr) {
221 return m_key->sign(digest, sig);
225 std::unique_ptr<port::Ec::PrivateKey> m_key;
233 generateRaw(uint8_t pvt[EcPrivateKey::KeyLen::value], uint8_t pub[EcPublicKey::KeyLen::value]) {
234 return port::Ec::generateKey(pvt, pub);
241 uint8_t pvt[PvtLen::value];
242 uint8_t pub[PubLen::value];
256 bool ok = stored !=
nullptr &&
generateRaw(stored->pvt, stored->pub) &&
257 pvt.
import(keyName, stored->pvt) && pub.
import(keyName, stored->pub);
259 if (keyChain !=
nullptr) {
310 return decoder.
decode(name) && pvt.
import(name, stored->pvt) && pub.
import(name, stored->pub);
Data packet.
Definition: data.hpp:136
void setContent(tlv::Value v)
Definition: data.hpp:176
tlv::Value getContent() const
Definition: data.hpp:172
TLV decoder.
Definition: decoder.hpp:10
bool decode(T &target) const
Decode first TLV into target object.
Definition: decoder.hpp:158
bool prepend(const First &first, const Arg &... arg)
Prepend a sequence of values.
Definition: encoder.hpp:123
uint8_t * prependRoom(size_t size)
Make room to prepend an object.
Definition: encoder.hpp:90
File based key and certificate store.
Definition: keychain.hpp:36
KeyChainKeys keys
Definition: keychain.hpp:51
tlv::Value get(const char *key, Region ®ion)
Retrieve a value.
Definition: kv.hpp:38
bool set(const char *key, tlv::Value value)
Store a value.
Definition: kv.hpp:69
Name.
Definition: name.hpp:14
Region-based memory allocator thats owns memory of NDNph objects.
Definition: region.hpp:9
uint8_t * alloc(size_t size)
Allocate a buffer with no alignment requirement.
Definition: region.hpp:27
Encoder that auto-discards upon destruction.
Definition: encoder.hpp:198
ValidityPeriod of a certificate.
Definition: validity-period.hpp:37
Definition: helper.hpp:64
Definition: helper.hpp:54
EC private key.
Definition: ec.hpp:180
bool import(const Name &name, const uint8_t raw[KeyLen::value])
Import a private key from raw key bits.
Definition: ec.hpp:194
detail::PvtLen KeyLen
Definition: ec.hpp:182
ssize_t sign(std::initializer_list< tlv::Value > chunks, uint8_t *sig) const final
Perform signing.
Definition: ec.hpp:213
size_t getMaxSigLen() const final
Definition: ec.hpp:209
port::Ec::Curve::MaxSigLen MaxSigLen
Definition: ec.hpp:183
EC public key.
Definition: ec.hpp:65
Data::Signed buildCertificate(Region ®ion, const Name &name, const ValidityPeriod &validity, const Signer &signer) const
Generate certificate of this public key.
Definition: ec.hpp:127
bool verify(std::initializer_list< tlv::Value > chunks, const uint8_t *sig, size_t sigLen) const final
Perform verification.
Definition: ec.hpp:165
detail::PubLen KeyLen
Definition: ec.hpp:67
bool import(const Name &name, const uint8_t raw[KeyLen::value])
Import from raw key bits.
Definition: ec.hpp:80
Data::Signed selfSign(Region ®ion, const ValidityPeriod &validity, const Signer &signer) const
Generate self-signed certificate of this public key.
Definition: ec.hpp:154
A sequence of bytes, usually TLV-VALUE.
Definition: value.hpp:11
const uint8_t * begin() const
Definition: value.hpp:38
size_t size() const
Definition: value.hpp:46
#define NDNPH_SHA256_LEN
SHA256 digest length.
Definition: common.hpp:34
bool isCertificate(const Data &data)
Determine if the Data packet is a certificate.
Definition: certificate.hpp:170
bool isKeyName(const Name &name)
Determine if the input is a key name.
Definition: certificate.hpp:37
Component getIssuerSelf()
Return 'self' component as self-signed issuerId.
Definition: certificate.hpp:29
Name toKeyName(Region ®ion, const Name &input, bool mustCopy=false)
Convert to key name.
Definition: certificate.hpp:82
Name makeCertName(Region ®ion, const Name &input, const Component &issuerId, const Component &version)
Construct certificate name with specified issuerId and version.
Definition: certificate.hpp:149
Definition: input-iterator-pointer-proxy.hpp:5
Data::Signed buildCertificate(Region ®ion, const Name &name, const ValidityPeriod &validity, const Signer &signer, const Modify &modify)
Definition: certificate.hpp:207
bool computeDigest(std::initializer_list< tlv::Value > chunks, uint8_t digest[NDNPH_SHA256_LEN])
Definition: helper.hpp:15
port::Ec::Curve::PvtLen PvtLen
Definition: ec.hpp:14
bool generate(Region ®ion, const Name &name, EcPrivateKey &pvt, EcPublicKey &pub, KeyChain *keyChain, const char *id)
Definition: ec.hpp:246
const uint8_t * findPublicKeyInCertificate(const Data &data)
Extract raw public key from a certificate.
Definition: ec.hpp:43
port::Ec::Curve::PubLen PubLen
Definition: ec.hpp:15
tlv::Value getSpkiHeader()
Return EC P-256 SPKI except the key.
Definition: ec.hpp:19
tlv::Value getOid()
Return '1.2.840.10045.2.1 ecPublicKey' OID bytes.
Definition: ec.hpp:33
bool generateRaw(uint8_t pvt[EcPrivateKey::KeyLen::value], uint8_t pub[EcPublicKey::KeyLen::value])
Generate key pair in raw format.
Definition: ec.hpp:233
bool isCertificate(const Data &data)
Determine if the Data packet is a certificate that contains an EC public key.
Definition: ec.hpp:319
bool load(KeyChain &keyChain, const char *id, Region ®ion, EcPrivateKey &pvt, EcPublicKey &pub)
Load key pair from KeyChain.
Definition: ec.hpp:301
ec::EcPrivateKey EcPrivateKey
Definition: ec.hpp:326
ec::EcPublicKey EcPublicKey
Definition: ec.hpp:325
Key pair stored in KeyChain.
Definition: ec.hpp:240