commit
df661268a2
|
@ -0,0 +1,7 @@
|
|||
# Files and directories created by pub.
|
||||
.dart_tool/
|
||||
.packages
|
||||
|
||||
# Conventional directory for build output.
|
||||
build/
|
||||
.idea/
|
|
@ -0,0 +1,3 @@
|
|||
## 1.0.0
|
||||
|
||||
- Initial version.
|
|
@ -0,0 +1,30 @@
|
|||
# This file configures the static analysis results for your project (errors,
|
||||
# warnings, and lints).
|
||||
#
|
||||
# This enables the 'recommended' set of lints from `package:lints`.
|
||||
# This set helps identify many issues that may lead to problems when running
|
||||
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
|
||||
# style and format.
|
||||
#
|
||||
# If you want a smaller set of lints you can change this to specify
|
||||
# 'package:lints/core.yaml'. These are just the most critical lints
|
||||
# (the recommended set includes the core lints).
|
||||
# The core lints are also what is used by pub.dev for scoring packages.
|
||||
|
||||
include: package:lints/recommended.yaml
|
||||
|
||||
# Uncomment the following section to specify additional rules.
|
||||
|
||||
# linter:
|
||||
# rules:
|
||||
# - camel_case_types
|
||||
|
||||
# analyzer:
|
||||
# exclude:
|
||||
# - path/to/excluded/files/**
|
||||
|
||||
# For more information about the core and recommended set of lints, see
|
||||
# https://dart.dev/go/core-lints
|
||||
|
||||
# For additional information about configuring this file, see
|
||||
# https://dart.dev/guides/language/analysis-options
|
|
@ -0,0 +1,3 @@
|
|||
export "src/spectre.dart" show Spectre;
|
||||
export "src/template.dart" show Template;
|
||||
export "src/scope.dart" show Scope, Scoper, SimpleScoper, defaultScoper;
|
|
@ -0,0 +1,44 @@
|
|||
import "template.dart";
|
||||
|
||||
enum Scope {
|
||||
authentication,
|
||||
identification,
|
||||
recovery,
|
||||
}
|
||||
|
||||
Template scopeDefaultTemplate(Scope scope) {
|
||||
switch (scope) {
|
||||
case Scope.identification:
|
||||
return Template.name;
|
||||
case Scope.recovery:
|
||||
return Template.phrase;
|
||||
case Scope.authentication:
|
||||
default:
|
||||
return Template.long;
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Scoper {
|
||||
String scope(Scope scope);
|
||||
}
|
||||
|
||||
class SimpleScoper implements Scoper {
|
||||
final String _key;
|
||||
|
||||
SimpleScoper(this._key);
|
||||
|
||||
@override
|
||||
String scope(Scope scope) {
|
||||
switch (scope) {
|
||||
case Scope.identification:
|
||||
return "$_key.login";
|
||||
case Scope.recovery:
|
||||
return "$_key.answer";
|
||||
case Scope.authentication:
|
||||
default:
|
||||
return _key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var defaultScoper = SimpleScoper("com.lyndir.masterpassword");
|
|
@ -0,0 +1,84 @@
|
|||
import 'dart:typed_data';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:dart_spectre/src/scope.dart';
|
||||
import 'package:dart_spectre/src/template.dart';
|
||||
|
||||
import "package:pointycastle/export.dart";
|
||||
|
||||
final scrypt = Scrypt();
|
||||
final hmac = HMac(SHA256Digest(), 64);
|
||||
|
||||
class Spectre {
|
||||
final String _name;
|
||||
final String _secret;
|
||||
late Scoper _scoper;
|
||||
|
||||
late Uint8List _key;
|
||||
|
||||
Spectre(this._name, this._secret, [Scoper? scoper]) {
|
||||
_scoper = scoper ?? defaultScoper;
|
||||
_key = _userKey();
|
||||
}
|
||||
|
||||
Uint8List _userKey() {
|
||||
var nameBytes = utf8.encode(_name);
|
||||
var secretBytes = utf8.encode(_secret);
|
||||
var keyScope = utf8.encode(_scoper.scope(Scope.authentication));
|
||||
|
||||
var nameBytesLen = nameBytes.length;
|
||||
var keySalt = keyScope +
|
||||
List.from([
|
||||
nameBytesLen >> 24,
|
||||
nameBytesLen >> 16,
|
||||
nameBytesLen >> 8,
|
||||
nameBytesLen,
|
||||
]) +
|
||||
nameBytes;
|
||||
|
||||
scrypt.init(ScryptParameters(32768, 8, 2, 64, Uint8List.fromList(keySalt)));
|
||||
return scrypt.process(Uint8List.fromList(secretBytes));
|
||||
}
|
||||
|
||||
Uint8List _siteKey(String name, int counter, Scope scope) {
|
||||
var nameBytes = utf8.encode(name);
|
||||
var scopeBytes = utf8.encode(_scoper.scope(scope));
|
||||
|
||||
var nameBytesLen = nameBytes.length;
|
||||
var keySalt = scopeBytes +
|
||||
List.from([
|
||||
nameBytesLen >> 24,
|
||||
nameBytesLen >> 16,
|
||||
nameBytesLen >> 8,
|
||||
nameBytesLen,
|
||||
]) +
|
||||
nameBytes +
|
||||
List.from([
|
||||
counter >> 24,
|
||||
counter >> 16,
|
||||
counter >> 8,
|
||||
counter,
|
||||
]);
|
||||
|
||||
hmac.init(KeyParameter(_key));
|
||||
return hmac.process(Uint8List.fromList(keySalt));
|
||||
}
|
||||
|
||||
String site(String siteName, {Template? templateType, int counter = 1, Scope scope = Scope.authentication}) {
|
||||
templateType = templateType ?? scopeDefaultTemplate(scope);
|
||||
|
||||
var siteKey = _siteKey(siteName, counter, scope);
|
||||
|
||||
var templateSet = templates[templateType]!;
|
||||
var template = templateSet[siteKey[0]%templateSet.length];
|
||||
|
||||
var out = StringBuffer();
|
||||
var idx = 0;
|
||||
for (var rune in template.runes) {
|
||||
var chars = characters[String.fromCharCode(rune)]!;
|
||||
var char = chars[siteKey[++idx]%chars.length];
|
||||
out.write(char);
|
||||
}
|
||||
return out.toString();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
enum Template {
|
||||
maximum,
|
||||
long,
|
||||
medium,
|
||||
short,
|
||||
pin,
|
||||
name,
|
||||
phrase,
|
||||
basic,
|
||||
}
|
||||
|
||||
const Map<Template, List<String>> templates = {
|
||||
Template.maximum: [
|
||||
"anoxxxxxxxxxxxxxxxxx",
|
||||
"axxxxxxxxxxxxxxxxxno",
|
||||
],
|
||||
Template.long: [
|
||||
"CvcvnoCvcvCvcv",
|
||||
"CvcvCvcvnoCvcv",
|
||||
"CvcvCvcvCvcvno",
|
||||
"CvccnoCvcvCvcv",
|
||||
"CvccCvcvnoCvcv",
|
||||
"CvccCvcvCvcvno",
|
||||
"CvcvnoCvccCvcv",
|
||||
"CvcvCvccnoCvcv",
|
||||
"CvcvCvccCvcvno",
|
||||
"CvcvnoCvcvCvcc",
|
||||
"CvcvCvcvnoCvcc",
|
||||
"CvcvCvcvCvccno",
|
||||
"CvccnoCvccCvcv",
|
||||
"CvccCvccnoCvcv",
|
||||
"CvccCvccCvcvno",
|
||||
"CvcvnoCvccCvcc",
|
||||
"CvcvCvccnoCvcc",
|
||||
"CvcvCvccCvccno",
|
||||
"CvccnoCvcvCvcc",
|
||||
"CvccCvcvnoCvcc",
|
||||
"CvccCvcvCvccno",
|
||||
],
|
||||
Template.medium: [
|
||||
"CvcnoCvc",
|
||||
"CvcCvcno",
|
||||
],
|
||||
Template.short: [
|
||||
"Cvcn",
|
||||
],
|
||||
Template.pin: [
|
||||
"nnnn",
|
||||
],
|
||||
Template.name: [
|
||||
"cvccvcvcv",
|
||||
],
|
||||
Template.phrase: [
|
||||
"cvcc cvc cvccvcv cvc",
|
||||
"cvc cvccvcvcv cvcv",
|
||||
"cv cvccv cvc cvcvccv",
|
||||
],
|
||||
Template.basic: [
|
||||
"aaanaaan",
|
||||
"aannaaan",
|
||||
"aaannaaa",
|
||||
],
|
||||
};
|
||||
|
||||
const Map<String, String> characters = {
|
||||
"V": "AEIOU",
|
||||
"C": "BCDFGHJKLMNPQRSTVWXYZ",
|
||||
"v": "aeiou",
|
||||
"c": "bcdfghjklmnpqrstvwxyz",
|
||||
"A": "AEIOUBCDFGHJKLMNPQRSTVWXYZ",
|
||||
"a": "AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz",
|
||||
"n": "0123456789",
|
||||
"o": r"@&%?,=[]_:-+*$#!'^~;()/.",
|
||||
"x":
|
||||
r"AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz0123456789!@#$%^&*()",
|
||||
" ": " ",
|
||||
};
|
|
@ -0,0 +1,362 @@
|
|||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "30.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.7.0"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.8.2"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
cli_util:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cli_util
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.3.5"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
coverage:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: coverage
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.1.2"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: io
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.6.3"
|
||||
lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: lints
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.12.11"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.7.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
node_preamble:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: node_preamble
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.4.0"
|
||||
pointycastle:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: pointycastle
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.4.0"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
shelf_packages_handler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_packages_handler
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
shelf_static:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_static
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
source_map_stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_map_stack_trace
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
source_maps:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_maps
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.10.10"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
test:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: test
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.19.3"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.7"
|
||||
test_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_core
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.8"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "7.4.0"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
webkit_inspection_protocol:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webkit_inspection_protocol
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
xml:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: xml
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.3.1"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
sdks:
|
||||
dart: ">=2.14.4 <3.0.0"
|
|
@ -0,0 +1,16 @@
|
|||
name: dart_spectre
|
||||
description: A simple command-line application.
|
||||
version: 1.0.0
|
||||
# homepage: https://www.example.com
|
||||
|
||||
environment:
|
||||
sdk: '>=2.14.4 <3.0.0'
|
||||
|
||||
|
||||
dependencies:
|
||||
pointycastle: ^3.4.0
|
||||
|
||||
dev_dependencies:
|
||||
lints: ^1.0.0
|
||||
test: ^1.19.3
|
||||
xml: ^5.3.1
|
|
@ -0,0 +1,17 @@
|
|||
import 'package:dart_spectre/spectre.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test("Example", () {
|
||||
var spectre = Spectre("Robert Lee Mitchell", "banana colored duckling");
|
||||
var pw = spectre.site("masterpasswordapp.com");
|
||||
expect(pw, equals("Jejr5[RepuSosp"));
|
||||
});
|
||||
|
||||
test("Example_second", () {
|
||||
var scoper = SimpleScoper("com.jojodev.jolheiser");
|
||||
var spectre = Spectre("Robert Lee Mitchell", "banana colored duckling", scoper);
|
||||
var pw = spectre.site("jojodev.com", scope: Scope.identification, templateType: Template.maximum, counter: 2);
|
||||
expect(pw, equals("Ig^JIcxD!*)TbefJBi6-"));
|
||||
});
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:xml/xml.dart';
|
||||
|
||||
import 'package:dart_spectre/spectre.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() async {
|
||||
var tests = await File("spectre_tests.xml").readAsString();
|
||||
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
<tests>
|
||||
<!-- Default values for all parameters. -->
|
||||
<case id="default">
|
||||
<algorithm>-1</algorithm>
|
||||
<userName>Robert Lee Mitchell</userName>
|
||||
<userSecret>banana colored duckling</userSecret>
|
||||
<siteName>spectre.app</siteName>
|
||||
<resultType>Long</resultType>
|
||||
<keyCounter>1</keyCounter>
|
||||
<keyPurpose>Authentication</keyPurpose>
|
||||
<result><!-- abstract --></result>
|
||||
</case>
|
||||
|
||||
<!-- Algorithm 3 -->
|
||||
<case id="v3" parent="default">
|
||||
<algorithm>3</algorithm>
|
||||
<result>ReqoCenuXonu1?</result>
|
||||
</case>
|
||||
<case id="v3_mb_userName" parent="v3">
|
||||
<userName>⛄</userName>
|
||||
<keyID>1717AA1F9BF5BA56CD0965CDA3D78E6D2E6A1EA8C067A8EA621F3DDAD4A87EB8</keyID>
|
||||
<result>Wewa9$YaqdDaje</result>
|
||||
</case>
|
||||
<case id="v3_mb_userSecret" parent="v3">
|
||||
<userSecret>⛄</userSecret>
|
||||
<keyID>351432B8528A5ABECAB768CA95015097DE76FE14C41E10AF36C67DCFB8917E08</keyID>
|
||||
<result>TeweBacg0$Tobe</result>
|
||||
</case>
|
||||
<case id="v3_mb_siteName" parent="v3">
|
||||
<siteName>⛄</siteName>
|
||||
<result>LiheCuwhSerz6)</result>
|
||||
</case>
|
||||
<case id="v3_loginName" parent="v3">
|
||||
<keyPurpose>Identification</keyPurpose>
|
||||
<resultType>Name</resultType>
|
||||
<result>wesruqori</result>
|
||||
</case>
|
||||
<case id="v3_securityAnswer" parent="v3">
|
||||
<keyPurpose>Recovery</keyPurpose>
|
||||
<resultType>Phrase</resultType>
|
||||
<result>zowp quy roxzuyu qim</result>
|
||||
</case>
|
||||
<case id="v3_type_maximum" parent="v3">
|
||||
<resultType>Maximum</resultType>
|
||||
<result>FB22U#U*LPFWlWxaxK2.</result>
|
||||
</case>
|
||||
<case id="v3_type_medium" parent="v3">
|
||||
<resultType>Medium</resultType>
|
||||
<result>ReqMon0)</result>
|
||||
</case>
|
||||
<case id="v3_type_basic" parent="v3">
|
||||
<resultType>Basic</resultType>
|
||||
<result>FLI88cDK</result>
|
||||
</case>
|
||||
<case id="v3_type_short" parent="v3">
|
||||
<resultType>Short</resultType>
|
||||
<result>Req8</result>
|
||||
</case>
|
||||
<case id="v3_type_pin" parent="v3">
|
||||
<resultType>PIN</resultType>
|
||||
<result>3648</result>
|
||||
</case>
|
||||
<case id="v3_type_name" parent="v3">
|
||||
<resultType>Name</resultType>
|
||||
<result>reqmonajo</result>
|
||||
</case>
|
||||
<case id="v3_type_phrase" parent="v3">
|
||||
<resultType>Phrase</resultType>
|
||||
<result>re monnu mit jededda</result>
|
||||
</case>
|
||||
<case id="v3_counter_ceiling" parent="v3">
|
||||
<keyCounter>4294967295</keyCounter>
|
||||
<result>ZurdYoda6:Jogs</result>
|
||||
</case>
|
||||
</tests>
|
Loading…
Reference in New Issue