public HttpResponseMessage Post(X509KeyModel model) { if (!ModelState.IsValid) { return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } if (this.config.Keys.All.Any(x => x.Name == model.Name)) { ModelState.AddModelError("", "That Name is already in use."); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } var key = new X509CertificateReference(); key.Name = model.Name; key.StoreName = System.Security.Cryptography.X509Certificates.StoreName.My; key.Location = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine; key.FindType = System.Security.Cryptography.X509Certificates.X509FindType.FindByThumbprint; key.FindValue = model.Thumbprint; var cert = key.Certificate; if (cert == null) { ModelState.AddModelError("", "Invalid Values For Certificate"); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } try { var tmp = cert.PrivateKey; } catch (CryptographicException) { ModelState.AddModelError("", "No Read Access to Private Key of Certificate"); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } if (model.FindType != FindType.Thumbprint) { key.FindType = System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectDistinguishedName; key.FindValue = cert.Subject; try { cert = key.Certificate; } catch (InvalidOperationException) { ModelState.AddModelError("", "Multiple certificates match that subject name"); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } } this.config.Keys.Add(key); this.config.SaveChanges(); return Request.CreateResponse(HttpStatusCode.OK, new X509KeyModel(key)); }
public HttpResponseMessage Put(int id, X509KeyModel model) { if (!ModelState.IsValid) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); } var key = _config.Keys.All.SingleOrDefault(x => x.ID == id) as X509CertificateReference; if (key == null) return Request.CreateResponse(HttpStatusCode.NotFound); if (_config.Keys.All.Any(x => x.Name == model.Name && x.ID != id)) { ModelState.AddModelError("", "That Name is already in use."); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } key.Name = model.Name; key.StoreName = System.Security.Cryptography.X509Certificates.StoreName.My; key.Location = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine; key.FindType = System.Security.Cryptography.X509Certificates.X509FindType.FindByThumbprint; key.FindValue = model.Thumbprint; var cert = key.Certificate; if (cert == null) { ModelState.AddModelError("", "Invalid Values For Certificate"); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } try { if (cert.HasPrivateKey) { var tmp = cert.PrivateKey; } } catch (CryptographicException exp) { ModelState.AddModelError("", exp.Message); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } if (model.FindType != FindType.Thumbprint) { key.FindType = System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectDistinguishedName; key.FindValue = cert.Subject; try { cert = key.Certificate; } catch (InvalidOperationException) { ModelState.AddModelError("", "Multiple certificates match that subject name"); return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); } } _config.SaveChanges(); return Request.CreateResponse(HttpStatusCode.NoContent); }