WEBVTT - Automatic transcript; may contain recognition errors. Speaker labels from separate source tracks. Times match the published episode.

00:00:07.800 --> 00:00:10.760
<v Aaron van Wirdum>Live from the internet, this is Bitcoin.

00:00:12.342 --> 00:00:12.902
<v Sjors Provoost>Explained.

00:00:13.780 --> 00:00:14.140
<v Aaron van Wirdum>Hey Sjors.

00:00:16.730 --> 00:00:21.790
<v Aaron van Wirdum>Yeah, we're doing another remote episode because, well, we promised to make one

00:00:21.790 --> 00:00:27.520
<v Aaron van Wirdum>in our last emergency broadcast. So we're going to discuss the cold

00:00:27.520 --> 00:00:33.220
<v Aaron van Wirdum>card hack as many other podcasts have done before us and many articles and,

00:00:33.220 --> 00:00:35.220
<v Aaron van Wirdum>you know, everyone has shared their opinion.

00:00:36.080 --> 00:00:41.560
<v Aaron van Wirdum>We thought we should still make this episode and I can pick your brain on this a

00:00:41.560 --> 00:00:43.600
<v Aaron van Wirdum>little bit. It's sort of your expertise.

00:00:44.960 --> 00:00:49.960
<v Aaron van Wirdum>Needless to say, COLDCARD is not our sponsor, at least not for this episode. We

00:00:49.960 --> 00:00:52.620
<v Aaron van Wirdum>haven't really discussed it. I don't think we're going back.

00:00:52.392 --> 00:00:56.492
<v Sjors Provoost>No, they stopped sponsoring podcasts in general. That's my understanding.

00:00:54.890 --> 00:00:56.370
<v Aaron van Wirdum>Yeah, okay, right.

00:00:58.200 --> 00:01:00.140
<v Aaron van Wirdum>Yeah, luckily we have a new sponsor,

00:01:01.102 --> 00:01:03.592
<v Sjors Provoost>That's right. That's right.

00:01:01.500 --> 00:01:07.160
<v Aaron van Wirdum>Mt. Gox. Mt. Gox, check it out. It's a brand new, brilliant Bitcoin exchange.

00:01:09.130 --> 00:01:12.890
<v Aaron van Wirdum>Perfectly fine to store your Bitcoin. I hear they have Litecoin coming in two

00:01:12.890 --> 00:01:13.590
<v Aaron van Wirdum>weeks from now.

00:01:14.582 --> 00:01:16.242
<v Sjors Provoost>Oh, nice. I should try that.

00:01:17.740 --> 00:01:22.160
<v Aaron van Wirdum>Yeah, jokes aside, that's actually something I also want to discuss. We'll do

00:01:22.160 --> 00:01:25.660
<v Aaron van Wirdum>that a bit later in the podcast because obviously, so I want to discuss the cold

00:01:25.660 --> 00:01:31.560
<v Aaron van Wirdum>card hack itself and then also... Yeah, kind of share my thoughts,

00:01:31.680 --> 00:01:36.440
<v Aaron van Wirdum>your thoughts on them being our sponsor, because that kind of became part of the

00:01:36.440 --> 00:01:40.320
<v Aaron van Wirdum>whole story that, you know, COLDCARD, Coinkite was sponsoring like every podcast

00:01:40.320 --> 00:01:40.900
<v Aaron van Wirdum>out there.

00:01:41.100 --> 00:01:46.920
<v Aaron van Wirdum>And to what extent, you know, are we to blame for all of this? Where do our

00:01:46.920 --> 00:01:49.020
<v Aaron van Wirdum>own responsibilities begin and end?

00:01:51.450 --> 00:01:57.210
<v Aaron van Wirdum>It sucks what happened. It's painful. But let's first discuss

00:01:57.210 --> 00:01:59.430
<v Aaron van Wirdum>the COLDCARD hack itself.

00:02:00.882 --> 00:02:01.442
<v Sjors Provoost>Let's do that.

00:02:03.800 --> 00:02:07.740
<v Aaron van Wirdum>By now, probably everyone knows at least roughly what happened.

00:02:10.040 --> 00:02:15.680
<v Aaron van Wirdum>But still, Sjors, what went wrong here? Obviously,

00:02:16.140 --> 00:02:21.140
<v Aaron van Wirdum>everyone knows about the news. The cold card turned out to be vulnerable in

00:02:21.140 --> 00:02:26.460
<v Aaron van Wirdum>basically the worst way possible. People that, as they say, did everything right.

00:02:26.460 --> 00:02:31.140
<v Aaron van Wirdum>They generated their seed on a hardware wallet, never used it online even.

00:02:31.640 --> 00:02:34.460
<v Aaron van Wirdum>But still, Bitcoins were being drowned from it.

00:02:35.632 --> 00:02:37.012
<v Sjors Provoost>Yeah, so...

00:02:35.720 --> 00:02:40.380
<v Aaron van Wirdum>Just in short, not to dwell on it too much because everyone knows this, but what

00:02:40.380 --> 00:02:40.700
<v Aaron van Wirdum>happened?

00:02:41.282 --> 00:02:45.802
<v Sjors Provoost>No, I guess there are sort of two bad failures for a hardware wallet. One is if

00:02:45.802 --> 00:02:49.762
<v Sjors Provoost>somebody can steal the coins from your hardware wallet if they have physical

00:02:49.762 --> 00:02:54.922
<v Sjors Provoost>access to it or through some trick, like with, you know, we've talked about

00:02:54.922 --> 00:02:59.082
<v Sjors Provoost>earlier with malicious PSBTs or tricks with fees, like malware on your computer,

00:02:59.182 --> 00:02:59.502
<v Sjors Provoost>basically.

00:02:59.982 --> 00:03:04.302
<v Sjors Provoost>And the other that is actually much worse, and that is what happened, is if the

00:03:04.302 --> 00:03:08.812
<v Sjors Provoost>seed was never secure in the first place. And that's basically what happened,

00:03:08.952 --> 00:03:10.812
<v Sjors Provoost>right? The seed had too little entropy.

00:03:12.442 --> 00:03:18.122
<v Sjors Provoost>So basically the number of possible seeds in the world was just a couple of

00:03:13.040 --> 00:03:14.280
<v Aaron van Wirdum>Yeah, too little randomness.

00:03:18.122 --> 00:03:23.402
<v Sjors Provoost>trillion, I think, which is just not enough. It needs to be, you know, 256 bit or

00:03:23.402 --> 00:03:28.002
<v Sjors Provoost>128 bits. So like the number of possible seeds should be more than the number of

00:03:28.002 --> 00:03:30.762
<v Sjors Provoost>molecules in the universe. And it wasn't.

00:03:31.540 --> 00:03:36.880
<v Aaron van Wirdum>Yeah, the core security function of Bitcoin, I think you can put it that way,

00:03:37.020 --> 00:03:42.780
<v Aaron van Wirdum>like the central reason that your Bitcoins are secure or should be secure is

00:03:42.780 --> 00:03:47.340
<v Aaron van Wirdum>that the private key or the private keys or whatever the private keys are derived

00:03:47.340 --> 00:03:53.210
<v Aaron van Wirdum>from is... A number that's so big that it's impossible to guess even with

00:03:53.210 --> 00:03:55.130
<v Aaron van Wirdum>all the computers in the world, blah, blah, blah.

00:03:55.430 --> 00:03:57.550
<v Aaron van Wirdum>There's just too many, too many.

00:03:55.812 --> 00:04:01.592
<v Sjors Provoost>Yeah, I mean, it's one of the foundations, right? The other foundations are that

00:04:01.592 --> 00:04:06.132
<v Sjors Provoost>the cryptography itself is secure, because if tomorrow it turns out that the SECP

00:04:06.132 --> 00:04:11.932
<v Sjors Provoost>curve is insecure, then everybody loses their Bitcoin. And the

00:04:09.380 --> 00:04:09.980
<v Aaron van Wirdum>Right.

00:04:11.932 --> 00:04:16.352
<v Sjors Provoost>third one, I guess, is proof of work. If that doesn't work, then Bitcoin is also

00:04:16.352 --> 00:04:20.512
<v Sjors Provoost>insecure in the sense that you just can't reliably make transactions anymore.

00:04:20.752 --> 00:04:22.852
<v Sjors Provoost>But you can't steal somebody's coins then, but yeah.

00:04:23.540 --> 00:04:28.240
<v Aaron van Wirdum>Yeah, you can double spend, etc. But yeah, at least one of the core security

00:04:28.240 --> 00:04:33.500
<v Aaron van Wirdum>assumptions in Bitcoin is that when you generate private keys, then it's going to

00:04:33.500 --> 00:04:38.280
<v Aaron van Wirdum>be random and out of such a big amount of possible numbers that no one can

00:04:38.280 --> 00:04:41.860
<v Aaron van Wirdum>possibly guess it. And that's what went wrong here, right?

00:04:42.200 --> 00:04:45.100
<v Aaron van Wirdum>So again, it's

00:04:42.732 --> 00:04:47.362
<v Sjors Provoost>Yeah, and then the question, of course, how it went wrong, how that went wrong.

00:04:47.110 --> 00:04:53.030
<v Aaron van Wirdum>also a core file, arguably, or maybe not even arguably, just... The number

00:04:53.030 --> 00:04:57.370
<v Aaron van Wirdum>one most important thing that a hardware wallet is supposed to do is generate one

00:04:57.370 --> 00:05:02.650
<v Aaron van Wirdum>of those random numbers. And it turns out that the way these random numbers were

00:05:02.650 --> 00:05:06.790
<v Aaron van Wirdum>generated meant that they weren't exactly random or not random enough.

00:05:07.110 --> 00:05:08.610
<v Aaron van Wirdum>And then the question is indeed,

00:05:07.722 --> 00:05:13.322
<v Sjors Provoost>Well, I would say it's obviously it needs to be done correctly. I would say the

00:05:13.322 --> 00:05:16.582
<v Sjors Provoost>number one task of a hardware wallet in general is to keep the secrets safe.

00:05:18.352 --> 00:05:21.932
<v Sjors Provoost>But if it is not capable of making it securely, then it shouldn't make it

00:05:21.932 --> 00:05:24.852
<v Sjors Provoost>securely, right? Then it should say, look, I'm not going to make a secret for

00:05:24.852 --> 00:05:29.992
<v Sjors Provoost>you. You make it yourself and give it to me. But if the hardware wallet makes the

00:05:27.840 --> 00:05:28.160
<v Aaron van Wirdum>right,

00:05:29.992 --> 00:05:33.072
<v Sjors Provoost>secret, then it has to do it correctly. Otherwise, yeah, it's terrible.

00:05:33.360 --> 00:05:38.590
<v Aaron van Wirdum>yeah. Yeah, so that's what went wrong in a nutshell. And then, yeah, so let's get

00:05:38.590 --> 00:05:43.950
<v Aaron van Wirdum>into a little bit of the technical nitty gritty of what the actual problem was.

00:05:44.050 --> 00:05:45.150
<v Aaron van Wirdum>Why did this not happen?

00:05:46.162 --> 00:05:51.622
<v Sjors Provoost>Yeah, so the cold card has a chip in it. I think it's a secure element chip. And

00:05:51.622 --> 00:05:55.972
<v Sjors Provoost>one of the things that secure element chip can do is make random numbers. And

00:05:55.972 --> 00:06:00.512
<v Sjors Provoost>making random numbers is, you know, it's not that easy because you need lots of

00:06:00.512 --> 00:06:02.512
<v Sjors Provoost>entropy from the universe, essentially.

00:06:03.812 --> 00:06:07.072
<v Sjors Provoost>So there's, I don't know how these chips do that internally. They might just

00:06:07.072 --> 00:06:11.652
<v Sjors Provoost>measure some noise in the environment, electricity, whatever. Whatever they do,

00:06:11.812 --> 00:06:15.452
<v Sjors Provoost>they create a secure random number. And as far as we know, they do that

00:06:15.452 --> 00:06:17.392
<v Sjors Provoost>correctly. So that's always a bit scary.

00:06:18.230 --> 00:06:24.150
<v Aaron van Wirdum>Yeah, and so I made a, just real quick, I made a whole episode on hardware

00:06:24.150 --> 00:06:28.230
<v Aaron van Wirdum>wallets. That was one of the few episodes I made without you. Back a couple of

00:06:28.230 --> 00:06:32.950
<v Aaron van Wirdum>years ago, I made it with Lawrence Nahum of the Jade Wallet and Ben Kaufman of

00:06:32.950 --> 00:06:36.870
<v Aaron van Wirdum>Spectre. And COLDCARD is one of the wallets we discussed.

00:06:36.870 --> 00:06:42.850
<v Aaron van Wirdum>And what I remember from that is that... Yeah, so the secure element,

00:06:43.170 --> 00:06:48.150
<v Aaron van Wirdum>we don't actually know how that part works internally, right? In the case of

00:06:47.922 --> 00:06:52.122
<v Sjors Provoost>Yes. So what can go wrong, if

00:06:48.150 --> 00:06:53.010
<v Aaron van Wirdum>COLDCARD. So the randomness is generated in some way that we,

00:06:54.260 --> 00:06:58.280
<v Aaron van Wirdum>yeah, we don't actually know how it's generated in the case of the COLDCARD, I

00:06:58.280 --> 00:06:58.740
<v Aaron van Wirdum>believe, right?

00:07:00.662 --> 00:07:05.522
<v Sjors Provoost>you only use a secure element to generate the entropy, then at least the outside

00:07:05.522 --> 00:07:10.742
<v Sjors Provoost>world has no way of knowing how that works. Why? Because these secure elements

00:07:10.742 --> 00:07:13.502
<v Sjors Provoost>are typically patented and secret.

00:07:14.310 --> 00:07:19.110
<v Aaron van Wirdum>Yeah, but that's not, but that, to be clear, that wasn't, to be clear, that

00:07:14.942 --> 00:07:17.362
<v Sjors Provoost>But you can compensate for that by generating

00:07:19.110 --> 00:07:24.730
<v Aaron van Wirdum>wasn't the issue here, right? That's not the, no, exactly. Okay, so, yeah,

00:07:19.442 --> 00:07:21.122
<v Sjors Provoost>no, exactly.

00:07:22.822 --> 00:07:25.802
<v Sjors Provoost>No, that's the kind of thing that still could go wrong with other hardware

00:07:25.802 --> 00:07:30.242
<v Sjors Provoost>wallets or even this one. We don't know, right? But there are ways to compensate

00:07:30.242 --> 00:07:30.682
<v Sjors Provoost>for that.

00:07:32.030 --> 00:07:32.810
<v Aaron van Wirdum>yeah.

00:07:32.362 --> 00:07:36.802
<v Sjors Provoost>But let's assume that the secure element just did its work, right? If it doesn't,

00:07:36.862 --> 00:07:40.602
<v Sjors Provoost>then you would expect even older cold card versions also to start being drained,

00:07:40.642 --> 00:07:45.162
<v Sjors Provoost>and we haven't seen that. No, something went wrong in the software that then sits

00:07:45.162 --> 00:07:50.972
<v Sjors Provoost>on the cold card between you and the secure element. And its job was,

00:07:51.112 --> 00:07:56.832
<v Sjors Provoost>and it did that correctly initially up to 2021, its job is to

00:07:56.832 --> 00:08:00.052
<v Sjors Provoost>ask the chip for entropy, basically, and then use that.

00:08:00.452 --> 00:08:05.232
<v Sjors Provoost>That's the simplest way to frame the job. Now, the problem here is that if you're

00:08:05.232 --> 00:08:10.972
<v Sjors Provoost>running software on, well,

00:08:11.052 --> 00:08:16.392
<v Sjors Provoost>let's go back a little bit. As a developer of hardware wallet firmware,

00:08:16.872 --> 00:08:20.692
<v Sjors Provoost>you need to be able to test things. And the way you typically do that is in a

00:08:20.692 --> 00:08:23.052
<v Sjors Provoost>simulator on your computer, not on the device itself.

00:08:23.292 --> 00:08:27.992
<v Sjors Provoost>You probably do both, right? But it's a bit easier to work on a simulator because

00:08:27.992 --> 00:08:31.052
<v Sjors Provoost>you need to quickly change something, try it, and you don't have to flash the

00:08:31.052 --> 00:08:31.772
<v Sjors Provoost>firmware all the time.

00:08:33.442 --> 00:08:39.192
<v Sjors Provoost>And therefore, the code somehow needs to work on both these

00:08:39.192 --> 00:08:42.952
<v Sjors Provoost>environments. It needs to know whether it's running on the device or whether it's

00:08:42.952 --> 00:08:48.302
<v Sjors Provoost>running... On the simulator. But that's a little bit dangerous because you don't

00:08:48.302 --> 00:08:49.322
<v Sjors Provoost>want...

00:08:48.730 --> 00:08:52.570
<v Aaron van Wirdum>Simulator, just to be clear, is basically a regular computer. It's what we're

00:08:52.432 --> 00:08:57.052
<v Sjors Provoost>Yes, but that means it does not have that secure element. Might have another

00:08:52.570 --> 00:08:53.110
<v Aaron van Wirdum>talking about.

00:08:54.610 --> 00:08:54.690
<v Aaron van Wirdum>Right.

00:08:56.890 --> 00:08:59.420
<v Aaron van Wirdum>Yes, right. Right.

00:08:57.052 --> 00:09:01.152
<v Sjors Provoost>secure element, but not the same one. And so then the question is, how do you

00:09:01.152 --> 00:09:05.052
<v Sjors Provoost>make that code work on both these environments? One very naive way is to say, I'm

00:09:05.052 --> 00:09:10.132
<v Sjors Provoost>just going to check in real time where I am. But that's kind of dangerous because

00:09:10.132 --> 00:09:10.912
<v Sjors Provoost>if...

00:09:10.912 --> 00:09:15.312
<v Sjors Provoost>If you're trying to inspect how the device works, maybe something goes wrong with

00:09:15.312 --> 00:09:19.692
<v Sjors Provoost>that check in the software in real time. And you don't want it to fall back to

00:09:19.692 --> 00:09:24.272
<v Sjors Provoost>the simulator way of doing things. Also, sometimes you just can't even compile it

00:09:24.272 --> 00:09:29.522
<v Sjors Provoost>because you can't run actual hardware wallet

00:09:29.582 --> 00:09:35.392
<v Sjors Provoost>machine code on a normal computer sometimes because that chip doesn't exist.

00:09:35.552 --> 00:09:39.022
<v Sjors Provoost>So the simulator is like, I don't, you know. I can't simulate that chip. I can

00:09:39.022 --> 00:09:42.462
<v Sjors Provoost>simulate everything else, but I can't simulate the chip. There's some reasons why

00:09:42.462 --> 00:09:47.082
<v Sjors Provoost>you can't run the exact same code on both the device and the simulator. And

00:09:47.082 --> 00:09:53.042
<v Sjors Provoost>that's where languages like C have things called macros. And a macro is a way

00:09:53.042 --> 00:09:57.902
<v Sjors Provoost>to say, or one thing you can do with a macro is to say, if I'm on the device,

00:09:58.102 --> 00:09:59.082
<v Sjors Provoost>compile this code.

00:09:59.222 --> 00:10:03.242
<v Sjors Provoost>And if I'm in the simulator, compile this other code. So the actual code that's

00:10:03.242 --> 00:10:07.062
<v Sjors Provoost>compiled is different for the simulator and the real device.

00:10:08.842 --> 00:10:14.812
<v Sjors Provoost>And the bug happened basically in that distinction. So the compiler would

00:10:14.812 --> 00:10:20.352
<v Sjors Provoost>basically use some of the simulator code on the real device. Not all of it, but

00:10:20.352 --> 00:10:25.952
<v Sjors Provoost>some of it. And in particular, the most critical bit of it, namely how to make

00:10:25.952 --> 00:10:26.572
<v Sjors Provoost>the random data.

00:10:29.002 --> 00:10:34.022
<v Sjors Provoost>So the real device uses or should have used the secure element to generate the

00:10:34.022 --> 00:10:39.362
<v Sjors Provoost>random data. The simulator instead uses a Python library to do it. And that

00:10:39.362 --> 00:10:44.982
<v Sjors Provoost>Python library was deliberately not actually cryptographically random. And that's

00:10:44.982 --> 00:10:47.782
<v Sjors Provoost>fine because that Python library wasn't designed for any of this.

00:10:49.462 --> 00:10:52.782
<v Sjors Provoost>But this is also where it gets really dangerous if you want to detect it.

00:10:49.890 --> 00:10:50.770
<v Aaron van Wirdum>Okay. So,

00:10:54.082 --> 00:10:59.182
<v Sjors Provoost>Because let's say the simulator had a very, very, very weak random number

00:10:59.182 --> 00:11:03.942
<v Sjors Provoost>generator that only produces the number one. Like whenever you call it, it just

00:11:03.942 --> 00:11:07.562
<v Sjors Provoost>says one. Well, that means anytime you run the simulator, you get the same seed.

00:11:08.022 --> 00:11:12.782
<v Sjors Provoost>And so it'd be very obvious. And then if you had this bug, then the devices would

00:11:12.782 --> 00:11:13.882
<v Sjors Provoost>all be making the same seed.

00:11:14.202 --> 00:11:18.122
<v Sjors Provoost>That would have been caught like almost immediately, right? The first. QA

00:11:18.122 --> 00:11:20.602
<v Sjors Provoost>probably would have seen it. And otherwise the customers would be like, why is

00:11:20.602 --> 00:11:23.402
<v Sjors Provoost>there money on my account? Why is my money disappearing from my account?

00:11:24.762 --> 00:11:25.082
<v Sjors Provoost>Right?

00:11:24.990 --> 00:11:30.150
<v Aaron van Wirdum>yeah, which some people did claim even happened now, but we'll leave that aside.

00:11:32.082 --> 00:11:35.302
<v Sjors Provoost>Collisions, right? So I think the number of secrets that these devices were

00:11:33.160 --> 00:11:33.740
<v Aaron van Wirdum>Yeah.

00:11:35.302 --> 00:11:40.502
<v Sjors Provoost>generating with the bug is still in the trillions. And then you can do some math

00:11:40.502 --> 00:11:45.282
<v Sjors Provoost>on how many you need. I always forget. I think it's the square root. So you need

00:11:45.282 --> 00:11:49.602
<v Sjors Provoost>a million devices to have any chance of overlap. But ask a statistician.

00:11:51.520 --> 00:11:57.210
<v Aaron van Wirdum>Yeah, it's the birthday paradox, probably, right? And anyways, like I said, let's

00:11:51.872 --> 00:11:52.992
<v Sjors Provoost>So probably not.

00:11:54.812 --> 00:11:55.892
<v Sjors Provoost>Yeah, exactly.

00:11:57.210 --> 00:12:01.170
<v Aaron van Wirdum>leave that aside. Yeah, you were saying if the randomness is like really bad,

00:12:01.310 --> 00:12:05.050
<v Aaron van Wirdum>then it's obvious enough for anyone to detect. And if it's really good, then

00:12:05.050 --> 00:12:08.530
<v Aaron van Wirdum>there's no problem. But it's this awkward middle space where it's still kind of

00:12:08.530 --> 00:12:10.770
<v Aaron van Wirdum>good-ish and then no one...

00:12:08.942 --> 00:12:13.582
<v Sjors Provoost>Yeah, it's a very, very dangerous middle space, right? It's good enough that you

00:12:11.700 --> 00:12:12.280
<v Aaron van Wirdum>Yeah.

00:12:13.582 --> 00:12:18.582
<v Sjors Provoost>can fool a human tester. It's probably even good enough that you can fool an

00:12:18.582 --> 00:12:24.032
<v Sjors Provoost>automated tester because let's say you... As a company, you might have 100

00:12:24.032 --> 00:12:29.672
<v Sjors Provoost>test devices or 1,000 test devices, and you could connect them all via USB to

00:12:29.672 --> 00:12:34.032
<v Sjors Provoost>some computer and have that computer constantly flash it and make a new seed,

00:12:34.052 --> 00:12:37.712
<v Sjors Provoost>make a new seed, make a new seed, and then see if there's any overlap.

00:12:39.392 --> 00:12:45.222
<v Sjors Provoost>So if the number of random numbers was maybe 10,000, You know, maybe the machine

00:12:45.222 --> 00:12:48.662
<v Sjors Provoost>would have caught it. But the number of unique outcomes, I think, is in the

00:12:48.662 --> 00:12:53.282
<v Sjors Provoost>billions or more. And so it was good enough to fool the humans, good enough to

00:12:53.282 --> 00:12:59.182
<v Sjors Provoost>fool any kind of automation, even good enough that users wouldn't see these like,

00:12:59.202 --> 00:13:01.102
<v Sjors Provoost>hey, why is there money in my fresh wallet?

00:13:02.422 --> 00:13:04.862
<v Sjors Provoost>But not good enough to defeat an attacker.

00:13:06.810 --> 00:13:12.810
<v Aaron van Wirdum>Right. So in short, the problem as you describe it is that the test code was

00:13:12.810 --> 00:13:18.370
<v Aaron van Wirdum>ultimately used as the real code on the device. That's the bug, basically. Is

00:13:18.370 --> 00:13:21.710
<v Aaron van Wirdum>that a good shortcut to explaining it?

00:13:20.872 --> 00:13:24.112
<v Sjors Provoost>Yeah, not all the test code, right? But the very critical part of the test code.

00:13:24.862 --> 00:13:27.982
<v Sjors Provoost>Yes. And so, you know, then you can look at how do you prevent problems like

00:13:24.910 --> 00:13:25.230
<v Aaron van Wirdum>Right.

00:13:27.982 --> 00:13:28.302
<v Sjors Provoost>this?

00:13:29.562 --> 00:13:31.122
<v Sjors Provoost>Well, obviously,

00:13:29.760 --> 00:13:32.480
<v Aaron van Wirdum>Yeah. Or how could this happen in the first place?

00:13:34.502 --> 00:13:36.202
<v Sjors Provoost>yeah. So how it happened?

00:13:34.840 --> 00:13:38.280
<v Aaron van Wirdum>You're a developer, right? Like, is this not an obvious thing that you would see?

00:13:38.400 --> 00:13:40.900
<v Aaron van Wirdum>Apparently not, right? Because no one saw it for a long time.

00:13:39.862 --> 00:13:40.382
<v Sjors Provoost>No.

00:13:42.302 --> 00:13:47.722
<v Sjors Provoost>Well, I guess it depends, right? If your expertise is embedded systems, and

00:13:47.722 --> 00:13:52.182
<v Sjors Provoost>you saw the change that was causing this, say, the switching between two

00:13:52.182 --> 00:13:56.022
<v Sjors Provoost>libraries, maybe you would have noticed it. You're like, hey, this is a

00:13:56.022 --> 00:14:01.932
<v Sjors Provoost>sloppy change. But if you look at the final result, maybe you

00:14:01.932 --> 00:14:03.992
<v Sjors Provoost>wouldn't because it's very subtle.

00:14:04.112 --> 00:14:09.942
<v Sjors Provoost>I think it's the difference between ifdef and if zero. So one says, is this

00:14:09.942 --> 00:14:14.182
<v Sjors Provoost>variable defined? And the other says, is this variable not zero? And these are

00:14:14.182 --> 00:14:18.962
<v Sjors Provoost>quite typical mistakes to make in code. We run into them in Bitcoin Core multiple

00:14:18.962 --> 00:14:23.602
<v Sjors Provoost>times where some components shouldn't be included or should be included.

00:14:23.782 --> 00:14:26.242
<v Sjors Provoost>It's just not happening in any critical place.

00:14:29.880 --> 00:14:31.220
<v Aaron van Wirdum>Right, okay, so,

00:14:30.912 --> 00:14:36.892
<v Sjors Provoost>But there's a second bug that made this worse. Or, you know, this bug

00:14:36.892 --> 00:14:39.712
<v Sjors Provoost>could have existed and nothing would have gone wrong if there were some other

00:14:39.712 --> 00:14:42.852
<v Sjors Provoost>things that had happened. So that might be useful to get into.

00:14:41.910 --> 00:14:47.050
<v Aaron van Wirdum>okay, and just to be clear, because there's different versions of the gold cards,

00:14:47.230 --> 00:14:51.370
<v Aaron van Wirdum>right, and some of them were affected more than others, so what you just

00:14:51.370 --> 00:14:55.730
<v Aaron van Wirdum>described, there was test code, and even though the secure element presumably

00:14:55.730 --> 00:15:00.850
<v Aaron van Wirdum>worked, the test code didn't call on the secure element for the randomness, and

00:15:00.850 --> 00:15:01.190
<v Aaron van Wirdum>it was,

00:15:00.992 --> 00:15:06.112
<v Sjors Provoost>The real code, yeah, exactly. The real code didn't use the test path to get the

00:15:06.112 --> 00:15:08.192
<v Sjors Provoost>randomness instead of the secure element.

00:15:07.330 --> 00:15:13.250
<v Aaron van Wirdum>yeah, and is this the MK3 problem already, or is there more to it there as

00:15:13.250 --> 00:15:13.450
<v Aaron van Wirdum>well?

00:15:14.342 --> 00:15:18.922
<v Sjors Provoost>No, that's what happened on MK3. But even on MK3 could have been prevented with

00:15:18.922 --> 00:15:20.082
<v Sjors Provoost>additional randomness.

00:15:21.372 --> 00:15:26.732
<v Sjors Provoost>So there's something quite nice about entropy, which is that if you take bad

00:15:26.732 --> 00:15:32.052
<v Sjors Provoost>entropy, so low entropy, not enough randomness in it, and you add to it

00:15:32.052 --> 00:15:37.072
<v Sjors Provoost>very good entropy, or the other way around, I guess, easier to understand. If you

00:15:37.072 --> 00:15:43.012
<v Sjors Provoost>take very good entropy, so completely quantum number generated noise, and

00:15:43.012 --> 00:15:46.912
<v Sjors Provoost>you add to it bad entropy, like just the word hello, it doesn't matter.

00:15:47.092 --> 00:15:50.192
<v Sjors Provoost>Like you do not weaken entropy. Entropy only gets stronger. Entropy just

00:15:50.192 --> 00:15:55.202
<v Sjors Provoost>increases if you add it. That's a very nice property. And that means what you can

00:15:55.202 --> 00:15:59.962
<v Sjors Provoost>do is you can take, once as a device that's trying to generate a key, you can

00:15:59.962 --> 00:16:03.442
<v Sjors Provoost>take the entropy from the skewer element, and then you can start adding other

00:16:03.442 --> 00:16:08.632
<v Sjors Provoost>stuff to it. And the coldcard was doing that a little bit, but not enough.

00:16:04.740 --> 00:16:05.180
<v Aaron van Wirdum>Right.

00:16:07.880 --> 00:16:09.260
<v Aaron van Wirdum>The MK3 also.

00:16:10.272 --> 00:16:12.192
<v Sjors Provoost>I think so, yes.

00:16:14.142 --> 00:16:19.622
<v Sjors Provoost>I'm not sure. I think, yes, the amp-key3 added a little bit about the timing of

00:16:19.622 --> 00:16:20.802
<v Sjors Provoost>where it was in the boot sequence.

00:16:22.612 --> 00:16:26.512
<v Sjors Provoost>Because if you just take the Python random number generator that they used

00:16:26.512 --> 00:16:31.432
<v Sjors Provoost>without any other data, then they would have all had the same seed because it was

00:16:31.432 --> 00:16:35.372
<v Sjors Provoost>a deterministic random number generator. This always produces the same thing

00:16:33.620 --> 00:16:34.800
<v Aaron van Wirdum>Oh, right. Okay.

00:16:35.372 --> 00:16:39.172
<v Sjors Provoost>given the same input. So they already, in a way, added a little bit of entropy,

00:16:39.272 --> 00:16:43.822
<v Sjors Provoost>but it was just not enough. But typically what you do is you generate your seed,

00:16:44.022 --> 00:16:48.602
<v Sjors Provoost>or sorry, you generate some entropy with one source, and then you XOR, it's like

00:16:48.602 --> 00:16:52.722
<v Sjors Provoost>an addition, essentially, another source of entropy into it, and you just keep

00:16:52.722 --> 00:16:54.302
<v Sjors Provoost>doing that with other sources.

00:16:54.482 --> 00:16:59.632
<v Sjors Provoost>And these other sources can be, well, on a normal computer, you can take a

00:16:59.632 --> 00:17:05.432
<v Sjors Provoost>screenshot off your desktop, you can measure, you can read a bunch of files, just

00:17:05.432 --> 00:17:06.812
<v Sjors Provoost>random files and hash those.

00:17:08.772 --> 00:17:13.372
<v Sjors Provoost>You can look at mouse movements. I don't know if people used PGP back in the 90s,

00:17:13.472 --> 00:17:18.932
<v Sjors Provoost>but then you'd have to wiggle your mouse for like a minute for it to have enough

00:17:18.932 --> 00:17:24.142
<v Sjors Provoost>entropy to create a secure PGP key. I don't know if that was actually true or

00:17:22.150 --> 00:17:27.920
<v Aaron van Wirdum>Yeah, also with the original paper wallet websites

00:17:24.142 --> 00:17:25.042
<v Sjors Provoost>just therapeutic, but

00:17:27.920 --> 00:17:31.380
<v Aaron van Wirdum>that you had in like 2013, 2014, that was also a thing.

00:17:31.852 --> 00:17:35.572
<v Sjors Provoost>yeah, but some of these paper wallets were highly insecure despite that.

00:17:36.140 --> 00:17:39.980
<v Aaron van Wirdum>I know I'm not recommending them, but I'm just pointing out that was like a thing

00:17:37.022 --> 00:17:37.422
<v Sjors Provoost>Yeah,

00:17:39.980 --> 00:17:42.530
<v Aaron van Wirdum>back then. And should

00:17:40.672 --> 00:17:43.312
<v Sjors Provoost>so mouse movement makes sense. Now, the problem with hardware wallets is they

00:17:43.312 --> 00:17:48.552
<v Sjors Provoost>have less of that, right? Because they are isolated devices, they have very

00:17:48.552 --> 00:17:52.852
<v Sjors Provoost>little software, so the file system is very predictable. It's not like you can

00:17:52.852 --> 00:17:57.752
<v Sjors Provoost>just look at somebody's desktop background or whenever they last opened their

00:17:57.752 --> 00:17:59.972
<v Sjors Provoost>email. There's none of that on the hardware wallet.

00:18:00.072 --> 00:18:05.972
<v Sjors Provoost>It's much more sterile, much more similar. So it probably

00:18:05.972 --> 00:18:09.172
<v Sjors Provoost>wouldn't be enough to just look at random things on the hardware wallet. The

00:18:09.172 --> 00:18:12.232
<v Sjors Provoost>hardware wallet also doesn't know the actual time in the universe. It just knows

00:18:12.232 --> 00:18:16.202
<v Sjors Provoost>how long it's been awake. But that's typically very short because you're just

00:18:16.202 --> 00:18:21.692
<v Sjors Provoost>creating a new one. So things you could probably do is have a

00:18:21.692 --> 00:18:23.872
<v Sjors Provoost>gravity sensor or accelerometer.

00:18:24.192 --> 00:18:27.592
<v Sjors Provoost>You know, your phone knows which side is up because it knows which way the

00:18:27.592 --> 00:18:31.612
<v Sjors Provoost>gravity is pulling on the sensor. And so if you just tell the user to rotate

00:18:31.612 --> 00:18:35.332
<v Sjors Provoost>their device a couple of times and you have such a sensor, that could be an

00:18:35.332 --> 00:18:36.512
<v Sjors Provoost>additional source of entropy.

00:18:38.442 --> 00:18:41.222
<v Sjors Provoost>We just tell the user, like, shake the device for, like, two seconds.

00:18:42.582 --> 00:18:46.882
<v Sjors Provoost>And you just add that to what the secure element is giving. Some hardware

00:18:46.882 --> 00:18:50.062
<v Sjors Provoost>wallets, I think, nowadays have cameras. Those are great, too, for entropy.

00:18:50.832 --> 00:18:54.372
<v Sjors Provoost>Because they just take, essentially, they just take photons from the universe.

00:18:54.872 --> 00:18:59.032
<v Sjors Provoost>And these are all just completely unique. Assuming the camera is working, right?

00:18:59.072 --> 00:19:02.772
<v Sjors Provoost>If the camera is black, like there's nothing coming in, well, then they're all

00:19:02.772 --> 00:19:03.092
<v Sjors Provoost>the same.

00:19:04.152 --> 00:19:07.372
<v Sjors Provoost>So you would never want to rely on any of these single sources. The sensor is

00:19:07.372 --> 00:19:12.132
<v Sjors Provoost>broken, it's not giving random data, then you still have a problem. So if they

00:19:12.132 --> 00:19:17.322
<v Sjors Provoost>had done that, that would have compensated for this, basically. But on the MK4,

00:19:17.402 --> 00:19:21.582
<v Sjors Provoost>there was an even better situation, in theory, because they had multiple secure

00:19:21.582 --> 00:19:25.462
<v Sjors Provoost>elements. And they were combining entropy from all three of them.

00:19:26.012 --> 00:19:27.112
<v Sjors Provoost>They just did it wrong.

00:19:29.510 --> 00:19:35.020
<v Aaron van Wirdum>we... About the MK3 real quick, because that's the worst one,

00:19:35.300 --> 00:19:39.180
<v Aaron van Wirdum>the one that's worst effective. So I think what we just described about the test

00:19:39.180 --> 00:19:43.680
<v Aaron van Wirdum>code and all that, that's true for all of them, right? For all reasons, once, but

00:19:43.512 --> 00:19:47.672
<v Sjors Provoost>Yeah, that's the fundamental thing that went wrong. What I just described after

00:19:43.680 --> 00:19:44.520
<v Aaron van Wirdum>then some added,

00:19:46.580 --> 00:19:47.660
<v Aaron van Wirdum>yeah, but then some,

00:19:47.672 --> 00:19:49.772
<v Sjors Provoost>this is like, what could have made it less bad?

00:19:49.880 --> 00:19:55.180
<v Aaron van Wirdum>yeah, but then some did make it less bad, right? So how do you know the

00:19:55.180 --> 00:19:59.280
<v Aaron van Wirdum>differences between like what else went wrong or didn't go wrong or what

00:19:56.982 --> 00:19:57.382
<v Sjors Provoost>Yeah.

00:19:59.280 --> 00:20:02.860
<v Aaron van Wirdum>mitigation did some of the wallets still have?

00:20:01.342 --> 00:20:05.862
<v Sjors Provoost>Yeah, so what happened in the MK4 is that they did add more entropy, namely from

00:20:05.862 --> 00:20:09.942
<v Sjors Provoost>these other secure elements. And if they had done that correctly, namely adding

00:20:09.942 --> 00:20:13.782
<v Sjors Provoost>all the entropy from the other secure elements, then there would not have been a

00:20:13.782 --> 00:20:17.142
<v Sjors Provoost>problem at all, because as long as one of them works, you're good.

00:20:18.170 --> 00:20:21.730
<v Aaron van Wirdum>Okay, so they did not do that correctly either. So what did they do then?

00:20:18.722 --> 00:20:19.562
<v Sjors Provoost>But they didn't.

00:20:20.832 --> 00:20:26.172
<v Sjors Provoost>No. They took some entropy from these other devices, from these other secure

00:20:26.172 --> 00:20:29.792
<v Sjors Provoost>elements, but then they trimmed it. So they only took, like, I think it was four

00:20:29.792 --> 00:20:33.312
<v Sjors Provoost>bytes of it. 4 times 8 is 32 bits.

00:20:34.812 --> 00:20:37.872
<v Sjors Provoost>So they had only 32 bits of real extra entropy.

00:20:39.720 --> 00:20:42.020
<v Aaron van Wirdum>So they took four bits out of how many?

00:20:43.522 --> 00:20:49.162
<v Sjors Provoost>Well, they could have taken infinity, but let's say normally you'd want a seed

00:20:49.162 --> 00:20:55.142
<v Sjors Provoost>that's 256 bit, so 32 bytes. So they could have taken

00:20:55.142 --> 00:21:00.702
<v Sjors Provoost>32 bytes from one of the secure enclaves, taken another 32 bytes from the other

00:21:00.702 --> 00:21:02.582
<v Sjors Provoost>one, and XOR all of them.

00:21:02.642 --> 00:21:07.082
<v Sjors Provoost>So just take all the 32 bytes from each of the devices. But instead, they took

00:21:07.082 --> 00:21:11.642
<v Sjors Provoost>only four. And I don't know why, because that is the kind of thing that I think

00:21:11.642 --> 00:21:17.012
<v Sjors Provoost>anyone looking at that code would have spotted. But anyone knowing a little bit

00:21:17.012 --> 00:21:17.492
<v Sjors Provoost>about entropy.

00:21:18.170 --> 00:21:23.940
<v Aaron van Wirdum>Okay, and this effect, correct me if I'm wrong. I believe so that they took four

00:21:23.940 --> 00:21:29.420
<v Aaron van Wirdum>bytes out of 32 for a reason that you don't understand. But then this was

00:21:29.420 --> 00:21:35.260
<v Aaron van Wirdum>itself also hashed again, right? With the Yasmarang. That's just

00:21:35.260 --> 00:21:38.020
<v Aaron van Wirdum>a MK4 and your specific feeling.

00:21:36.482 --> 00:21:40.922
<v Sjors Provoost>Yeah, so the Yasmarang is this Python library. So the Yasmarang is this Python

00:21:38.140 --> 00:21:38.500
<v Aaron van Wirdum>Is that correct?

00:21:40.922 --> 00:21:44.442
<v Sjors Provoost>pseudorandom number generator. We talked about that in the milk set episode,

00:21:44.602 --> 00:21:49.532
<v Sjors Provoost>about the general phenomena of a pseudorandom number generator. It takes some

00:21:49.532 --> 00:21:54.322
<v Sjors Provoost>input. And it gives a random looking number, but it's actually, if you give the

00:21:54.322 --> 00:21:55.902
<v Sjors Provoost>same input, you always get the same output.

00:21:56.002 --> 00:22:01.632
<v Sjors Provoost>So it's not really random. And so if the input to that generator

00:21:57.940 --> 00:21:58.420
<v Aaron van Wirdum>Yeah.

00:22:01.632 --> 00:22:07.612
<v Sjors Provoost>is four bytes, essentially, four bytes of uniqueness, then you're only going

00:22:07.612 --> 00:22:11.602
<v Sjors Provoost>to get four bytes of worth of entropy in the end.

00:22:13.242 --> 00:22:17.382
<v Sjors Provoost>Because you essentially just have these four bytes and the pseudorandom number

00:22:17.382 --> 00:22:21.402
<v Sjors Provoost>generator doesn't add anything. It's just four bytes in is four bytes out in

00:22:21.402 --> 00:22:21.942
<v Sjors Provoost>terms of entropy.

00:22:24.260 --> 00:22:29.300
<v Aaron van Wirdum>So this really does sound like it's disaster upon disaster upon disaster then.

00:22:30.682 --> 00:22:36.622
<v Sjors Provoost>No, it's a disaster that could have been fixed in the MK4, could

00:22:36.622 --> 00:22:40.622
<v Sjors Provoost>have been harmless in the MK4, but wasn't harmless because they didn't use the

00:22:40.622 --> 00:22:45.042
<v Sjors Provoost>entropy they had, the extra entropy they had. They just didn't use it. So like

00:22:44.220 --> 00:22:46.700
<v Aaron van Wirdum>Yeah, well, that's a second disaster then, right?

00:22:45.042 --> 00:22:47.102
<v Sjors Provoost>you add two chips that could have given you...

00:22:48.512 --> 00:22:51.412
<v Sjors Provoost>Yeah, I guess it depends on your definition of disaster. Yeah.

00:22:51.290 --> 00:22:54.010
<v Aaron van Wirdum>How would you call it? Blunder?

00:22:55.872 --> 00:23:01.672
<v Sjors Provoost>It's one disaster plus one bad implementation,

00:23:01.672 --> 00:23:02.532
<v Sjors Provoost>I guess. I don't know.

00:23:03.972 --> 00:23:07.552
<v Sjors Provoost>I don't know what the reason is why they only kept four bytes, but my guess would

00:23:07.552 --> 00:23:12.312
<v Sjors Provoost>be that they did not have this intuition that good entropy plus bad entropy is

00:23:12.312 --> 00:23:18.092
<v Sjors Provoost>good entropy. Because if you think, generally, if you think a nice cup of

00:23:18.092 --> 00:23:22.632
<v Sjors Provoost>tea plus poison is just bad tea, right?

00:23:23.612 --> 00:23:26.992
<v Sjors Provoost>But entropy doesn't work that way. You can just add as much badness or poison. So

00:23:26.992 --> 00:23:30.992
<v Sjors Provoost>they might have just mistrusted these other secure devices. They're like, well,

00:23:31.412 --> 00:23:34.012
<v Sjors Provoost>they're different manufacturers, but we don't fully trust them, so we don't use

00:23:34.012 --> 00:23:37.812
<v Sjors Provoost>all of it, what's coming out of it. But that's the wrong intuition.

00:23:39.450 --> 00:23:43.450
<v Aaron van Wirdum>Right. Let me pull this apart real quick just to make sure that I understand and

00:23:43.450 --> 00:23:48.630
<v Aaron van Wirdum>then hopefully our listeners also. Because I do want to point out, it sounds to

00:23:48.630 --> 00:23:54.510
<v Aaron van Wirdum>me there are three different mistakes that happened on different...

00:23:53.282 --> 00:23:55.822
<v Sjors Provoost>Probably more, but there's two critical ones, yeah.

00:23:56.370 --> 00:24:01.890
<v Aaron van Wirdum>Yeah, so the first one is that there was a bug in the firmware, in the code that

00:24:01.890 --> 00:24:06.710
<v Aaron van Wirdum>made the COLDCARD use test codes, which therefore didn't pull the randomness from

00:24:06.710 --> 00:24:12.550
<v Aaron van Wirdum>the secure element. That's one. We discussed that one. Two is only

00:24:12.550 --> 00:24:18.070
<v Aaron van Wirdum>four bytes out of 32 were used when the secure elements were combined.

00:24:18.550 --> 00:24:22.270
<v Aaron van Wirdum>Instead of just using all the randomness, they only use part of the randomness.

