buildProof method
Future<Map<String, dynamic> >
buildProof(
- dynamic data,
- WalletStore wallet,
- String did, {
- String? challenge,
- String? domain,
override
Implementation
@override
Future<Map<String, dynamic>> buildProof(data, WalletStore wallet, String did,
{String? challenge, String? domain}) async {
var proofOptions = {
'@context': ecdsaRecoveryContextIri,
'type': typeName,
'proofPurpose': 'assertionMethod',
'verificationMethod': '$did#controller',
'created': DateTime.now().toUtc().toIso8601String()
};
if (domain != null) {
proofOptions['domain'] = domain;
}
if (challenge != null) {
proofOptions['challenge'] = challenge;
}
List<int> hashToSign = await _dataToHash(data);
var pOptionsHash = sha256
.convert(utf8.encode(await JsonLdProcessor.normalize(proofOptions,
options:
JsonLdOptions(safeMode: true, documentLoader: loadDocument))))
.bytes;
var hash = sha256.convert(pOptionsHash + hashToSign).bytes;
proofOptions.remove('@context');
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(Uint8List.fromList(hash), key);
while (sigArray.length != 65) {
sigArray = _buildSignatureArray(Uint8List.fromList(hash), key);
}
var critical = <String, dynamic>{};
critical['b64'] = false;
proofOptions['jws'] = '${buildJwsHeader(alg: 'ES256K-R', extra: critical)}.'
'.${base64UrlEncode(sigArray)}';
return proofOptions;
}