Skip to content

Commit

Permalink
Merge branch 'main' into update-dotnet-8
Browse files Browse the repository at this point in the history
  • Loading branch information
raymens authored Feb 19, 2024
2 parents 709b1c4 + cfad088 commit 8264f1a
Show file tree
Hide file tree
Showing 27 changed files with 737 additions and 388 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build-apps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ jobs:
fi
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 20.x
cache: npm
cache-dependency-path: mobile/package-lock.json

Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Build
run: dotnet build
Expand All @@ -30,19 +30,19 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Backend tests
run: dotnet test

frontend_test:
runs-on: ubuntu-latest
container:
image: node:16.15
image: node:20

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Install dependencies
run: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
using Core.Domain.Exceptions;
using Core.Presentation.Models;
using Newtonsoft.Json.Linq;
using NSec.Cryptography;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using static Core.Domain.Constants;

Expand Down Expand Up @@ -67,7 +67,6 @@ public async Task Invoke(HttpContext context)
JObject payloadJson = JObject.Parse(payloadString);

byte[] publicKeyBytes = Convert.FromBase64String(publicKeyHeader);
var publicKey = Encoding.UTF8.GetString(publicKeyBytes);

// Get the current Unix UTC timestamp (rounded to 30 seconds)
long currentTimestamp = (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
Expand Down Expand Up @@ -99,7 +98,7 @@ public async Task Invoke(HttpContext context)

if (isCurrentTime || isWithin30Seconds)
{
if (VerifySignature(publicKey, payloadBytes, signatureBytes))
if (VerifySignature(publicKeyBytes, payloadBytes, signatureBytes))
{
await _next(context); // Signature is valid, continue with the request
}
Expand All @@ -119,12 +118,12 @@ public async Task Invoke(HttpContext context)
}
catch (CustomErrorsException ex)
{
_logger.LogError("Unknown exception thrown: {message}", ex.Message);
_logger.LogError(ex, "Unknown exception thrown: {message}", ex.Message);
throw;
}
catch (Exception ex)
{
_logger.LogError("Unknown exception thrown: {message}", ex.Message);
_logger.LogError(ex, "Unknown exception thrown: {message}", ex.Message);
var customErrors = new CustomErrors(new CustomError("Forbidden", ex.Message, ex.Source!));
await WriteCustomErrors(context.Response, customErrors, (int)HttpStatusCode.Forbidden);
}
Expand All @@ -140,22 +139,14 @@ private static async Task WriteCustomErrors(HttpResponse httpResponse, CustomErr
await httpResponse.WriteAsync(json);
}

public static bool VerifySignature(string publicKey, byte[] payload, byte[] signature)
public static bool VerifySignature(byte[] publicKey, byte[] payload, byte[] signature)
{
try
{
using (RSA rsa = RSA.Create())
{
// Import the public key (assuming it's in PEM format)
rsa.ImportFromPem(publicKey);

// Verify the signature using the SHA256 algorithm and PKCS1 padding
var isValidSignature = rsa.VerifyData(payload, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

return isValidSignature;
}
var pubKeyImport = PublicKey.Import(SignatureAlgorithm.Ed25519, publicKey, KeyBlobFormat.RawPublicKey);
return SignatureAlgorithm.Ed25519.Verify(pubKeyImport, payload, signature);
}
catch (CryptographicException)
catch
{
// Signature verification failed
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Core.Domain.Exceptions;
using Microsoft.Extensions.Logging;
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;

namespace Core.Infrastructure.Nexus.SigningService
Expand Down Expand Up @@ -33,8 +34,17 @@ public async Task<string> GenerateKeyPair(Blockchain blockchain)
var crypto = MapBlockchainToCrypto(blockchain);
var model = new CreateSigningPairRequest(LABELPARTNERCODE, crypto);

var response = await _httpClient.PostAsJsonAsync
($"CreateSigningPair?code={_settings.CreateSigningPairKey}", model);
var jsonSerializerOptions = new JsonSerializerOptions(JsonSerializerOptions.Default);
jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

var jsonObj = Newtonsoft.Json.JsonConvert.SerializeObject(model);

// send json as json
var httpContent = new StringContent(jsonObj, Encoding.UTF8, "application/json");

_logger.LogInformation("Posting model: {json}", jsonObj);

var response = await _httpClient.PostAsync($"CreateSigningPair?code={_settings.CreateSigningPairKey}", httpContent);

var json = await response.Content.ReadAsStringAsync();

Expand All @@ -61,8 +71,18 @@ public async Task<string> Sign(SignRequest request)
var model = new CreateSignatureRequest
(LABELPARTNERCODE, crypto, new string[] { request.PublicKey }, request.TransactionEnvelope, _settings.StellarNetworkPassphrase);

var response = await _httpClient.PostAsJsonAsync
($"CreateSignature?code={_settings.CreateSignatureKey}", model);

var jsonSerializerOptions = new JsonSerializerOptions(JsonSerializerOptions.Default);
jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

var jsonObj = Newtonsoft.Json.JsonConvert.SerializeObject(model);

// send json as json
var httpContent = new StringContent(jsonObj, Encoding.UTF8, "application/json");

_logger.LogInformation("Posting model: {json}", jsonObj);

var response = await _httpClient.PostAsync($"CreateSignature?code={_settings.CreateSignatureKey}", httpContent);

var json = await response.Content.ReadAsStringAsync();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0

using Core.API.ResponseHandling;
using NSec.Cryptography;
using System.Security.Cryptography;
using System.Text;

Expand All @@ -14,16 +15,15 @@ public class SignatureVerificationMiddlewareTests
[TestMethod]
public void VerifySignature_ValidSignature_ReturnsTrue()
{
string publicKey = "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnLQKInx7UeHsc99RPHHT\r\ndBs5jQZoTOswJc6pE4+dggmbf4b/XKDxNrKCpHVXMKRrotGdHKv9xOMhJFHPyZHz\r\nd2ZPjyeakERGjS2ZKBCo1ysYnP0bROdoNAEbAIOyMutiTkYEuf/a7Rr5ptJQ323s\r\n3hVLOzdLlHEisjTkHUsDJATg8J8EHx/pRJD48+Q0LHkArhmbIKol4lDRe2ODfgko\r\n+bVQxtv1/ZiGhDsWUPNGss1hXmXBQCzx4VXgi6DfeTkn/GyyaonumVEkaR+KUKxZ\r\nwRvezSnUfGcY0h/HG/TMs1EGfUecgI6bCsIv6lD5U4AMkHvt4e+dckRgSV5cnJ+f\r\ngwIDAQAB\r\n-----END PUBLIC KEY-----";
string privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEpAIBAAKCAQEAnLQKInx7UeHsc99RPHHTdBs5jQZoTOswJc6pE4+dggmbf4b/\r\nXKDxNrKCpHVXMKRrotGdHKv9xOMhJFHPyZHzd2ZPjyeakERGjS2ZKBCo1ysYnP0b\r\nROdoNAEbAIOyMutiTkYEuf/a7Rr5ptJQ323s3hVLOzdLlHEisjTkHUsDJATg8J8E\r\nHx/pRJD48+Q0LHkArhmbIKol4lDRe2ODfgko+bVQxtv1/ZiGhDsWUPNGss1hXmXB\r\nQCzx4VXgi6DfeTkn/GyyaonumVEkaR+KUKxZwRvezSnUfGcY0h/HG/TMs1EGfUec\r\ngI6bCsIv6lD5U4AMkHvt4e+dckRgSV5cnJ+fgwIDAQABAoIBAQCXZIl2D/XEghTD\r\nTblaQE4eGj9btBkIVyBJJoPK1jFB9K46Yt5LS2I/ie8VnBgEcpVa1FCJ5tBha14V\r\njMTG5S7m5/1tPMHjJ1NSCf+x6YZ1erlo0k+KHldaBsdjk9iRwT9Uh+kBGeMUt78C\r\nIKbpdXYmiUQJjb6DR1pR+S957YK3REro6HWBhYwRAnPCukchaD6efaUN2yoqm/7g\r\nMy5avNFeJ+3VaR+RejylZd+IoGIAYRW7Lgu5x2g9SD1O2HaX/tfPj9ouz+5c8J2e\r\nciNnDqI8M78zhgpcFvgoFdHNL+UiSUEGen+ZCT9JiPNEH/AI2zxc8TtCjIpA0qJk\r\nJ/MxRP6BAoGBANpd9+wC/meOcsOPBZYra/vIc7Oo2OVOrdYZQQ89so2ZlbtSoPP6\r\n9wN84d6M56oulApE4F4zdlgojSWo3S/4qN93ZptR1vuSIml7eAkH9BQJSnlHgFjf\r\ntdF1zcXV4bSxnqkdZh5i77aioVm0fCkdJgQyRbewiqp7Jp/z5dqpseYRAoGBALe1\r\njmeXZ3bIzbq33EO+pc3NIQODhpDiRsZJfrneH7tm4N2UWp8vBKBqjwmMxFO4LMPx\r\nH0amnhtLvq0cOCgVyN9zekTWtIuyOw9KKfrmJ3zfRY1oRV2Fn+h6dWIveWj1hm0H\r\n6yv5xznaUuNzlRubXshWyC/eyMPAUatYrf5tKYhTAoGAMt5/GcDcyPz7KSlRMNlu\r\nr1nT8j9cP5bjkiOR7139EVV89wVZr1yAXJSj/XcvpIpzPC0tY2RzpjfUIbjDxiAU\r\nHvKuuXIINdSmJZJ4tQngRyae7b/FW27J6UCbLgIUMUbLYjQSDPQZSZ97HO2Zmu5K\r\nY+HeMdtzgiFsLwjfO+AaLDECgYAO9SFbHeC2szLM+RteCK/HSeRePN8//Kx2iJVg\r\n3M0InR/B6spWG6XsycBLrsJtbpl2erNpNTe6UTh9L8cCvINWbjiOUkzw8toMLKWu\r\nX/7nE+a91LeRHcgfTZkxHVxtR1BioDptojCubTBChK6nSMc22JoEC8ec6JO9t8Ky\r\n7IBtMQKBgQDWIihg/WYVZh6a7LQ2LayHJ39JvOUhOPUK0LN3hxlUnIiJWczJf41i\r\nt8c/ooKmrFMGh3Nc9P42wqdsRQrnt1de3otGNQmAgrO65QZbOvr7hhSp6znb6d+T\r\nytUeiYdFC/xmBbQoZ6Fz3r72T36VWuRatULkYrOAGTKlwtWKD3oByQ==\r\n-----END RSA PRIVATE KEY-----";
byte[] payload = Encoding.UTF8.GetBytes("{\"timestamp\": 1700136384437}");
byte[] signature;
var publicKeyB64 = "gwZ+LyQ+VLaIsWeSq3QFh+WaZHNgl07pXul++BsezoY=";
var publicKey = Convert.FromBase64String(publicKeyB64);
var privateKeyB64 = "bi3SJ0gfnWXpL3vkJIdgFetU5ZgmIGCYrLxEL9Nx2rQ=";
var privateKey = Convert.FromBase64String(privateKeyB64);
var payload = Encoding.UTF8.GetBytes("{\"timestamp\": 1700136384437}");

using (RSA rsa = RSA.Create())
{
rsa.ImportFromPem(privateKey);
signature = rsa.SignData(payload, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
var key = Key.Import(SignatureAlgorithm.Ed25519, privateKey, KeyBlobFormat.RawPrivateKey);

var signature = SignatureAlgorithm.Ed25519.Sign(key, payload);

// Act
bool result = SignatureVerificationMiddleware.VerifySignature(publicKey, payload, signature);
Expand All @@ -35,16 +35,15 @@ public void VerifySignature_ValidSignature_ReturnsTrue()
[TestMethod]
public void VerifySignature_InvalidSignature_ReturnsFalse()
{
string publicKey = "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnLQKInx7UeHsc99RPHHT\r\ndBs5jQZoTOswJc6pE4+dggmbf4b/XKDxNrKCpHVXMKRrotGdHKv9xOMhJFHPyZHz\r\nd2ZPjyeakERGjS2ZKBCo1ysYnP0bROdoNAEbAIOyMutiTkYEuf/a7Rr5ptJQ323s\r\n3hVLOzdLlHEisjTkHUsDJATg8J8EHx/pRJD48+Q0LHkArhmbIKol4lDRe2ODfgko\r\n+bVQxtv1/ZiGhDsWUPNGss1hXmXBQCzx4VXgi6DfeTkn/GyyaonumVEkaR+KUKxZ\r\nwRvezSnUfGcY0h/HG/TMs1EGfUecgI6bCsIv6lD5U4AMkHvt4e+dckRgSV5cnJ+f\r\ngwIDAQAB\r\n-----END PUBLIC KEY-----";
string privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEpAIBAAKCAQEAnLQKInx7UeHsc99RPHHTdBs5jQZoTOswJc6pE4+dggmbf4b/\r\nXKDxNrKCpHVXMKRrotGdHKv9xOMhJFHPyZHzd2ZPjyeakERGjS2ZKBCo1ysYnP0b\r\nROdoNAEbAIOyMutiTkYEuf/a7Rr5ptJQ323s3hVLOzdLlHEisjTkHUsDJATg8J8E\r\nHx/pRJD48+Q0LHkArhmbIKol4lDRe2ODfgko+bVQxtv1/ZiGhDsWUPNGss1hXmXB\r\nQCzx4VXgi6DfeTkn/GyyaonumVEkaR+KUKxZwRvezSnUfGcY0h/HG/TMs1EGfUec\r\ngI6bCsIv6lD5U4AMkHvt4e+dckRgSV5cnJ+fgwIDAQABAoIBAQCXZIl2D/XEghTD\r\nTblaQE4eGj9btBkIVyBJJoPK1jFB9K46Yt5LS2I/ie8VnBgEcpVa1FCJ5tBha14V\r\njMTG5S7m5/1tPMHjJ1NSCf+x6YZ1erlo0k+KHldaBsdjk9iRwT9Uh+kBGeMUt78C\r\nIKbpdXYmiUQJjb6DR1pR+S957YK3REro6HWBhYwRAnPCukchaD6efaUN2yoqm/7g\r\nMy5avNFeJ+3VaR+RejylZd+IoGIAYRW7Lgu5x2g9SD1O2HaX/tfPj9ouz+5c8J2e\r\nciNnDqI8M78zhgpcFvgoFdHNL+UiSUEGen+ZCT9JiPNEH/AI2zxc8TtCjIpA0qJk\r\nJ/MxRP6BAoGBANpd9+wC/meOcsOPBZYra/vIc7Oo2OVOrdYZQQ89so2ZlbtSoPP6\r\n9wN84d6M56oulApE4F4zdlgojSWo3S/4qN93ZptR1vuSIml7eAkH9BQJSnlHgFjf\r\ntdF1zcXV4bSxnqkdZh5i77aioVm0fCkdJgQyRbewiqp7Jp/z5dqpseYRAoGBALe1\r\njmeXZ3bIzbq33EO+pc3NIQODhpDiRsZJfrneH7tm4N2UWp8vBKBqjwmMxFO4LMPx\r\nH0amnhtLvq0cOCgVyN9zekTWtIuyOw9KKfrmJ3zfRY1oRV2Fn+h6dWIveWj1hm0H\r\n6yv5xznaUuNzlRubXshWyC/eyMPAUatYrf5tKYhTAoGAMt5/GcDcyPz7KSlRMNlu\r\nr1nT8j9cP5bjkiOR7139EVV89wVZr1yAXJSj/XcvpIpzPC0tY2RzpjfUIbjDxiAU\r\nHvKuuXIINdSmJZJ4tQngRyae7b/FW27J6UCbLgIUMUbLYjQSDPQZSZ97HO2Zmu5K\r\nY+HeMdtzgiFsLwjfO+AaLDECgYAO9SFbHeC2szLM+RteCK/HSeRePN8//Kx2iJVg\r\n3M0InR/B6spWG6XsycBLrsJtbpl2erNpNTe6UTh9L8cCvINWbjiOUkzw8toMLKWu\r\nX/7nE+a91LeRHcgfTZkxHVxtR1BioDptojCubTBChK6nSMc22JoEC8ec6JO9t8Ky\r\n7IBtMQKBgQDWIihg/WYVZh6a7LQ2LayHJ39JvOUhOPUK0LN3hxlUnIiJWczJf41i\r\nt8c/ooKmrFMGh3Nc9P42wqdsRQrnt1de3otGNQmAgrO65QZbOvr7hhSp6znb6d+T\r\nytUeiYdFC/xmBbQoZ6Fz3r72T36VWuRatULkYrOAGTKlwtWKD3oByQ==\r\n-----END RSA PRIVATE KEY-----";
byte[] payload = Encoding.UTF8.GetBytes("{\"timestamp\": 1700136384437}");
byte[] validSignature;

using (RSA rsa = RSA.Create())
{
rsa.ImportFromPem(privateKey);
validSignature = rsa.SignData(payload, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
var publicKeyB64 = "gwZ+LyQ+VLaIsWeSq3QFh+WaZHNgl07pXul++BsezoY=";
var publicKey = Convert.FromBase64String(publicKeyB64);
var privateKeyB64 = "bi3SJ0gfnWXpL3vkJIdgFetU5ZgmIGCYrLxEL9Nx2rQ=";
var privateKey = Convert.FromBase64String(privateKeyB64);
var payload = Encoding.UTF8.GetBytes("{\"timestamp\": 1700136384437}");

var key = Key.Import(SignatureAlgorithm.Ed25519, privateKey, KeyBlobFormat.RawPrivateKey);

var validSignature = SignatureAlgorithm.Ed25519.Sign(key, payload);

// Modifying the payload to create an invalid signature
byte[] modifiedPayload = Encoding.UTF8.GetBytes("{\"timestamp\": 17001363844}");
Expand Down
9 changes: 4 additions & 5 deletions mobile/.env.development
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
APP_NAME="[Dev] Quantoz Blockchain Solutions"
IOS_BUNDLE_IDENTIFIER="com.quantoz.qbs.dev"
ANDROID_PACKAGE_NAME="com.quantoz.qbs.dev"
SCHEME="quantoz.qbs.dev"

APP_NAME="[Dev] Quantoz Blockchain Services"
IOS_BUNDLE_IDENTIFIER="com.quantoz.qbs"
ANDROID_PACKAGE_NAME="com.quantoz.qbs"
SCHEME="quantoz.qbs"
3 changes: 1 addition & 2 deletions mobile/.env.production
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
APP_NAME="Quantoz Blockchain Solutions"
APP_NAME="Quantoz Blockchain Services"
IOS_BUNDLE_IDENTIFIER="com.quantoz.qbs"
ANDROID_PACKAGE_NAME="com.quantoz.qbs"
SCHEME="quantoz.qbs"

12 changes: 6 additions & 6 deletions mobile/eas.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
},
"env": {
"APP_ENV": "development",
"APP_NAME": "[Dev] Quantoz Blockchain Solutions",
"IOS_BUNDLE_IDENTIFIER": "com.quantoz.qbs.dev",
"ANDROID_PACKAGE_NAME": "com.quantoz.qbs.dev",
"SCHEME": "quantoz.qbs.dev"
"APP_NAME": "[Dev] Quantoz Blockchain Services",
"IOS_BUNDLE_IDENTIFIER": "com.quantoz.qbs",
"ANDROID_PACKAGE_NAME": "com.quantoz.qbs",
"SCHEME": "quantoz.qbs"
}
},
"production": {
Expand All @@ -25,15 +25,15 @@
"distribution": "store",
"env": {
"APP_ENV": "production",
"APP_NAME": "Quantoz Blockchain Solutions",
"APP_NAME": "Quantoz Blockchain Services",
"IOS_BUNDLE_IDENTIFIER": "com.quantoz.qbs",
"ANDROID_PACKAGE_NAME": "com.quantoz.qbs",
"SCHEME": "quantoz.qbs"
}
}
},
"submit": {
"test": {
"production": {
"android": {
"serviceAccountKeyPath": "./google-service-account.json",
"track": "internal"
Expand Down
2 changes: 1 addition & 1 deletion mobile/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,6 @@ export default {

testEnvironment: "jsdom",
transformIgnorePatterns: [
"node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg|axios|@sentry/.*|sentry-expo)",
"node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg|axios|@sentry/.*|sentry-expo|@noble/ed25519*)",
],
};
Loading

0 comments on commit 8264f1a

Please sign in to comment.