00:24:22.470 --> 00:24:23.970
<v Aaron van Wirdum>And then the third mistake.

00:24:25.750 --> 00:24:30.770
<v Aaron van Wirdum>Did I get this straight? Is that the Yasmarang thing is a pseudo-random, is not

00:24:27.662 --> 00:24:29.642
<v Sjors Provoost>Yeah, so another way to put that is to say,

00:24:30.770 --> 00:24:34.950
<v Aaron van Wirdum>even a random number generator at all, not a good one. So there were three

00:24:34.162 --> 00:24:37.942
<v Sjors Provoost>well, that is part of the test code. The pseudo-random number generator is the

00:24:34.950 --> 00:24:36.030
<v Aaron van Wirdum>mistakes in that sense.

00:24:37.942 --> 00:24:43.932
<v Sjors Provoost>test code. So you basically take on the... Yes.

00:24:40.420 --> 00:24:42.210
<v Aaron van Wirdum>Is that Yasmarang?

00:24:44.172 --> 00:24:49.632
<v Sjors Provoost>So what happens is on the MK3, you take nothing, you don't take the

00:24:44.340 --> 00:24:45.320
<v Aaron van Wirdum>Oh, okay.

00:24:49.632 --> 00:24:52.192
<v Sjors Provoost>random number generator, and you just give it to Yasmarang.

00:24:53.152 --> 00:24:58.552
<v Sjors Provoost>And on the MK4, I think you did that, plus you then added

00:24:53.670 --> 00:24:54.190
<v Aaron van Wirdum>Okay.

00:24:58.552 --> 00:25:01.372
<v Sjors Provoost>real secure elements, but you only added four bytes of them.

00:25:02.850 --> 00:25:05.030
<v Aaron van Wirdum>Okay, I see. So then there's...

00:25:03.612 --> 00:25:07.972
<v Sjors Provoost>And I think those did not go to the Yasmarang. So it's like you take nothing, you

00:25:07.972 --> 00:25:12.482
<v Sjors Provoost>put it through Yasmarang, and then that's one source, and then you add another

00:25:12.482 --> 00:25:14.022
<v Sjors Provoost>source, but you don't add the full source.

00:25:17.100 --> 00:25:17.620
<v Aaron van Wirdum>Right.

00:25:17.112 --> 00:25:22.612
<v Sjors Provoost>And that first one, I think, could have been missed in a security audit of that

00:25:22.612 --> 00:25:25.992
<v Sjors Provoost>part of the code. The second, I don't understand it.

00:25:27.862 --> 00:25:31.082
<v Sjors Provoost>I mean, of course, everything can be missed. And it depends on what you tell an

00:25:28.180 --> 00:25:28.700
<v Aaron van Wirdum>Okay.

00:25:31.082 --> 00:25:34.822
<v Sjors Provoost>auditor and what that auditor's experience is. You know, if you tell the auditor,

00:25:35.002 --> 00:25:38.482
<v Sjors Provoost>like, make sure nobody can steal the secret, then they might not even look at

00:25:38.482 --> 00:25:39.202
<v Sjors Provoost>this part of the code.

00:25:40.350 --> 00:25:46.160
<v Aaron van Wirdum>Yeah, so let's get there next. But first, does this cover the bugs? Like the

00:25:46.160 --> 00:25:50.940
<v Aaron van Wirdum>actual mistakes, you know, the heart of the disaster. Does this cover that part

00:25:50.940 --> 00:25:55.100
<v Aaron van Wirdum>before we move on to? Yeah. OK, so that

00:25:51.612 --> 00:25:55.572
<v Sjors Provoost>Yeah, I think so. I mean, you can make it more subtle, but those are the two

00:25:55.572 --> 00:25:55.832
<v Sjors Provoost>things.

00:25:56.770 --> 00:26:01.870
<v Aaron van Wirdum>this is basically what went wrong. OK, so then, yeah, let's get into a little bit

00:26:01.870 --> 00:26:04.770
<v Aaron van Wirdum>of, you know, how could this have happened?

00:26:06.590 --> 00:26:11.150
<v Aaron van Wirdum>One of the one of the things I saw out there is.

00:26:12.520 --> 00:26:17.160
<v Aaron van Wirdum>That, you know, one of the mistakes that were made is sort of a meta mistake is

00:26:17.160 --> 00:26:22.360
<v Aaron van Wirdum>that the firmware, the source code itself was no longer open source since a

00:26:22.360 --> 00:26:27.220
<v Aaron van Wirdum>couple of years. You know, the backstory is another hardware wallet manufacturer

00:26:27.220 --> 00:26:32.830
<v Aaron van Wirdum>foundation. Wanted to take the open source code that COLDCARD was using.

00:26:34.330 --> 00:26:39.690
<v Aaron van Wirdum>The Coinkite people, Novak, didn't like it. And they decided to

00:26:39.690 --> 00:26:45.210
<v Aaron van Wirdum>turn the source code into source available rather than open source. Which, if I

00:26:45.210 --> 00:26:49.170
<v Aaron van Wirdum>understand correctly, means the code is out there, but it cannot be commercially

00:26:49.170 --> 00:26:54.390
<v Aaron van Wirdum>used by any other manufacturer or product. And this would have taken away, the

00:26:54.390 --> 00:26:57.450
<v Aaron van Wirdum>claim is this would have taken away the incentive for other

00:26:58.710 --> 00:27:02.630
<v Aaron van Wirdum>Developers, security, auditors, whatever, to actually properly look at the code.

00:27:02.770 --> 00:27:07.070
<v Aaron van Wirdum>And that's why it could stay in there for so long. What do you think of this

00:27:07.070 --> 00:27:09.430
<v Aaron van Wirdum>claim? Do you agree with this?

00:27:09.022 --> 00:27:14.542
<v Sjors Provoost>First, we should disentangle two things. One is the changing of the library is

00:27:14.542 --> 00:27:18.102
<v Sjors Provoost>what introduced this bug, just the act of changing it, regardless of whether the

00:27:18.102 --> 00:27:21.722
<v Sjors Provoost>new library was good or bad. It was the act of swapping the libraries where the

00:27:21.722 --> 00:27:23.922
<v Sjors Provoost>mistake was introduced, the first mistake.

00:27:26.082 --> 00:27:28.582
<v Sjors Provoost>But your question is more important, I think.

00:27:30.022 --> 00:27:33.982
<v Sjors Provoost>I don't think that explains it. It's one of those things that could have made a

00:27:33.982 --> 00:27:38.062
<v Sjors Provoost>marginal difference. Maybe some would have caught it. But you have to understand

00:27:38.062 --> 00:27:44.052
<v Sjors Provoost>that Source available. If it was completely open source, then there would have

00:27:44.052 --> 00:27:48.512
<v Sjors Provoost>been more companies using the source. Therefore, maybe more people incentivized

00:27:48.512 --> 00:27:49.112
<v Sjors Provoost>to look at it.

00:27:49.372 --> 00:27:55.292
<v Sjors Provoost>But if these companies would have just lazily copied the source and not looked

00:27:55.292 --> 00:28:00.852
<v Sjors Provoost>at it, they might have made the same mistake. That's one aspect of it. The other

00:28:00.852 --> 00:28:04.312
<v Sjors Provoost>is that there was quite an incentive out there to look at the source anyway.

00:28:05.042 --> 00:28:09.302
<v Sjors Provoost>Because there's a lot of prestige for security researchers and competitors to

00:28:09.302 --> 00:28:11.622
<v Sjors Provoost>find bad bugs in their competitor.

00:28:12.022 --> 00:28:15.222
<v Sjors Provoost>And we know that companies, you know, there's been many conferences where people

00:28:15.222 --> 00:28:18.962
<v Sjors Provoost>would show, oh, look, I can play snake on the ledger. Or like, look, you know, I

00:28:18.962 --> 00:28:21.042
<v Sjors Provoost>can take a hammer and take the seed out of a treasure.

00:28:22.300 --> 00:28:22.740
<v Aaron van Wirdum>Right.

00:28:22.742 --> 00:28:27.262
<v Sjors Provoost>So we know people were doing that. People were spending quite serious money on

00:28:27.262 --> 00:28:30.692
<v Sjors Provoost>trying to do that. So that's why I don't think in this case it would have made a

00:28:30.692 --> 00:28:34.552
<v Sjors Provoost>difference. Just because you can't commercially reuse the software source doesn't

00:28:34.552 --> 00:28:39.902
<v Sjors Provoost>mean you're not going to look at it. Another thing that's important is that the

00:28:39.902 --> 00:28:45.442
<v Sjors Provoost>new library they use is kind of a wrapper library around existing ones that are

00:28:45.442 --> 00:28:46.262
<v Sjors Provoost>free and open source.

00:28:46.782 --> 00:28:51.662
<v Sjors Provoost>So it uses internally libsecp, you know, the library we did in episode two, I

00:28:51.662 --> 00:28:57.142
<v Sjors Provoost>think about. And that's a very mature, very well audited library. The problem is

00:28:57.142 --> 00:29:02.062
<v Sjors Provoost>that even libsecp tells you to bring your own entropy. So the critical part is

00:29:02.062 --> 00:29:03.382
<v Sjors Provoost>something that's not in the library.

00:29:06.602 --> 00:29:10.842
<v Sjors Provoost>So even if the library was completely fine, it wouldn't have mattered because it

00:29:10.842 --> 00:29:13.962
<v Sjors Provoost>is basically the final part where you say, okay,

00:29:15.442 --> 00:29:19.882
<v Sjors Provoost>give me some entropy because how you get entropy depends on the device. So if you

00:29:19.882 --> 00:29:23.502
<v Sjors Provoost>are a hardware wallet, you have a very different way of getting entropy than when

00:29:23.502 --> 00:29:27.152
<v Sjors Provoost>you are a software wallet. So that's just left to the wallet developer.

00:29:29.650 --> 00:29:31.710
<v Aaron van Wirdum>Yeah, I mean, this is what I'm getting at is that,

00:29:29.922 --> 00:29:32.922
<v Sjors Provoost>And that part is going to be unique anyway, and you can't really copy it without

00:29:32.922 --> 00:29:34.402
<v Sjors Provoost>completely cloning the device.

00:29:36.810 --> 00:29:42.790
<v Aaron van Wirdum>yeah. What about, you know, I'm just going down some claims and just kind

00:29:42.790 --> 00:29:48.720
<v Aaron van Wirdum>of picking your brain on, you know, because I... I do get the impression a

00:29:48.720 --> 00:29:52.700
<v Aaron van Wirdum>little bit that there's a lot of, you know, it's a bit of Captain Hind sighting

00:29:52.700 --> 00:29:58.480
<v Aaron van Wirdum>where, you know, after the disaster happens, you know, people are looking,

00:29:57.012 --> 00:30:02.332
<v Sjors Provoost>It's not entirely kept in hindsight because, like I can speak of my own

00:30:02.332 --> 00:30:06.212
<v Sjors Provoost>experience, I have worked on two software walls, right? On the blockchain.com

00:30:06.212 --> 00:30:10.792
<v Sjors Provoost>wallet back in the day when I was still blockchain.info and on the Bitcoin Core

00:30:10.792 --> 00:30:14.472
<v Sjors Provoost>wallet. And in both cases, I've looked at some of that random number generation

00:30:14.472 --> 00:30:19.512
<v Sjors Provoost>code. And so I know at least, you know, some best practices there.

00:30:21.462 --> 00:30:25.842
<v Sjors Provoost>So in other words, I think if I had looked at this code, I would have caught the

00:30:21.490 --> 00:30:23.530
<v Aaron van Wirdum>okay, well, that's,

00:30:25.842 --> 00:30:29.762
<v Sjors Provoost>second problem. Not the first one. Not the wrong if def statement. I don't think

00:30:29.762 --> 00:30:33.462
<v Sjors Provoost>I would have seen it. But the like, hey, why are you not adding much more entropy

00:30:33.462 --> 00:30:38.362
<v Sjors Provoost>if you have it? That I would have complained about. In an audit, personally. It's

00:30:38.362 --> 00:30:40.262
<v Sjors Provoost>not the kind of thing that you go on Twitter and rant about.

00:30:40.842 --> 00:30:41.682
<v Sjors Provoost>But it's one of those.

00:30:43.270 --> 00:30:48.440
<v Aaron van Wirdum>yeah, yeah, yeah, but my question is a bit more. Yeah, but my question is a

00:30:43.272 --> 00:30:46.432
<v Sjors Provoost>Right? So I think other people with this experience would have seen that too.

00:30:48.440 --> 00:30:54.380
<v Aaron van Wirdum>little bit more because now you're addressing like the software, the bug itself,

00:30:54.780 --> 00:30:59.520
<v Aaron van Wirdum>which that's where, you know, I'm not an expert in that at all. And you are. So I

00:30:55.332 --> 00:30:55.612
<v Sjors Provoost>Mm-hmm.

00:30:59.520 --> 00:31:04.500
<v Aaron van Wirdum>believe you when you say that. But I'm a little bit more asking about sort of the

00:31:04.500 --> 00:31:09.260
<v Aaron van Wirdum>meta behavior or best practices in the sense of, you know, how was the software

00:31:09.260 --> 00:31:09.820
<v Aaron van Wirdum>developed?

00:31:10.180 --> 00:31:15.840
<v Aaron van Wirdum>So indeed, for example, this difference between open sourcing and code available.

00:31:10.622 --> 00:31:11.082
<v Sjors Provoost>Mm-hmm.

00:31:16.530 --> 00:31:21.150
<v Aaron van Wirdum>Or another example that people have brought up is that the COLDCARD wouldn't have

00:31:21.150 --> 00:31:26.790
<v Aaron van Wirdum>had like a proper bug bounty program. Like these kinds of things. How do you see

00:31:26.790 --> 00:31:30.910
<v Aaron van Wirdum>these concerns? So you address the code available source.

00:31:28.992 --> 00:31:32.232
<v Sjors Provoost>Well, the bug bounty program, like I said, I don't think that matters because

00:31:32.232 --> 00:31:36.072
<v Sjors Provoost>there's enough prestige to find these bugs without a bug bounty program. I mean,

00:31:36.152 --> 00:31:39.712
<v Sjors Provoost>it's not that, you know, it would be nice if they did, but I don't think it's

00:31:39.712 --> 00:31:41.872
<v Sjors Provoost>going to make that much of a difference. There is an incentive to look.

00:31:42.250 --> 00:31:42.830
<v Aaron van Wirdum>Yeah.

00:31:43.082 --> 00:31:46.722
<v Sjors Provoost>The other part is the open source versus closed source. Now, it's been a few

00:31:46.722 --> 00:31:50.522
<v Sjors Provoost>years, but I have actually made a pull request to the cold card to add some

00:31:50.522 --> 00:31:55.042
<v Sjors Provoost>descriptor support like many years ago, you know, with Bitcoin Core. And so they,

00:31:55.202 --> 00:31:58.982
<v Sjors Provoost>at least then, I don't know if they still do it, but... They then did have a

00:31:58.982 --> 00:32:02.702
<v Sjors Provoost>somewhat collaborative culture where other people would contribute to their code.

00:32:03.082 --> 00:32:06.722
<v Sjors Provoost>And people, I don't know if they're still doing that, but that's a way to get

00:32:06.722 --> 00:32:07.722
<v Sjors Provoost>eyes on your code.

00:32:09.002 --> 00:32:12.342
<v Sjors Provoost>One of the problems in open source is that you can publish and you can make it

00:32:12.342 --> 00:32:18.182
<v Sjors Provoost>free, like in Libra, as much as you want, but if nobody contributes to

