RFC 8387
Practical Considerations and Implementation Experiences in Securing Smart Object Networks
Practical Considerations and Implementation Experiences in Securing Smart Object Networks โจ
(part 1 of 10 ๐งฉ)
Okay bestie, here's the header tea ๐ซ. This is RFC 8387, published by the IETF in May 2018 ๐. The authors are M. Sethi, J. Arkko, and A. Keranen from Ericsson, plus H. Back from Nokia ๐ซถ. It's Informational, so it isn't a Standards Track spec. It's here to share experiences, not lay down rules ๐ธ. The ISSN is 2070-1721. The header doesn't list any RFC it obsoletes or updates, so it isn't replacing or patching anything else ๐ .
Abstract
Okay so this memo is all about the struggles of securing resource-constrained smart object devices ๐งธ, aka tiny gadgets without much power or memory ๐ฅบ. It describes a possible deployment model where those little devices sign message objects โ๏ธ. It also talks about whether cryptographic libraries are actually available for them ๐, and shares some preliminary experiences using those libraries for message signing on constrained devices ๐. Lastly, it covers the trade-offs between different kinds of security approaches ๐.
Status of This Memo
This document is not an Internet Standards Track specification, it's just published for info ๐ฆ.
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community โจ. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG). Not every IESG-approved doc is a candidate for any level of Internet Standard, so check out Section 2 of RFC 7841 for the full story ๐.
Info about the current status of this document, any errata, and how to give feedback is at https://www.rfc-editor.org/info/rfc8387 ๐.
Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the document authors. All rights reserved ๐.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as in effect on the date of publication. Please read these carefully, because they describe your rights and restrictions for this document ๐. Code Components extracted from this document must include Simplified BSD License text, as described in Section 4.e of the Trust Legal Provisions. They're provided without warranty, as described in the Simplified BSD License ๐ซง.
Table of Contents ๐๏ธ
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Related Work . . . . . . . . . . . . . . . . . . . . . . . . 3
3. Challenges . . . . . . . . . . . . . . . . . . . . . . . . . 4
4. Proposed Deployment Model . . . . . . . . . . . . . . . . . . 6
4.1. Provisioning . . . . . . . . . . . . . . . . . . . . . . 6
4.2. Protocol Architecture . . . . . . . . . . . . . . . . . . 9
5. Code Availability . . . . . . . . . . . . . . . . . . . . . . 10
6. Implementation Experiences . . . . . . . . . . . . . . . . . 12
7. Example Application . . . . . . . . . . . . . . . . . . . . . 18
8. Design Trade-Offs . . . . . . . . . . . . . . . . . . . . . . 21
8.1. Feasibility . . . . . . . . . . . . . . . . . . . . . . . 21
8.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 22
8.3. Layering . . . . . . . . . . . . . . . . . . . . . . . . 24
8.4. Symmetric vs. Asymmetric Crypto . . . . . . . . . . . . . 26
9. Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
10. Security Considerations . . . . . . . . . . . . . . . . . . . 27
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27
12. Informative References . . . . . . . . . . . . . . . . . . . 27
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 33
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 33
1. Introduction โจ
Okay so this memo is about the challenges of securing smart object devices in constrained implementations and environments ๐งธ. In Section 3, we get into three specific challenges ๐: the implementation difficulties you run into on resource-constrained platforms, the problem of provisioning keys, and making the choice of implementing security at the appropriate layer ๐ฐ.
Section 4 talks about a potential deployment model for constrained environments ๐. The model needs only a minimal amount of configuration, and we believe it's a natural fit with the typical communication practices in smart object networking environments ๐.
Section 5 covers the availability of cryptographic libraries ๐. Section 6 shares experiences implementing cryptography on resource-constrained devices using those libraries, including info about achievable code sizes and speeds on typical hardware ๐ง. Section 7 describes an example proof-of-concept prototype implementation. It uses public-key cryptography on resource-constrained devices to provide end-to-end data authenticity and integrity protection ๐.
Finally, Section 8 discusses trade-offs between different types of security approaches ๐.
2. Related Work ๐ฆ
The Constrained Application Protocol (CoAP) [RFC7252] is a lightweight protocol designed for machine-to-machine applications like smart energy and building automation โก. We use it as our example here, but the conclusions may apply to other similar protocols ๐ธ. The CoAP base specification [RFC7252] outlines how to use DTLS [RFC6347] and IPsec [RFC4303] to secure the protocol ๐. DTLS can be applied with pairwise shared keys, raw public keys, or certificates ๐๏ธ.
In every case, the security model is mutual authentication. So yes, there's some commonality with HTTP [RFC7230] when it comes to verifying the server identity, but in practice the models are pretty different ๐. The use of IPsec with CoAP is described with regard to the protocol requirements, and it notes that lightweight implementations of the Internet Key Exchange Protocol Version 2 (IKEv2) exist [RFC7815] โจ. However, the CoAP specification is silent on policy and the other stuff you normally need for interoperable use of IPsec in any environment [RFC5406] ๐.
[IoT-SECURITY] walks through the different stages in the life cycle of a smart object ๐. Then it highlights the security threats for smart objects and the challenges you might face protecting against them ๐ฌ. It also looks at a bunch of security protocols: IKEv2/IPsec [RFC7296], TLS/SSL [RFC5246], DTLS [RFC6347], the Host Identity Protocol (HIP) [RFC7401], HIP Diet EXchange [HIP-DEX], a Protocol for Carrying Authentication for Network Access (PANA) [RFC5191], and the Extensible Authentication Protocol (EAP) [RFC3748] ๐ง. Lastly, [IoT-BOOTSTRAPPING] discusses bootstrapping mechanisms for resource-constrained Internet of Things (IoT) devices ๐ฅพ.
[RFC6574] gives an overview of the security discussions at the March 2011 IAB workshop on smart objects ๐. The workshop recommended more work on three things: developing suitable credential management mechanisms (maybe something like the Bluetooth pairing mechanism) ๐, understanding how implementable standard security mechanisms are on resource-constrained devices ๐ ๏ธ, and doing more research into lightweight cryptographic primitives ๐งช.
[HIP-DEX] defines a lightweight version of the HIP protocol for low-power nodes ๐. It uses a fixed set of algorithms, Elliptic Curve Cryptography (ECC), and it eliminates hash functions ๐ค. The protocol still operates based on host identities and runs end-to-end between hosts, protecting all IP-layer communications ๐ก๏ธ. [RFC6078] describes an extension of HIP that can send upper-layer protocol messages without running the usual HIP base exchange at all ๐.
[IPV6-LOWPAN-SEC] makes a comprehensive analysis of security issues related to IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) networks ๐ก. Its findings also apply more generally to all low-powered networks ๐. Some of the issues it covers include the need to minimize the number of transmitted bits and simplify implementations ๐ซง, threats in smart object networking environments ๐, and how suitable 6LoWPAN security mechanisms, IPsec, and key management protocols are for these environments ๐ .
3. Challenges โจ
okay so this section is about three challenges: 1) implementation difficulties, 2) practical provisioning problems, and 3) layering and communication models ๐ง
First up, implementation difficulties. Everyone loves to talk about these when it comes to security for the Internet of Things ๐ The goal is to build devices that are resource-constrained, battery-operated, and cheap, so they end up with a limited protocol and application suite. Some typical limitations are running CoAP instead of HTTP, limited support for security mechanisms, limited processing power for long key lengths, and a sleep schedule that doesn't allow communication at all times, and so on ๐ญ On top of that, these devices usually have very limited support for configuration, which makes it hard to set up secrets and trust anchors. Lowkey a nightmare ๐
Now, the implementation difficulties are important, but they should not be overemphasized ๐ It's important to pick the right security mechanisms and avoid duplicated or unnecessary functionality. But at the end of the day, if strong cryptographic security is needed, the implementations have to support that ๐ฅ It's also important for developers and product designers to figure out which security threats they want to tackle, plus the resulting security requirements, before picking the hardware. Honestly, development in the wild often happens in the wrong order ๐ฉ Someone picks a platform with a resource-constrained microcontroller first, and then decides which security features can fit on it. The most lightweight algorithms and cryptographic primitives are useful, but they should not be the only thing you consider in the design and development ๐ Interoperability matters too, and other parts of the system, like key management protocols or certificate formats, are often heavier to implement than the algorithms themselves.
The second challenge is practical provisioning problems ๐ธ This is perhaps the most fundamental and difficult issue, and it's unfortunately often neglected in the design. There are several problems in provisioning and managing smart object networks:
- Resource-constrained devices have no natural user interface for configuration, which would be required for installing shared secrets and other security-related parameters. Typically there's no keyboard or display, and there may not even be buttons to press. Some devices may only have one interface, the interface to the network. ๐ญ
- Manual configuration is rarely, if ever, possible, because the necessary skills are missing in typical installation environments (like family homes) ๐
- There may be a large number of devices. Configuration tasks that are fine for one device may become unacceptable with dozens or hundreds of devices ๐
- Smart object networks may rely on different radio technologies. Provisioning methods that rely on specific link-layer features may not work with other radio technologies in a heterogeneous network ๐ก
- Network configurations evolve over the lifetime of the devices, as additional devices are introduced or addresses change. Central nodes may also get more frequent updates than individual devices, like sensors embedded in building materials ๐งฑ
So, given all of that, resource-constrained devices are often shipped with a single static identity. In many cases, it's a single raw public key ๐ These long-term static identities make it easy to track the devices (and their owners) when they move. The static identities may also let an attacker track these devices across ownership changes. Not me getting chills ๐ฅถ
Last but not least, layering and communication models make it hard to straightforwardly use the most obvious security mechanisms ๐ฆ Smart object networks typically pass information through multiple participating nodes [CoAP-SENSORS], and end-to-end security for IP or transport layers may not fit these communication models very well. The main reasons for needing middleboxes come down to accommodating sleeping nodes, and enabling nodes that store or aggregate information ๐
4. Proposed Deployment Model ๐
okay so [CoAP-SECURITY] says the provisioning model is the driver of what kind of security architecture is useful ๐ง This section quickly reintroduces that model so we can talk about the different design alternatives later without getting lost ๐ซถ
The proposed architecture is based on self-generated secure identities, which is giving CGAs vibes [RFC3972] or Host Identity Tags (HITs) [RFC7401]. So basically, we assume the following holds:
I = h(P|O)
where I is the secure identity of the device, h is a hash function, P is the public key from a key pair generated by the device, and O is optional other information. "|" (vertical bar) here denotes the concatenation operator โจ Main character energy for the identity, no cap ๐
4.1. Provisioning โจ
okay so provisioning security credentials, shared secrets, and policy info is genuinely hard ๐ญ, which is why the whole model is based only on the secure identities ๐. A typical network install means physically placing a bunch of devices and noting each one's identity. That list of short identifiers then gets fed to a central server as the list of authorized devices. After that, secure comms can start with the devices, at least for info flowing from the devices to the server, and that's exactly what sensor networks need ๐ธ.
This setup is a perfect fit for sensor networks, where info flows from tons of devices into a few servers. But it's not enough on its own for other kinds of apps. Take actuator apps, where a large number of devices need to take commands from somewhere else. There, you need to secure that the commands actually come from an authorized source ๐ฅ.
This can be supported with some extra provisioning effort and optional pairing protocols ๐ฆ. The basic provisioning approach still applies, but there also has to be something that tells the devices who the trusted server(s) are, and there are multiple ways to do that. One simple approach is to feed the identities of the trusted server(s) to the devices at installation time. You can do that through a separate user interface, a local connection (like USB), or the device's network interface for configuration. Same as with sensor networks, the config stays tiny: just one short identity value gets fed in, not both an identity and a certificate or shared secrets that have to stay confidential ๐ค. An even simpler approach is for the devices in the device group to trust each other, so no configuration is needed at installation time ๐ .
Once both parties who want to communicate know each other's expected cryptographic identity offline, secure communications can start. Or, various pairing schemes can be used instead. These can benefit from the already secure identifiers on the device side. For example, the server can send a pairing message to each device after its initial power-on and before it's been paired with anyone, encrypted with the device's public key. Now, here's the tea โ: as with all pairing schemes that don't use a shared secret or the secure identity of both parties, there are some leftover vulnerabilities that may or may not be acceptable for the application in question. For example, lots of pairing methods based on "leap of faith" or "trust on first use" assume the attacker isn't present during the initial setup. So they're vulnerable to eavesdropping or man-in-the-middle (MitM) attacks ๐.
Anyway, the secure identities help once again by keeping operations as simple as possible. Only identities need to be communicated to the devices, not certificates, shared secrets, or, e.g., IPsec policy rules ๐.
Where necessary, the info collected at installation time can also include other application-relevant parameters, like the location or purpose of the devices ๐. That way, the server can know, for instance, that a particular device is the temperature sensor for the kitchen ๐.
There are a few ways to collect the identity info at installation time ๐. One simple but not completely secure method is printing the last few digits of the identity on a tiny device just a few millimeters across. Or, the packaging for the device can include the full identity (typically 32 hex digits), retrieved from the device at manufacturing time. The installation personnel can then read it with, for example, a bar code reader they carry around. (Quick reminder: the identities are not secret. The security of the system doesn't depend on the identity info staying hidden from others. The real owner of an identity can always prove ownership with the private key, which never leaves the device ๐.) Last but not least, the device might use its wired network interface or proximity-based communications, like Near-Field Communications (NFC) or Radio-Frequency Identity (RFID) tags. These interfaces let the device identity be communicated securely to an information gathering device at installation time ๐ง.
No matter how the info gets collected, this provisioning model keeps the effort needed to set up security super low ๐ญโจ. Each device generates its own identity in a random, secure key-generation process ๐. The identities are self-securing, meaning that if you know the identity of the peer you want to talk to, messages from that peer can be signed with the peer's private key, and it's trivial to verify the message came from the expected peer ๐ซถ. You don't need to configure an identity and a certificate for that identity separately. You don't need to configure a group secret or a shared secret. You don't need to configure a trust anchor either. Plus, identities usually get collected anyway for application purposes (like figuring out which sensor is in which room), so under most circumstances there's basically no extra configuration effort for security provisioning ๐.
As we talked about in the previous section, long-term static identities mess with the privacy of the devices and their owners ๐. So it's beneficial for devices to generate new identities at appropriate times in their life cycle, like after a factory reset or an ownership handover ๐. In our proposed deployment model, then, the devices would generate a new asymmetric key pair and use the new public-key P' to generate the new identity I'. It's also desirable that these identities are only used during the provisioning stage. Once the device is operational, temporary identities (like dynamic IPv6 addresses) can be used for network communication protocols ๐.
Groups of devices can be managed through single identifiers too ๐. In these deployment cases, you can configure the identity of an entire group of devices, instead of registering each device one by one. For instance, lots of installations use a kit of devices bought from the same manufacturer in one package ๐ฆ. It's easy to give a set like that an identity, like this:
Idev = h(Pdev|Potherdev1|Potherdev2|...|Potherdevn)
Igrp = h(Pdev1|Pdev2|...|Pdevm)
where Idev is the identity of an individual device, Pdev is the public key of that device, Potherdevi are the public keys of other devices in the group, n is all the devices in the group except the device with Pdev as its public key, and m is the total number of devices in the group. So basically, we can define the secure identity of the group (Igrp) as a hash of all the public keys of the devices in the group (Pdevi) ๐งฎ.
The installation personnel can scan the identity of the group from the box the kit came in, and that identity can be stored in a server that's expected to receive info from the nodes ๐ธ. Later, when the individual devices contact that server, they can prove they're part of the group, because they can reveal their own public key and the public keys of the other devices ๐ซก. Devices that don't belong to the kit can't claim to be in the group, because the group identity would change if any new keys were added to the identity of the group (Igrp). Not me trying to sneak into the group chat ๐ซ๐ .
4.2. Protocol Architecture ๐๏ธ
okay so, as we noted above, the starting point is that nodes self-generate secure identities, which then get communicated out of band to the peers that need to know which devices to trust ๐ค. To make this model work in a protocol architecture, we also need to use these secure identities to implement secure messaging between the peers, explain how the system can respond to different types of attacks like replay attempts, and decide which protocol layer and endpoints the architecture should use ๐ง .
The deployment itself works with a variety of design choices when it comes to layering and protocol mechanisms ๐ฐ. [CoAP-SECURITY] was mostly focused on employing end-to-end data-object security as opposed to hop-by-hop security. But other approaches are possible too. For instance, HIP in its opportunistic mode could be used to implement largely the same functionality at the IP layer. However, it's our belief that the right layer for this solution is the application layer, and more specifically, the data formats transported in the payload part of CoAP โจ. This approach gives us the following benefits:
- Ability for intermediaries to act as caches to support different sleep schedules, without the security model being impacted ๐ด.
- Ability for intermediaries to be built to perform aggregation, filtering, storage, and other actions, again without impacting the security of the data being transmitted or stored ๐ฆ.
- Ability to operate in the presence of traditional middleboxes, such as a protocol translators or even NATs (not that we recommend their use in these environments) ๐.
Now, the catch: as we'll see later, link, network, and transport-layer solutions are more likely to benefit from sessions where the cost of expensive operations can be amortized over multiple data transmissions ๐ธ. While this isn't impossible in data-object security solutions, it's generally not the typical arrangement ๐ฅฒ.
5. Code Availability ๐ปโจ
Okay so, for putting public-key crypto on tiny resource-constrained devices, we picked the Arduino Uno board [arduino-uno] as our test platform ๐. It has an ATmega328 microcontroller, which is an 8-bit processor running at a clock speed of 16 MHz, with 2 kB of RAM and 32 kB of flash memory. I know, an 8-bit chip sounds kinda unexpected when cheaper and more energy-efficient 32-bit chips exist ๐. But our whole goal was to see how public-key crypto performs on the most resource-constrained platforms out there, so it made sense. It's totally reasonable to expect better numbers from 32-bit microcontrollers ๐.
For picking which asymmetric crypto libraries to look at, we surveyed a bunch of code sources and did a first pass on how well each one fits the Arduino environment ๐. Heads up though, these results are preliminary and could be thrown off in any direction by implementation bugs, configuration errors, or other mistakes ๐ญ. Please double-check the numbers before you build anything important with them ๐ซถ. We also didn't put any real effort into optimizing ROM usage beyond what the libraries already did for themselves, so treat those numbers as upper limits ๐ธ.
Here's the lineup of libraries we found:
- AVRCryptoLib [avr-cryptolib]: This one gives you symmetric algorithms like AES, plus RSA for asymmetric stuff ๐. Parts of it are written in AVR 8-bit assembly to shrink the size and boost performance โก.
- Relic-toolkit [relic-toolkit]: Written entirely in C, and wow, it's giving flexible and customizable ๐. It covers RSA and ECC, but also pairing-based asymmetric crypto, Boneh-Lynn-Shacham signatures, and Boneh-Boyen short signatures ๐ฆ. It has added support for curve25519 (for Elliptic Curve Diffie-Hellman key exchange) [RFC7748] and edwards25519 (for elliptic curve digital signatures) [RFC8032] ๐. There's also an option to build only the components you need for your platform ๐ .
- TinyECC [tinyecc]: Designed for elliptic-curve public-key crypto on sensor networks ๐ง. It's written in the nesC programming language [nesC], so it's built for TinyOS specifically ๐. It can be ported to standard C, either with toolchains or by manually rewriting parts of the code ๐ ๏ธ. It also has one of the smallest memory footprints of the elliptic curve libraries we surveyed so far ๐ฅน.
- Wiselib [wiselib]: A generic library for sensor networks with a wide variety of algorithms โจ. The stable version only has routing algorithms, but the test version adds cryptography, localization, topology management, and much more ๐. It was designed to be easy to interface with operating systems like iSense and Contiki ๐. Since it's written entirely in C++ with a template-based model similar to Boost/CGAL, it can run on any platform directly without using the operating system interfaces at all ๐. That's the approach we took to test it on the Arduino Uno ๐ฏ.
- MatrixSSL [matrix-ssl]: A low footprint implementation of several crypto algorithms, including RSA and ECC (ECC needs a commercial license) ๐ผ. In its original form, the library takes about 50 kB of ROM and is intended for 32-bit platforms ๐งธ.
This list is definitely not exhaustive, and there are other crypto libraries out there that target resource-constrained devices ๐.
There are also operating systems built specifically for resource-constrained devices ๐ฅ๏ธ. These may include libraries and code for security. Hahm et al. [hahmos] surveyed these operating systems, so go check that out if you're curious ๐. The ARM Mbed OS [mbed] is one of them, and it provides various cryptographic primitives needed for SSL/TLS protocol implementation as well as X509 certificate handling ๐. It gives developers an API with a minimal code footprint ๐ฅฐ. It's intended for various ARM platforms, like ARM Cortex M0, ARM Cortex M0+, and ARM Cortex M3 ๐.
6. Implementation Experiences ๐งช๐
Okay, so while we were evaluating our experiences, we were especially interested in the signature generation operation ๐. That's because our example application, which we'll get to in Section 7, only needed signature generation on the resource-constrained platforms ๐ฏ. We summarized the initial results of RSA private-key exponentiation performance using AVRCryptoLib [avr-crypto-lib] in Table 1 ๐. Every result comes from a single run, since repeating the test didn't change the results (or only changed them minimally) ๐คทโโ๏ธ. The execution time for a 2048-bit key was inordinately long, which would be a major deterrent in real-world deployments ๐ญ๐.
+--------------+------------------------+---------------------------+
| Key length | Execution time (ms); | Memory footprint (bytes); |
| (bits) | key in RAM | key in RAM |
+--------------+------------------------+---------------------------+
| 2048 | 1587567 | 1280 |
+--------------+------------------------+---------------------------+
Table 1: RSA Private-Key Operation Performance
The code size was about 3.6 kB, and there's potential for further reduction ๐. It's also worth noting that the implementation does basic exponentiation and multiplication without any mathematical optimizations, like Montgomery multiplication or optimized squaring, as described in [rsa-high-speed] ๐ง. We believe that with more RAM, 2048-bit operations could be done in way less time, as shown in [rsa-8bit] ๐.
In Table 2, we present the results from manually porting TinyECC to the C99 standard and running the Elliptic Curve Digital Signature Algorithm (ECDSA) on the Arduino Uno board ๐ธ. TinyECC supports a variety of SEC-2-recommended elliptic curve domain parameters [sec2ecc] ๐ฆ. The execution time and memory footprint are shown next to each curve parameter ๐ . These results were obtained by turning on all the optimizations and using assembly code where it was available โจ.
The results from the ECDSA performance evaluation in the following tables also have a column with the approximate comparable RSA key length, as documented in [sec2ecc] ๐. It's clearly observable that for similar security levels, elliptic curve public-key crypto outperforms RSA ๐๐ฅ.
+-------------+---------------+-----------------+-------------------+
| Curve | Execution | Memory | Comparable RSA |
| parameters | time (ms) | footprint | key length |
| | | (bytes) | |
+-------------+---------------+-----------------+-------------------+
| secp160k1 | 2228 | 892 | 1024 |
| secp160r1 | 2250 | 892 | 1024 |
| secp160r2 | 2467 | 892 | 1024 |
| secp192k1 | 3425 | 1008 | 1536 |
| secp192r1 | 3578 | 1008 | 1536 |
+-------------+---------------+-----------------+-------------------+
Table 2: Performance of ECDSA Sign Operation with TinyECC
We also ran experiments with the assembly optimization removed, using a C-only form of the library ๐งฉ. This gives us an idea of the performance TinyECC can achieve on any platform, no matter what kind of OS and assembly instruction set is available ๐. The memory footprint stays the same with or without assembly code ๐ฅณ. The tables contain the maximum RAM used when all the possible optimizations are on ๐. However, if the RAM available is smaller, some optimizations can be turned off to reduce memory consumption accordingly ๐ก.
+-------------+---------------+-----------------+-------------------+
| Curve | Execution | Memory | Comparable RSA |
| parameters | time (ms) | footprint | key length |
| | | (bytes) | |
+-------------+---------------+-----------------+-------------------+
| secp160k1 | 3795 | 892 | 1024 |
| secp160r1 | 3841 | 892 | 1024 |
| secp160r2 | 4118 | 892 | 1024 |
| secp192k1 | 6091 | 1008 | 1536 |
| secp192r1 | 6217 | 1008 | 1536 |
+-------------+---------------+-----------------+-------------------+
Table 3: Performance of ECDSA Sign Operation with TinyECC
(No Assembly Optimizations)
Table 4 documents the performance of Wiselib ๐ท. There were no optimizations that could be turned on or off, so we only have one set of results ๐ซถ. By default, Wiselib only supports some of the standard SEC 2 elliptic curves, but it's easy to change the domain parameters and get results for all the 128-, 160-, and 192-bit SEC 2 elliptic curves ๐ ๏ธ. The ROM size for all the experiments was less than 16 kB ๐.
+-------------+---------------+-----------------+-------------------+
| Curve | Execution | Memory | Comparable RSA |
| parameters | time (ms) | footprint | key length |
| | | (bytes) | |
+-------------+---------------+-----------------+-------------------+
| secp160k1 | 10957 | 842 | 1024 |
| secp160r1 | 10972 | 842 | 1024 |
| secp160r2 | 10971 | 842 | 1024 |
| secp192k1 | 18814 | 952 | 1536 |
| secp192r1 | 18825 | 952 | 1536 |
+-------------+---------------+-----------------+-------------------+
Table 4: Performance ECDSA Sign Operation with Wiselib
For testing the relic-toolkit, we used a different board, because it needed more RAM/ROM and we couldn't run experiments with it on the Arduino Uno ๐. The Arduino Mega has the same 8-bit architecture as the Arduino Uno, but it has much larger RAM/ROM ๐ฃ. We used the Arduino Mega for experimenting with the relic-toolkit ๐. Again, it's important to mention that we used Arduino because it's a convenient prototyping platform ๐งธ. Our goal was to demonstrate the feasibility of the entire architecture with public-key crypto on an 8-bit microcontroller โจ. However, it's important to say that 32-bit microcontrollers are way more easily available, cheaper, and more power efficient ๐. So real deployments are better off using 32-bit microcontrollers that let developers include the necessary crypto libraries ๐ซถ. There's no good reason to choose platforms that don't have enough computing power to run the necessary crypto operations ๐ซ๐ .
Okay so the relic-toolkit supports Koblitz curves over prime fields AND binary fields ๐ง but we only tested Koblitz curves over binary fields, bestie. We didn't run every curve in the library because this work isn't about crowning the fastest curve ๐ It's about proving that asymmetric crypto is possible on resource-constrained devices ๐ฆ
The relic-toolkit results live in Tables 5 and 6 โจ The first set was configured for high-speed performance with zero thought given to memory ๐ฅ The second set was configured for low memory usage, no matter how long each curve takes ๐ข By turning optimizations on and off, you can trade off memory against execution time, and that's giving flexibility ๐
+-----------------+--------------+----------------+-----------------+
| Curve | Execution | Memory | Comparable RSA |
| parameters | time (ms) | footprint | key length |
| | | (bytes) | |
+-----------------+--------------+----------------+-----------------+
| sect163k1 | 261 | 2804 | 1024 |
| (assembly math) | | | |
| sect163k1 | 932 | 2750 | 1024 |
| sect163r2 | 2243 | 2444 | 1024 |
| sect233k1 | 1736 | 3675 | 2048 |
| sect233r1 | 4471 | 3261 | 2048 |
+-----------------+--------------+----------------+-----------------+
Table 5: Performance of ECDSA Sign Operation with
relic-toolkit (Fast)
+-----------------+--------------+----------------+-----------------+
| Curve | Execution | Memory | Comparable RSA |
| parameters | time (ms) | footprint | key length |
| | | (bytes) | |
+-----------------+--------------+----------------+-----------------+
| sect163k1 | 592 | 2087 | 1024 |
| (assembly math) | | | |
| sect163k1 | 2950 | 2215 | 1024 |
| sect163r2 | 3213 | 2071 | 1024 |
| sect233k1 | 6450 | 2935 | 2048 |
| sect233r1 | 6100 | 2737 | 2048 |
+-----------------+--------------+----------------+-----------------+
Table 6: Performance of ECDSA Sign Operation with relic-toolkit
(Low Memory)
Now, a few important points about the elliptic curve measurements, and you need to read these, no skipping ๐ซถ
- Some boards (e.g., Arduino Uno) do not provide a hardware random number generator ๐ญ On those boards, getting cryptographic-quality randomness is a real challenge. Real-world deployments must rely on a hardware random number generator for cryptographic operations such as generating a public-private key pair. The Nordic nRF52832 board [nordic], for example, provides a hardware random number generator โจ For a deep dive into requirements and best practices for cryptographic-quality randomness, check [RFC4086].
- For measuring the memory footprint of all the ECC libraries, we used the Avrora simulator [avrora] ๐ธ Only stack memory was counted, so RAM consumption was easy to track.
Tschofenig and Pegourie-Gonnard [armecdsa] also evaluated ECC performance on an ARM Coretex platform ๐ The ECDSA sign results in Table 7 come from a Freescale FRDM-KL25Z board [freescale], which has an ARM Cortex-M0+ 48MHz microcontroller with 128 kB of flash memory and 16 kB of RAM ๐ The sliding window technique for efficient exponentiation was used with a window size of 2. All other optimizations were disabled for these measurements.
+------------------+---------------------+--------------------------+
| Curve parameters | Execution time (ms) | Comparable RSA key |
| | | length |
+------------------+---------------------+--------------------------+
| secp192r1 | 2165 | 1536 |
| secp224r1 | 3014 | 2048 |
| secp256r1 | 3649 | 2048 |
+------------------+---------------------+--------------------------+
Table 7: Performance of ECDSA Sign Operation with an ARM Mbed TLS
Stack on Freescale FRDM-KL25Z
Tschofenig and Pegourie-Gonnard [armecdsa] also measured an ST Nucleo F091 (STM32F091RCT6) board [stnucleo] ๐ It has an ARM Cortex-M0 48 MHz microcontroller with 256 kB of flash memory and 32 kB of RAM. The ECDSA sign execution times for different curves are in Table 8. The sliding window technique for efficient exponentiation was used with a window size of 7, and fixed-point optimization plus NIST curve-specific optimizations were used for these measurements ๐
+------------------+---------------------+--------------------------+
| Curve parameters | Execution time (ms) | Comparable RSA key |
| | | length |
+------------------+---------------------+--------------------------+
| secp192k1 | 291 | 1536 |
| secp192r1 | 225 | 1536 |
| secp224k1 | 375 | 2048 |
| secp224r1 | 307 | 2048 |
| secp256k1 | 486 | 2048 |
| secp256r1 | 459 | 2048 |
| secp384r1 | 811 | 7680 |
| secp521r1 | 1602 | 15360 |
+------------------+---------------------+--------------------------+
Table 8: ECDSA Signature Performance with an ARM Mbed TLS Stack on ST
Nucleo F091 (STM32F091RCT6)
Finally, Tschofenig and Pegourie-Gonnard [armecdsa] also measured RAM consumption by calculating the heap used for the cryptographic operations, using a custom memory allocation handler ๐ง They did not measure the minimal stack memory consumption. Depending on the curve and which optimizations were enabled or disabled, the memory consumption for the ECDSA sign operation varied from 1500 bytes to 15000 bytes ๐
At the time of these measurements and this study, it was unclear which exact elliptic curve(s) the IETF community would select for resource-constrained devices ๐คทโโ๏ธ But [RFC7748] defines two elliptic curves over prime fields (Curve25519 and Curve448) that offer a high level of practical security for Diffie-Hellman key exchange ๐ There's also ongoing work to specify elliptic curve signature schemes with the Edwards-curve Digital Signature Algorithm (EdDSA). [RFC8032] specifies the recommended parameters for the edwards25519 and edwards448 curves. Of these, curve25519 (for Elliptic Curve Diffie-Hellman key exchange) and edwards25519 (for elliptic curve digital signatures) are especially suitable for resource-constrained devices ๐ฆ
We found that the NaCl [nacl] and MicoNaCl [micronacl] libraries provide highly efficient implementations of Diffie-Hellman key exchange with curve25519 โจ The results showed these libraries with curve25519 outperform other elliptic curves offering similar levels of security. Hutter and Schwabe [naclavr] also show that signing data with the curve Ed25519 from the NaCl library needs only 23216241 cycles on the same microcontroller we used for our evaluations (Arduino Mega ATmega2560). That corresponds to about 1451 milliseconds of execution time โฑ๏ธ Compared with other curves and libraries offering a similar level of security (such as sect233r1 and sect233k1), this implementation far outperforms all the others ๐ So it is recommended that the IETF community use these curves for protocol specification and implementations ๐
A summary of library flash memory use is in Table 9 ๐
+------------------------+------------------------------------+
| Library | Flash memory footprint (kilobytes) |
+------------------------+------------------------------------+
| AVRCryptoLib | 3.6 |
| Wiselib | 16 |
| TinyECC | 18 |
| Relic-toolkit | 29 |
| NaCl Ed25519 [naclavr] | 17-29 |
+------------------------+------------------------------------+
Table 9: Summary of Library Flash Memory Consumption
All the measurements here are only an example to show that asymmetric-key cryptography (particularly digital signatures) is possible on resource-constrained devices. By no means are these numbers the final source for measurements, and some curves presented here may no longer be acceptable for real in-the-wild deployments ๐ For example, Mosdorf et al. [mosdorf] and Liu et al. [tinyecc] also document the performance of ECDSA on similar resource-constrained devices ๐
7. Example Application ๐
okay so we built an example app on the Arduino platform to play with public-key cryptography, data-object security, and an easy provisioning model ๐ It was originally made to test how to support communication with "always off" sensor nodes. These are battery-operated or energy-scavenging nodes that don't have enough power to stay on all the time ๐ญ So they wake up now and then, send their readings, and go back to sleep ๐
There are a few ways to support sensors like this. [CoAP-SENSORS] was an early multicast-based approach. In the current application we switched to resource directories [CoRE-RD] and publish-subscribe brokers [CoAP-BROKER] instead โจ The architecture idea is that sensors can delegate part of their role to a node in the network. That network node could be a local resource or something out on the Internet. With CoAP publish-subscribe brokers, the network node agrees to hold the web resources on the sensor's behalf while the sensor is asleep ๐ฆ The only job the sensor has is registering itself and periodically updating the readings. All queries from the rest of the world go to the broker, so the broker is giving main character energy ๐
We constructed a system with four entities:
- Sensor: an Arduino-based device that runs a CoAP publish-subscribe broker client and relic-toolkit. Relic takes 29 kB of flash memory, and the simple CoAP client takes roughly 3 kB ๐
- Publish-Subscribe Broker: a broker that holds resources on the sensor's behalf. The sensor registers itself to this node ๐ง
- Resource Directory: while it lives on the same node in our implementation, a resource directory is a logical function. It lets sensors and publish-subscribe brokers register resources in the directory, and applications can query those resources ๐
- Application: a simple app that runs on a general purpose computer. It can retrieve both registrations from the resource directory and the most recent sensor readings from the publish-subscribe broker ๐
The security here relies on a secure-shell-like approach, and it's honestly so clean ๐ฅ
Step 1: upon first boot, sensors generate keys and register themselves in the publish-subscribe broker. Their public key is submitted along with the registration as an attribute in the CoRE Link Format data [RFC6690] ๐
Step 2: when the sensor makes a measurement, it sends an update to the publish-subscribe broker and signs the message contents. It uses a JSON Object Signing and Encryption (JOSE) signature on the JSON [RFC7515] and Sensor Measurement List (SenML) payload [MT-SenML]. The sensor can also use CBOR Object Signing and Encryption (COSE) [RFC8152] to sign the sensor measurement instead โ๏ธ
Step 3: any other device in the network can check that the public key from the registration matches the private key that made the signature in the data update. That includes the publish-subscribe broker, the resource directory, and the application ๐ต๏ธโโ๏ธ
Checks can be done at any time, and the sensor and the checking node don't need to be awake at the same time ๐ธ In our implementation, the checking happens on the application node. This shows how you can implement end-to-end security even when there are assisting middleboxes in the path ๐ซถ
To check that our architecture is feasible, we built a proof-of-concept prototype ๐งช The sensor was implemented using the Arduino Ethernet shield over an Arduino Mega board. The implementation uses the standard C99 programming language on the Arduino Mega board. In this prototype, the publish-subscribe broker and the Resource Directory (RD) live on the same physical host. A 64-bit x86 Linux machine acts as the broker and the RD, and a similar but physically separate 64-bit x86 Linux machine acts as the client that requests data from the sensor ๐ฅ๏ธ
We picked the Relic library version 0.3.1 for the sample prototype because it can be compiled easily for different bit-length processors. That meant we could use it on the 8-bit processor of the Arduino Mega and on the 64-bit processor of the x86 client, which is so iconic ๐ฆ We used ECDSA to sign and verify data updates with the standard sect163k1 curve parameters. When we compiled Relic for the prototype, we used the fast configuration without any assembly optimizations โ๏ธ
The gateway implements the CoAP base specification in the Java programming language. It also extends that spec to add support for the publish-subscribe broker and Resource Directory Representational State Transfer (REST) interfaces ๐ We also built a minimalistic CoAP C library for the Arduino sensor and for the client that requests data updates for a resource. It has small RAM requirements and uses stack-based allocation only. It's interoperable with the Java CoAP implementation running on the gateway ๐ค The location of the resource directory was configured into the smart object sensor by hardcoding the IP address. A real implementation based on this prototype would instead use the domain name system to find the resource directory ๐
Our goal was to show that the entire architecture can run with public-key cryptography on an 8-bit microcontroller ๐ช The numbers we measured can be improved a lot. For example, flash memory and RAM use are relatively high because some Arduino libraries were used out of the box, and several functions could be removed. We also used the fast version of the Relic library in the prototype instead of the low-memory version. Still, it's important to note that this was only a research prototype to verify feasibility. As stated elsewhere, most modern development boards have a 32-bit microcontroller, since they are more economical and have better energy efficiency ๐
8. Design Trade-Offs โ๏ธ
This section tries to draw some early conclusions about the trade-offs in the design space. It's based on deployment considerations for various mechanisms and on how easy or hard they are to implement. The analysis looks at layering, freshness, and the choice between symmetric and asymmetric cryptography ๐ง
8.1. Feasibility ๐
The first question is whether cryptographic security, and asymmetric cryptography in particular, is feasible at all on resource-constrained devices. The numbers above give a mixed message ๐ฅฒ On one hand, a significant cryptographic operation like public-key signing can be done in a surprisingly small amount of code space. It could even be argued that our chosen prototype platform was unnecessarily restrictive about code space. We picked this platform on purpose to show something as resource constrained and difficult as possible ๐
A recent trend in microcontrollers is 32-bit CPUs getting cheaper and easier to get than 8-bit CPUs, and they're also easier to program โจ Flash memory size is probably easier to grow than other parameters in microcontrollers, so it isn't expected to be the biggest limiting factor. Developers should also plan for firmware updates before picking a platform. That basically means the platform should have at least total code size * 2 of flash memory, plus some space for buffer ๐ฆ
The CPU power needed for the algorithms is less clear ๐ค The demonstrated speeds are fine for many applications. For instance, a sensor that wakes up every now and then can probably spend a fraction of a second, or even several seconds in some cases, computing a signature for the message it's about to send โฑ๏ธ Most applications that use protocols like DTLS, which only use public-key cryptography at the start of the session, would also be fine with any of these execution times ๐ฆ
Still, with reasonably long key sizes, the execution times are in the seconds, dozens of seconds, or even longer. For some applications, that's too long ๐ฉ Even so, these algorithms can be successfully used on resource-constrained devices for the following reasons:
- With the right selection of algorithms and libraries, the execution times can actually be very small (less than 500 ms). ๐โโ๏ธ
- As discussed in [wiman], the power needed to turn the radio on or off and to send or receive messages is generally far bigger than what's needed to run cryptographic operations. Newer radios significantly lower the energy use of sending and receiving messages, but there's no good reason to pick platforms that don't have enough computing power for the necessary cryptographic operations ๐ก
- Commercial libraries and full use of the various optimizations will give a better result than what we reached in this memo ๐
- Using public-key cryptography only at the beginning of a session will reduce the per-packet processing times significantly ๐
We didn't do an exhaustive performance evaluation of asymmetric key-pair generation on resource-constrained devices. We did note that it's possible for such devices to generate a new key pair ๐ Since this would only happen in rare circumstances, like a factory reset or an ownership change, and because of its potential privacy benefits, developers should provide mechanisms for generating new identities. However, it is extremely important to note that the security of this operation relies on access to cryptographic-quality randomness. ๐จ
8.2. Freshness
Okay bestie, let's talk about freshness ๐ ๐ฅ. In the architecture as described so far, messages and their signatures that get sent from the sensors to the publish-subscribe broker can be recorded and replayed by an eavesdropper ๐ญ. The broker has no way to tell a packet it already got apart from one that the sender retransmitted or that an eavesdropper replayed ๐. So the smart objects really need to put a freshness indicator in every data update โจ. But ensuring freshness on constrained devices is not easy, and here's why ๐:
- Communication is mostly unidirectional to save energy.
- Internal clocks might not be accurate and may be reset several times during the operational phase of the smart object.
- Network time synchronization protocols such as the Network Time Protocol (NTP) [RFC5905] are resource intensive and therefore may be undesirable in many smart object networks.
There are several methods that can be used for replay protection in our architecture ๐ธ. Which one you pick depends on the actual deployment scenario ๐ฆ.
Including sequence numbers in signed messages is an effective method of replay protection ๐. The publish-subscribe broker should verify the sequence number of each incoming message and accept it only if it is greater than the highest previously seen sequence number โจ. The broker drops any packet whose sequence number has already been received, or whose sequence number is greater than the highest previously seen sequence number by an amount larger than the preset threshold ๐ซ.
Sequence numbers can wrap around at their maximum value, so it is essential to make sure they are sufficiently long ๐. The catch is that long sequence numbers in packets increase the network traffic coming from the sensor, which can decrease its energy efficiency ๐ฉ. To get around that, we can use a scheme similar to that of Huang [huang], where the sender and receiver maintain and sign long sequence numbers of equal bit lengths, but only transmit the least-significant bits ๐ง.
It is important for the smart object to write the sequence number into permanent flash memory after each increment and before it is included in the message to be transmitted ๐พ. This way, the sensor can get back the last sequence number it intended to send after a reset or a power failure ๐ซถ. Even so, the sensor and the publish-subscribe broker can still end up in a discordant state, where the sequence number the broker received exceeds the expected sequence number by an amount greater than the preset threshold ๐ต. This may happen because of a prolonged network outage, or if the publish-subscribe broker experiences a power failure for some reason โก. So it is essential for sensors that normally send Non-Confirmable data updates to also send some Confirmable updates, and to resynchronize with the publish-subscribe broker if a reset message is received ๐. The sensors resynchronize by sending a new registration message with the current sequence number ๐.
Sequence numbers protect the system from replay attacks, but the publish-subscribe broker still has no way to determine the time at which the sensor created an update โฐ. Even worse, if sequence numbers are the only freshness indicator, a malicious eavesdropper can induce inordinate delays in the communication of signed updates by buffering messages ๐. So in certain smart object networks, it may be important for sensors to send data updates that include timestamps, so the broker can work out when each update was created ๐ฐ๏ธ. For example, when the publish-subscribe broker is collecting temperature data, it may be necessary to know exactly when the sensor made the temperature measurement ๐ก๏ธ. A simple solution is for the broker to assume the data object was created when it receives the update ๐. In a relatively reliable network with low RTT, that assumption can be acceptable ๐. But most networks are susceptible to packet loss and hostile attacks, which makes this assumption unsustainable ๐จ.
Depending on the hardware used by the smart objects, they may have access to accurate hardware clocks, which can be used to include timestamps in the signed updates ๐. These timestamps are included in addition to sequence numbers ๐ง. The clock time in the smart objects can be set by the manufacturer, or the current time can be communicated by the publish-subscribe broker during the registration phase ๐ก. However, these approaches require the smart objects to either rely on the long-term accuracy of the clock set by the manufacturer, or trust the publish-subscribe broker, which increases the potential vulnerability of the system ๐ฌ. The smart objects could also get the current time from NTP, but this may consume additional energy and give rise to the security issues discussed in [RFC5905] ๐ฅบ. They could also have access to a mobile network or the Global Positioning System (GPS), and can use either one to obtain the current time ๐ฐ๏ธ. Finally, if the sensors need to coordinate their sleep cycles, or if the publish-subscribe broker computes an average or mean of updates collected from multiple smart objects, it is important for the network nodes to synchronize the time among them ๐ค. This can be done by using existing synchronization schemes ๐.
8.3. Layering
It would be useful to select just one layer where security is provided ๐ฏ. Otherwise, a simple device needs to implement multiple security mechanisms, which is a lot ๐ตโ๐ซ. Some code can probably be shared across such implementations (like algorithms), but it is likely that most of the code involving the actual protocol machinery cannot be ๐งฉ. Here are the choices at each layer and what they imply ๐:
- link layer: This is probably the most common solution today ๐. The primary benefits of this choice are that security services are commonly available (WLAN secrets, cellular SIM cards, etc.), and that protection applies to the entire communication ๐.
The main drawback is that there is no security beyond the first hop ๐ฑ. This can be a problem, for example, in many devices that talk to a server on the Internet. A smart home weighing scale, for instance, can support WLAN security, but without some level of end-to-end security, it would be difficult to prevent fraudulent data submissions to the servers โ๏ธ.
Another drawback is that some commonly implemented link-layer security designs use group secrets. This allows any device within the local network (e.g., an infected laptop) to attack the communications ๐ปโ ๏ธ.
- network layer: There are a number of solutions in this space, and many new ones and variations are being proposed: IPsec, PANA, and so on ๐. In general, these solutions have characteristics similar to those in the transport layer. They work across forwarding hops, but only as far as the next middlebox or application entity ๐งญ. There are plenty of existing solutions and designs ๐.
Experience has shown that it is difficult to control IP-layer entities from an application process ๐. While this is theoretically easy, in practice the necessary APIs do not exist. For instance, most IPsec software has been built for the VPN use case, and is difficult or impossible to tweak for use on a per-application basis ๐ง. As a result, the authors are not particularly enthusiastic about recommending these solutions ๐ โโ๏ธ.
- transport and application layer: This is another popular solution, along with link-layer designs ๐ฅณ. TLS with HTTP (HTTPS) and DTLS with CoAP are examples of solutions in this space, and they have been proven to work well ๐. These solutions are typically easy to adopt in an application without assuming anything from the underlying OS, and they are easy to control as needed by the applications ๐. The main drawback is that, generally speaking, these solutions only run as far as the next application-level entity ๐ง. Even so, HTTPS can be made to work through proxies, so this limit is not unsolvable ๐. Another drawback is that attacks on the link layer, network layer, and in some cases the transport layer cannot be protected against ๐ฅ. However, if the upper layers have been protected, such attacks can at most result in a denial of service. Since denial of service can often be caused anyway, it is not clear that this is a real drawback ๐คทโโ๏ธ.
- data-object layer: This solution does not protect any of the protocol layers, but it protects individual data elements being sent ๐ฆ. It works particularly well when there are multiple application-layer entities on the path of the data ๐ค๏ธ. Smart object networks are likely to employ such entities for storage, filtering, aggregation, and other reasons, and as such, an end-to-end solution is the only one that can protect the actual data ๐ซง.
The downside is that the lower layers are not protected. But again, as long as the data is protected and checked every time it passes through an application-level entity, it is not clear that there are attacks beyond denial of service ๐ง.
The main question mark is whether this type of solution provides sufficient advantages over the more commonly implemented transport and application-layer solutions โ.
8.4. Symmetric vs. Asymmetric Crypto
The second trade-off worth discussing is whether to use plain asymmetric cryptographic mechanisms, plain symmetric cryptographic mechanisms, or some mixture of the two ๐.
Contrary to popular cryptographic community beliefs, a symmetric cryptographic solution can be deployed at large scale ๐ฎ. In fact, one of the largest deployments of cryptographic security, the cellular network authentication system, uses Subscriber Identification Module (SIM) cards that are based on symmetric secrets ๐ฑ. In contrast, public-key systems have yet to show that they can scale to hundreds of millions of devices, let alone billions ๐. But the authors do not believe scaling is an important differentiator when comparing the solutions ๐ .
As can be seen from Section 6, the time needed to calculate some of the asymmetric cryptographic operations with reasonable key lengths can be significant โณ. There are two contrary observations that can be made from this ๐. First, recent wisdom indicates that computing power on resource-constrained devices is far cheaper than transmission power [wiman], and it keeps getting more efficient very quickly ๐. From this we can conclude that sufficient CPU is, or at least will be, easily available ๐.
But the other observation is that when asymmetric operations are very costly, doing a key exchange followed by the use of generated symmetric keys would make sense ๐. This model works very well for DTLS and other transport-layer solutions, but it works less well for data-object security, particularly when the number of communicating entities is not exactly two ๐ซถ.
9. Summary โจ
okay so this section is basically the group chat recap of everything we've been yapping about, and it's SO good ๐ the doc says it's making a few security recommendations based on the team's actual implementation experience, and here are the highlights:
- Developers and product designers should choose the hardware after determining the security requirements for their application scenario. Figure out what security you need FIRST, then pick your chip. Don't do it backwards ๐
- ECC outperforms RSA-based operations; therefore, it is recommended for resource-constrained devices. ECC is the lowkey iconic choice for small devices ๐
- Cryptographic-quality randomness is needed for many security protocols. Developers and vendors should ensure that the sufficient randomness is available for security critical tasks. Randomness is not optional, bestie ๐ฒโจ
- 32-bit microcontrollers are much more easily available, at lower costs, and are more power efficient. Therefore, real-world deployments are better off using 32-bit microcontrollers. The 32-bit chips are giving easy-to-find, budget-friendly, power-sipping energy ๐๐
- Developers should provide mechanisms for devices to generate new identities at appropriate times during their life cycle, for example, after a factory reset or an ownership handover. Devices should be able to get a fresh identity when things change hands or get wiped ๐ง
- Planning for firmware updates is important. The hardware platform chosen should at least have a flash memory size of the total code size * 2, plus some space for buffer. Plan for updates now, or future you will be crying ๐ญ Flash should be at least total code size * 2, plus some buffer space ๐ธ
10. Security Considerations โจ
This entire memo deals with security issues. ๐ Like, the whole thing is security, so yeah, it's serious business, bestie ๐
11. IANA Considerations ๐
This document has no IANA actions. Nothing to register here, no registries to update, zero IANA paperwork ๐ฆ
12. Informative References ๐
okay bestie, here are all the receipts ๐งพโจ every draft, paper, library and RFC this doc leans on, listed exactly as they were cited so you can go check them yourself ๐
- [arduino-uno] Arduino, "Arduino Uno REV3",
<http://arduino.cc/en/Main/arduinoBoardUno>. - [armecdsa] Tschofenig, H. and M. Pegourie-Gonnard, "Performance Investigations", March 2015,
<https://www.ietf.org/proceedings/92/slides/slides-92-lwig-3.pdf>. - [avr-crypto-lib] Das Labor, "AVR-Crypto-Lib", February 2014,
<http://www.das-labor.org/wiki/AVR-Crypto-Lib/en>. - [avr-cryptolib] "AVRCryptoLib",
<http://www.emsign.nl/>. - [avrora] Avora, "The AVR Simulation and Analysis Framework",
<http://compilers.cs.ucla.edu/avrora/>. - [CoAP-BROKER] Koster, M., Keranen, A., and J. Jimenez, "Publish-Subscribe Broker for the Constrained Application Protocol (CoAP)", Work in Progress, draft-ietf-core-coap-pubsub-04, March 2018.
- [CoAP-SECURITY] Arkko, J. and A. Keranen, "CoAP Security Architecture", Work n Progress, draft-arkko-core-security-arch-00, July 2011.
- [CoAP-SENSORS] Arkko, J., Rissanen, H., Loreto, S., Turanyi, Z., and O. Novo, "Implementing Tiny COAP Sensors", Wok in Progress, draft-arkko-core-sleepy-sensors-01, July 2011.
- [CoRE-RD] Shelby, Z., Koster, M., Bormann, C., Stok, P., and C. Amsuess, "CoRE Resource Directory", Work in Progress, draft-ietf-core-resource-directory-13, March 2018.
- [freescale] ARM Mbed, "FRDM-KL25Z",
<https://developer.mbed.org/platforms/KL25Z/>. - [hahmos] Hahm, O., Baccelli, E., Petersen, H., and N. Tsiftes, "Operating systems for low-end devices in the internet of things: a survey", IEEE Internet of Things Journal, Vol. 3, Issue 5, DOI 10.1109/JIOT.2015.2505901, October 2016.
- [HIP-DEX] Moskowitz, R., Ed. and R. Hummen, "HIP Diet EXchange (DEX)", Work in Progress, draft-ietf-hip-dex-06, December 2017.
- [huang] Huang, C., "LOFT: Low-overhead freshness transmission in sensor networks", IEEE, DOI 10.1109/SUTC.2008.38, June 2008.
- [IoT-BOOTSTRAPPING] Sarikaya, B., Sethi, M., and A. Sangi, "Secure IoT Bootstrapping: A Survey", Work in Progress, draft-sarikaya-t2trg-sbootstrapping-03, February 2017.
- [IoT-SECURITY] Garcia-Morchon, O., Kumar, S., and M. Sethi, "State-of-the-Art and Challenges for the Internet of Things Security", Work in Progress, draft-irtf-t2trg-iot-seccons-14, April 2018.
- [IPV6-LOWPAN-SEC] Park, S., Kim, K., Haddad, W., Chakrabarti, S., and J. Laganier, "IPv6 over Low Power WPAN Security Analysis", Work in Progress, draft-daniel-6lowpan-security-analysis-05, March 2011.
- [matrix-ssl] Inside Secure, "GUARD TLS Toolkit (formerly Matrix SSL)",
<http://www.matrixssl.org/>. - [mbed] ARM Mbed, "Mbed TLS",
<https://www.mbed.com/en/technologies/security/mbed-tls/>. - [micronacl] MicroNaCl, "The Networking and Cryptography library for microcontrollers",
<http://munacl.cryptojedi.org/>. - [mosdorf] Mosdorf, M. and W. Zabolotny, "Implementation of elliptic curve cryptography for 8-bit and 32-bit embedded systems - time efficiency and power consumption analysis", Pomiary Automatyka Kontrola, 2010.
- [MT-SenML] Jennings, C., Shelby, Z., Arkko, J., Keranen, A., and C. Bormann, "Sensor Measurement Lists (SenML)", Work in Progress, draft-ietf-core-senml-15, May 2018.
- [nacl] NaCl, "Networking and Cryptography library",
<http://nacl.cr.yp.to/>. - [naclavr] Hutter, M. and P. Schwabe, "NaCl on 8-Bit AVR Microcontrollers", International Conference on Cryptology in Africa, Computer Science, Vol. 7918, pp. 156-172, February 2013,
<https://doi.org/10.1007/978-3-642-38553-7_9>. - [nesC] Gay, D., Levis, P., von Behren, R., Welsh, M., Brewer, E., and D. Culler, "The nesC language: A holistic approach to networked embedded systems", ACM SIGPLAN Notices, Vol. 38, Issue 5, DOI 10.1145/781131.781133, 2003.
- [nordic] Nordic Semiconductor, "nRF52832 Product Specification v1.3", March 2017,
<http://infocenter.nordicsemi.com/pdf/nRF52832_PS_v1.3.pdf>. - [relic-toolkit] "relic", March 2017,
<https://github.com/relic-toolkit/relic>. - [RFC3748] Aboba, B., Blunk, L., Vollbrecht, J., Carlson, J., and H. Levkowetz, Ed., "Extensible Authentication Protocol (EAP)", RFC 3748, DOI 10.17487/RFC3748, June 2004,
<https://www.rfc-editor.org/info/rfc3748>. - [RFC3972] Aura, T., "Cryptographically Generated Addresses (CGA)", RFC 3972, DOI 10.17487/RFC3972, March 2005,
<https://www.rfc-editor.org/info/rfc3972>. - [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, "Randomness Requirements for Security", BCP 106, RFC 4086, DOI 10.17487/RFC4086, June 2005,
<https://www.rfc-editor.org/info/rfc4086>. - [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", RFC 4303, DOI 10.17487/RFC4303, December 2005,
<https://www.rfc-editor.org/info/rfc4303>. - [RFC5191] Forsberg, D., Ohba, Y., Ed., Patil, B., Tschofenig, H., and A. Yegin, "Protocol for Carrying Authentication for Network Access (PANA)", RFC 5191, DOI 10.17487/RFC5191, May 2008,
<https://www.rfc-editor.org/info/rfc5191>. - [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, DOI 10.17487/RFC5246, August 2008,
<https://www.rfc-editor.org/info/rfc5246>. - [RFC5406] Bellovin, S., "Guidelines for Specifying the Use of IPsec Version 2", BCP 146, RFC 5406, DOI 10.17487/RFC5406, February 2009,
<https://www.rfc-editor.org/info/rfc5406>. - [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, "Network Time Protocol Version 4: Protocol and Algorithms Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010,
<https://www.rfc-editor.org/info/rfc5905>. - [RFC6078] Camarillo, G. and J. Melen, "Host Identity Protocol (HIP) Immediate Carriage and Conveyance of Upper-Layer Protocol Signaling (HICCUPS)", RFC 6078, DOI 10.17487/RFC6078, January 2011,
<https://www.rfc-editor.org/info/rfc6078>. - [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, January 2012,
<https://www.rfc-editor.org/info/rfc6347>. - [RFC6574] Tschofenig, H. and J. Arkko, "Report from the Smart Object Workshop", RFC 6574, DOI 10.17487/RFC6574, April 2012,
<https://www.rfc-editor.org/info/rfc6574>. - [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link Format", RFC 6690, DOI 10.17487/RFC6690, August 2012,
<https://www.rfc-editor.org/info/rfc6690>. - [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing", RFC 7230, DOI 10.17487/RFC7230, June 2014,
<https://www.rfc-editor.org/info/rfc7230>. - [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained Application Protocol (CoAP)", RFC 7252, DOI 10.17487/RFC7252, June 2014,
<https://www.rfc-editor.org/info/rfc7252>. - [RFC7296] Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. Kivinen, "Internet Key Exchange Protocol Version 2 (IKEv2)", STD 79, RFC 7296, DOI 10.17487/RFC7296, October 2014,
<https://www.rfc-editor.org/info/rfc7296>. - [RFC7401] Moskowitz, R., Ed., Heer, T., Jokela, P., and T. Henderson, "Host Identity Protocol Version 2 (HIPv2)", RFC 7401, DOI 10.17487/RFC7401, April 2015,
<https://www.rfc-editor.org/info/rfc7401>. - [RFC7515] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, May 2015,
<https://www.rfc-editor.org/info/rfc7515>. - [RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves for Security", RFC 7748, DOI 10.17487/RFC7748, January 2016,
<https://www.rfc-editor.org/info/rfc7748>. - [RFC7815] Kivinen, T., "Minimal Internet Key Exchange Version 2 (IKEv2) Initiator Implementation", RFC 7815, DOI 10.17487/RFC7815, March 2016,
<https://www.rfc-editor.org/info/rfc7815>. - [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital Signature Algorithm (EdDSA)", RFC 8032, DOI 10.17487/RFC8032, January 2017,
<https://www.rfc-editor.org/info/rfc8032>. - [RFC8152] Schaad, J., "CBOR Object Signing and Encryption (COSE)", RFC 8152, DOI 10.17487/RFC8152, July 2017,
<https://www.rfc-editor.org/info/rfc8152>. - [rsa-8bit] Gura, N., Patel, A., Wander, A., Eberle, H., and S. Shantz, "Comparing Elliptic Curve Cryptography and RSA on 8-bit CPUs", DOI 10.1007/978-3-540-28632-5_9, 2004.
- [rsa-high-speed] Koc, C., "High-Speed RSA Implementation", November 1994,
<http://storage.jak-stik.ac.id/rsasecurity/tr201.pdf>. - [sec2ecc] Certicom Research, "SEC 2: Recommended Elliptic Curve Domain Parameters", Version 2.0, January 2010.
- [stnucleo] STMicroelectronics, "NUCLEO-F091RC",
<http://www.st.com/en/evaluation-tools/nucleo-f091rc.html/>. - [tinyecc] Liu, A. and P. Nig, "TinyECC: A Configurable Library for Elliptic Curve Cryptography in Wireless Sensor Networks (Version 2.0)", NCSU College of Engineering, February 2011,
<http://discovery.csc.ncsu.edu/software/TinyECC/>. - [wiman] Margi, C., Oliveira, B., Sousa, G., Simplicio, M., Paulo, S., Carvalho, T., Naslund, M., and R. Gold, "Impact of Operating Systems on Wireless Sensor Networks (Security) Applications and Testbeds", Proceedings of the 19th International Conference on Computer Communciations and Networks, DOI 10.1109/ICCCN.2010.5560028, 2010.
- [wiselib] "wiselib", February 2015,
<https://github.com/ibr-alg/wiselib>.
Acknowledgments ๐ซถ
The authors would like to thank Mats Naslund, Salvatore Loreto, Bob Moskowitz, Oscar Novo, Vlasios Tsiatsis, Daoyuan Li, Muhammad Waqas, Eric Rescorla, and Tero Kivinen for interesting discussions in this problem space. The authors would also like to thank Diego Aranha for helping with the relic-toolkit configurations and Tobias Baumgartner for helping with questions regarding wiselib.
Tim Chown, Samita Chakrabarti, Christian Huitema, Dan Romascanu, Eric Vyncke, and Emmanuel Baccelli provided valuable comments that helped us improve this document. ๐
Authors' Addresses ๐
okay bestie, these are the four people who wrote this RFC, and they're all at Ericsson or Nokia in Finland ๐ซ๐ฎ๐ง here's where you can find them, iykyk ๐
Mohit Sethi
Ericsson
Jorvas 02420
Finland
Email: mohit@piuha.net
Jari Arkko
Ericsson
Jorvas 02420
Finland
Email: jari.arkko@piuha.net
Ari Keranen
Ericsson
Jorvas 02420
Finland
Email: ari.keranen@ericsson.com
Heidi-Maria Back
Nokia
Helsinki 00181
Finland
Email: heidi.back@nokia.com
that's the whole crew, and they're the reason this spec exists ๐ซถโจ
๐ฆ where this page comes from
- ietf: rfc8387 2018-05
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms