You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.6 KiB
163 lines
5.6 KiB
using Common.Models.DigitalSignature;
|
|
using JsonWebToken;
|
|
using Microsoft.Extensions.Logging;
|
|
using SignatureAPI.Controllers;
|
|
using System;
|
|
using System.Configuration;
|
|
using System.IO;
|
|
|
|
namespace SignatureAPI
|
|
{
|
|
public class Utlis
|
|
{
|
|
|
|
private readonly ILogger<BracController> _logger;
|
|
private string publicKeyLocation {get;set;}
|
|
private string privateKeyLocation { get; set; }
|
|
|
|
|
|
public Utlis()
|
|
{
|
|
|
|
privateKeyLocation = Path.Combine(Directory.GetCurrentDirectory(), "keys\\Brac", "Jme_private_uat.pem");
|
|
publicKeyLocation = Path.Combine(Directory.GetCurrentDirectory(), "Keys\\Brac", "BBL_public.pem");
|
|
}
|
|
public Utlis(ILogger<BracController> logger)
|
|
{
|
|
_logger = logger;
|
|
privateKeyLocation = Path.Combine(Directory.GetCurrentDirectory(), "keys\\Brac", "Jme_private_uat.pem");
|
|
publicKeyLocation = Path.Combine(Directory.GetCurrentDirectory(), "Keys\\Brac", "BBL_public.pem");
|
|
|
|
}
|
|
|
|
//public static string MapPath(string path)
|
|
//{
|
|
// return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
|
|
// path);
|
|
//}
|
|
|
|
public static string ReadWebConfig(string key, string defVal)
|
|
{
|
|
try
|
|
{
|
|
return ConfigurationManager.AppSettings[key].ToString() == null ? defVal : ConfigurationManager.AppSettings[key].ToString();
|
|
}
|
|
catch
|
|
{
|
|
return defVal;
|
|
}
|
|
}
|
|
|
|
public JwtResponse CreateToken(string payload)
|
|
{
|
|
JwtResponse jwtResponse = new JwtResponse();
|
|
|
|
|
|
_logger.LogInformation(payload);
|
|
try
|
|
{
|
|
// RSA key for signing
|
|
string pem = File.ReadAllText(privateKeyLocation);
|
|
var signatureKey = Jwk.FromPem(pem);
|
|
|
|
// RSA key for encryption
|
|
pem = File.ReadAllText(publicKeyLocation);
|
|
var encryptionKey = Jwk.FromPem(pem);
|
|
|
|
string issuer = "jme";
|
|
string subject = "api";
|
|
|
|
var now = DateTime.Now;
|
|
var unixTimeSeconds = new DateTimeOffset(now).ToUnixTimeSeconds();
|
|
|
|
var jws = new JwsDescriptor()
|
|
{
|
|
SigningKey = signatureKey,
|
|
Algorithm = SignatureAlgorithm.RsaSha256,
|
|
ExpirationTime = now.AddMinutes(1440),
|
|
IssuedAt = now,
|
|
Issuer = issuer,
|
|
NotBefore = DateTime.Now,
|
|
Subject = subject,
|
|
Payload = new JwtObject()
|
|
};
|
|
jws.Payload.Add("Payload", payload);
|
|
jws.AddClaim("iss", issuer);
|
|
|
|
// Creates a JWE descriptor with all its properties
|
|
var descriptor = new JweDescriptor<JwsDescriptor>()
|
|
{
|
|
EncryptionKey = encryptionKey,
|
|
EncryptionAlgorithm = EncryptionAlgorithm.Aes256CbcHmacSha512,
|
|
Algorithm = KeyManagementAlgorithm.RsaOaep256,
|
|
Payload = jws
|
|
};
|
|
|
|
// Generates the UTF-8 string representation of the JWT
|
|
var writer = new JwtWriter();
|
|
var token = writer.WriteTokenString(descriptor);
|
|
|
|
jwtResponse.Id = token;
|
|
jwtResponse.Extra = unixTimeSeconds.ToString();
|
|
jwtResponse.ResponseCode = "0";
|
|
return jwtResponse;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex.ToString());
|
|
|
|
jwtResponse.ResponseCode = "1";
|
|
jwtResponse.Msg = ex.ToString();
|
|
return jwtResponse;
|
|
}
|
|
}
|
|
|
|
public JwtResponse ExtractPayloadFromToken(string token)
|
|
{
|
|
JwtResponse jwtResponse = new JwtResponse();
|
|
_logger.LogInformation(token);
|
|
// string jwtResponse = string.Empty;
|
|
|
|
try
|
|
{
|
|
// RSA key for verification
|
|
string pem = File.ReadAllText(publicKeyLocation);
|
|
var signatureKey = Jwk.FromPem(pem);
|
|
|
|
// RSA key for decryption
|
|
pem = File.ReadAllText(privateKeyLocation);
|
|
var decryptionKey = Jwk.FromPem(pem);
|
|
|
|
string issuer = "jme";
|
|
|
|
var policy = new TokenValidationPolicyBuilder()
|
|
.RequireSignature(signatureKey, SignatureAlgorithm.RsaSha256)
|
|
.Build();
|
|
|
|
var reader = new JwtReader(decryptionKey);
|
|
var result = reader.TryReadToken(token, policy);
|
|
if (result.Succedeed)
|
|
{
|
|
JwtProperty jwtProp = new JwtProperty();
|
|
var hasPayload = result.Token?.Payload?.TryGetValue("Payload", out jwtProp);
|
|
|
|
if (hasPayload != null && hasPayload.Value)
|
|
{
|
|
jwtResponse.Data = jwtProp.Value;
|
|
jwtResponse.Extra = token;
|
|
jwtResponse.ResponseCode = "0";
|
|
}
|
|
}
|
|
return jwtResponse;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// write exception logs to database
|
|
_logger.LogError(ex.ToString());
|
|
jwtResponse.ResponseCode = "1";
|
|
jwtResponse.Msg = ex.ToString();
|
|
return jwtResponse;
|
|
}
|
|
}
|
|
}
|
|
}
|