00:32:18.182 --> 00:32:24.102
<v Sjors Provoost>it, they're also not going to look at it. So there's plenty of, there might

00:32:21.480 --> 00:32:22.480
<v Aaron van Wirdum>Yeah, sure.

00:32:24.102 --> 00:32:27.902
<v Sjors Provoost>be, you know, super critical code out there that is completely free and open

00:32:27.902 --> 00:32:31.822
<v Sjors Provoost>source, has a giant bug in it, and just people don't see it because nobody's

00:32:31.822 --> 00:32:32.322
<v Sjors Provoost>looking at it.

00:32:32.462 --> 00:32:32.882
<v Sjors Provoost>I

00:32:32.790 --> 00:32:37.760
<v Aaron van Wirdum>Yeah. Yeah. Well, to that point, another, you know.

00:32:38.510 --> 00:32:42.730
<v Aaron van Wirdum>The complaint or concern that people brought up is like, were there or should

00:32:42.730 --> 00:32:47.950
<v Aaron van Wirdum>there have been like formal security audits on this kind of code? And if there

00:32:47.950 --> 00:32:51.410
<v Aaron van Wirdum>weren't, then why didn't that happen? Do you have any thoughts on that?

00:32:53.012 --> 00:32:57.132
<v Sjors Provoost>mean, I guess you can come up with a, you know, a regulatory framework where you

00:32:57.132 --> 00:33:03.132
<v Sjors Provoost>can say like, hey, if you are producing hardware wallets or some class of

00:33:03.132 --> 00:33:08.412
<v Sjors Provoost>security products, you need to do this and this and this audits. That's a

00:33:08.412 --> 00:33:13.482
<v Sjors Provoost>government thing. Or like, you know, it's a marketing thing where you say, we

00:33:13.482 --> 00:33:16.762
<v Sjors Provoost>have, even without the government intervention, you can say, look, we have this

00:33:16.762 --> 00:33:17.422
<v Sjors Provoost>security audit.

00:33:17.902 --> 00:33:21.582
<v Sjors Provoost>That's a part of your marketing then. And the customers can decide whether they

00:33:21.582 --> 00:33:26.482
<v Sjors Provoost>want to buy a product that has this certification or not. Now, of course, we know

00:33:26.482 --> 00:33:31.342
<v Sjors Provoost>that all sorts of certification schemes can become paper tigers.

00:33:32.372 --> 00:33:36.192
<v Sjors Provoost>Like the DigiNotar example in the Netherlands, where like a domain.

00:33:36.822 --> 00:33:41.042
<v Sjors Provoost>I think it was a top-level domain provider or something that passed all the

00:33:41.042 --> 00:33:45.162
<v Sjors Provoost>audits, but they were completely insecure. So I don't know if that would have

00:33:45.162 --> 00:33:45.402
<v Sjors Provoost>helped.

00:33:46.802 --> 00:33:52.282
<v Sjors Provoost>But maybe it is good to have some sort of quality standard. But then still, what

00:33:52.282 --> 00:33:57.212
<v Sjors Provoost>do you tell the auditor? Which auditor do you hire? What should their expertise

00:33:57.212 --> 00:34:01.932
<v Sjors Provoost>be? Sure, now you can hire auditors to look for the exact same bug, and you'll

00:34:01.932 --> 00:34:03.512
<v Sjors Provoost>find it if it's in other devices.

00:34:05.342 --> 00:34:11.182
<v Sjors Provoost>You don't know what the next disaster is going to be. And especially if you have

00:34:11.182 --> 00:34:15.712
<v Sjors Provoost>a hardware wallet with lots of whistles and bells, bells and whistles, you know,

00:34:15.772 --> 00:34:19.752
<v Sjors Provoost>at least the cold card and some other devices only support Bitcoin. But now

00:34:19.752 --> 00:34:24.312
<v Sjors Provoost>imagine you need to audit a hardware wallet that has 15,000 shitcoins on it.

00:34:26.542 --> 00:34:30.342
<v Sjors Provoost>And some of the bugs have nothing to do with the cryptography. They're just

00:34:30.342 --> 00:34:34.812
<v Sjors Provoost>like... Oh, if you don't check this field in an Ethereum transaction, somebody

00:34:34.812 --> 00:34:39.092
<v Sjors Provoost>can trick you into losing all your wallet. And that's a huge class of bugs that

00:34:39.092 --> 00:34:43.032
<v Sjors Provoost>you're just not going to find in an audit. That's just a North Korean audit,

00:34:43.172 --> 00:34:44.952
<v Sjors Provoost>basically. You find out when it goes wrong.

00:34:47.262 --> 00:34:52.582
<v Sjors Provoost>So I'm not saying that they were fine, they did enough. I'm just saying I

00:34:47.520 --> 00:34:48.040
<v Aaron van Wirdum>Yeah, so,

00:34:52.582 --> 00:34:57.342
<v Sjors Provoost>wouldn't count on it that it would have... It's all incremental. More security

00:34:57.342 --> 00:35:03.082
<v Sjors Provoost>audits, good. More open source. Instead of view only, it's all better.

00:35:03.302 --> 00:35:06.502
<v Sjors Provoost>So you're just decreasing the chances by doing all these things better.

00:35:06.882 --> 00:35:12.402
<v Sjors Provoost>And the other is just write code much more carefully with much more review. You

00:35:12.402 --> 00:35:18.042
<v Sjors Provoost>don't swap a giant library into commits with 2,000 lines of code. That's not very

00:35:18.042 --> 00:35:20.202
<v Sjors Provoost>good software development style.

00:35:22.102 --> 00:35:26.542
<v Sjors Provoost>But again, if you look at software that, you know, in retrospect, when you find a

00:35:22.480 --> 00:35:23.700
<v Aaron van Wirdum>right. Well, that's...

00:35:26.542 --> 00:35:29.162
<v Sjors Provoost>bug, it's often in a sloppy part of the code base.

00:35:30.872 --> 00:35:32.892
<v Sjors Provoost>But I don't know what that means.

00:35:34.140 --> 00:35:40.020
<v Aaron van Wirdum>Yeah, well, so I wanted to ask you, but you sort of answered it in a,

00:35:40.020 --> 00:35:45.120
<v Aaron van Wirdum>well, kind of in a depressing way, you kind of non-answered it. It is like,

00:35:45.380 --> 00:35:51.200
<v Aaron van Wirdum>how do we move forward? How do we prevent something like this? So all of

00:35:51.200 --> 00:35:55.260
<v Aaron van Wirdum>these things would have been a bit better, you say, like it would have been a bit

00:35:55.260 --> 00:35:56.500
<v Aaron van Wirdum>better if it was open source.

00:35:56.720 --> 00:36:02.000
<v Aaron van Wirdum>It would have been a bit better if there were maybe security audits or, but.

00:36:02.710 --> 00:36:07.550
<v Aaron van Wirdum>None of it would have necessarily prevented this. And probably there is no way.

00:36:06.622 --> 00:36:10.342
<v Sjors Provoost>No, there is, I mean, what is interesting here is that,

00:36:08.390 --> 00:36:13.410
<v Aaron van Wirdum>What are the lessons, Sjors? What do we learn from this, if anything?

00:36:11.602 --> 00:36:17.562
<v Sjors Provoost>well, this class of bug where you think you have randomness but

00:36:17.562 --> 00:36:21.442
<v Sjors Provoost>you don't have enough has happened a few times before, right? We did an episode

00:36:21.442 --> 00:36:26.962
<v Sjors Provoost>on Milksad where this wasn't an actual wallet, it was just a tutorial. The

00:36:26.962 --> 00:36:29.802
<v Sjors Provoost>tutorial used to be safe and then something changed in the library and the

00:36:29.802 --> 00:36:31.442
<v Sjors Provoost>tutorial is suddenly completely unsafe.

00:36:31.962 --> 00:36:36.642
<v Sjors Provoost>But it wasn't obvious enough to immediately see it. And historically, there was,

00:36:36.742 --> 00:36:40.542
<v Sjors Provoost>I think, the blockchain.info wallet just before I was there, or at least not in

00:36:40.542 --> 00:36:45.602
<v Sjors Provoost>the area I was working on, on the Android wallet, where they were, again, they

00:36:45.602 --> 00:36:49.502
<v Sjors Provoost>were using randomness from the device, and then they would fall back to some

00:36:49.502 --> 00:36:54.402
<v Sjors Provoost>random.org website that would, you know, just in case, just give you something,

00:36:54.582 --> 00:36:54.702
<v Sjors Provoost>right?

00:36:55.162 --> 00:36:58.882
<v Sjors Provoost>And I think what turned out is that that website was gone, so it was just saying

00:36:58.882 --> 00:37:04.342
<v Sjors Provoost>404. So there's no entropy there. And then the device entropy either didn't work

00:37:04.342 --> 00:37:08.742
<v Sjors Provoost>or they didn't take enough bits. And again, it wasn't obvious enough that users

00:37:08.742 --> 00:37:13.842
<v Sjors Provoost>would say, hey, why do I have balance in my new wallet? QA wouldn't have seen it,

00:37:13.902 --> 00:37:18.942
<v Sjors Provoost>but it was bad enough that anybody understanding what's going on could steal all

00:37:18.942 --> 00:37:19.282
<v Sjors Provoost>the coins.

00:37:19.422 --> 00:37:23.202
<v Sjors Provoost>And in that case, it was all, I think, sweeped by a good actor and eventually

00:37:23.202 --> 00:37:29.012
<v Sjors Provoost>redistributed. This class of bug, there is some discussion of how you would

00:37:29.012 --> 00:37:34.742
<v Sjors Provoost>prevent it. One line of argument would say make it an all or nothing proposition.

00:37:35.662 --> 00:37:41.482
<v Sjors Provoost>Make sure the test code has absolutely no entropy in it so that it's

00:37:41.482 --> 00:37:42.762
<v Sjors Provoost>very clearly test code.

00:37:43.002 --> 00:37:48.042
<v Sjors Provoost>And don't add mediocre entropy. So don't add keystrokes or timing from the device

00:37:48.042 --> 00:37:52.182
<v Sjors Provoost>because it's enough to obfuscate the bug, but it's not enough to actually save

00:37:52.182 --> 00:37:56.602
<v Sjors Provoost>it. Whereas another line of thinking, which I kind of prefer, is saying, no, you

00:37:56.602 --> 00:38:00.302
<v Sjors Provoost>should just add more entropy. Like you should make the device such that even if

00:38:00.302 --> 00:38:03.582
<v Sjors Provoost>the secure element doesn't work, it doesn't matter.

00:38:03.742 --> 00:38:09.482
<v Sjors Provoost>Like you have enough entropy from sensors and voltage and whatever it is. And

00:38:09.482 --> 00:38:13.422
<v Sjors Provoost>just force the user to shake or type on the keyboard. Like those are kind of the

00:38:13.422 --> 00:38:16.742
<v Sjors Provoost>two different approaches there. But that just deals with this particular issue.

00:38:18.890 --> 00:38:24.850
<v Aaron van Wirdum>Yeah, exactly. So, I mean, that's also great. And any issue that can be solved

00:38:24.850 --> 00:38:29.670
<v Aaron van Wirdum>in the future is, of course, good. But at least in this sort of...

00:38:27.392 --> 00:38:31.232
<v Sjors Provoost>Yeah, and libraries are a good way to prevent bugs in general, right? So good

00:38:31.232 --> 00:38:36.952
<v Sjors Provoost>open source, well-reviewed libraries like SecP make it less likely. But entropy

00:38:36.952 --> 00:38:42.132
<v Sjors Provoost>is device-specific, is wallet-specific. So it's very hard to have a reusable

00:38:42.132 --> 00:38:46.092
<v Sjors Provoost>thing because every physical chip is different. You're not going to have shared

00:38:46.092 --> 00:38:46.612
<v Sjors Provoost>code there.

00:38:46.652 --> 00:38:52.132
<v Sjors Provoost>It's just one project. So then the solution is, I guess you just combine wallets.

00:38:52.232 --> 00:38:54.352
<v Sjors Provoost>So you use multisig and with music too.

00:38:55.862 --> 00:39:01.182
<v Sjors Provoost>If one device has a flaw, the other one maybe not have the flaw. Problem there is

00:39:00.520 --> 00:39:05.480
<v Aaron van Wirdum>Right, yeah, I mean, that's more a user-side solution, of course.

00:39:01.182 --> 00:39:01.622
<v Sjors Provoost>complexity.

00:39:06.042 --> 00:39:11.722
<v Sjors Provoost>But that might be the only solution, because if everybody relies on a single

00:39:06.080 --> 00:39:07.360
<v Aaron van Wirdum>I was...

00:39:11.722 --> 00:39:16.272
<v Sjors Provoost>device, even if different people rely on different devices, then there's going to

00:39:16.272 --> 00:39:18.092
<v Sjors Provoost>be bugs. It's just inevitable.

00:39:20.890 --> 00:39:25.710
<v Aaron van Wirdum>Right. Okay. So that's, you know, insofar that you want to give any, you know,

00:39:25.950 --> 00:39:31.950
<v Aaron van Wirdum>officially Sjors mandated security advice, then you do think the

00:39:31.950 --> 00:39:36.750
<v Aaron van Wirdum>sort of multi-fender hardware wallet, multisig setup, that's a good way to go.

00:39:37.942 --> 00:39:43.182
<v Sjors Provoost>Well, with this really, really big trade-off, that is complicated. And complexity

00:39:43.182 --> 00:39:47.182
<v Sjors Provoost>is how people lose backups. People have two or three...

00:39:49.362 --> 00:39:53.182
<v Sjors Provoost>And they assume that if they lose one of the three devices, they're fine. But

00:39:53.182 --> 00:39:56.702
<v Sjors Provoost>they're not because you still need the xpub from that third device that you lost.

00:39:56.882 --> 00:40:02.492
<v Sjors Provoost>And if you didn't... So it is, in theory, if we can get the software to the point

00:40:02.492 --> 00:40:06.472
<v Sjors Provoost>where it's idiot-proof and everybody knows what to backup. But other than that,

00:40:06.572 --> 00:40:10.272
<v Sjors Provoost>if you have to decide, like, am I going to, you know, what's my long-term risk?

00:40:10.752 --> 00:40:15.152
<v Sjors Provoost>Is it... My device that I randomly bought, like I just pick one of the reputable

00:40:15.152 --> 00:40:20.022
<v Sjors Provoost>manufacturers, I buy their device, put all my savings on it, and then hope that

00:40:20.022 --> 00:40:25.102
<v Sjors Provoost>device is not the one that's broken? Or do I do this complicated multisig setup

00:40:25.102 --> 00:40:30.602
<v Sjors Provoost>where now my risks are I lose my backup, I did something just wrong in the setup,

00:40:30.742 --> 00:40:34.642
<v Sjors Provoost>I used a bunch of additional software to do this, that software had a backdoor

00:40:34.642 --> 00:40:38.602
<v Sjors Provoost>and it was tricking me into sending money to the wrong place because it...

00:40:38.772 --> 00:40:42.312
<v Sjors Provoost>Took over my browser and replaced the exchange address and I checked it on the

00:40:42.312 --> 00:40:47.192
<v Sjors Provoost>devices, on multiple devices, the destination address, but the money went to the

00:40:47.192 --> 00:40:51.452
<v Sjors Provoost>hacker because there was malware in one of these complicated pieces of software.

00:40:51.692 --> 00:40:55.332
<v Sjors Provoost>Or do I use a third party that helps me with the multisig? There's companies out

