buildProof method

  1. @override
Future<Map<String, dynamic>> buildProof(
  1. dynamic data,
  2. WalletStore wallet,
  3. String did, {
  4. String? challenge,
  5. String? domain,
})
override

Implementation

@override
Future<Map<String, dynamic>> buildProof(data, WalletStore wallet, String did,
    {String? challenge, String? domain}) async {
  var proofOptions = {
    'type': typeName,
    'proofPurpose': 'assertionMethod',
    'verificationMethod': did,
    'created': DateTime.now().toUtc().toIso8601String()
  };
  if (domain != null) {
    proofOptions['domain'] = domain;
  }
  if (challenge != null) {
    proofOptions['challenge'] = challenge;
  }
  String pOptions = jsonEncode(proofOptions);

  List<int> hashToSign = _dataToHash(data);

  var pOptionsHash = sha256.convert(utf8.encode(pOptions)).bytes;
  var hash = sha256.convert(pOptionsHash + hashToSign).bytes;
  var privateKeyHex = await wallet.getPrivateKeyForCredentialDid(did);
  privateKeyHex ??= await wallet.getPrivateKeyForConnectionDid(did);
  if (privateKeyHex == null) throw Exception('Could not find a private key');
  var key = EthPrivateKey.fromHex(privateKeyHex);

  var sigArray = _buildSignatureArray(hash as Uint8List, key);
  while (sigArray.length != 65) {
    sigArray = _buildSignatureArray(hash, key);
  }

  var critical = <String, dynamic>{};
  critical['b64'] = false;
  proofOptions['jws'] = '${buildJwsHeader(alg: 'ES256K-R', extra: critical)}.'
      '.${base64UrlEncode(sigArray)}';

  return proofOptions;
}