Skip to content

Commit 1370601

Browse files
committed
Improved seed backup page information.
1 parent 25efff4 commit 1370601

6 files changed

Lines changed: 215 additions & 17 deletions

File tree

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ _For related Threat Modeling, see the [Seed Tool Manual](https://github.com/Bloc
4747

4848
[Join the Test Flight Open Beta](https://testflight.apple.com/join/0LIl6H1h)
4949

50+
### 1.6 (76)
51+
52+
* THIS IS A RELEASE CANDIDATE
53+
* Seed Detail > Authenticate > Backup > Backup as Gordian Envelope > Print
54+
* The printed seed backup page "Derivations" section has been replaced with a display that varies depending on the "Primary Asset" app setting:
55+
* Bitcoin: The associated output descriptor (if any) is shown.
56+
* Ethereum: The ETH account ID is shown.
57+
* Tezos: The Tezos address is shown.
58+
* When any of the above are shown, a QR code containing the same information is also shown.
59+
5060
### 1.6 (75)
5161

5262
* THIS IS A RELEASE CANDIDATE
@@ -232,7 +242,7 @@ See [Version History](VERSIONS.md) for previous builds.
232242

233243
## Origin, Authors, Copyright & Licenses
234244

235-
Unless otherwise noted (either in this [/README.md](./README.md) or in the file's header comments) the contents of this repository are Copyright © 2020 by Blockchain Commons, LLC, and are [licensed](./LICENSE) under the [spdx:BSD-2-Clause Plus Patent License](https://spdx.org/licenses/BSD-2-Clause-Patent.html).
245+
Unless otherwise noted (either in this [/README.md](./README.md) or in the file's header comments) the contents of this repository are Copyright © 2024 by Blockchain Commons, LLC, and are [licensed](./LICENSE) under the [spdx:BSD-2-Clause Plus Patent License](https://spdx.org/licenses/BSD-2-Clause-Patent.html).
236246

237247
In most cases, the authors, copyright, and license for each file reside in header comments in the source code. When it does not, we have attempted to attribute it accurately in the table below.
238248

SeedTool/Markdown/license-and-disclaimer.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Please read and accept the terms of our disclaimer:
44

55
The use of Gordian Seed Tool is under the [BSD 2-Clause Plus Patent License](https://spdx.org/licenses/BSD-2-Clause-Patent.html).
66

7-
Copyright © 2022 BlockchainCommons.
7+
Copyright © 2024 BlockchainCommons.
88
All rights reserved.
99

1010
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

SeedTool/SeedToolApp.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,24 @@ let globalFormatContext = {
2828
// xcrun simctl openurl booted ur:seed/otadgdlfwfdwlphlfsghcphfcsaybekkkbaejkaosezofptplpayftemckpfaxihfpjziniaihttmhwnen
2929
// ```
3030

31+
/// The global settings object.
32+
///
33+
/// Only use `globalSettings` if you must. Prefer:
34+
///
35+
/// @EnvironmentObject private var settings: Settings
36+
///
37+
let globalSettings = {
38+
Settings(storage: UserDefaults.standard)
39+
}()
40+
3141
@main
3242
struct SeedToolApp: App {
3343
@UIApplicationDelegateAdaptor private var appDelegate: AppDelegate
3444
@StateObject private var model: Model
3545
@StateObject private var settings: Settings
3646

3747
init() {
38-
let settings = Settings(storage: UserDefaults.standard)
48+
let settings = globalSettings
3949
let model = Model(settings: settings)
4050
self._settings = StateObject(wrappedValue: settings)
4151
self._model = StateObject(wrappedValue: model)

SeedTool/Seeds/SeedBackupPage.swift

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ let seedDateFormatter: DateFormatter = {
1919

2020
struct SeedBackupPage: View {
2121
let seed: ModelSeed
22-
22+
2323
let titleFontSize = 16.0
2424
let textFontSize = 12.0
2525
let sectionSpacing = 12.0
@@ -83,14 +83,66 @@ struct SeedBackupPage: View {
8383
}
8484
}
8585

86+
@ViewBuilder
87+
var btcDerivation: some View {
88+
if let outputDescriptor = seed.outputDescriptor {
89+
BackupPageSection(title: Text("Output Descriptor"), icon: Image.bitcoin) {
90+
HStack {
91+
PrintingQRCodeView(message: outputDescriptor.sourceWithChecksum.utf8Data)
92+
.frame(height: 50)
93+
VStack(alignment: .leading) {
94+
Text(outputDescriptor.sourceWithChecksum)
95+
.appMonospaced(size: textFontSize)
96+
}
97+
Spacer()
98+
}
99+
}
100+
}
101+
}
102+
103+
@ViewBuilder
104+
var ethDerivation: some View {
105+
BackupPageSection(title: Text("Ethereum Account"), icon: Image.ethereum) {
106+
HStack {
107+
PrintingQRCodeView(message: ethereumAccount.utf8Data)
108+
.frame(height: 50)
109+
VStack(alignment: .leading) {
110+
Text(ethereumAccount)
111+
.appMonospaced(size: textFontSize)
112+
}
113+
Spacer()
114+
}
115+
}
116+
}
117+
118+
@ViewBuilder
119+
var xtzDerivation: some View {
120+
BackupPageSection(title: Text("Tezos Address"), icon: Image.tezos) {
121+
HStack {
122+
PrintingQRCodeView(message: tezosAddress.utf8Data)
123+
.frame(height: 50)
124+
VStack(alignment: .leading) {
125+
Text(tezosAddress)
126+
.appMonospaced(size: textFontSize)
127+
}
128+
Spacer()
129+
}
130+
}
131+
}
132+
133+
@ViewBuilder
86134
var derivations: some View {
87-
BackupPageSection(title: Text("Derivations"), icon: Image.key) {
88-
VStack(alignment: .leading, spacing: 5) {
89-
Text("Master Key Fingerprint: ").bold() + Text(masterKeyFingerprint.flanked("[", "]")).appMonospaced(size: textFontSize)
90-
Text("Ethereum Account: ").bold() + Text(ethereumAccount).appMonospaced(size: textFontSize)
135+
VStack(alignment: .leading, spacing: 5) {
136+
switch globalSettings.primaryAsset {
137+
case .btc:
138+
btcDerivation
139+
case .eth:
140+
ethDerivation
141+
case .xtz:
142+
xtzDerivation
91143
}
92-
.layoutPriority(1)
93144
}
145+
.layoutPriority(1)
94146
}
95147

96148
var masterKey: HDKey {
@@ -104,6 +156,10 @@ struct SeedBackupPage: View {
104156
var ethereumAccount: String {
105157
Ethereum.Address(hdKey: masterKey).description
106158
}
159+
160+
var tezosAddress: String {
161+
Tezos.Address(hdKey: masterKey)!.description
162+
}
107163
}
108164

109165
struct BackupPageLabel: View {

fastlane/Fastfile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ platform :ios do
2020
capture_screenshots(workspace: "SeedTool.xcworkspace", scheme: "SeedToolUITests")
2121
end
2222

23-
lane :precheck_metadata do
24-
precheck(
25-
platform: "ios"
26-
)
27-
end
28-
2923
lane :upload_metadata_and_screenshots do
3024
upload_to_app_store(skip_binary_upload: true, overwrite_screenshots: true)
3125
end
@@ -38,6 +32,15 @@ platform :ios do
3832
upload_to_app_store(skip_binary_upload: true, skip_metadata: true, overwrite_screenshots: true)
3933
end
4034

35+
#
36+
# Do this *after* metadata upload but *before* submitting for review
37+
#
38+
lane :precheck_metadata do
39+
precheck(
40+
platform: "ios"
41+
)
42+
end
43+
4144
lane :build do
4245
build_ios_app(
4346
scheme: "SeedTool",

fastlane/Preview.html

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<!DOCTYPE html>
22
<html>
33
<head>
4-
<title>deliver - Gordian Seed Tool</title>
4+
<title>deliver - Gordian Seed Tool
5+
</title>
56
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
67
<style>
78
.app-name {
@@ -147,30 +148,92 @@
147148

148149

149150
<div class="app-name">
150-
en-US
151+
en-US: Gordian Seed Tool
152+
151153
</div>
152154

153155

154156

157+
<div class="app-subtitle">
158+
Subtitle: Cryptographic Seed Vault
159+
160+
</div>
161+
155162

156163
<div class="app-urls">
157164

158165

159166

160167

168+
<div class="app-url-descr">
169+
support_url: <a target="_blank" class="app-url" href="https://github.com/BlockchainCommons/GordianSeedTool-iOS/issues
170+
">https://github.com/BlockchainCommons/GordianSeedTool-iOS/issues
171+
</a>
172+
</div>
173+
161174

162175

163176

177+
<div class="app-url-descr">
178+
marketing_url: <a target="_blank" class="app-url" href="https://github.com/blockchaincommons/GordianSeedTool-iOS
179+
">https://github.com/blockchaincommons/GordianSeedTool-iOS
180+
</a>
181+
</div>
182+
164183

165184
</div>
166185

167186

187+
<div class="app-keyword">
188+
<div class="cat-headline">Keywords</div>
189+
<ul class="app-keyword-list">
190+
191+
<li>cryptography</li>
192+
193+
<li>cryptocurrency</li>
194+
195+
<li>bitcoin</li>
196+
197+
<li>private keys</li>
198+
199+
<li>seeds</li>
200+
201+
<li>blockchain</li>
202+
203+
<li>qr</li>
204+
205+
<li>wallet</li>
206+
207+
<li>security</li>
208+
209+
<li>psbt</li>
210+
211+
</ul>
212+
</div>
213+
168214

169215

216+
<div class="app-description">
217+
<div class="cat-headline">Description</div>
218+
<div class="app-description-text">
219+
Gordian Seed Tool protects your cryptographic seeds while also making them available for easy use. Using Seed Tool, you can generate seeds and store them securely on your device. You can then derive and share multi-signature signing and verification keys from those seeds or use them to sign PSBTs. Sophisticated backup procedures include printed pages and Sharded Secret Key Reconstruction (SSKR) — which lets you split your seed into pieces and send them to trusted parties, who can send them back to you in an emergency for seed recovery. You can even use an entirely offline device (no internet access) to store your seeds and use QR codes to exchange accounts, descriptors, seeds, keys, or PSBTs with online devices running compatible wallet or signing software.<br /><br />The "seeds" generated and protected by Gordian Seed Tool are long strings of truly random numbers used in cryptography. As the name suggests, seeds are the starting point for other things such as cryptocurrency keys and addresses. To be secure, seeds need to be created and saved safely.<br /><br />NOTE: Gordian Seed Tool is not a cryptocurrency wallet. It does not store or transmit value in any cryptocurrency, but it can be used in conjunction with such tools.<br /><br />Gordian Seed Tool is open-source software from Blockchain Commons, a not-for-profit public-good organization. Find our repository on GitHub and check out the code for yourself!<br />
220+
</div>
221+
</div>
222+
170223

171224

225+
<div class="app-changelog">
226+
<div class="cat-headline">Changelog</div>
227+
Improvements in 1.6<br /><br />UI Best Practices<br /><br />• BIP39/ByteWords Entry: Shows validity of individual words<br />• Hex Entry: More accessible entry cuts out spaces, other non-hex entries<br />• Seed Printing: Elides some info if necessary to print out a backup of a seed<br />• Fingerprint Info: Seed views now display master fingerprint & Lifehash<br /><br />Resilience Best Practices<br /><br />• Output Descriptor: Output Descriptor can be saved as seed metadata<br /><br />Other Chain Expansions<br /><br />• Tezos Support: Generates tz1 addresses & private keys<br />• Ethereum & Tezos Improvements: Better shows necessary data for chains<br /><br />Specification Updates<br /><br />• Envelope is now prime output type for seeds, SSKR, requests, responses<br />• Envelope attachments are supported<br />• Update to Envelope v2, based on IETF feedback<br />• Update to Account Descriptor v2, Output Descriptor v3, based on community feedback<br />• Update to IANA registered CBOR numbers (with backward compatibility as needed)<br /><br />General bug fixes and improvements.<br />
228+
</div>
229+
172230

173231

232+
<div class="app-changelog">
233+
<div class="cat-headline">Promotional Text</div>
234+
Securely generates, stores, imports, and exports cryptographic seeds (long random numbers) used in a variety of cryptographic and cryptocurrency applications.<br />
235+
</div>
236+
174237

175238
<div class="app-screenshots">
176239
<div class="cat-headline">Screenshots</div>
@@ -308,5 +371,61 @@ <h4>iPad Pro (12.9-inch) (3rd generation)</h4>
308371

309372

310373

374+
<div class="app-minor-information">
375+
<div class="cat-headline">Review Information</div>
376+
<dl class="app-minor-information">
377+
378+
<dt class="app-minor-information-key">
379+
First name
380+
</dt>
381+
<dd class="app-minor-information-text">
382+
Wolf<br />
383+
</dd>
384+
385+
<dt class="app-minor-information-key">
386+
Last name
387+
</dt>
388+
<dd class="app-minor-information-text">
389+
McNally<br />
390+
</dd>
391+
392+
<dt class="app-minor-information-key">
393+
Phone number
394+
</dt>
395+
<dd class="app-minor-information-text">
396+
+1 626 488 7620<br />
397+
</dd>
398+
399+
<dt class="app-minor-information-key">
400+
Email address
401+
</dt>
402+
<dd class="app-minor-information-text">
403+
wolf@wolfmcnally.com<br />
404+
</dd>
405+
406+
<dt class="app-minor-information-key">
407+
Demo user
408+
</dt>
409+
<dd class="app-minor-information-text">
410+
<br />
411+
</dd>
412+
413+
<dt class="app-minor-information-key">
414+
Demo password
415+
</dt>
416+
<dd class="app-minor-information-text">
417+
<br />
418+
</dd>
419+
420+
<dt class="app-minor-information-key">
421+
Notes
422+
</dt>
423+
<dd class="app-minor-information-text">
424+
Note: This is not a cryptocurrency wallet. It neither stores nor transmits value in any cryptocurrency.<br /><br />To test the app's scanning capabilities, you can find a PDF containing a "ur:crypto-seed" QR code attached, or at this URL: https://github.com/BlockchainCommons/GordianSeedTool-iOS/blob/master/Testing/DPAL%20Seed.pdf<br />
425+
</dd>
426+
427+
</dl>
428+
</div>
429+
311430
</body>
312431
</html>

0 commit comments

Comments
 (0)