00:40:55.332 --> 00:41:00.832
<v Sjors Provoost>there. Yeah, now I've lost all my privacy because of the way they generally do

00:41:00.832 --> 00:41:01.072
<v Sjors Provoost>that.

00:41:02.352 --> 00:41:07.952
<v Sjors Provoost>Or I'm subject to KYC now. There just is no good way to deal with this, I think.

00:41:08.422 --> 00:41:12.722
<v Sjors Provoost>We should continue improving things until there is. But currently, I think the

00:41:12.722 --> 00:41:16.502
<v Sjors Provoost>current state of the art is you kind of, yeah, it's not good.

00:41:18.032 --> 00:41:21.512
<v Sjors Provoost>And the solution is not like send it to a custodian because that's also not good.

00:41:18.320 --> 00:41:20.220
<v Aaron van Wirdum>Yeah, that's, yeah,

00:41:21.592 --> 00:41:22.252
<v Sjors Provoost>We already know that.

00:41:24.420 --> 00:41:29.540
<v Aaron van Wirdum>that's also my impression. And that's, you know, it sucks. And in a way, I've

00:41:29.540 --> 00:41:34.060
<v Aaron van Wirdum>been saying this for a long time that I actually think, yeah.

00:41:31.142 --> 00:41:33.182
<v Sjors Provoost>I guess I can add one more point maybe.

00:41:36.282 --> 00:41:41.022
<v Sjors Provoost>We probably shouldn't be writing off a cold card immediately either. Permanently,

00:41:41.162 --> 00:41:44.622
<v Sjors Provoost>anyway. I mean, obviously, you probably want to, you know, ignore them for a year

00:41:44.622 --> 00:41:48.842
<v Sjors Provoost>or so to see how they, you know, how they behave, if they really make their

00:41:48.842 --> 00:41:52.882
<v Sjors Provoost>quality higher. But there aren't that many hardware wallets out there. And they

00:41:52.882 --> 00:41:53.722
<v Sjors Provoost>all have trade-offs.

00:41:55.092 --> 00:41:59.312
<v Sjors Provoost>You know, some of them have shitcoins, which means how many developer hours are

00:41:59.312 --> 00:42:02.392
<v Sjors Provoost>actually going into the part that we care about versus how much goes into other

00:42:02.392 --> 00:42:04.052
<v Sjors Provoost>stuff that might itself be a weakness.

00:42:06.352 --> 00:42:09.492
<v Sjors Provoost>Some don't have secure elements, so they're maybe less secure against physical

00:42:09.492 --> 00:42:14.052
<v Sjors Provoost>attack. We're not in a space yet where we have like 100 products, and if one of

00:42:14.052 --> 00:42:17.852
<v Sjors Provoost>them fails and misbehaves, we just completely ignore them and we don't worry

00:42:17.852 --> 00:42:20.112
<v Sjors Provoost>about it because there's 99 others out there. We're not there yet.

00:42:21.840 --> 00:42:27.680
<v Aaron van Wirdum>Okay, so you think Coinkite, COLDCARD, you know, can recover from this

00:42:27.680 --> 00:42:32.820
<v Aaron van Wirdum>and in a way you're sort of saying they deserve a second chance even? Yeah, of

00:42:30.772 --> 00:42:33.892
<v Sjors Provoost>Technically, they can. I don't know if financially they can. They might get sued

00:42:32.820 --> 00:42:35.640
<v Aaron van Wirdum>course. Right. Yeah.

00:42:33.892 --> 00:42:34.652
<v Sjors Provoost>to death, basically.

00:42:37.320 --> 00:42:38.640
<v Aaron van Wirdum>Yeah, no, but...

00:42:37.402 --> 00:42:40.582
<v Sjors Provoost>But the spirit of, you know, and even if they don't, then hopefully they're nice

00:42:40.582 --> 00:42:44.702
<v Sjors Provoost>enough to say, you know what, we as a company are doomed. We're going to

00:42:44.702 --> 00:42:48.442
<v Sjors Provoost>completely open source the hardware and the software of what we have and we'll

00:42:48.442 --> 00:42:52.702
<v Sjors Provoost>let other people take another stab at it. Though their bankruptcy lawyer might

00:42:52.702 --> 00:42:56.602
<v Sjors Provoost>not like that because it's like giving away value.

00:42:56.762 --> 00:42:59.182
<v Sjors Provoost>So, yeah, maybe that whole design is trapped.

00:43:02.580 --> 00:43:08.040
<v Aaron van Wirdum>Yeah, no, generally speaking, I, you know, this has been a, I think everyone

00:43:08.040 --> 00:43:12.580
<v Aaron van Wirdum>agrees is basically a disaster for Bitcoin. It's a disaster for people that lost

00:43:12.580 --> 00:43:18.520
<v Aaron van Wirdum>money. But also it really drills down, drills home the idea that there just

00:43:18.520 --> 00:43:20.780
<v Aaron van Wirdum>is no good solution of how to actually.

00:43:21.330 --> 00:43:26.030
<v Aaron van Wirdum>Store your coins. Everything has pretty significant tradeoffs. I personally don't

00:43:26.030 --> 00:43:30.450
<v Aaron van Wirdum>know what to recommend anymore. I mean, I will make a best effort recommendation

00:43:30.450 --> 00:43:35.030
<v Aaron van Wirdum>to, you know, whoever is asking, depending on the technical capability or how

00:43:35.030 --> 00:43:39.790
<v Aaron van Wirdum>much Bitcoin they own. But the idea that there is anything resembling a one

00:43:39.790 --> 00:43:45.350
<v Aaron van Wirdum>-size-fits-all solution is just not there, which is,

00:43:44.672 --> 00:43:50.152
<v Sjors Provoost>No, and then you start adding inheritance to the problem where some non-technical

00:43:45.490 --> 00:43:46.710
<v Aaron van Wirdum>yeah.

00:43:50.152 --> 00:43:55.992
<v Sjors Provoost>successor has to be able to use it. But also the $5 range attack shouldn't be

00:43:55.992 --> 00:43:59.312
<v Sjors Provoost>able to take advantage of whatever that mechanism is by just triggering your

00:43:59.312 --> 00:44:03.752
<v Sjors Provoost>inheritance basically. So yeah, it's a completely unsolved problem.

00:44:03.872 --> 00:44:09.432
<v Sjors Provoost>We need to keep working on it. And this was probably maybe a warning to not think

00:44:09.432 --> 00:44:10.432
<v Sjors Provoost>that we've already solved it.

00:44:11.820 --> 00:44:17.620
<v Aaron van Wirdum>Right. You briefly mentioned COLDCARD, Coinkite potentially

00:44:17.620 --> 00:44:23.620
<v Aaron van Wirdum>getting sued or whatever, but as a more general point, what is your

00:44:23.620 --> 00:44:28.440
<v Aaron van Wirdum>assessment of people potentially getting any of their money back if they lost it

00:44:28.440 --> 00:44:32.140
<v Aaron van Wirdum>in this hack? Do you think there's a path to that at all?

00:44:33.052 --> 00:44:37.512
<v Sjors Provoost>Well, assuming that they catch whoever did it, right? If they don't catch it or

00:44:37.512 --> 00:44:42.292
<v Sjors Provoost>if it turns out it was North Korea, then nobody's getting anything back. But

00:44:42.292 --> 00:44:48.042
<v Sjors Provoost>let's say that the, you know, people think that some script kiddie used an AI and

00:44:48.042 --> 00:44:53.382
<v Sjors Provoost>found the bug and then kind of in a rush took the money because there were some

00:44:53.382 --> 00:44:59.302
<v Sjors Provoost>patterns that they were using APIs of Block Explorer services instead of

00:44:59.302 --> 00:45:01.822
<v Sjors Provoost>just, you know, doing a very high OPSEC.

00:45:05.502 --> 00:45:10.762
<v Sjors Provoost>And who knows? Maybe they used an AI with actual logging. Probably not.

00:45:11.122 --> 00:45:13.962
<v Sjors Provoost>I don't know if they used AI. Maybe they didn't. Maybe they just looked at the

00:45:13.962 --> 00:45:15.502
<v Sjors Provoost>code and realized what was going on.

00:45:18.052 --> 00:45:22.452
<v Sjors Provoost>Anyway, let's assume that the money is retrieved. Then it presumably goes into

00:45:22.452 --> 00:45:26.952
<v Sjors Provoost>some sort of foundation, either back to the company or like a dedicated vehicle

00:45:26.952 --> 00:45:31.392
<v Sjors Provoost>that's focused on dealing with this because as a company, it's a massive

00:45:31.392 --> 00:45:31.872
<v Sjors Provoost>distraction.

00:45:33.242 --> 00:45:38.712
<v Sjors Provoost>Now such a vehicle could, I think part of the secret was, part of the mnemonic

00:45:38.712 --> 00:45:43.882
<v Sjors Provoost>was derived from the device identifier, or at least the chip series identifier,

00:45:44.282 --> 00:45:48.622
<v Sjors Provoost>something not unique, maybe not unique to devices, but at least narrows it down a

00:45:48.622 --> 00:45:52.822
<v Sjors Provoost>bit. And so people can, if they hold on to the physical device, can use that

00:45:52.822 --> 00:45:56.062
<v Sjors Provoost>device as part of the evidence that they are the owner.

00:45:56.672 --> 00:46:00.652
<v Sjors Provoost>But the thing is, I don't think it's good enough that you can automate it. So you

00:46:00.652 --> 00:46:04.522
<v Sjors Provoost>can't make a DAO. You know, like in Ethereum land, they might have set up a smart

00:46:03.440 --> 00:46:03.740
<v Aaron van Wirdum>Sure.

00:46:04.522 --> 00:46:08.022
<v Sjors Provoost>contract, put all the money in a smart contract, and then you can redeem yourself

00:46:08.022 --> 00:46:12.122
<v Sjors Provoost>automatically from the smart contract. I don't think that's possible because the

00:46:12.122 --> 00:46:14.762
<v Sjors Provoost>device just doesn't have a way to prove it, right?

00:46:14.762 --> 00:46:19.562
<v Sjors Provoost>You can just use a simulator and pretend that you're the owner. That means humans

00:46:19.562 --> 00:46:24.862
<v Sjors Provoost>have to be involved. And given that they're a company based in Canada, those

00:46:24.862 --> 00:46:28.962
<v Sjors Provoost>humans are going to be very heavily regulated. That means anybody who wants to

00:46:28.962 --> 00:46:32.902
<v Sjors Provoost>file a claim probably has to prove their funds, not just from a point of view of

00:46:32.902 --> 00:46:37.002
<v Sjors Provoost>proving that you are the owner, but proving that you're not a criminal, right?

00:46:37.302 --> 00:46:42.822
<v Sjors Provoost>So it's full KYC, AML. So that makes it even more tragic in a way because people

00:46:42.822 --> 00:46:45.362
<v Sjors Provoost>who are doing self-custody, it's not even that they're trying to evade the law or

00:46:45.362 --> 00:46:49.422
<v Sjors Provoost>anything, but they want to be independent of the system and they're kind of

00:46:49.422 --> 00:46:51.822
<v Sjors Provoost>forced into the system to get their money back.

00:46:54.570 --> 00:46:58.730
<v Aaron van Wirdum>Yeah, I mean, I'm sure everyone would take that trade off at this point.

00:46:56.262 --> 00:47:00.432
<v Sjors Provoost>I don't see how you can just anonymously... Sorry?

00:47:00.310 --> 00:47:03.650
<v Aaron van Wirdum>I mean, I'm sure everyone would take that trade-off at this point if you at least

00:47:03.650 --> 00:47:05.870
<v Aaron van Wirdum>get your money back that way or at least part of it.

00:47:06.532 --> 00:47:08.912
<v Sjors Provoost>Yeah, yeah, of course. But it's painful.

00:47:07.170 --> 00:47:08.730
<v Aaron van Wirdum>But yeah,

00:47:10.250 --> 00:47:16.150
<v Aaron van Wirdum>so you're saying indeed there's an identifier in the hardware itself

00:47:16.150 --> 00:47:22.030
<v Aaron van Wirdum>that could help. So if you're listening and your device was drained, don't throw

00:47:22.030 --> 00:47:25.870
<v Aaron van Wirdum>it out yet because it might come in helpful.

00:47:22.872 --> 00:47:27.672
<v Sjors Provoost>Yeah, definitely don't throw it out. But then in addition, my guess is because

00:47:27.672 --> 00:47:32.662
<v Sjors Provoost>you need to prove that you own those coins for legal reasons. And that also

00:47:32.662 --> 00:47:37.182
<v Sjors Provoost>serves as proof that, you know, that makes it more likely that they're sending it

00:47:37.182 --> 00:47:40.142
<v Sjors Provoost>to the correct person. So such an, I would imagine, some sort of trust or

00:47:40.142 --> 00:47:44.222
<v Sjors Provoost>foundation makes an inventory of people who are making claims, all the evidence

00:47:44.222 --> 00:47:48.322
<v Sjors Provoost>they've submitted, and then like a waiting period, say like, hey, if you think,

00:47:48.402 --> 00:47:50.162
<v Sjors Provoost>you know, somebody's taking your money, let us know.

00:47:50.902 --> 00:47:54.482
<v Sjors Provoost>And otherwise, we're just going to give it to the people who made a claim and

00:47:54.482 --> 00:47:59.122
<v Sjors Provoost>reasonably prove that it was them, whatever's left. And then these lawyers are

00:47:59.122 --> 00:48:03.722
<v Sjors Provoost>charging $1,000 an hour at least. Just draining half the pot and it's going to

00:48:03.722 --> 00:48:08.002
<v Sjors Provoost>take longer than Mt. Gox. That's my guess. But if the Bitcoin price, you know,

00:48:08.422 --> 00:48:14.062
<v Sjors Provoost>10x in the meantime, then that might still be a decent outcome compared to losing

00:48:14.062 --> 00:48:14.422
<v Sjors Provoost>everything.

00:48:15.510 --> 00:48:21.210
<v Aaron van Wirdum>Yeah, and then also one of the ways... Yeah, yeah. And then also one of the ways

00:48:16.342 --> 00:48:18.422
<v Sjors Provoost>You know, which is what happened with Mt. Gox, right?

00:48:21.210 --> 00:48:25.550
<v Aaron van Wirdum>you can potentially prove that these coins were yours is ironically to show the

00:48:25.550 --> 00:48:29.010
<v Aaron van Wirdum>KYC records that you bought them and then exchange and withdrew or something like

00:48:29.010 --> 00:48:31.610
<v Aaron van Wirdum>that. That could be one way.

00:48:29.622 --> 00:48:30.522
<v Sjors Provoost>Yep, exactly.

00:48:34.580 --> 00:48:40.300
<v Aaron van Wirdum>Okay, I think that's rough. Is there anything else you want to say about like

00:48:40.300 --> 00:48:45.080
<v Aaron van Wirdum>either the bug or the aftermath or the process or anything we've been discussing

00:48:45.080 --> 00:48:45.540
<v Aaron van Wirdum>so far?

00:48:46.382 --> 00:48:49.442
<v Sjors Provoost>No, I think we covered most of that or all of it.

00:48:50.770 --> 00:48:56.270
<v Aaron van Wirdum>Yeah, so then let's get into sort of our part because

00:48:56.270 --> 00:49:02.150
<v Aaron van Wirdum>CoinKite was a sponsor of ours, of course. In fact, it seems

00:49:02.150 --> 00:49:07.810
<v Aaron van Wirdum>that they sponsored the entire Bitcoin ecosystem or the entire podcastosphere,

00:49:07.810 --> 00:49:09.090
<v Aaron van Wirdum>it looked like.

