This subtitle is not finished yet. If you are able to, please support us and watch the talk in amara for the last changes: https://c3subtitles.de/talk/747 Thanks!
*33c3 prerol music*
Herald: As mentioned before, Internet of Things, it would be great if it would work
and one big part of Internet of Things is the Internet part. So stuff has to talk
and cables are shit. So we use Wi-Fi and other wireless protocols. So our next
speaker is going to take a very close look at the physical layer of LoRa, a low power
wireless area network, and he built some stuff to actually sniff what's happening
and inject stuff. And apparently he offered his sacrifices to the gods. So
we'll see something. Please give a warm round of applause to Matt Knight.
*applause*
Matt Knight: Thank you for that warm introduction and thank you all for coming.
I'm really excited to be here. So for the next hour or so, we're going to be talking
about the LoRa failure. And LoRa is a low power wide area network, wireless
technology that is designed for the Internet of Things. So first, a little bit
of background. Myself, a software engineer and a security researcher with bestial
networks, I have a bachelor's in engineering, electrical engineering and
better systems from Dartmouth. But really, my interests are in applied RF security
research. So that means everything from reverse engineering wireless protocols to
developing functional based bands and software and HDL and also all the way up
to software networking stocks. So all these things are interesting, interesting
to me, but I'm really excited about the material we're going to talk about today.
So before we get started, there aren't going to be any like zero days or
traditional security related exploits here. But we are going to take apart a
cutting edge wireless protocol. Let's talk about why that's important in a minute.
But first, I'd just like to survey the room and get a sense for who's here so I
can figure out where to spend more of my time. So if you'd be so kind as to raise
your hand if you've heard of software defined radio. That's a lot of hands.
That's great. OK, how about raise your hand if you know what is best for you,
transform is awesome. And how about a symbol in the context of wireless wireless
systems? OK, cool, this we're going to do well, this is going be fun, so why why is
this sort of network forensics interesting or why is it relevant? Why is this
important? The Cisco Internet Business Solutions Group has a figure that I really
like that states that by 2020 they're going to be 50 billion devices connected
to the Internet in some way. As we know, with the growth of mobile and the Internet
of Things, fewer and fewer of those devices are connected with wires every
year. And as we know, tools like Wireshark and Monitor Mode weren't always a thing,
even for common interfaces like Wi-Fi and able to 11. Those those tools that we come
to rely on every day exist because somebody thought to look below the layer
they had and make it. And I believe that low level security, low level access to
interfaces is essential for an enabling comprehensive security on various
interfaces. So we're going to begin by discussing L.P winds at a high level and
then we're going to do a little bit of a background on some technical radio
concepts just so we can level out our domain knowledge and inform the rest of
the conversation. Then I'm going to take you through my recent reverse engineering
of the law failure that was powered through separate fun radio. And finally,
I'm going to give you a demo of this tool called Jaala that I've made. That is an
open source implementation of of this FI that will enable you to begin doing your
own security research with it. So to begin, what is LoRa, what is this thing?
It is a wireless Iot protocol and Iot is in red because some of us are are
marketers. We're all engineers. We know that this is a dirty term. Right? Iot is
really code for connected embedded devices and there are tons of common standards for
embedded systems already. Everything like ITOCHU 54 and all of its friends like
Ziggy and six Lappin, Itochu, eleven wi fi and then also more common things like
Bluetooth and Bluetooth, low energy. And the list goes on. Right. We've got all
these standards. What is wrong with them? Why don't we just use just one of these
existing ones? Well, all the ones we just mentioned all require some degree of local
provisioning. You need to connect your device to in side or hook your your Zuby
device up to a coordinator in order to get a communicating. Some of them require
gateways to talk out to to the Internet. And in the case of eight to 11, it's very
power intensive. So you can't run a device for a long time on a battery. So what's
ideal? What about cellular cellular works everywhere? It's easy to install. You
don't have to worry about any hardware on premises. As long as you can talk to a
tower, there could be miles away. You're good to go. Well, it's power intensive and
in the case of certain types of the standards, they're going away. And I'm
talking about to give us an edge service in in the United States. AT&T, one of the
largest carriers, is saying they're going to sunset their 2G network in about three
days in Australia. This has already happened. Telstra, which is one of the
largest telecom companies in Australia, sunset their GPS service earlier this
month. And all the other major carriers are soon to follow. So 2G is is works
everywhere. It's very battery conscious and it's fairly cheap. So this is exactly
what the Internet of Things needs to to power its communication standards. Now,
say you're a developer and you want to move on to a new wireless standard that
won't, you know, deprecate in three days you can either go to 3G or more modern
cell stack, which which comes with a more expensive radio and harder power
requirements. Or you can wait for the 3G up, which is the standards body that makes
and maintains the cellular standards to come out with their Iot focused, with
their Iot focused standards that are currently in development. And the
indications that I've gotten state that those won't be ready until the end of next
year, really at the earliest. So it's gonna be the end of twenty seventeen at
the beginning of twenty eighteen before we start to see these things in the wild,
which means that until then there's a massive hole in the market. So if you want
to, if you want to develop a embedded system that requires this type of
connectivity, you're going to have to look elsewhere. And that brings us to the topic
of low power, wide area networks. And you can think of these networks as being just
like cellular, but optimized for Iot and M2M communications. The architecture is
almost exactly the same and that you have a network of base stations or gateways
worldwide and then end nodes uplink directly to those base stations without
any meshing or routing among themselves. It's just like a star network. Basically,
you have these nodes, the connect directly to the base station and they have a range
on the order Miles. It's a very similar topology to cellular. There are tons of
standards that are there are popping up more and more every day. But the two that
have the most momentum are LoRa and Sigge Fox. There's been a ton of investment in
both of these technologies, actually. Just last month, LoRa Ersek Fox closed a
hundred and fifty million Euro Series F, some late stage funding round in the Wall
Street Journal, wrote an article recently that stated they were investigating a U.S.
IPO soon. Additionally, Senate and activity, two of the biggest backers of
the wharfie have raised a combined fifty one million dollars in the last year or
two, so one from raising one hundred fifty million dollars, they're absolutely going
for it. They're investing like crazy in these technologies. So when we say that
these networks are optimized for the Internet of Things, we're really talking
about two things. They're battery conscious sic. Fox advertises that they
can get up to 10 years of battery on the amount of energy and a single AAA battery
and their long range. And if you turn all the knobs and LoRa just right and have a
perfect noiseless channel, they advertise that you can get thirteen point six miles
on one of these very long range devices. And if you compare that with, you know,
some of the standards we talked about earlier, that's pretty competitive. So how
how do they do that? How does that work? Well, they've designed the entire system
around the fact that they're willing to accept compromises in the protocol and the
functionality of these devices. When I talk about compromises, I'm talking about
aggressive duty cycling, both transmitting and listening, very sparse data, grams, so
tiny packet sizes. And they're highly limited, meaning they can't send that many
packets that often. Now, for example, signal limits. This is built into the FYE
limits devices to 140 12 byte data grams per day. That's like that's like nothing.
I think that's less than like a look at to you. It's tiny now and then weightless in
another LP when standard is uplink only. So it can only send messages up to Gateway
but can't receive any downlink. So for example, if you had a device deployed, you
can never deliver firmware to it later unless you rolled a truck to it or climbed
up the telephone pole to where it's mounted. And finally, LoRa, classi devices
can only receive downlink for a brief window after they uplink. So if you're if
you're an application operator and you want to send a message to a device you
have in the field, you have to wait for that device to call home before you had
your brief window to tell it what you want. So these systems are built around
compromises, but that's what enables them to get some pretty incredible performance.
All right. Let's get into the details with LoRa. So LoRa is an LP when it's developed
by some tech, which is a French semiconductor company. Biffy was patented
June in 2014 and LoRa when McCan network STAC was published in January of 2015. So
this this entire standard is less than two and a half years old. It's brand new and
it's supported by an industry trade group called the LoRa Alliance, which has
tripled in size every year since its founding. So growing quite a bit before we
move on. Just want to clear up some nomenclature that will help us focus in on
what this talk is going to center on, and that is disambiguate. LoRa and LoRa, when
LoRa refers strictly to the player, the physical layer of the standard, LoRa when
defines a Mac and a networking, some upper layer stacks that right on top of LoRa,
the LoRa Wanne standard, the upper layer has been published and that's public. But
the FIGLIA itself is totally closed. So the LoRa, when upper layer stack gives
some information about its topology, it's kind of interesting, suggests that they
were really thinking about security when they designed it. There are kind of four
stages in the network all the way out in the field. On your sensor you have the
node and that connects to Gateway over a wireless link. That's the LoRa link. And
then once you get into the gateway, everything from there up is all on. It's
all on IP networks, just standard commercial IP networks. And then they have
roaming that works on different networks. So you'll be able to take your device and
move to different areas of coverage and have it all play nicely. And then you can
hook your application server up to that as well to receive packets to and from the
network servers. It's all over IP and they actually went as far as to define two
different mechanisms for encrypting it. There are two different keys. You have the
network key, which goes from the which covers from the node up to the network
server, and then you have the application key, which is actually fully end to end.
It goes from the end device all the way up to the to the application server. So if
you design that right, the network should never see your traffic unencrypted. And
they also provide a mechanism for having unique keys per device. It's built into
the standard, but it's not required. So it's still up to the implementor to to do
that and get that right. So there are some good thoughts that went into security with
lawin. However, that's not what we're talking about today. That's all we're
going to say about lawin. We're just going to tell you it exists that it rides above
LoRa, but we're not going to go into any more detail than that. So from here on
out, it's all LoRa all the time. We're just talking about the file here. So let's
get into what makes that really interesting. One of the big defining
features of LoRa and Cig Fox, the two biggest LP wins, is that they're designed
to use what are called isman spectrum. That's what's called in the United States.
It stands for industrial, scientific and medical. And what's cool about these these
bands is they're what are called unlicenced, which means that you don't
need a specific license from the FCC or you or your telecom regulation. Authority
to operate on it. So if you go and you buy any Wi-Fi router on Amazon, you take it
home, you plug it in, you don't need to then go and apply for a specific license
to to be able to communicate on it because it was built to a certain standard. It is
compliant with those unlicensed band rules and therefore can just work. So these
these devices use that same spectrum, but to much greater effect, much longer ranges
in a much different use case. So that's quite novel. And some other things that
use these technologies are, you know, wi fi, Bluetooth, cordless phones, baby
monitors, things like that. So you can think of this as occupying the same space
in the spectrum as these. Now, why is this noteworthy, well, contrasted with the
cellular model where cellular technologies use what is used protected spectrum, where
you have to have specific rights to transmit on it in order to to legally use
it. And regular regulatory authorities sell the spectrum for fortunes. But
billions of dollars is what the spectrum sells for in the US. I'm sure it's the
same over here. And I just want to call your attention to how expensive this is on
the left here we have a picture. It's an excerpt from a document that I found that
was related to the RFQs TV white space reverse auction. They're trying to
repurpose a lot of spectrum that used to be used for digital TV. They're selling it
off. And if you want to come in and buy some really prime low UHF spectrum to use
for whatever purposes you have, mind you, this is just one TV station in the New
York area. You can get out your checkbook and write a nine hundred million dollar
check and take over CBS TV in New York. So getting into the cellular cellular game is
crazy expensive. It costs a fortune. But there are a lot of us in here. Maybe we
can pass the hat and and buy some spectrum at the end of this. So as a result of this
unlicensed nature, there are a number of different models of commercialization that
are starting to emerge. We have the traditional telecom model we're seeing
through companies like Senate, which is a company that deploys home heating, heating
oil tank monitoring solutions in the United States. They're also opening the
network up for Iot applications to right on top of that traffic as well. And you'd
operate with them just like you would operate with like Verizon or AT&T or
Deutsche Telekom or whoever whoever you work with here. Also interesting is I
believe it's CPN has rolled out Laurer, a commercial or network lawin network
throughout the entire region of the Netherlands. So countries entirely covered
with LoRa. So that's the commercial side in the middle. We also have crowdsourced
networks. The one that I like to talk about is this group called the Things
Network, where basically they have defined in the cloud the network server
architecture for operating a worldwide lawin network. So if you want to provide,
Laurieann, service on the Things Network in your your area, you can get your hands
on Allura Gateway pointed at their network servers and basically become become a base
station in their network from your living room, which is kind of cool. So it can
kind of spread and grow organically based on the needs of of people like me and you
who want, you know, the sort of service. Then finally all the way up at the up at
the kind of independent amateur side, we have people like Travis Goodspeed and some
of his friends that are working on a technology called LoRa Him. And that's
leveraging the fact that you can actually get more radios that work in workaround
for thirty three, which is in the I think it's the 70 centimeter hand band in the
United States. So you can actually put a reasonable amount of power behind LoRa
into tech based communications in the clear. So they're developing a Allura base
mesh networking system for doing basic like ASCII packet radio and communicating.
It's not public yet, but I like Pete. He's blessed me to come and tell you that he's
that he's working on this and it should be out soon. So there are all sorts of
different ways to use these technologies. So this is a very different paradigm,
which we're used to. And it's opening up lots of different opportunities for how
this technology might be used and grow. OK, so that wraps up our background on
LoRa. We're about to get into some really technical stuff, but before we do, I want
to go through a very short crash course on some basic radio fundamentals to try to
even the playing field so that we can all understand this. And I call it the
obscenely short radio crash course. But with apologies to any use a real telecom
whizzes in the room. I think this is probably more appropriate. We're going to
we're going to blow through this material. And I'm just going to try to pick out a
few points that are really essential to understanding the rest of this talk. I'll
tell you what's important and just try to grab those concepts and we'll reiterate
them later as we go through it. So, again, we're going to be talking about the
physical layer. And if you think about the Ossi data model that we've all seen, the
physical layer refers to how your bits, your data get mapped into physical
phenomena that represent them in reality. And when you're dealing with wireless
systems, the mapping maps, the bits into into patterns of energy in an RF medium,
RF sensor radio frequency, and there it's basically electromagnetic waves or energy
that is just everywhere. And you can manipulate RF by using a device called a
radio. And radios can either be harder to find where the RF kind of mechanics and
the protocol are baked into the silicon and are inflexible. Or you can use a
software defined radio where you have some very general, flexible silicon up front
that basically just grab some raw information and feeds it to some sort of a
processor, which can either be a traditional CPU or an FPGA to implement
some of the more radio specific things and has come a long way in the most most
recent few years. And it's now incredibly powerful. So we're going to be talking
about both harder to find radios and tougher to find radios throughout this
talk. So if you put together a radio coherently, you can start to develop it
into a fire. And a fire has a has one main component or several components. But one
of the main components is this notion of the modulation in the modulation is the
algorithm that defines how your digital values, your bits are mapped into RF
energy. And there are a few parameters that we can kind of tweak to do that. And
those are amplitude frequency and phase. And then we can put them together and use
some combination of them as well. In modulators can modulate either analog or
digital information. But we're going to be talking about modulating digital
information today. And an essential concept with that is this notion of a
symbol. This is something it's very important to remember. And the symbol
represents a discrete RF energy state that represents some quantity of information.
So it's discretely sampled. And just think of it as being like a state in your RF
medium. That means something. And will illustrate this in just a moment. So here
we have two pictures of two different modulations. And I just want to put these
up here to help you maybe get a grasp on what a symbol looks like. So on top, we
have Frequency King, where you can see your signal is alternating between two
frequencies. When it's on the left, it's swelling on one frequency. When it's on
the right, it's dwelling on another frequency. Which symbol is present is
based on where basically what frequency that signal is on at a discretely sampled
moment in time. So you could think of this as being like, you know, it's a zero when
the signal is rolling on the first frequency, the one on the left and it's
one. And the signal is dwelling on the right frequency frequency, too. And you
can see the see the analog with the bottom modulation off keying where the signal
being present represents the one in the signal being off represents a zero. So
hopefully that helps you get a grasp of what it is that we're talking about. There
are, of course, more complicated Iot fires. We have spread spectrum where data
can be basically chipped at a higher rate. It'll occupy more spectrum, but it makes
it more resilient to noise. And then we have some technologies to do that, like
eight to 15 for us, one that uses a spread spectrum mechanism. So we talked a bit
about radios just a moment ago. We're going to use two different kinds of radios
when when going through this talk. First, we have a harder to find radio, which is a
microchip. LoRa, are in two, nine and three module. And this is basically a
death word that has a harder to find lower radio built on to it. So this is going to
be a transmitter they're going to be targeting. And then finally, a receiver is
the software defined radio right here. This is an ETA USCAP B to ten. It's just a
commodity software defined radio board. And basically what this thing does is it
gets raw RF information from the air, serves it to my computer so they can start
to work with it. With commodity tools like Python, I can do radio, things like that
to start to process it. One less thing to cover is the fast forward to transform the
Esperia transform basically takes a signal in decomposes it into all of the the the
smaller signals, the some carriers, the composite and any periodic signal can be
models of some of harmonic sine waves. So basically the FFT takes any signal and
unravels it into the components. And why we care about this is it takes it's
basically a very easy way for analyzing and visualizing signals in the frequency
domain. So when we put it take a bunch of 50s and put them together, we get this
picture called a spectrogram where you have time in the the ones we're going to
be looking at all the time in the Y axis frequency in the Z axis and then sorry,
frequency in the X axis and power in the Z axis. So the intensity of the color is how
how powerful that component is at that instant in time. So here you can start to
visualize all the different signals that are present. OK, raise your hand if you're
an expert. I see a few heads. Hopefully this is all that we're going to need. I'm
going to reiterate some of these concepts as we go through. So I really hope that
doesn't doesn't alarm you, son. You're running for the door. It's going can be
very visual as we go through it. And hopefully the graphics will help keep this
all grounded. So let's get into the meat of how this Laurer fireworks. LoRa uses a
really neat proprietary fire that's built on a modulation called chirp spread
spectrum success for short. Now, what is a chirp? Chirp is a signal whose frequency
continuously increases or decreases. You can think of it as being like a sweet
tone. And if we visualize it, using a spectrogram is before it looks kind of
like this. In this case, we have a finite amount of bandwidth and the frequency
either increases or decreases. You can have up chirps or down chirps until it
reaches the end of its band. And then it wraps around back to the bottom, back to
the beginning and continues. So here you can see that the frequency that the first
derivative of frequency is constant. So the frequency is always increasing or
decreasing at the same rate. And then when it hits the end of the band, it just wraps
it keeps going. So why use something like success, it has really great it has
properties that make it really resilient to noise and very performance, low power.
So all these things with Iot focused radios and having having very long battery
life, these are properties that lend directly to that sort of efficiency. It's
also really resilient to multi path and Doppler, which is great for urban and
mobile uses. So this is an interesting set of sort of features here. Where else do we
see chirps radar is. I just heard it. Thank you. Yeah. Radar is a really common
common usage. And you'll see military marine radars sometimes refer to chirps as
wide band or pulse compression if they're using chirping in the radar scheme. And
they're also used for scientific over the horizon radars as well. And there's an
open source project called the New Chirp Sounder that has some some features like
that for for visualizing these over the horizon scientific radars. And also in a
past life, I worked on a scientific radar called Super Dhan, which is a similar over
the horizon radar for visualizing ionospheric activity. Cool. So that's a
little bit of background on the technology here. So this is kind of my journey into
into starting to work with LoRa here. In December. Twenty fifteen, I joined this
company, Bestilo, where I'm currently. And on the research team we have these weekly
meetings where we get together and we look at new either new R.F. techniques or
protocols, things that are interesting. And we basically just have a deep
brainstorm on how they work. And and what's interesting and the first meeting
that I participated in, it was the first week that I joined. They were mentioning
they were talking about these L.P technologies. They sounded pretty cool. So
we broke for Christmas. So I went back to to New York where I'm from, and, you know,
brought my radio and sort of poking around and seeing what I could find. And my
colleagues looked in San Francisco, Atlanta, and I also worked in Boston. I
was there, too. And we didn't see LoRa anywhere in December. Fortunately, a few
weeks later, I was I was at a meetup and I encountered this company, Senate. I was
living in Cambridge, Massachusetts, at the time. And they were talking about their
their home heating oil monitoring network sounded pretty cool. So I looked him up
later and was watching one of the marketing videos. And there was like a two
or three second bit where you could see one of their technicians operating a
computer. Right. And they put up this picture and this looks just like a
coverage map. Right. So, you know, this could be fake data or it could be live.
And I took a bit of a closer look and I realized where that is. That's Portsmouth,
New Hampshire. That's like an hour away from Boston. So there's really only one
thing to do. So I hop in my car, I drive up to New Hampshire, to Maine border, and
there's, you know, me behind the wheel, my Saab with the USPI on the dash. And after
about ten minutes in the Marriott parking lot across the street from there from
their headquarters, we have our first sighting of LoRa in the wild. There it is.
It's the first signal I recorded. So let's take a closer look at what we have here.
So if we look at the top third of the picture, we have a series of repeated up
trips. You can see the signal is just continuously increasing until it hits the
band and then it wraps and continues. And knowing what we know about digital
communication systems, most of them have some notion of a preamble or training
sequence to tell a receiver that, hey, heads up, you're about to get a packet. So
probably with that is following that, you can see the chip direction changes right
in the middle and you have two and a quarter downtowners. And this looks like a
start, a frame delimiter or a synchronization element. So this tells the
receiver, hey, heads up, preambles over. You're about to get you're about to get
the data. You're about to get get the payload here. And finally, you can see the
chip direction again, changes to the up chirps. But this time the chirps are kind
of choppy. You see, they jump around throughout the band, you know, just kind
of arbitrarily. It's not arbitrary, though. That's actually the data being
encoded into the fire. So here we can see that the chirp frequency, that is the
first derivative of the frequency, the rate at which the frequency changes
remains constant. Right. However, the instantaneous frequency may change within
the band. So you may have these jumps, but remember that the rate at which it's
changing is always constant. You can just have those discontinuities in those
instantaneous frequency changes represent data being modulated onto the chirps. You
can kind of think of this as being like a frequency modulated chirp with an FM
signal. You have a static carrier, a carrier at a fixed frequency that you're
modulating to produce that signal. The modulated signal here we're modulating a
chirp signal to produce the to produce that. So rather than having a fixed
frequency that you're modulating your modulating this continuous chirp. Cool. So
let's get our hands dirty. Let's figure out how this thing works and start to pull
some data out of it before we dove into the modulating it, let's take a look at
what we know through some open source intelligence. And using open source
intelligence is a great way to really kind of shortcut the reverse engineering
process. Because otherwise, you can you can wind up doing a lot more work than you
have to. So there are a few things that are really useful. We'll talk about these
as we go through this. This material first thing we found. First thing I found was
the Simsek European patent application. It was in the EU market, but basically
defined it modulation. That looked a lot like what Lura could be. That's the number
if you want to look it up later. But that had some pretty good information in their
final year. Secondly, we have the law of the law when spek. And again, that's the
layer to add up spec that's open, not the PHY, but it still has some references and
define some terms that are likely going to be analogous to the file. So it's still
pretty useful. And finally, we have two application notes from some tech that were
pretty juicy. The first one and there are the the 18 one contained a number of
reference algorithms for implementing a whitening sequence, which is like a
scrambler. We'll talk through that or we'll talk about that momentarily. And
then twenty two had just a general overview of the fine, define some terms.
Also, there was some prior art online. There was a partial implementation in RTL
Strangelove that didn't really seem to be maintained. It seemed pretty neglected and
I never really got it to to do anything at all. But we're still good to look at and
had some really good hints in there. And then there were also some very high level
observations in the FI in this wiki page based an else decoding LoRa. It was mostly
just like looking at the spectrum and seeing that it's a chirp modulation and
example recordings and things like that. So from this documentation, we can start
to pull out some definitions defined. We have the bandwidth, which is how much
spectrum the chirp can occupy, the spreading factor, which is the number of
bits encoded symbol. And remember, the symbol is it's just an RF state rights,
the number of bits in each RF state within the modulation. And then finally we have
this thing called the chirp rate, which we've kind of hinted at. It's the first
derivative of the chirp frequency. So the rate at which that that chirp signal is is
constantly changing. And we can pull some numbers out of this documentation to
define those. So we actually have have some common constants for the first two.
And then we find a formula in one of those documentations that states the rate is a
function of those first two. And since there's a finite number of values there,
we can start to iterate and just try all the different frequencies and start to
find one that that works. So in this case, what is the symbol we've talked about how
how this modulation is basically frequency modulated chirps. Right. So what we're
going to try to do with these demodulator is quantify exactly where the chirp jumps
to whenever we have one of those discontinuities. So let's start working
through it here. There are really three steps we're going to we're going to
achieve. We're going to identify the preamble, which is the beginning of the
frame denoted with the one we're going to find the start of that of the FI data unit
by look, by looking in, synchronizing against the sink word, which are those
downshifts that are there. And then finally, step three is we're going to try
to figure out how to extract the data from these instantaneous frequency transitions.
And to do that, we need to quantify them. Now, there's a technique that I found
pretty early on. It was enormously helpful for doing this, and that is to transform
the signal by describing it. And we'll show you what the result is in just a
moment. But first, we're going to have to do some math. And math doesn't read
because it's scary, but it's it's not really it's actually pretty easy. So
there's a basic basic property of complex signals that states that if you multiply
two signals together, if you multiply two signals together, the resulting signal has
the frequency of the frequency of each of the components added together. And from
that, if we multiply a signal with one frequency against the signal that has the
negative value of its frequency, the result is zero. We get a deep we get a
constant signal and we're working at baseband here, which means the center of
the band is zero hertz so we can see negative frequencies and things like that.
So if you multiply an up and down chirp together, what do you get? You get
constant frequency. Now why do I say constant frequency rather than DC? If the
troops are out of phase with one another, there might be an offset from from zero
hertz there. So so it might not be perfectly aligned with zero hertz. We
might do expect to get some offset there. So what happens if you multiply a chirp
signal like this separately against an up chirp and it down chirp. So to do
different two different operations produced two different products. What do
you think is going to happen? Well, if you do that, you get these pretty pictures
right here, so here you can see those those there's really kind of tricky
diagonal chirp signals that are cutting all of your spectrum, are hard to measure,
are translated into these nice, you know, nice signals that are aligned in time. And
that looks like something we can start to really work with and do something with. So
we need to quantify those. So, again, remember symbols, we're going to keep
coming back to this. It's an hour of state. The results represent some number
of bits and the law, LoRa, has this value called the spreading factor that we found
some of the documentation that defines the number of bits encoded for symbol. And
from the picture we saw a little bit earlier, the common values are seven
through 12 or six or 12. You see you see them both in different markets. So from
that, how many possible symbols to be expressed? There can be? Well, each bit
can have, you know, two states is your one. And there are spreading factor number
of bits. The number of symbols is two to the spreading factor. So how can we start
to quantify these these symbols and start to pull them out of the fire? So the steps
that I found that were that were the trick to this were to channelize and resample
the signal to the bandwidth, decrypt the signal with the look of the signal with a
locally generated chirp we just talked about. Then we're going to take a fast
Fauria transform that signal where the number of bends of the 50 that we compute
is equal to the number of possible symbols. And we'll illustrate this
momentarily. And then if we do that correctly, then the most powerful
component in that Pesquería transform, that is the strongest component frequency
that we get back from that operation is the symbol that we're looking for,
somebody chirping it. We get it into a form where we really expect her to only be
one strong component per FFT, whereas if we didn't ditch it when we took the 50 of
of a chirps worth of symbols, we would see the energy kind of spread all throughout,
all throughout all the different bits. But by describing it correctly, all that
energy gets pushed into one bin and we get a single but clear value out of it. So if
we do that, we get a picture that looks like this in here at the Z axis again, is
the is the intensity, the power present. And we expect that to be the symbol that
we're looking for. And here it's aligned in time with the base chip on the left
there. So here are the steps again. We mentioned this earlier. Let's look for the
for the preamble. Right. What's a stupid, simple algorithm for finding this? Let's
do it. Let's do it at 50 and let's look for basically the most powerful component
being in the same bin for some number of consecutive Fatty's easy fighting. The SFD
is the same thing. But again, this time we're going to do it on the opposite
ditcher product. So when we did it, we get back to different streams. We get one of
the D chirped up, chirps in one of the D chirp downstairs so we can look at the
opposite stream and do the same algorithm looking for the the safety here. Important
caveat. Accurately synchronizing on the Safdie is essential for getting good, good
data out of this, this modulation, because if you have a bad sync then you can wind
up having your bisley, your symbols, the samples that comprise your symbol spread
between multiple adjacent fêtes if that happens and you get incorrect data. Now
let's illustrate what that looks like. If you look at rows thirty nine fifty, you
can see that visually it's almost impossible to tell which of those two
readings represents the symbol. You see, there are two different values that are
really powerful. That's the result of basically basically half of the samples
from one chirp and basically half of the sample from Chirp N and then half of the
samples from sample from chirp end plus one wind up in the same FFT. So when we do
it, we get those two components in there. And it's really it's really ugly and hard
to work with. So we can solve this by using a technique called overlapping
Mufti's when looking for our safety synchronization. And basically what that
means is we're going to process each sample multiple times with the effect of
getting better resolution in time of our resulting Mufti's. It's more
computationally intensive, but it gets us much better, better fidelity here. So if
we do that, this is what the result looks like. It's a little bit hard to see right
now. I'll get you a better picture in a moment, but basically it's much less
ambiguous in terms of which symbol is present. So if we use those overlapping
50s, we can synchronize on that SFD. And then once we know exactly where the first
symbol of the data unit is and our buffer, we can go back to using non overlapping
Mufti's, which are more computationally more computationally efficient. And get us
a nice read on the right here. You can see that again, if we look at lines thirty
eight and thirty nine, that ambiguity is gone. Right. You can see exactly where the
most intensive were, the most intense binnaz and therefore which symbol is
present. And here's the whole frame synchronized. So we got the collisions on
the left and doesn't look that great on the right it's much clearer. Cool. So
again we recompute more computationally intensive and then we get out data. Now,
one last thing we have to do to wrap up the modulation. So doing this again,
remember, we were talking about the chermayeff, if our troops aren't perfectly
aligned, then then the resulting deterrence signal might not necessarily be
off of the same reference. Right. And of course, we don't know what chirp was used
to generate the signal on the transmitter. So we have to find some way of normalizing
this data to account for that that that first discrepancy. And we can do that by
referencing the preamble. And it just so happens that the preamble, when you do it,
always represents simple value zero. So you can basically just do a modulo
operation on your receive symbols to rotate that back. So all the symbols are
referenced off of the preamble and you're good to go. And that's it, right. Not even
close. We're just getting started, people. Why is that? Because the data here is
encoded. What is encoding? Basically encoding is a transformation that is
applied to the data before it's transmitted. Why would you do something
like that? Because encoding increases over the year. Resiliency. Why? Why is this
necessary? Right. Remember that we're dealing with unlicensed spectrum. Right.
This is what the nine hundred megahertz band, which is what LoRa uses in the
United States, looks looks like look at all that stuff. It's not LoRa, right? That
stuff is there to ruin your day. It's there to create all sorts of interference
and make your receiver not work the way you expect. So RF is a really brutal
environment. There's all sorts of interference. And basically the encoding
is a way of treating your data so that even if you have a non ideal reception,
you can still get the data out of the frame. So what do we have here? Remember
that LoRa's clotheshorse, we have some material that's available through data
sheets, but we really don't know for sure definitively what's in this file. So,
again, we're going to go back to open source intelligence to figure out what we
know and then try to narrow in on how we're going to iterate through this and
figure out how it works. So from the patent, we have a number of very good
clues. First of all, it refers to the stage called gray indexing, which, as is
defined there should add zero tolerance. In the event that you read, a symbol is
being off by one, off by one bit. But if you if you read a symbol in the incorrect,
then secondly, you have data whitening, which induces randomness into the frame.
We'll talk about that momentarily. If interleaving, which scrambles the bits
within the frame, then you have for error correction, which adds correcting parody
bits, you can think of it as being a parody bits on steroids rather than
telling you that just an error occurred. It can actually help you correct the error
without needing retransmit. So we have four different things to that to comprise
the encoding there in the patent. Right. So that's awesome. It's easy, right? Why
is that? Because documentation lies to us and even. And even even the clear, even
the clearest signals can can can lead us into dead ends. So let me show you how. So
the grand hexing we read to represent great cotting, which is just a basic
binary transformation that you can use to treat data whitening. We actually have
defined in one of the application notes reference designs for the pseudo random
number generators that you use for use of the whitening. It's like C-code that you
can copy and paste. So this should be like this should be rock solid. Step three, we
have an actual algorithm for the EarlyBird that is defined in the patent. I'll show
you what it is momentarily. And then finally, step four suggests that having a
human code is used, which is just a standard for error correction mechanism.
So the first thing to focus on figuring out here is the data whitening. And that's
a critical step because this is the way the whitening works, is you X or your
message against a random string. And unless you know what the random string is,
you're not going to be able to make any sense of what follows it. So figuring out
that random string is essential to being able to even make sense of what follows
it. So, again, with whitening, you take your you take your your buffer that's
going out to the radio and you exhort against a pre computed sort of random
string that is known to both the transmitter and the receiver. Then when
the receiver gets in the frame, it explores that the received buffer against
the same sequence that the transmitter used. And you get back to the original
data because if you remember, explores its own inverse. So that nicely undoes itself.
Now, why would we bother with whitening, and that's because having random data is
really good for receivers similar to Manchester and coding, where basically by
by encoding the data such that you don't have some number of consecutive values of
some number of consecutive symbols of the same value. You get this nice random data
source. What that does is creates lots of edges for your receiver to do clock
recovery against so you get better reception of longer messages or if your
clocks are bad. Manchester, of course, comes with the penalty of a reduced bit
rate. It actually cuts the effective bit rate that you can use into half of the
battery was whitening, does not. The caveat is that you have to know what the
string is in order for it to work. So let's find the waiting sequence. We've got
these algorithms in the in the application note, we've got some examples and strange
love. None of them worked, so we had to figure this out empirically. How can we do
that when there's interleaving and for error correction in in the in the pipeline
here? Right. You know, we can we can send something that might, you know, put the
whitening in a certain state that we could we could leverage. Right. But we still
have these unknown transforms and follow it. How are we going to be able to figure
out what what goes up? How are we going be able to figure out the whitening when
those operations are in the loop, too? Well, we need to bound the problem and
make some assumptions that we can start to iterate through this black box problem. So
we're going to assume that the Forder correction is what the documentation tells
us. It is the Heming and for and we're also going to make another assumption and
we're going to set the spreading factor equal to eight bits per symbol. And
basically, if you do that, then it makes it such that we'll have exactly one
Heming, eight four code word per eight bits per symbol, because if we set the
number of total bits in our having error correcting code to eight, if it's
possible, fits very nicely and should work out well. Now there's another very useful
property of the Hemingford Error correcting code scheme that we're also
going to exploit, and that's that Heming eight for contains four data bits and four
parity bits each. And for 14 of those 16 states, again, remember two possible
states per bit to the power for data bits per code word in each of those in 14 of
those 16 code word possibilities, other for ones and for zeroes each. However, for
the four, the word for data Knebel zero. That's four zeros. The code word of that
is eight zeros. So it's totally non additive. So if we if we send our error
correcting scheme a string of zeros to apply itself to, it's totally not
additive. We get back twice as many zeros so we can leverage that to do something to
try to cancel out that for error correcting stage. So let's go ahead and
transmit a string of zeros. Right. So, again, if it's hamming it for his resume,
we expect that stage for the four year curtain code to cancel out, right. What
about the inner lever? Let's take a look at the algorithm that suggested in the
pattern. There it is. The key takeaway from this is if this is implemented in a
way that's similar to this, is this should be totally non additive. So this should
just move bits around but not add any bits. Right. So if it is in fact non
additive and all we pass through are a bunch of zeros, what happens when you
shuffle around a bunch of zeros? You get the same thing out, so that falls away,
too, right? So we're left with two states, right? We have our symbol grand stage and
our data waiting stage waiting is what we're solving for. That's our variable and
gray indexing. The quote unquote indexing is a bit of an ambiguous term, but it
likely refers to some variant of gray coating, which we mentioned earlier. But
even if it is gray coating versus gray coating or nothing at all, it's just
something they didn't implement. That leaves only three permutations here.
Right. So we've just reduced all the ambiguity of figuring out what this
decoder is to really figure out what the lighting sequences, to really just
figuring out which of the three states this for which of the three operations,
this first gray indexing stages. Right. So if we do that, we try all three. That's
only three things to attempt in order to derive the whitening sequence from the
transmitter, because, again, if we send through a string of zeros, what is the
whitening do? It explores the zeroes against the pseudo random string and what
does anything extra zero. It's the input. So we can do this and get the transmitter
to tell us what its whitening sequences so we can implement the receiver, read that
out, plug it back in and then start to sell for the rest. Cool. Next stage is the
inner lever. Again, we had that formula from the patent surprise surprise
implemented. It was no good. So let's figure out how this works now. We're going
to move very quickly through this because this was the hardest part of all this. And
I'm going to show you the process without making us all the time of staring at a
bunch of graph paper and trying things that that kind of went into this. But
again, just like with the whitening sequence, we're going to exploit
properties of the Heming fact, reveal patterns in the interleave. So, again, if
we look at our Heming eight for code words that we know and love that are very
useful, we're going to use this time the code word for for once, the code word for
for Hex F, and in that case, the state of that code word is eight once. So if we
construct a bunch of packets, we're basically we take we take eight symbols.
We start we take we take four four bytes, which is eight symbols and SFH and we walk
the position of those ones through our our frame here. We can start to look for
patterns. Who sees it. I'll save you the trouble. Who sees it. Now look at the the
bottom row. Second from the right and you'll see the pattern. Basically it's a
diagonal inner lever. But the first two, the two most significant bits are flipped.
So if we take this and then read out, basically we can take this and we can
start to map those diagonal positions into positions within within a interleave
matrix. So if we do that, we walk through all the different states and map those
positions out with data that we know we get this nice table. Now, let's put this
table next to the data that we're looking for. Right. So here we decomposed the
Heming code words for for the data we in, which is, of course, our beloved dead beef
on the in the middle column. On the left, we have the the data values, the four data
bits that we're looking for. And then the column, the right column on the left there
is are the Perati bits that we're looking for. Again, I'm going to make this easy
for you. If you stare at this for long enough, you become compelled to reverse
the order. And then if you continue staring at it, you start to see some
patterns. That looks like our data, right. So if we go a step further, we can start
to map in some of these HanTing correcting fields into this this matrix here. So here
we see the four data are the rightmost rightmost bits. And then we can see that
Perati bits, one and two correlate very nicely. And if you go a step further, we
can see that. These are these the Ghiz five in format very closely as well,
although they're flipped, you'll see that Perati before is actually more significant
period of three. So we're almost there, right. Although we have left to do is
applier and we're done. And that's the modulation. That's the whole thing. So,
again, let's thank you. So, again, let's let's talk briefly about these red
herrings and try to wrap this up, I want to do a demo before our Q&A. So we had
these four different encoding stages here, right? We had great documentation for all
of them. But empirically, after implementing them, we were able to
establish that, well, three of the three of the four just weren't the case. Right.
One of them was actually cool, right? One of them was actually what it said it was.
So. So, yeah. Anyway, how are we able to work through this? I think it's important
to reflect and try to get some takeaways from this. Hopefully this is useful as you
approach your reverse engineering challenges. Basically, what was essential
here was being able to bauen the problem and hold certain things constants that we
could solve for unknowns. And if you remember, we kind of did this in two
stages. We were able to cancel out the interleaving in the forward error
correction and hold that hold that standard, hold that static in order to
figure out the whitening sequence. And the gray indexing were kind of all in one go.
And then when we controlled the grand indexing, the whitening sequence, and
we're pretty confident about what the Ford error correction was, there was really
only one variable that we really had to had to solve, really only one thing. We
actually had to go into the bits and really, really kind of dig out of this
thing. Right. So by making these assumptions, using open source information
and really bounding the problem and working, working through it, through it,
coherently able to reverse these four stages down into really one experimental
variable and just solve for it. So that's that's really the trick here. OK, I'm
going to blow through this next part to talk very briefly about the structure, the
Laurer Phi Phi packett. So this is a picture pulled out of one of the one of
the data sheets. We already talked about the preamble, this repeated chirps. One
thing that's not pictured here is the single word in the story frame delimiter,
which is right there. And then we have this thing called the header. Right. And
it says here that the header is only present in explicit mode. So there's this
notion of implicit versus explicit header in LoRa. And the explicit header includes
a finder that that has some information, such as the length of the payload, the
type of scheme in there that's applied to the remainder of the payload, not the
header itself, but the rest of it. And then there's also an optional CRC as well.
It can be included in implicit assumes that the receiver knows the modulation
parameters and skips that bit. So no problem, right? We can use implicit mode
to figure out what the whitening sequences and then switch back to explicit mode, use
the whitening sequence from implicit and figure out what the header is by just
looking to see what the values are as we change the modulation. Yeah, right. None
of this is easy, right? Like, really, really nothing. Nothing helps us here. So
as it turns out, implicit and explicit explicit header modes use different
whitening sequences. So the header remains unpersuaded, even if we know what the
implicit whitening sequence is implicit about whitening sequences. So let's see
what we know. Again, we've got this header here and in this picture tells us the code
rate is always four eight for the header. So no matter what the code rate, that is
the the number of bits in the Heming for Hemingford error correcting codes used is
for the rest of the packet. This code red is always for it. Well, what about the
spreading factor, as it turns out, the header is always sent at the spreading
factor, that is to less than the rest of your modulation, the code rate is still
for the spreading factor for the header is the pretty factor of minus two. So two
fewer bits per symbol, even if the headers implicit and I have to credit Thomas tell
Camp for giving me the tip that actually led led to kind of putting this all
together thanks to him. So again, the first eight symbols, no matter whether
you're an implicit or explicit mode, are always Senate it minus two and code word
for it. That's always the case. Also, there's this mode called low data rate
where if that set on, then all of the symbols in the remaining in the remainder
of the five, the five packet are also sent at spreading factor F minus two. So it's
just an extra basically gets you some extra margin in case you're dealing with
the noisy channel and need to get data for that's the five who want some tools to go
with it, who's curious about this and wants to start playing with it. Does LoRa
seem cool? So with that, that brings us to G.R. LoRa, which is an out of frequency
radio module that I've been working on for for the last couple of months. And it's an
open source implementation of the fire that works very nicely with the GANU radio
software, defined radio, digital signal processing toolkit. It's open source
software, its free software. It's got a great community built up around it. It's
really cool. If you're curious about ETR, there are loads of good tutorials. And
even if you're a wizard, well, if you're a wizard, you already know what this is. But
it's a really, really great, great piece of software and ecosystem. And why is
having an open source version of this interesting, well, existing interfaces to
LoRa or layer to and above, both with the the data sheets that we get that go with
each of the different lower radios and the standards that are available and open.
It's all layer tuneup. We don't have any insight into what the fi state machine
actually does. And FIGLIA security really can't be taken for granted. And to to back
this up, I'm going to point to some eight to 15 for exploits that that kind of
reinforce this from a couple of years ago. We have traves good speeds packet packet
that show that he was able to do a full seven layer compromise by basically
encoding the data that would induce the preamble and subframe symbols for eight to
15 for within the payload of another message, he was able to get some really
wonky things to happen to radio state machines in doing so. And related to that,
we have this wireless intrusion detection system evasion that was done by Travis
Good and some friends of mine from Dartmouth. Where they were basically able
to fingerprint how different Itochu for radio state machines work and construct
packets that would be able to be heard by some but not others. So from that, you
could basically identify generate versions of packets that weren't totally compliant
with the standard, but would still be heard by certain receivers and not others.
So some really tricky stuff here. Phi's really matter. You can't take them for
granted in the picture of security. So my hope with this is by getting this tool out
there, we can actually really start to look at the surface and figure out how it
works and how it can be made better and really start to start to get involved with
improving the security of this new protocol through some prior to site. Josh
Blum has a module for both of us, which is a kind of like a competitor to radio. It's
like another framework. It gets the modulation right. But the decoding is is
basically off of the documentation so it can talk to itself, but it can't talk to
actual hardware because it doesn't implement the real decoding stage that we
had to reverse engineer. And also, there's another Gahler out there made by this guy,
RPV zero on GitHub. When I first looked at it, it was like this python thing that I
couldn't quite get to work. I went, What did you get last night? Actually looks
pretty cool. So you might check that out, too, if you're interested in this. Looks
like it's it's pretty, pretty solid. So Migiro LoRa implements modulation encoding
in separate blocks so that you can you can be modular and experiment. So if you want
to have like a multiple kind of like a common two layer for error correcting
thing, you better resiliency. You can write that in without having to touch the
demodulator. Told you a couple for you. Also, there's a very simple asynchronous
PDU interface for passing data between the blocks and you basically write to it just
using websocket, which is really easy. I'll demonstrate in a minute and it's just
like I you know, two fifteen four which is a great eight to 15 four, which is a
really great module made by Bastiaan, who I think is here really, really cool tool I
used all the time. So demodulator, the demodulator in the decoding implements the
process that we just reverse engineered using the stack, the 50s and all that. The
modulator in the encoder use a more efficient method that does direct
synthesis of chirps. So rather than like basically computing the fifty results and
then doing an effect of that, we can actually index into a pre computed chirp
to make the generation a lot more computationally efficient. If you want the
source right there just pushed a giant update to it about two hours ago. So if
you're interested in playing with it, there it is. Let's run through a quick
demo before we're out of time here. So here's a scenario. I've written you guys a
poem. I'm going to play you guys a poem. And I want to be able to sniff it and show
you what it is. Right. So to transmit, we have our ative fruit. It's an idea for
radio, like an Arduino basically with a lower radio on it. And to receive it,
we're going to use our USP right down here. And of course, it's all being
received by G.R. LoRa. So I'm going to jump over to my VM if I can see if I can
get this up on the other screen. Bear with me one moment. There we go. Show you the
interview of my password. We're going to start a receiver here and now I'm. Going
to just open a. Sock it here. And I'm going to. Sir, my transmitter and let's
see what we have for you. In case you're unsure of what you're looking at. So
that's all over, LoRa. There are few to do's, if you want to contribute, be happy
to have you do so, some additional resources if you want to know more. I've
written this up all in detail in traves good speeds, PIERCEY or ETFO. The most
recent issue has that in there. Also, if you want to learn more about Radio's NDR,
my colleague Mark and I are giving a talk at Shukan and Troupers called. So you want
to talk radio's, which is going to go through how to reverse engineer really
basic Iot modulations. It'll spend a lot more time on some of the basics and show
you how to actually apply the stuff yourself to wrap up. LPI plans are
exploding. They have tons of momentum and are popping up everywhere. RF stacks are
also becoming more diverse. So when you're talking about securing your wireless air
space, you're not just worrying worried about Wi-Fi anymore. If you're a corporate
security administrator, you work in corporate I.T. You also have to worry
about all these other, like, Iot appliances that are coming into your
enterprise and are starting to take root. On a technical note, we've shown how to go
from some obscure modulation into bits. We've also added a new tool to the
researchers arsenal. I want to thank Bollon Sieber Bestival. He's an incredible
resource and this would have been possible without him. Also, the open source
contributors who helped get here helped us all get here. And finally, the Chaos
Computer Club for organizing 33c3 and having me. So thank you very much. Thank
you for your attention. And I'd be happy to take your questions.
*Applause*
Herald: We are almost out of time, thank you very much, Matt. We're able to take
very few and brief questions. So microphone in front, right, please.
Matt: I remember you. We met in your video conference. Good to see you.
Mic: Yes. There are two ways to quantify the reliability of a dense LoRa network.
Matt: Could you repeat that, please? Mic: Is art a ways to quantify the
reliability of a dense LoRa network? Matt: I'm sure there are. I haven't really
looked at all at benchmarking or figuring out what kind of the limits are. My
interest has really been in getting the decoding information extraction done. I
know that there's a group in San Francisco that's building deep networks that
building a LoRa product or network of some sort. They've done some benchmarking of
how LoRa works in cities and they have a blog post. That's pretty good. You might
check that out. Herald: We have one question from the
Internet via our Signal Angel? Signal Angel: Our panel on the IAC is
asking, how long did it take to figure out all of this?
Matt: So, you know, I first saw LoRa in the wild in January and kind of just let
the capture sit in my sitting by my hard drive for a while. It probably took about
four or five weeks of working on this, more or less full time, I was a little bit
I had some other things working on, too, I'd say probably four weeks from what I
actually said. All right. Let's figure this thing out to having the initial
results. Herald: Another question from the rear
right microphone. Mic: So in decoding those two unknown
layers, you had your proprietary hardware and you could send it data and it'll it
won't do the AES and encryption stuff and it just sends that encoding.
Matt: That's a great question. I kind of skipped over that the microchip LoRa radio
that I had this guy right here. I also wanted another one that was a LoRa when
radio. This is a LoRa radio, but actually exposes an API to pause the Maxsted
machine so you can turn off all the layer two stuff that would add a header in
encryption, stuff like that, and send what are close to arbitrary frames. And I say
what are close to arbitrary frames because you can't turn off the implicit header. So
it's always an implicit or sorry, you can't turn off explicit headers, it's
always in the explosive header mode. So this more or less exposed raw raw payload
injection. Mic: OK, thanks.
Herald: Yeah, we're already in overtime. We're taking one last question from our
Signal Angel on IRC and then we'll have to wrap up.
Matt: I'll be happy to hang out and answer questions after the fact too.
Mic: Now many people are wondering what implications does it have that basically
the patent is not used at all? So could you could you say that the technology is
patent free In a way? Matt: I am not a lawyer, but I have known
lawyers and I know that they're clever enough to not fall for that. So I'm sure
that I'm sure that the patent was defined as generally as possible. And again, it
describes a modulation similar to LoRa. I'm again not a lawyer, but I'm almost
certain that that that that it would be covered. So but that's a clever thought.
Herald: Thank you, Mike. Please give him a warm round of applause. Thank you again.
*applause*
*33c3 postrol music*
Subtitles created by c3subtitles.de in the year 2021. Join, and help us!