convert method
Converts input
and returns the result of the conversion.
Implementation
@override
CryptData convert(String input) {
String id, name, value;
String? version, salt, hash;
Map<String, String>? params;
Iterable<String> parts = input.split('\$');
if (parts.isEmpty) {
throw FormatException('Empty string');
}
parts = parts.skip(1);
if (parts.isEmpty) {
throw FormatException('Invalid PHC string format');
}
id = parts.first;
parts = parts.skip(1);
if (parts.isNotEmpty && parts.first.startsWith('v=')) {
version = parts.first.substring(2);
parts = parts.skip(1);
}
if (parts.isNotEmpty && parts.first.contains('=')) {
params = {};
for (final kv in parts.first.split(',')) {
var pair = kv.split('=');
if (pair.length != 2) {
throw FormatException('Invalid param format: $kv');
}
name = pair[0];
value = pair[1];
params[name] = value;
}
parts = parts.skip(1);
}
if (parts.isNotEmpty) {
salt = parts.first;
parts = parts.skip(1);
}
if (parts.isNotEmpty) {
hash = parts.first;
parts = parts.skip(1);
}
if (parts.isNotEmpty) {
throw FormatException('Invalid PHC string format');
}
var data = CryptData(
id,
version: version,
salt: salt,
hash: hash,
params: params,
);
try {
data.validate();
} on ArgumentError catch (e) {
throw FormatException(e.message, e);
}
return data;
}