00:49:10.030 --> 00:49:15.830
<v Aaron van Wirdum>And that's become part of the story also, like all

00:49:10.342 --> 00:49:11.622
<v Sjors Provoost>Quite a few, yeah.

00:49:15.830 --> 00:49:16.770
<v Aaron van Wirdum>these podcasters.

00:49:18.170 --> 00:49:23.750
<v Aaron van Wirdum>They look stupid for promoting this hardware wallet now. And yeah, we're

00:49:23.750 --> 00:49:29.750
<v Aaron van Wirdum>part of that. So yeah, I have some thoughts on that. I think

00:49:29.750 --> 00:49:34.030
<v Aaron van Wirdum>you have some thoughts on that. As a sort of general question,

00:49:34.410 --> 00:49:38.830
<v Aaron van Wirdum>yeah, what do you think we are part of the problem here?

00:49:40.262 --> 00:49:43.422
<v Sjors Provoost>I think that's a good question. And I'm not sure.

00:49:45.762 --> 00:49:49.952
<v Sjors Provoost>Because... Like we know that sponsorships in general can cause problems, right?

00:49:50.152 --> 00:49:54.412
<v Sjors Provoost>And especially on YouTube, like any sponsor you will see, you will be able to

00:49:54.412 --> 00:49:58.532
<v Sjors Provoost>find out somebody debunking it as a complete scam. And that has something to do

00:49:58.532 --> 00:50:03.892
<v Sjors Provoost>with the companies with the most budget, the most marketing budget causing being

00:50:03.892 --> 00:50:04.432
<v Sjors Provoost>problematic.

00:50:05.372 --> 00:50:10.592
<v Sjors Provoost>However, I think with a lot of these high budget sponsors out there,

00:50:10.962 --> 00:50:16.242
<v Sjors Provoost>if you actually do some like... Asking around between competent people, they'll

00:50:16.242 --> 00:50:21.082
<v Sjors Provoost>explain to you why it's not good. That was not the case here at all. There are

00:50:21.082 --> 00:50:25.342
<v Sjors Provoost>many technically reputable people who are using COLDCARD right until the end.

00:50:25.702 --> 00:50:30.122
<v Sjors Provoost>So it wasn't the case of, oh, if you just asked two technical people, they would

00:50:30.122 --> 00:50:35.962
<v Sjors Provoost>have told you it's a scam. That's just not the case. So the question is, how much

00:50:35.962 --> 00:50:40.802
<v Sjors Provoost>due diligence should you do as a podcaster? I think we did at least some by not

00:50:40.802 --> 00:50:44.532
<v Sjors Provoost>just... I'm sure there would have been other companies, other hardware

00:50:44.532 --> 00:50:48.752
<v Sjors Provoost>manufacturers out there that nobody's even heard of that are less good,

00:50:48.872 --> 00:50:49.372
<v Sjors Provoost>basically.

00:50:52.030 --> 00:50:57.470
<v Aaron van Wirdum>Yeah, I can share my thoughts on this because you're touching

00:50:57.470 --> 00:51:03.430
<v Aaron van Wirdum>on... I think there's kind of two aspects to it. Or first of all, generally

00:51:03.430 --> 00:51:08.500
<v Aaron van Wirdum>speaking, you know, as media producers,

00:51:08.860 --> 00:51:14.320
<v Aaron van Wirdum>or I would even say, you know, in my case, I think we're making a journalistic

00:51:14.320 --> 00:51:18.300
<v Aaron van Wirdum>podcast ultimately, or at least I consider myself a journalist.

00:51:18.600 --> 00:51:24.310
<v Aaron van Wirdum>And for better or worse, mostly for worse, For the most part

00:51:24.310 --> 00:51:28.770
<v Aaron van Wirdum>these days, that is funded by sponsorships, advertisements, that kind of thing.

00:51:29.150 --> 00:51:33.930
<v Aaron van Wirdum>In an ideal world, that wouldn't even be the case, right? In an ideal world, you

00:51:33.930 --> 00:51:38.830
<v Aaron van Wirdum>could make media based on subscription models.

00:51:39.030 --> 00:51:43.230
<v Aaron van Wirdum>And there are some examples of that that are successful or even donations or

00:51:43.230 --> 00:51:49.190
<v Aaron van Wirdum>something like that. But other than that, for a... The overwhelming majority of

00:51:49.190 --> 00:51:54.950
<v Aaron van Wirdum>media out there, it's funded through advertisements, sponsorships, and that's

00:51:55.370 --> 00:51:57.550
<v Aaron van Wirdum>the case for our podcast as well.

00:51:57.710 --> 00:52:03.490
<v Aaron van Wirdum>Although, I considered it more of a hobby what we were doing. We were not getting

00:52:03.490 --> 00:52:05.330
<v Aaron van Wirdum>a lot of money out of it, as you know.

00:52:06.272 --> 00:52:10.952
<v Sjors Provoost>No, and that's kind of tricky as well, right? Because the budget is so small that

00:52:10.952 --> 00:52:16.532
<v Sjors Provoost>we couldn't hire a separate auditor to investigate their product because it would

00:52:16.532 --> 00:52:20.392
<v Sjors Provoost>just have been more expensive than anything we ever got from the podcast. But

00:52:20.392 --> 00:52:23.392
<v Sjors Provoost>that's more of a situation because we are a small podcaster.

00:52:24.020 --> 00:52:29.000
<v Aaron van Wirdum>Yeah, but just generally speaking, the problem exists in journalism for a long

00:52:29.000 --> 00:52:34.940
<v Aaron van Wirdum>time, which is essentially a journalist. Journalism is

00:52:35.840 --> 00:52:41.760
<v Aaron van Wirdum>built on reputation and telling the truth and informing your audience

00:52:41.760 --> 00:52:44.160
<v Aaron van Wirdum>in an objective way, essentially.

00:52:44.700 --> 00:52:50.620
<v Aaron van Wirdum>While an advertiser or marketing that's in conflict with that, there's always a

00:52:50.620 --> 00:52:56.060
<v Aaron van Wirdum>tension there. They want to... Use the reputation of the journalism, of the

00:52:56.060 --> 00:53:01.060
<v Aaron van Wirdum>journalist, of the publication to sell their products. But it's not the same

00:53:01.060 --> 00:53:06.280
<v Aaron van Wirdum>thing. It's journalism and marketing are kind of, you know, they need each other,

00:53:06.300 --> 00:53:09.240
<v Aaron van Wirdum>but they're also in tension with each other.

00:53:09.740 --> 00:53:10.440
<v Aaron van Wirdum>So then,

00:53:09.882 --> 00:53:15.522
<v Sjors Provoost>Yeah, and it's a combination of audience size and reputation, right? It's two

00:53:15.522 --> 00:53:21.052
<v Sjors Provoost>equally sized audiences, but a more reputable journal is, as a sponsor,

00:53:21.172 --> 00:53:25.572
<v Sjors Provoost>presumably more attractive. So the trust is part of the equation. Yeah,

00:53:22.800 --> 00:53:24.000
<v Aaron van Wirdum>yeah, of course.

00:53:25.460 --> 00:53:29.340
<v Aaron van Wirdum>Yeah, of course. I'm just pointing there's a natural tension there always. That

00:53:29.340 --> 00:53:34.940
<v Aaron van Wirdum>always existed. But there's also solutions for that, essentially. And

00:53:34.940 --> 00:53:39.960
<v Aaron van Wirdum>I think there's two big responsibilities that we have and had.

00:53:40.500 --> 00:53:46.020
<v Aaron van Wirdum>So the first of all, and this is the one you pointed out, is that we should

00:53:46.020 --> 00:53:51.980
<v Aaron van Wirdum>do at least basic due diligence to make sure that we're not promoting a

00:53:51.980 --> 00:53:52.320
<v Aaron van Wirdum>scam.

00:53:53.290 --> 00:53:58.150
<v Aaron van Wirdum>If we're promoting something like OneCoin that's super obviously a scam and

00:53:58.150 --> 00:54:02.270
<v Aaron van Wirdum>people are going to lose money if they invest in it, that's a bad look on us. We

00:54:02.270 --> 00:54:07.850
<v Aaron van Wirdum>need to take some measures to avoid that. But I

00:54:07.850 --> 00:54:13.170
<v Aaron van Wirdum>don't think that applies here. I don't think Coinkite or ColdCard was a scam.

00:54:13.670 --> 00:54:17.690
<v Aaron van Wirdum>As you mentioned, there were a lot of people that looked at this product,

00:54:17.990 --> 00:54:23.900
<v Aaron van Wirdum>including pretty serious security researchers. That did not see

00:54:23.900 --> 00:54:28.480
<v Aaron van Wirdum>this bug. They did not find this bug. So it was a reputable

00:54:28.480 --> 00:54:34.160
<v Aaron van Wirdum>company. And in fact, that's why we took them as a sponsor.

00:54:35.240 --> 00:54:40.320
<v Aaron van Wirdum>One of the claims that's gone out there is, you know, Coinkite kind of bought off

00:54:40.320 --> 00:54:45.790
<v Aaron van Wirdum>the entire podcasting system to sell their defunct products. But that's, speaking

00:54:45.790 --> 00:54:49.670
<v Aaron van Wirdum>for ourselves, that's the opposite of what happened. We were happy that a

00:54:49.670 --> 00:54:53.560
<v Aaron van Wirdum>reputable... Seemingly solid company wanted to sponsor it.

00:54:53.800 --> 00:54:58.970
<v Aaron van Wirdum>That is why we said yes to it. It's not like some kind of hush. Yeah, it's not

00:54:56.872 --> 00:55:00.722
<v Sjors Provoost>I agree with that. And I actually liked the situation.

00:54:58.970 --> 00:55:00.530
<v Aaron van Wirdum>like we took hush money.

00:55:02.530 --> 00:55:03.170
<v Aaron van Wirdum>Go on.

00:55:03.012 --> 00:55:06.532
<v Sjors Provoost>I like the situation much more than our previous arrangement where we had no

00:55:06.532 --> 00:55:10.112
<v Sjors Provoost>control of the advertisements. I think technically we had some sort of veto, but

00:55:10.112 --> 00:55:14.852
<v Sjors Provoost>when we were part of the Bitcoin magazine, they would splice in the ads and they

00:55:14.852 --> 00:55:17.612
<v Sjors Provoost>would be for stuff that we wouldn't know anything about.

00:55:18.972 --> 00:55:21.492
<v Sjors Provoost>Whereas now at least we had a sponsor that we didn't know.

00:55:23.030 --> 00:55:28.430
<v Aaron van Wirdum>Yeah, in our judgment, it was, and I would even say still is, like I don't think

00:55:28.430 --> 00:55:31.390
<v Aaron van Wirdum>they were scammers. I don't think that is what happened. I think it was a

00:55:31.390 --> 00:55:37.050
<v Aaron van Wirdum>disaster and a really bad bug, but I don't think they, you know, they stole the

00:55:37.050 --> 00:55:40.970
<v Aaron van Wirdum>money. At least I would want to see real evidence before I believe something like

00:55:40.970 --> 00:55:41.170
<v Aaron van Wirdum>that.

00:55:41.310 --> 00:55:45.090
<v Aaron van Wirdum>I don't think that's what happened. And at the very least, I can say that, you

00:55:45.090 --> 00:55:50.070
<v Aaron van Wirdum>know, no one, there was no one that suggested to us that we should drop them or,

00:55:50.250 --> 00:55:55.740
<v Aaron van Wirdum>you know, that... We had them because we thought they were reputable. That's the

00:55:55.740 --> 00:55:59.710
<v Aaron van Wirdum>reason we had them as sponsor. So I think that's our first part.

00:55:59.810 --> 00:56:05.620
<v Aaron van Wirdum>We need to make sure that we're not promoting a scam.

00:56:05.900 --> 00:56:11.220
<v Aaron van Wirdum>And reasonably thinking, I do think we did that. And then I think the other

00:56:11.220 --> 00:56:15.120
<v Aaron van Wirdum>aspect is that we do need to make very clear.

00:56:16.910 --> 00:56:22.190
<v Aaron van Wirdum>What is sponsored content essentially, right? Like what part of the podcast is us

00:56:22.190 --> 00:56:27.590
<v Aaron van Wirdum>making content? Is me being a journalist and you being a Bitcoin core developer?

00:56:27.890 --> 00:56:32.510
<v Aaron van Wirdum>And in what part of the podcast we're actually doing like an advertisement or a

00:56:32.510 --> 00:56:36.990
<v Aaron van Wirdum>sponsored thing? And I do think also in that we were pretty clear in that.

00:56:37.190 --> 00:56:42.730
<v Aaron van Wirdum>Like it was kind of over the top clear. I listened back to it and it's cringe to

00:56:42.730 --> 00:56:47.310
<v Aaron van Wirdum>listen back to it, right? Because we are saying, or especially me, like I'm

00:56:47.310 --> 00:56:51.930
<v Aaron van Wirdum>saying these very positive things about the cold card and indeed, even like over

00:56:51.930 --> 00:56:56.210
<v Aaron van Wirdum>the top, like I'm calling it like a piece of art and these things, but at least

00:56:55.452 --> 00:56:59.492
<v Sjors Provoost>I think it was so over the top that it kind of proved that they were sponsoring

00:56:56.210 --> 00:56:56.770
<v Aaron van Wirdum>I,

00:56:59.492 --> 00:57:03.052
<v Sjors Provoost>us mostly just because they wanted to help out, not because they expected to make

00:57:03.052 --> 00:57:08.982
<v Sjors Provoost>money from it. In a more serious, larger podcasting setup, I'm not even

00:57:08.982 --> 00:57:14.882
<v Sjors Provoost>sure if any company would appreciate when there's so much tongue-in-cheek

00:57:12.840 --> 00:57:14.180
<v Aaron van Wirdum>right, yeah.

00:57:14.882 --> 00:57:15.942
<v Sjors Provoost>in the advertisement.

00:57:16.322 --> 00:57:16.822
<v Sjors Provoost>I

00:57:17.410 --> 00:57:21.530
<v Aaron van Wirdum>Yeah, I think that's, you know, that's the second part of our response. Like the

00:57:21.530 --> 00:57:25.490
<v Aaron van Wirdum>first part is, you know, it shouldn't be an obvious scam. And the second part, it

00:57:25.490 --> 00:57:29.250
<v Aaron van Wirdum>does also need to be very obvious and clear that we're doing like an

00:57:29.250 --> 00:57:34.530
<v Aaron van Wirdum>advertisement rather than content. And I do think we did that on both counts. So,

00:57:34.990 --> 00:57:37.950
<v Aaron van Wirdum>yeah, it's a disaster what happened and it really sucks.

00:57:38.170 --> 00:57:43.050
<v Aaron van Wirdum>And, you know, if we could turn back the hands of time, like we wouldn't take

00:57:43.050 --> 00:57:43.730
<v Aaron van Wirdum>them as a sponsor.

00:57:45.380 --> 00:57:50.460
<v Aaron van Wirdum>At the same time, I find it very hard to blame myself for it or

00:57:50.460 --> 00:57:52.020
<v Aaron van Wirdum>to...

00:57:50.582 --> 00:57:54.602
<v Sjors Provoost>mean, if we had a time machine, and this raises all sorts of physics questions,

00:57:54.722 --> 00:57:55.702
<v Sjors Provoost>but ignoring those.

00:57:55.100 --> 00:57:57.000
<v Aaron van Wirdum>We

00:57:56.932 --> 00:58:00.632
<v Sjors Provoost>If we had known about this bug earlier, we would have responsibly disclosed it

