Add full XCA curve and digest parity
CI / Build and push docker image (push) Successful in 37s
CI / Build and push OCSP image (push) Successful in 38s

This commit is contained in:
2026-10-26 12:06:17 +08:00
parent e83dc42d3d
commit 1a7b4a10e8
36 changed files with 4326 additions and 331 deletions
+28 -17
View File
@@ -4,13 +4,15 @@ use sycamore::prelude::*;
use wasm_bindgen_futures::spawn_local;
use crate::api;
use crate::components::crypto::{key_parameter_input, key_type_select, signature_hash_input};
use crate::components::nav::{app_nav, spinner, whoami};
use crate::components::ui::{page_header, toast_error};
use crate::model::Me;
use crate::model::{Me, OptionsPage};
pub fn SettingsPage(vault_id: String) -> View {
let id: &'static str = Box::leak(vault_id.clone().into_boxed_str());
let me = create_signal(None::<Me>);
let options = create_signal(None::<OptionsPage>);
let error = create_signal(None::<String>);
let info = create_signal(None::<String>);
let loading = create_signal(true);
@@ -25,6 +27,7 @@ pub fn SettingsPage(vault_id: String) -> View {
let hide_unusable = create_signal(false);
let default_key_type = create_signal("rsa".to_string());
let default_key_size = create_signal("2048".to_string());
let default_key_curve = create_signal("secp256r1".to_string());
let default_validity = create_signal("365".to_string());
let default_validity_unit = create_signal("days".to_string());
@@ -32,6 +35,9 @@ pub fn SettingsPage(vault_id: String) -> View {
if let Ok(user) = api::me().await {
me.set(Some(user));
}
if let Ok(page) = api::options(id).await {
options.set(Some(page));
}
match api::vault_settings(&id).await {
Ok(value) => {
version.set(value.get("version").and_then(|v| v.as_i64()).unwrap_or(0));
@@ -57,6 +63,9 @@ pub fn SettingsPage(vault_id: String) -> View {
if let Some(v) = key.get("size").and_then(|v| v.as_i64()) {
default_key_size.set(v.to_string());
}
if let Some(v) = key.get("curve").and_then(|v| v.as_str()) {
default_key_curve.set(v.to_string());
}
}
if let Some(validity) = settings.get("default_validity") {
if let Some(v) = validity.get("amount").and_then(|v| v.as_i64()) {
@@ -87,7 +96,11 @@ pub fn SettingsPage(vault_id: String) -> View {
"default_key": {
"type": default_key_type.get_clone(),
"size": default_key_size.get_clone().parse::<i64>().unwrap_or(2048),
"curve": null,
"curve": if default_key_type.get_clone() == "ec" {
json!(default_key_curve.get_clone())
} else {
serde_json::Value::Null
},
},
"default_validity": {
"amount": default_validity.get_clone().parse::<i64>().unwrap_or(365),
@@ -130,14 +143,12 @@ pub fn SettingsPage(vault_id: String) -> View {
div(class="form-section-title") { "Cryptography" }
div(class="row g-3") {
div(class="col-md-4") {
label(class="form-label") { "Default signature hash" }
select(class="form-select", bind:value=default_hash) {
option(value="sha256") { "SHA-256" }
option(value="sha384") { "SHA-384" }
option(value="sha512") { "SHA-512" }
option(value="sha224") { "SHA-224" }
option(value="sha1") { "SHA-1" }
}
(signature_hash_input(
"Default signature hash",
options,
|| None,
default_hash,
))
}
div(class="col-md-4") {
label(class="form-label") { "Serial number length (bits)" }
@@ -175,15 +186,15 @@ pub fn SettingsPage(vault_id: String) -> View {
div(class="row g-3") {
div(class="col-md-4") {
label(class="form-label") { "Default key type" }
select(class="form-select", bind:value=default_key_type) {
option(value="rsa") { "RSA" }
option(value="ec") { "EC" }
option(value="ed25519") { "ED25519" }
}
(key_type_select(options, default_key_type))
}
div(class="col-md-4") {
label(class="form-label") { "Default key size" }
input(class="form-control", bind:value=default_key_size)
(key_parameter_input(
options,
default_key_type,
default_key_size,
default_key_curve,
))
}
div(class="col-md-4 d-flex align-items-end") {
button(class="btn btn-primary", disabled=saving.get(), on:click=save) {