Delivery-date: Mon, 13 May 2024 08:29:20 -0700 Received: from mail-qt1-f184.google.com ([209.85.160.184]) by mail.fairlystable.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1s6Xc8-0008Ui-6c for bitcoindev@gnusha.org; Mon, 13 May 2024 08:29:20 -0700 Received: by mail-qt1-f184.google.com with SMTP id d75a77b69052e-43d1e3e7730sf57269011cf.2 for ; Mon, 13 May 2024 08:29:19 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1715614154; cv=pass; d=google.com; s=arc-20160816; b=hGSK6+A/qGPx1FYNLtt5NQk5tlrElaqS9Znxc3oWdgiH62KBPoIK+xpmmLDhuO4D7r /AR6orkKgf5RVLecC61R9CkynGuIdxtMVFmN+pJV1CFpNbOSDqlrXyWglAJmw/BpWB5H QAoZtOOZc/XxmyU7TflaeWdnXvEtsz1pPtBZmYMtI5jOfANSF6poHdjCp2WbYSN2LPXS 1a7XxhAu/ZJxrMs64AFooKPl2h8805cC3ZPwi+hf7+3sHQfxdRzlKY954V6w/J03h/Uv QHFBCUHjSgn+X99ckCUZS0QcGp0pTNGDY7pgoTCcAS4v7l4yanQX3cKYUpPCEuCPnKFz E/9g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:sender :dkim-signature; bh=sABCvxs/gJlGnFb9qjaZP60PwyaD4LI7H9dDl/j9+zE=; fh=EhXfBvhHBG4Z/UXBLw1KJWiIfyF3v4aSH7zqt2xyBj8=; b=KI2+p/R0SQlCDIPZ1AQA14uSCULLUNkVV/hEAKWGnBk4ZePHmYt9GdEBalet8HVHVF VnI+wK+8Fo3Fw7AiNWY1RgueZkhiF1UApDGeZ6jtgJoFZL6OdBgBDpq9XAzs9qGMw7gz AQwOlXeIbJsst96XxAY9nJqu192XRYRc5vmEDY2nDMQwriWvBXKaDPq/jDSa/vzLIKab jHUxiu/ulsVzTC5dvIHUjA3Q7oEYKG5/RZYZcBpSQavfUCP7JqKhhoS5cpqnUgrpMV1e iyjuAn4P04xJP10SkccC1sZC3orELayZMDA0b31SiE5A9qAOKthF/rIqCT147pfUZPrq 8zng==; darn=gnusha.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@mail.wpsoftware.net header.s=default header.b=G+09vxV4; spf=pass (google.com: domain of apoelstra@wpsoftware.net designates 66.183.0.205 as permitted sender) smtp.mailfrom=apoelstra@wpsoftware.net; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=wpsoftware.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1715614154; x=1716218954; darn=gnusha.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:sender:from:to:cc :subject:date:message-id:reply-to; bh=sABCvxs/gJlGnFb9qjaZP60PwyaD4LI7H9dDl/j9+zE=; b=EHNX+hOx5+tOcLGlVyJY/WOer0WSKc7fOr5gTC5ZEunzDqNHGKaId3TS2LM/2iECnY 2DZDTXS+MQ2v7Gyry2+WVcipqlxvfGem0S5pg/rfama5khnx72heCwFs3+i7sIEkGR4D RMxibjrFqBlc8rPWu3A27gpdcrHCHQH/nqYYop0fofkC/m1Fmoy14HFFfQkSbHSYq4dL sStAbprgdSadkbhILhr7f2ODxEe2fZUEaeIRyd5DwRvjDEl+7kzOuTo06zhOrwLYrhU3 nJkrwTOL+fYiJTpoa55KOjQ7i3kAkKdUVXXsn2ofKlm5GW54k9/D7YbpKMwzYFaF6mbc ZBHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715614154; x=1716218954; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:x-beenthere :x-gm-message-state:sender:from:to:cc:subject:date:message-id :reply-to; bh=sABCvxs/gJlGnFb9qjaZP60PwyaD4LI7H9dDl/j9+zE=; b=UoFmRa05seabFeSQRfqokzrpr0mR7MZTkV7VIGxQqjAIkerSP6rxFWGIXO2MDuhQrn nPLWnPF8ifHfEEEHPkdkiSzdrl7QIADB2T8bdugOJmfGeK1yr1MvOnN9sdLGuml9zV9H M+IUH+MGf7VU9D8AH9Jo1r3fynUTfD3PatGelHFawX6rX33DF9CHgp2p5jJ1n/vMO3Wu yIxwkKJDaY7/vWYtxpWg/JBRetmjhA0AzOqn1AVYWu6/I8lRAePS3thKpCvl4xaPDMIs OV8fFwQzYiUKjEVvh+RUvjVPaQq1rMlwmAzJ735h7cx+Gj/H0z40gW4PaF6F0eXgPkb6 yXgA== Sender: bitcoindev@googlegroups.com X-Forwarded-Encrypted: i=2; AJvYcCVDogYn0yC6k1goTVwkqWD56rwGbstveuM/UvnuzVO1OvTyN00qD28w9nJLl+EZugzqC/5aq2/jXPgq9K/RqaLZ46sB6OI= X-Gm-Message-State: AOJu0YwcYzMUcy040LG8dx0xyrs3y4BFoMMIeW5A2zRHzQ/w54fCQRAl w8tQlvnEUbeMK9A7wZlozugoy9Mm1vwZAf5Ly1sUK1d16XPAb6w0 X-Google-Smtp-Source: AGHT+IGTfwMXVr16jm6SSJZIo3yFMgtYaRd8GneXpB4/sJ+nfZOzLFNGkB04QbYVXkWp1wyQeTwwJw== X-Received: by 2002:a05:622a:4109:b0:43a:b2a0:6e01 with SMTP id d75a77b69052e-43dfdae26acmr116687741cf.21.1715614153683; Mon, 13 May 2024 08:29:13 -0700 (PDT) X-BeenThere: bitcoindev@googlegroups.com Received: by 2002:a05:622a:188a:b0:43a:b15a:f8c9 with SMTP id d75a77b69052e-43decf07704ls69262841cf.0.-pod-prod-07-us; Mon, 13 May 2024 08:29:12 -0700 (PDT) X-Received: by 2002:a05:620a:25cd:b0:790:efb0:8095 with SMTP id af79cd13be357-792c75a5162mr27416585a.7.1715614152345; Mon, 13 May 2024 08:29:12 -0700 (PDT) Received: by 2002:a05:620a:3947:b0:790:eff4:844b with SMTP id af79cd13be357-792bca7d096ms85a; Mon, 13 May 2024 06:40:50 -0700 (PDT) X-Received: by 2002:a05:6122:1807:b0:4dc:b486:e4a5 with SMTP id 71dfb90a1353d-4df88139d7amr8122822e0c.0.1715607649288; Mon, 13 May 2024 06:40:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1715607649; cv=none; d=google.com; s=arc-20160816; b=q1JCt55zZGdOUrT6xTn6JRVWIj47FWAb5DPvt0K/wn8tIisp2mK36eQrKVkEfa/5P2 n4hdNP4E/PhlNHZCrykc/NVkrwFopKqQDAx9t7F1WeO2hC6xVUiFPKD4XO4rSWxfi5Gh YxtB1QBIGdbhrA5ExAaFo7xWY+Lfp2YTY0C98zgbDZW84j3ki/AkBB5I3Vz5GU6c18Eo QSVpCutJ0hXgxavWHhfL/+9WkLZ/SZV/kMCQgHUFiosX1nJzAwjWFFU0glROVLoZisNs siWMSZfB+WcYBJaUZS5G5usab1BydQQJFa6imN6Vco7Vak4WinxgFGXlLNUOp1P5xW2H YJHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:dkim-signature; bh=5SaxWPXbQBuy78SOGPkGG5tiz/dfXhTq/vadbJpMO24=; fh=cahZDgTdN45RG3UsKThsxzoXgKY9yWPedXjgzYAIiH8=; b=qyZtRb+MzdCjnOLzUXdlbqp5AwPHsZBp1buVSFMWcAevfMaxJTe/ymnVf7/mzXtKmp 4/m/ojKpLqz+PENSezxRj81w8FImGUG2qWqXuIpl0X+GsDPHMjNnwbvNTAZAYAXMzXI1 lbPUHNJAkQ8bRsXruZwi0yJlzjNq7dJ4Rm3xm02QszMdtLbz30U2BHpx6AnyuTe9shBS hR1wC0BFe/gp+IhA6FFxJV7JtV2T3ntQk6Gb75lMu1Z+MURCtKEK+BQfvWhlG1+IMCbr X152b31hz43ktHtOkMdiMikYHOGs1C5SxccHjdjOjFAQ9Xn/VV75o+X6fwg5QK9sah7J RB7w==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@mail.wpsoftware.net header.s=default header.b=G+09vxV4; spf=pass (google.com: domain of apoelstra@wpsoftware.net designates 66.183.0.205 as permitted sender) smtp.mailfrom=apoelstra@wpsoftware.net; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=wpsoftware.net Received: from mail.wpsoftware.net ([66.183.0.205]) by gmr-mx.google.com with ESMTP id 71dfb90a1353d-4df7bf99effsi1030810e0c.2.2024.05.13.06.40.48 for ; Mon, 13 May 2024 06:40:49 -0700 (PDT) Received-SPF: pass (google.com: domain of apoelstra@wpsoftware.net designates 66.183.0.205 as permitted sender) client-ip=66.183.0.205; Received: from camus (camus-andrew.lan [192.168.0.190]) by mail.wpsoftware.net (Postfix) with ESMTPSA id EC324400F9; Mon, 13 May 2024 13:40:47 +0000 (UTC) Date: Mon, 13 May 2024 13:40:46 +0000 From: Andrew Poelstra To: Rama Gan Cc: "bitcoindev@googlegroups.com" Subject: Re: [bitcoindev] Penlock, a paper-computer for secret-splitting BIP39 seed phrases Message-ID: References: <9bt6npqSdpuYOcaDySZDvBOwXVq_v70FBnIseMT6AXNZ4V9HylyubEaGU0S8K5TMckXTcUqQIv-FN-QLIZjj8hJbzfB9ja9S8gxKTaQ2FfM=@proton.me> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="WVG9KjvnRs+OL60e" Content-Disposition: inline In-Reply-To: <9bt6npqSdpuYOcaDySZDvBOwXVq_v70FBnIseMT6AXNZ4V9HylyubEaGU0S8K5TMckXTcUqQIv-FN-QLIZjj8hJbzfB9ja9S8gxKTaQ2FfM=@proton.me> X-Original-Sender: apoelstra@wpsoftware.net X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@mail.wpsoftware.net header.s=default header.b=G+09vxV4; spf=pass (google.com: domain of apoelstra@wpsoftware.net designates 66.183.0.205 as permitted sender) smtp.mailfrom=apoelstra@wpsoftware.net; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=wpsoftware.net Precedence: list Mailing-list: list bitcoindev@googlegroups.com; contact bitcoindev+owners@googlegroups.com List-ID: X-Google-Group-Id: 786775582512 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-Spam-Score: -0.8 (/) --WVG9KjvnRs+OL60e Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline On Sun, May 12, 2024 at 06:04:09PM +0000, 'Rama Gan' via Bitcoin Development Mailing List wrote: > I am excited to introduce Penlock, a printable paper-computer that guides users > through secret-splitting their BIP39 seed phrase without an electronic device. A > beta release is now available for peer-reviewing and early testing: > https://beta.penlock.io. > > > Hi Rama, Very interesting project. I have a few unordered thoughts about this: * You have instructions for generating BIP39 seed words, but if the goal is to be compatible with existing setups, this really isn't necessary (or even desireable). If somebody is willing to generate a whole new seed and is willing to sweep their coins, they might as well just use codex32. (Perhaps they have an urgent need to do so, and cannot wait for codex32 support to arrive in mainstream wallets. Ok. But it's a pretty niche user who is panickedly updating their coins while having the patience to hand-compute things!) * Furthermore, the "just grind checksum words til the string works" approach, while ergonomic for 12 words (16 iterations max), is unrealistic for 16 words (64 iterations) and basically impossible for 24 words (256 iterations). Probably worth mentioning this. * The math underlying this all seems sound -- you map BIP39 characters directly into the field of integers mod 29, then compute lines in this field. However, the resulting checksum is then as long as your original set of words. Again, probably ok for 12 words but unreasonable for 24. (BTW, we have an unofficial BIP39 compatibility layer for codex32 which has the same issue -- everything is horrible for the 24-word case. But it is possible to do, and I've done it.) * However, the use of a characteristic-greater-than-2 field means that addition and subtraction are different operations and suddenly you need to be careful about the exact order in which your read things off the volvelles. It also makes recovering your share more complicated. I see that you currently have a table for the 2-of-3 case where you read the volvelle in different ways depending on which shares you have. Clever, but this will not extend to 2-of-n and I suspect you'll basically need to implement the full "recovery wheel" from codex32 (or the "recovery tables" which are faster to use for the 2-of-n case, though easier to use wrong). Recovery is not really that important because you only do it when you're going to put your seed into a computer, and in that case you might as well make the computer do the recovery for you, but it is unfortunate. Especially in this case where a stated goal is that the computer -won't- do anything for you because it doesn't know about the scheme. * Furthermore, this encoding into GF29 is nonstandard. I think, for the checksum construction this doesn't matter -- if the encoding becomes lost then you can just forget about the checksum, and if it doesn't, then you have a pretty great checksum (which can recover any number of errors as long as they don't hit both the data and the checksum in the same place). My feeling is that it's probably a good idea for people to use your checksum scheme on top of their existing BIP39 words, but the splitting stuff I'm less comfortable with. Possibly you would rather just combine your checksum scheme with seedxor? Though seedxor has the unfortunate need to convert your data to binary before xoring, which is time-consuming and error-prone and not compatible with the checksum so you don't have any good way to catch or fix mistakes. (The "unofficial compatibility layer for codex32" I mentioned works this way as well and it's horrible. But as you say, for users who really don't want to sweep their coins, maybe they are willing to make ugly tradeoffs..) Though I believe that seedxor only works for 2-of-3 and cannot be generalized without making the scheme unrecognizable. Alternately, if you switched to a binary field, and chose a checksum whose target residue was 0 (normally *not* recommended because it allows some classes of errors, in particular prefixes of zeroes) (though it does not allow any more substitution or erasure errors, which is what we care about for short fixed-length like this) then you could use an addition volvelle in the same way, the computation would secretly be identical to the seedxor computation, and your checksum would be preserved by it. So this is another way in which you could try to make a "seedxor-compatible checksum". But by adding a multiplicaion wheel that can do Lagrange multipliers you could generalize it to 2-of-n in a "natural" way which would break seedxor compatibility only for people who wanted more than 3 shares, and possibly even only when actually using shares beyond the third.. As a final note about seedxor, they have as a design goal that the shares look identical to full seeds; they preserve the broken bip39 checksum, have no extra characters, etc. Personally I think this goal is terrible. If you are going to use obscure hand-computation tricks you are far more likely to lose your data (or forget how to manipulate it) than you are to be robbed by a thief who understands your scheme. * More generally, you need to write up a specification and description of the math and maybe even a PDF :). I learned the scheme by reverse-engineering your Javascript, which is well-written and dependency-free, but still pretty abstract and indirect and anyway JS is not my language (nor is it likely to be the language for the typical hand-computer user). Sadly your volvelles also don't render properly in my browser (qutebrowser) which is chromium-based but maybe I have some settings wrong. Best Andrew -- Andrew Poelstra Director, Blockstream Research Email: apoelstra at wpsoftware.net Web: https://www.wpsoftware.net/andrew The sun is always shining in space -Justin Lewis-Webster -- You received this message because you are subscribed to the Google Groups "Bitcoin Development Mailing List" group. To unsubscribe from this group and stop receiving emails from it, send an email to bitcoindev+unsubscribe@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/bitcoindev/ZkIYXs7PgbjazVFk%40camus. --WVG9KjvnRs+OL60e Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEkPnKPD7Je+ki35VexYjWPOQbl8EFAmZCGF0ACgkQxYjWPOQb l8HWfggAk7e9s33d7qe/lzkePo5qB0Q/7TgETayepCcRZG939H7JAmWnybkStYSW QyXkMxr3mlvEa59cbDMm/ZmSiXlYZVIfQpAz/E0PU0o/i4wPMRGKpl1vLgrbB7Bk RM6A/XK+3nJwk9Du3F3l2ggC9cQ/VeWhd/RxwTAV/59hDprXeB33SkTGv7NR+Lm7 wyRNw8b1fQJP2z/uZ+ftS1uIXF7nn/aBR1ktiUq6NjO+uJsEY9S01YTKzdleTViA YNu+jRFcDFoiiDPdOYgKUKIJtPnStLinobK5g04EcMAgH0AOFD4SzLsk5h8mhJIQ iCCdc+U/yMhg4mWjNzJVm/SvO5bV9g== =l9NU -----END PGP SIGNATURE----- --WVG9KjvnRs+OL60e--