sign method

  1. @override
FutureOr<String> sign({
  1. dynamic data,
  2. WalletStore? wallet,
  3. String? did,
  4. Map<String, dynamic>? jwk,
  5. bool detached = false,
  6. dynamic jwsHeader,
})
override

Build a (detached) JWS

Either using a combination of wallet and did or by using a private JsonWebKey jwk.

Implementation

@override
FutureOr<String> sign(
    {dynamic data,
    WalletStore? wallet,
    String? did,
    Map<String, dynamic>? jwk,
    bool detached = false,
    dynamic jwsHeader}) async {
  Map<String, dynamic> header;
  if (jwsHeader != null) {
    header = credentialToMap(jwsHeader);
    if (header['alg'] != algValue) {
      throw Exception('Unsupported Signature Algorithm ${header['alg']}');
    }
    if (header['crv'] != crvValue) {
      throw Exception('Unsupported Curve ${header['crv']}');
    }
  } else {
    header = {'alg': algValue, 'crv': crvValue};
  }

  String encodedHeader = removePaddingFromBase64(
      base64UrlEncode(utf8.encode(jsonEncode(header))));
  String encodedPayload = removePaddingFromBase64(
      base64UrlEncode(utf8.encode(data is String ? data : jsonEncode(data))));
  String signingInput = '$encodedHeader.$encodedPayload';

  Map<String, dynamic>? key;
  if (wallet != null && did != null) {
    key = await wallet.getPrivateKeyForCredentialDidAsJwk(did);
    key ??= await wallet.getPrivateKeyForConnectionDidAsJwk(did);
    if (key == null) throw Exception('No key found in Wallet');
  } else if (jwk != null) {
    key = jwk;
  } else {
    throw Exception('No private key given');
  }

  var privateKey = EcPrivateKey(
      eccPrivateKey: web3_crypto
          .bytesToUnsignedInt(base64Decode(addPaddingToBase64(key['d']))),
      curve: curves.p256k);

  var signer = privateKey.createSigner(algorithms.signing.ecdsa.sha256);
  var sig = signer.sign(ascii.encode(signingInput));

  String encodedSig = removePaddingFromBase64(base64UrlEncode(sig.data));

  return detached
      ? '$encodedHeader..$encodedSig'
      : '$signingInput.$encodedSig';
}