00:57:59.430 --> 00:58:01.110
<v Aaron van Wirdum>would have prevented it. Yeah, exactly.

00:58:00.632 --> 00:58:04.172
<v Sjors Provoost>and we would have told them like, hold off with sponsorship until you've fixed

00:58:04.172 --> 00:58:08.292
<v Sjors Provoost>this totally, total vulnerability. Now, maybe a more realistic scenario would

00:58:08.292 --> 00:58:13.782
<v Sjors Provoost>have been if we had known about... The precise engineering style or something.

00:58:14.602 --> 00:58:18.302
<v Sjors Provoost>But again, it's not like I went to conferences and people were telling me, oh,

00:58:18.302 --> 00:58:19.902
<v Sjors Provoost>you should look at that cold card software.

00:58:20.082 --> 00:58:24.642
<v Sjors Provoost>It's absolute crap. Look, so sloppy. There must be a bug in there. That's totally

00:58:24.642 --> 00:58:28.462
<v Sjors Provoost>not what happened. And that does happen with other projects. So, yeah.

00:58:28.980 --> 00:58:34.600
<v Aaron van Wirdum>Yeah, so I mean, the one thing I've been mulling over whether or

00:58:33.892 --> 00:58:38.532
<v Sjors Provoost>But obviously, if we had known there was a red flag, yeah, then we would have had

00:58:34.600 --> 00:58:35.400
<v Aaron van Wirdum>not...

00:58:38.532 --> 00:58:42.052
<v Sjors Provoost>to make that more ethical discussion. Like, do we want to have a sponsor knowing

00:58:42.052 --> 00:58:44.472
<v Sjors Provoost>that we don't like how they do things?

00:58:46.210 --> 00:58:51.500
<v Aaron van Wirdum>Yeah, the one thing I have been mulling over is that, you know,

00:58:46.532 --> 00:58:48.172
<v Sjors Provoost>But I don't think that was the case.

00:58:51.720 --> 00:58:57.720
<v Aaron van Wirdum>in the... On the point of making it very clear which part

00:58:57.720 --> 00:59:02.400
<v Aaron van Wirdum>of the podcast is us making content, is me being a journalist and you being a

00:59:02.400 --> 00:59:05.360
<v Aaron van Wirdum>developer versus what part is sponsorship.

00:59:06.740 --> 00:59:12.500
<v Aaron van Wirdum>It has become a norm in podcast land that... The same people, the hosts

00:59:12.500 --> 00:59:16.860
<v Aaron van Wirdum>also do the ad reads. And again, in our case, it was tongue in cheek. And I think

00:59:16.860 --> 00:59:20.940
<v Aaron van Wirdum>it was pretty obvious, but, you know, it is maybe better to not have that and to

00:59:20.940 --> 00:59:24.720
<v Aaron van Wirdum>have what we had before, where it's just a recorded piece of audio. There's like

00:59:24.720 --> 00:59:29.180
<v Aaron van Wirdum>some sound effects and you get a completely different person doing the ad like

00:59:29.180 --> 00:59:29.440
<v Aaron van Wirdum>that.

00:59:29.520 --> 00:59:31.860
<v Aaron van Wirdum>That is maybe better than what we did.

00:59:33.080 --> 00:59:34.400
<v Aaron van Wirdum>So that that's sort of the.

00:59:33.202 --> 00:59:39.072
<v Sjors Provoost>I think that would be fine if the sponsor did not, like if

00:59:39.072 --> 00:59:42.112
<v Sjors Provoost>let's say we have a new sponsor and they don't want us to be tongue-in-cheek

00:59:42.112 --> 00:59:45.212
<v Sjors Provoost>about it but much more serious about it, then I think you would get into this

00:59:45.212 --> 00:59:49.632
<v Sjors Provoost>territory where we might say, well, maybe we should just have another voice do it

00:59:49.632 --> 00:59:53.532
<v Sjors Provoost>to make it clear that we're not endorsing something or, you know, to keep more

00:59:53.532 --> 00:59:54.452
<v Sjors Provoost>distance, basically.

00:59:56.292 --> 01:00:00.872
<v Sjors Provoost>Because it's not just about, I think that might be a good distinction. There's

00:59:56.560 --> 00:59:57.560
<v Aaron van Wirdum>Yeah, exactly.

01:00:00.872 --> 01:00:05.112
<v Sjors Provoost>the distinction between making it clear that it is an ad, but also whether you're

01:00:05.112 --> 01:00:09.212
<v Sjors Provoost>endorsing it to what degree you are. I think in our case, you were doing it so

01:00:09.212 --> 01:00:14.572
<v Sjors Provoost>tongue-in-cheek that, I don't know, but at the same time, of course, the fact

01:00:14.572 --> 01:00:17.332
<v Sjors Provoost>that you list an ad at all is some level of endorsement.

01:00:17.872 --> 01:00:21.312
<v Sjors Provoost>But a lot of sponsors will go much beyond that, right? They will say, oh, I

01:00:21.312 --> 01:00:25.822
<v Sjors Provoost>personally use this, blah, blah, blah, all my wealth is on it. And then you get

01:00:23.010 --> 01:00:23.330
<v Aaron van Wirdum>Right.

01:00:25.822 --> 01:00:30.822
<v Sjors Provoost>into murky territory where I tend to agree with, then you really need a separate

01:00:30.822 --> 01:00:35.402
<v Sjors Provoost>sound or a separate person to make that distinction. Like, yes, we think they're

01:00:35.402 --> 01:00:40.382
<v Sjors Provoost>reliable enough to be a sponsor, but it's not more than that.

01:00:41.692 --> 01:00:44.692
<v Sjors Provoost>But it depends on what it is. If it's like a conference, like, yeah, sure, go to

01:00:41.760 --> 01:00:42.740
<v Aaron van Wirdum>Yeah, I mean, and.

01:00:44.692 --> 01:00:48.852
<v Sjors Provoost>the conference. Like, that's not a recommendation that is dangerous to make, even

01:00:48.852 --> 01:00:51.472
<v Sjors Provoost>if the conference is terrible. Like, that's not the end of the world.

01:00:52.760 --> 01:00:54.400
<v Aaron van Wirdum>Yeah, yeah, and not

01:00:52.972 --> 01:00:55.432
<v Sjors Provoost>But if you tell people, like, oh, put your life savings here,

01:00:56.230 --> 01:01:02.210
<v Aaron van Wirdum>to mention that there's, of course, also, I won't name any names, but

01:01:02.210 --> 01:01:06.230
<v Aaron van Wirdum>there are, of course, also podcasts that, like, where the content is just

01:01:06.230 --> 01:01:10.740
<v Aaron van Wirdum>recommending. COLDCARD, where it's not specifically an advertisement, but it's

01:01:10.740 --> 01:01:14.580
<v Aaron van Wirdum>the actual host actually recommending, like, this is what you need to do.

01:01:15.220 --> 01:01:20.940
<v Aaron van Wirdum>We didn't do that. Again, I think in our case, it was clear. I hope for everyone

01:01:20.940 --> 01:01:26.260
<v Aaron van Wirdum>that there's a distinction between the sponsored part and us being a journalist

01:01:26.260 --> 01:01:27.120
<v Aaron van Wirdum>and developer part.

01:01:28.400 --> 01:01:32.760
<v Aaron van Wirdum>So, yeah, I mean, at the end of the day, I just hope no one got hurt. You know, I

01:01:32.760 --> 01:01:36.320
<v Aaron van Wirdum>hope no one that listened to our podcasts.

01:01:34.892 --> 01:01:39.372
<v Sjors Provoost>None of our listeners, you mean, or not as a result of us recommending it. But,

01:01:39.872 --> 01:01:40.312
<v Sjors Provoost>you know.

01:01:39.890 --> 01:01:42.590
<v Aaron van Wirdum>Yeah, that, well, both, I guess, yeah.

01:01:44.610 --> 01:01:49.410
<v Aaron van Wirdum>But I mean, it's very possible, of course. Well, I do think in our case, because

01:01:49.410 --> 01:01:53.730
<v Aaron van Wirdum>by the time we started our, not that this is important, but by the time we

01:01:53.730 --> 01:01:58.930
<v Aaron van Wirdum>started having them as a sponsor, the MK4 was already out. So it kind of reduces

01:01:58.930 --> 01:02:04.880
<v Aaron van Wirdum>the risk that maybe one of our listeners got the MK3 and their money is stolen

01:02:04.242 --> 01:02:07.282
<v Sjors Provoost>Yeah, I don't think that's a strong argument, though, because you could still

01:02:04.880 --> 01:02:05.180
<v Aaron van Wirdum>away.

01:02:06.320 --> 01:02:10.780
<v Aaron van Wirdum>No, no, I mean, I'm not making an argument. I'm just, you know, some thoughts

01:02:07.282 --> 01:02:09.062
<v Sjors Provoost>say, well, no.

01:02:10.780 --> 01:02:13.860
<v Aaron van Wirdum>that have been floating through my head because at the end of the day, it does,

01:02:14.040 --> 01:02:17.620
<v Aaron van Wirdum>you know, it is a disaster and it does suck that it happened to our sponsor.

01:02:19.302 --> 01:02:23.882
<v Sjors Provoost>Yeah, and, you know, even if the MK4 came out, like, somebody might have had an

01:02:23.882 --> 01:02:27.802
<v Sjors Provoost>MK3, and because we talked about the MK4, they were like, okay, I guess Coldcard

01:02:27.802 --> 01:02:33.712
<v Sjors Provoost>is solid, and I'm not going to throw it away and buy some competitor. So, but, I

01:02:33.712 --> 01:02:37.572
<v Sjors Provoost>mean, you weren't making the case anyway, but I'm just... Thoroughly dismissing

01:02:36.670 --> 01:02:41.290
<v Aaron van Wirdum>Yeah, but so as a, I guess as a general question, like,

01:02:37.572 --> 01:02:38.392
<v Sjors Provoost>that argument.

01:02:38.832 --> 01:02:39.392
<v Sjors Provoost>But

01:02:41.820 --> 01:02:45.700
<v Aaron van Wirdum>let's say, you know, one of the other reputable,

01:02:44.902 --> 01:02:49.482
<v Sjors Provoost>also, let's say we've had Ledger as a sponsor and their social media hack

01:02:47.060 --> 01:02:49.000
<v Aaron van Wirdum>well, I was just going to ask that.

01:02:49.482 --> 01:02:53.142
<v Sjors Provoost>happened and people got kidnapped. That wouldn't look good either. So again,

01:02:54.282 --> 01:02:56.552
<v Sjors Provoost>they're not unique in this.

01:02:55.150 --> 01:03:01.150
<v Aaron van Wirdum>Yeah, or so to ask the question in a very general way to you, like let's say, you

01:03:01.150 --> 01:03:06.690
<v Aaron van Wirdum>know, someone from Ledger or Trezor or Jade or Foundation or whatever, Bitbox. So

01:03:06.690 --> 01:03:10.490
<v Aaron van Wirdum>someone is listening and they think, oh, they don't have a sponsor anymore. Let's

01:03:10.490 --> 01:03:15.990
<v Aaron van Wirdum>reach out. Would we do anything differently compared to what we did?

01:03:16.150 --> 01:03:21.110
<v Aaron van Wirdum>Like, is there anything we should have done differently in your view? Or is this

01:03:21.110 --> 01:03:24.630
<v Aaron van Wirdum>just kind of a disaster?

01:03:23.552 --> 01:03:28.612
<v Sjors Provoost>Well, this comes to the bigger problem is our podcast is too small. So taking on

01:03:28.612 --> 01:03:34.552
<v Sjors Provoost>a sponsor is not giving me any meaningful income. But it is exposing us to

01:03:34.552 --> 01:03:40.352
<v Sjors Provoost>reputational risk. So I would say we just shouldn't take a new sponsor for that

01:03:40.352 --> 01:03:45.252
<v Sjors Provoost>reason unless we scale the podcast or it's a really large amount.

01:03:47.402 --> 01:03:50.682
<v Sjors Provoost>So it's kind of a difficult discussion for us. I mean, if we were to do it, yeah,

01:03:47.990 --> 01:03:48.950
<v Aaron van Wirdum>Yeah, I

01:03:50.802 --> 01:03:55.842
<v Sjors Provoost>you can do the things like having them record the audio and splicing it in, et

01:03:55.842 --> 01:04:00.082
<v Sjors Provoost>cetera, et cetera. But I think fundamentally... It's like pennies in front of

01:04:00.082 --> 01:04:04.702
<v Sjors Provoost>steamrollers. It was like 0.1% of my income, but it still

01:04:02.230 --> 01:04:05.570
<v Aaron van Wirdum>suppose

01:04:04.702 --> 01:04:06.142
<v Sjors Provoost>happens.

01:04:06.542 --> 01:04:09.682
<v Sjors Provoost>I would have rather just paid the cost ourselves, right?

01:04:11.230 --> 01:04:16.910
<v Aaron van Wirdum>I agree with that. In our case specifically, it's the amount of money. We're a

01:04:16.910 --> 01:04:20.570
<v Aaron van Wirdum>tiny podcast, no one listens to us, and the amount of money we were getting

01:04:20.570 --> 01:04:26.330
<v Aaron van Wirdum>reflects that. We would have been better off to just not have a

01:04:26.330 --> 01:04:29.630
<v Aaron van Wirdum>sponsor and consider it a pure hobby, which we're kind of doing anyways.

01:04:30.332 --> 01:04:34.532
<v Sjors Provoost>Well, look, in the beginning, we were doing at least one episode a week, and that

01:04:34.532 --> 01:04:38.792
<v Sjors Provoost>would have been at least some reasonable income. But once we started doing four

01:04:38.792 --> 01:04:43.652
<v Sjors Provoost>episodes a year, at the same time, it's nice to be paid by somebody because it's

01:04:43.652 --> 01:04:47.812
<v Sjors Provoost>a form of appreciation, right? It does give you a motive. It does motivate you a

01:04:47.812 --> 01:04:52.252
<v Sjors Provoost>little bit to see that people appreciate it enough to sponsor it.

01:04:52.472 --> 01:04:52.812
<v Sjors Provoost>Yeah,

01:04:52.500 --> 01:04:58.140
<v Aaron van Wirdum>It made it feel a little bit real. It made it feel like we were making a podcast

01:04:58.140 --> 01:05:02.280
<v Aaron van Wirdum>rather than just sort of friends hanging out and talking about Bitcoin for an

01:05:02.280 --> 01:05:03.440
<v Aaron van Wirdum>hour. So, yeah.

01:05:04.720 --> 01:05:09.800
<v Aaron van Wirdum>Well, we'll see. In case there is a potential sponsor listening, feel free to

01:05:09.800 --> 01:05:13.860
<v Aaron van Wirdum>reach out and we'll at least think about it, I guess. But, yeah.

01:05:13.592 --> 01:05:15.292
<v Sjors Provoost>starting at 1 million a year. Yeah.

01:05:17.690 --> 01:05:22.610
<v Aaron van Wirdum>Okay, well, Sjors, anything else on this topic, on the topic of them having

01:05:21.402 --> 01:05:22.262
<v Sjors Provoost>No, I think

01:05:22.610 --> 01:05:28.310
<v Aaron van Wirdum>us as a sponsor or the bug itself

01:05:28.310 --> 01:05:31.950
<v Aaron van Wirdum>or lessons learned or how to move forward from here or anything else?

01:05:32.502 --> 01:05:37.402
<v Sjors Provoost>we've covered a lot. So thank you all for listening to Bitcoin.

01:05:38.550 --> 01:05:39.150
<v Aaron van Wirdum>Explained.

