diff --git a/Akari.Prototype.Server/Akari.Prototype.Server.csproj b/Akari.Prototype.Server/Akari.Prototype.Server.csproj
index c7e1787..3880de8 100644
--- a/Akari.Prototype.Server/Akari.Prototype.Server.csproj
+++ b/Akari.Prototype.Server/Akari.Prototype.Server.csproj
@@ -5,7 +5,7 @@
-
+
diff --git a/Akari.Prototype.Server/Protos/akari.proto b/Akari.Prototype.Server/Protos/akari.proto
new file mode 100644
index 0000000..b94c3c3
--- /dev/null
+++ b/Akari.Prototype.Server/Protos/akari.proto
@@ -0,0 +1,37 @@
+syntax = "proto3";
+
+option csharp_namespace = "Akari.Prototype.Protos";
+
+package akari;
+
+service AkariApi {
+ rpc Encrypt (EncryptRequest) returns (EncryptResponse);
+
+ rpc Decrypt (DecryptRequest) returns (DecryptResponse);
+}
+
+message EncryptRequest {
+ string application = 1;
+ string token = 2;
+ bytes plain = 3;
+}
+
+message EncryptResponse {
+ oneof response {
+ string error_message = 1;
+ bytes encrypted = 2;
+ }
+}
+
+message DecryptRequest {
+ string application = 1;
+ string token = 2;
+ bytes encrypted = 3;
+}
+
+message DecryptResponse {
+ oneof response {
+ string error_message = 1;
+ bytes plain = 2;
+ }
+}
diff --git a/Akari.Prototype.Server/Services/AkariService.cs b/Akari.Prototype.Server/Services/AkariService.cs
new file mode 100644
index 0000000..4da6fe3
--- /dev/null
+++ b/Akari.Prototype.Server/Services/AkariService.cs
@@ -0,0 +1,89 @@
+using Akari.Prototype.Protos;
+using Akari.Prototype.Server.Services;
+using Akari.Prototype.Server.Utils;
+using Google.Protobuf;
+using Grpc.Core;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Akari.Prototype.Server
+{
+ public class AkariService : AkariApi.AkariApiBase
+ {
+ private readonly ILogger _logger;
+ private readonly IApplicationsManager _applications;
+
+ public AkariService(ILogger logger, IApplicationsManager applications)
+ {
+ _logger = logger;
+ _applications = applications;
+ }
+
+ public override Task Decrypt(DecryptRequest request, ServerCallContext context)
+ {
+ if (!_applications.Contains(request.Application))
+ {
+ return Task.FromResult(new DecryptResponse()
+ {
+ ErrorMessage = "Application not found"
+ });
+ }
+
+ if (!_applications.VerifyToken(request.Application, request.Token))
+ {
+ return Task.FromResult(new DecryptResponse()
+ {
+ ErrorMessage = "Wrong token"
+ });
+ }
+
+ if (_applications.TryRetrieveKey(request.Application, request.Token, out var key))
+ {
+ return Task.FromResult(new DecryptResponse()
+ {
+ Plain = ByteString.CopyFrom(Security.AesGcmDecrypt(key, request.Encrypted.ToByteArray()))
+ });
+ }
+
+ return Task.FromResult(new DecryptResponse()
+ {
+ ErrorMessage = "No fingerprint auth found for this application"
+ });
+ }
+
+ public override Task Encrypt(EncryptRequest request, ServerCallContext context)
+ {
+ if (!_applications.Contains(request.Application))
+ {
+ return Task.FromResult(new EncryptResponse()
+ {
+ ErrorMessage = "Application not found"
+ });
+ }
+
+ if (!_applications.VerifyToken(request.Application, request.Token))
+ {
+ return Task.FromResult(new EncryptResponse()
+ {
+ ErrorMessage = "Wrong token"
+ });
+ }
+
+ if (_applications.TryRetrieveKey(request.Application, request.Token, out var key))
+ {
+ return Task.FromResult(new EncryptResponse()
+ {
+ Encrypted = ByteString.CopyFrom(Security.AesGcmEncrypt(key, request.Plain.ToByteArray()))
+ });
+ }
+
+ return Task.FromResult(new EncryptResponse()
+ {
+ ErrorMessage = "No fingerprint auth found for this application"
+ });
+ }
+ }
+}
diff --git a/Akari.Prototype.Server/Services/GreeterService.cs b/Akari.Prototype.Server/Services/GreeterService.cs
deleted file mode 100644
index 1154b6f..0000000
--- a/Akari.Prototype.Server/Services/GreeterService.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using Grpc.Core;
-using Microsoft.Extensions.Logging;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace Akari.Prototype.Server
-{
- public class GreeterService : Greeter.GreeterBase
- {
- private readonly ILogger _logger;
- public GreeterService(ILogger logger)
- {
- _logger = logger;
- }
-
- public override Task SayHello(HelloRequest request, ServerCallContext context)
- {
- return Task.FromResult(new HelloReply
- {
- Message = "Hello " + request.Name
- });
- }
- }
-}
diff --git a/Akari.Prototype.Server/Startup.cs b/Akari.Prototype.Server/Startup.cs
index af7c474..5c54724 100644
--- a/Akari.Prototype.Server/Startup.cs
+++ b/Akari.Prototype.Server/Startup.cs
@@ -64,7 +64,7 @@ namespace Akari.Prototype.Server
app.UseEndpoints(endpoints =>
{
- endpoints.MapGrpcService();
+ endpoints.MapGrpcService();
endpoints.MapGet("/", async context =>
{