in JetBrains.AppStore.NotaryApi/HttpEx.cs [28:48]
public static HttpRequestMessage WithAuthorization(this HttpRequestMessage message, AppStoreConnectAuth auth)
{
if (new PemReader(new StringReader(auth.PrivateKey)).ReadObject() is not ECPrivateKeyParameters ecPrivateKeyParameters)
throw new Exception("invalid private key format");
var q = ecPrivateKeyParameters.Parameters.G.Multiply(ecPrivateKeyParameters.D).Normalize(); // https://github.com/dotnet/core/issues/2037#issuecomment-436340605
var x = q.AffineXCoord.GetEncoded();
var y = q.AffineYCoord.GetEncoded();
var d = ecPrivateKeyParameters.D.ToByteArrayUnsigned();
var msEcp = new ECParameters { Curve = ECCurve.NamedCurves.nistP256, Q = { X = x, Y = y }, D = d };
var tokenHandler = new JsonWebTokenHandler { SetDefaultTimesOnTokenCreation = false };
var token = tokenHandler.CreateToken(new SecurityTokenDescriptor
{
SigningCredentials = new SigningCredentials(new ECDsaSecurityKey(ECDsa.Create(msEcp)) { KeyId = auth.KeyId }, SecurityAlgorithms.EcdsaSha256),
Issuer = auth.IssuerId,
IssuedAt = DateTime.UtcNow,
Expires = DateTime.UtcNow.AddMinutes(5),
Audience = NotaryClient.DefaultAppStoreConnectAudience
});
message.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
return message;
}