Skip to content

Commit 3b5f877

Browse files
authored
Merge pull request #2 from cake-tech/fix-legacy-seed-for-non-english
Fix issues with converting to legacy seed
2 parents df1c963 + 1b1977d commit 3b5f877

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.0.4
2+
3+
- Fix issues with convert to legacy seed for other languages other than english
4+
15
## 0.0.3
26

37
- Add Wownero support

lib/src/mnemonics/legacy/legacy_seed_lang.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:convert';
2+
13
import 'package:hashlib/hashlib.dart';
24
import 'package:polyseed/src/mnemonics/legacy/de_lang.dart';
35
import 'package:polyseed/src/mnemonics/legacy/en_lang.dart';
@@ -121,10 +123,12 @@ class LegacySeedLang {
121123
int _getChecksumIndex(List<String> words, int prefixLen) {
122124
var trimmedWords = '';
123125
for (var i = 0; i < words.length; i++) {
124-
trimmedWords += words[i].substring(0, prefixLen);
126+
final actualPrefixLength =
127+
words[i].length > prefixLen ? prefixLen : words[i].length;
128+
trimmedWords += words[i].substring(0, actualPrefixLength);
125129
}
126130

127-
var checksum = trimmedWords.crc32code();
131+
var checksum = trimmedWords.crc32code(Encoding.getByName('utf-8'));
128132
var index = (checksum % words.length);
129133
return index;
130134
}

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: polyseed
22
description: A pure dart implementation of the 16-word seed scheme for monero
3-
version: 0.0.3
3+
version: 0.0.4
44
homepage: https://cakelabs.com
55
repository: https://github.com/cake-tech/polyseed_dart
66
issue_tracker: https://github.com/cake-tech/polyseed_dart/issues

test/polyseed_test.dart

+33-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:convert';
22

33
import 'package:polyseed/polyseed.dart';
4+
import 'package:polyseed/src/mnemonics/es_lang.dart';
45
import 'package:test/test.dart';
56

67
void main() {
@@ -16,6 +17,8 @@ void main() {
1617
final expectedBirthday = 1693622412;
1718
final expectedLegacySeed =
1819
"avidly chlorine gave yeti ramped certain hybrid comb governing amply hinder pamphlet offend geometry narrate unopened robot epoxy annoyed glide ingested ascend were austere unopened";
20+
final expectedLegacySeedEs =
21+
"apoyo bestia desnudo revés meter beso este bonsái duelo algodón engaño llaga lámina diamante imperio pobre mortal cochino altar diva fábrica ángulo recurso aplicar algodón";
1922

2023
test('Decode and test for correct birthday', () {
2124
final seed = Polyseed.decode(expectedSeedString, enLang, coin);
@@ -71,12 +74,36 @@ void main() {
7174
expect(Polyseed.load(serializedSeed).birthday, seed.birthday);
7275
});
7376

74-
test('Generate a 25 Word LegacySeed from a Seed', () {
75-
final seed = Polyseed.decode(expectedSeedString, enLang, coin);
76-
final keyBytes = seed.generateKey(coin, 32);
77-
final legacySeed = LegacySeedLang.getByName("English")
78-
.encodePhrase(keyBytes.toHexString());
79-
expect(legacySeed, expectedLegacySeed);
77+
group('Convert to Legacy Seed', () {
78+
test('Generate a 25 Word english LegacySeed from a Seed', () {
79+
final seed = Polyseed.decode(expectedSeedString, enLang, coin);
80+
final keyBytes = seed.generateKey(coin, 32);
81+
final legacySeed = LegacySeedLang.getByName("English")
82+
.encodePhrase(keyBytes.toHexString());
83+
expect(legacySeed, expectedLegacySeed);
84+
});
85+
86+
test('Generate a 25 Word spanish LegacySeed from a Seed', () {
87+
final seed = Polyseed.decode(expectedSeedString, enLang, coin);
88+
final keyBytes = seed.generateKey(coin, 32);
89+
final legacySeed = LegacySeedLang.getByEnglishName("Spanish")
90+
.encodePhrase(keyBytes.toHexString());
91+
expect(legacySeed, expectedLegacySeedEs);
92+
});
93+
94+
test(
95+
'EdgeCase: Generate a 25 Word Spanish LegacySeed from a Seed with words smaller than the prefix length of the word list',
96+
() {
97+
final seed = Polyseed.decode(
98+
"remedio foca sujeto veneno bello humilde surco crear típico chacal célula empate moreno varón verde masa",
99+
esLang,
100+
coin);
101+
final keyBytes = seed.generateKey(coin, 32);
102+
final legacySeed = LegacySeedLang.getByEnglishName("Spanish")
103+
.encodePhrase(keyBytes.toHexString());
104+
expect(legacySeed,
105+
"remedio haz ébano lobo orden celda pezuña regreso ardilla estar acelga fallo punto nación hada quitar ancla obeso piedra pausa helio fuente joroba pista quitar");
106+
});
80107
});
81108
});
82109
}

0 commit comments

Comments
 (0)