public void Serve(HttpListenerRequest request, HttpListenerResponse response, Url url) { var userCreateRequest = (UserCreateRequest) new DataContractJsonSerializer(typeof(UserCreateRequest)).ReadObject( request.InputStream); var newId = UserEngine.RegisterUser(CryptoEngine.GetInstance().Certificate.Cert.Id, Encoding.ASCII.GetBytes(userCreateRequest.Key)); new DataContractJsonSerializer(typeof(UserCreateResponse)).WriteObject(response.OutputStream, new UserCreateResponse { Id = newId, NodeId = CryptoEngine.GetInstance().Certificate.Cert.Id, Success = true }); /* Update everyone else that there's a new user */ PartnersEngine.PartnersUpdateRequest(new PartnerSyncUserCreate { Id = newId, NodeId = CryptoEngine.GetInstance().Certificate.Cert.Id, Key = userCreateRequest.Key }); }
private static PBCertificate SignCertificate(string name, PBKeyPair masterKeyPair, PBKeyPair keyPair) { var dsa = CryptoEngine.GetInstance().ECLoad(masterKeyPair.PublicKey.PublicKey, masterKeyPair.PrivateKey); var cert = new PBCertificate { Name = name, PublicKey = keyPair.PublicKey.PublicKey }; /* Issue certificate Id */ cert.Id = masterKeyPair.IssuedCerts++; if (cert.Id > masterKeyPair.IssuedCerts) { throw new OverflowException("Ran out of issueable certificates"); } /* Prepare sign buffer */ var pubKey = keyPair.PublicKey.PublicKey.ToByteArray(); byte[] signBuff = new byte[pubKey.Length + sizeof(int)]; pubKey.CopyTo(signBuff, 0); for (int i = 0; i < sizeof(int); ++i) { signBuff[pubKey.Length + i] = (byte)((cert.Id >> (8 * i)) & 0xff); } var byteCert = dsa.SignData(signBuff, HashAlgorithmName.SHA256); cert.Signature = ByteString.CopyFrom(byteCert, 0, byteCert.Length); return(cert); }
public void Serve(HttpListenerRequest request, HttpListenerResponse response, Url url) { var partnerSyncRequest = JSONSerializer <PartnerSyncMessage> .Deserialize(request.InputStream); var jsonResponse = new BooleanResponse { Success = false }; /* Validate incoming certificate */ try { if (!CryptoEngine.GetInstance().verifyCertificate(partnerSyncRequest.key, partnerSyncRequest.certId, partnerSyncRequest.cert) .VerifyData(partnerSyncRequest.data, partnerSyncRequest.signature, HashAlgorithmName.SHA256)) { throw new CryptographicException("Data verification failed"); } /* Parse action */ var partnerSyncRequestData = JSONSerializer <PartnerSyncMessageData> .Deserialize(partnerSyncRequest.data); /* Figure out which message type need to be handled */ switch (partnerSyncRequestData.MessageType) { case PartnerSyncMessageType.PARTNER_JOIN: { /* Parse join request */ var partnerJoinRequest = JSONSerializer <PartnerSyncRequestJoin> .Deserialize(partnerSyncRequestData.Data); /* Add to partners */ PartnersEngine.AddPartner(partnerJoinRequest.Address); /* Create a DB Dump object */ var partnerDBDump = new PartnerSyncResponseDBDump { Partners = PartnersEngine.Partners.ToArray() }; /* Dump te DB */ var dbFile = File.Open(Config <string> .GetInstance()["DB_Filename"], FileMode.Open, FileAccess.Read, FileShare.ReadWrite); using (var reader = new BinaryReader(dbFile)) { /* Hopefully DB will not be larger than 2GB */ partnerDBDump.DBDump = reader.ReadBytes((int)dbFile.Length); } JSONSerializer <PartnerSyncMessage> .Serialize(PartnersEngine.PrepareSignedMessage(partnerDBDump), response.OutputStream); break; } case PartnerSyncMessageType.USER_CREATE: { /* Parse register request */ var userRegisterRequest = JSONSerializer <PartnerSyncUserCreate> .Deserialize(partnerSyncRequestData.Data); /* Update here */ UserEngine.RegisterUser(partnerSyncRequest.certId, userRegisterRequest.Id, Encoding.ASCII.GetBytes(userRegisterRequest.Key)); jsonResponse.Success = true; jsonResponse.Message = "Success"; JSONSerializer <PartnerSyncMessage> .Serialize(PartnersEngine.PrepareSignedMessage(jsonResponse), response.OutputStream); break; } case PartnerSyncMessageType.QUEUE_CREATE: { /* Parse queue create request */ var queueCreateRequest = JSONSerializer <PartnerSyncQueueCreate> .Deserialize(partnerSyncRequestData.Data); QueueEngine.CreateQueue(queueCreateRequest.UID, queueCreateRequest.NodeId, queueCreateRequest.QueueName, queueCreateRequest.Readers); jsonResponse.Success = true; jsonResponse.Message = "Success"; JSONSerializer <PartnerSyncMessage> .Serialize(PartnersEngine.PrepareSignedMessage(jsonResponse), response.OutputStream); break; } case PartnerSyncMessageType.QUEUE_WRITE: { /* Parse queue write request */ var queueWriteRequest = JSONSerializer <PartnerSyncQueueWrite> .Deserialize(partnerSyncRequestData.Data); /* Try to correct timezone issues */ Config <long> .GetInstance()["TIMEZONE_CORRECTION"] = queueWriteRequest.Timestamp.ToFileTimeUtc() - DateTime.UtcNow.ToFileTimeUtc(); /* Add to buffered queue */ if (QueueEngine.WriteBufferedQueue(queueWriteRequest.UID, queueWriteRequest.NodeId, queueWriteRequest.QueueName, queueWriteRequest.Data, queueWriteRequest.Timestamp)) { jsonResponse.Success = true; jsonResponse.Message = "Success"; } else { jsonResponse.Success = false; jsonResponse.Message = "Not enough space in queue"; } JSONSerializer <PartnerSyncMessage> .Serialize(PartnersEngine.PrepareSignedMessage(jsonResponse), response.OutputStream); break; } case PartnerSyncMessageType.QUEUE_COMMIT: { /* Parse queue commit request */ var queueCommitRequest = JSONSerializer <PartnerSyncRequestCommit> .Deserialize(partnerSyncRequestData.Data); QueueEngine.CommitQueue(queueCommitRequest.UID, queueCommitRequest.NodeId, queueCommitRequest.ReaderId, queueCommitRequest.ReaderNodeId, queueCommitRequest.QueueName); jsonResponse.Success = true; jsonResponse.Message = "Success"; JSONSerializer <PartnerSyncMessage> .Serialize(PartnersEngine.PrepareSignedMessage(jsonResponse), response.OutputStream); break; } default: { jsonResponse.Message = "Invalid Message ID"; break; } } } catch (CryptographicException e) { Console.WriteLine(e); jsonResponse.Message = e.Message; JSONSerializer <PartnerSyncMessage> .Serialize(PartnersEngine.PrepareSignedMessage(jsonResponse), response.OutputStream); } }
private static void Main(string[] args) { ushort port = 8080; if (args.Length == 1) { try { port = (ushort)int.Parse(args[0]); } catch (Exception e) { Console.WriteLine("Invalid port number " + e); return; } } /* Something might happen. Just go on... */ while (true) { try { /* Load certificate */ CryptoEngine.GetInstance().loadCertificate(Config <string> .GetInstance()["Certificate"]); /* Add preconfigured partners */ foreach (var partner in Config <string[]> .GetInstance()["PARTNERS"]) { if (partner == string.Empty) { continue; } PartnersEngine.AddPartner(partner); } Console.WriteLine("Node " + CryptoEngine.GetInstance().Certificate.Cert.Id + " Running on port " + port); /* Request joining the network and load current DB from network */ PartnersEngine.PartnerJoinRequest(new JSON.PartnerSyncRequestJoin { Address = Config <string> .GetInstance()["PUBLIC_ADDRESS"] }); var server = new AsyncHTTPServer(port); server.AddHandler("/testQuery", new TestQueryHandler()); server.AddHandler("/createUser", new CreateUserHandler()); server.AddHandler("/createQueue", new CreateQueueHandler()); server.AddHandler("/partnerSync", new PartnerSyncHandler()); server.AddHandler("/login", new LoginHandler()); server.AddHandler("/queue", new QueueHandler()); server.Start(); } catch (HttpListenerException e) { Console.WriteLine("External port diallowed. Please run as Administrator (" + e.Message + ")"); Console.WriteLine("\tnetsh http add urlacl url=http://+:" + port + "/ user=\"" + Environment.UserName + "\""); } catch (Exception e) { Console.WriteLine(e); Console.WriteLine(e.Message); } } }