convert method

  1. @override
CryptData convert(
  1. String input
)
override

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;
}