Add full XCA curve and digest parity
CI / Build and push docker image (push) Successful in 2m16s
CI / Build and push OCSP image (push) Successful in 34s

This commit is contained in:
KCA
2026-10-26 03:45:25 +00:00
parent b910fa706c
commit d5f060cbf0
36 changed files with 4326 additions and 331 deletions
+44 -18
View File
@@ -4,13 +4,18 @@ use sycamore::prelude::*;
use wasm_bindgen_futures::spawn_local;
use crate::api;
use crate::components::crypto::{
add_key_parameters, apply_signature_hash, key_parameter_input, key_type_select,
signature_hash_input,
};
use crate::components::nav::{app_nav, whoami};
use crate::components::ui::{page_header, toast_error};
use crate::model::{KeySummary, Me};
use crate::model::{KeySummary, Me, OptionsPage};
pub fn RequestNewPage(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 keys = create_signal(Vec::<KeySummary>::new());
let error = create_signal(None::<String>);
let saving = create_signal(false);
@@ -21,6 +26,7 @@ pub fn RequestNewPage(vault_id: String) -> View {
let new_key = create_signal(false);
let key_type = create_signal("rsa".to_string());
let key_size = create_signal("2048".to_string());
let curve = create_signal("secp256r1".to_string());
let signature_hash = create_signal("sha256".to_string());
let cn = create_signal(String::new());
@@ -54,8 +60,24 @@ pub fn RequestNewPage(vault_id: String) -> View {
keys.set(page.results.into_iter().filter(|key| key.has_private).collect());
}
}
if let Ok(page) = api::options(id).await {
if options.is_alive() {
options.set(Some(page));
}
}
});
let signing_key_type = move || {
if new_key.get() {
return Some(key_type.get_clone());
}
let selected = key_id.get_clone();
keys.get_clone()
.into_iter()
.find(|key| key.id == selected)
.map(|key| key.key_type)
};
let submit = move |_| {
let request_name = name.get_clone();
if request_name.trim().is_empty() {
@@ -113,14 +135,24 @@ pub fn RequestNewPage(vault_id: String) -> View {
"comment": comment.get_clone(),
"subject": subject,
"extensions": extensions,
"signature_hash": signature_hash.get_clone(),
});
apply_signature_hash(
&mut payload,
signing_key_type().as_deref(),
&signature_hash.get_clone(),
);
if new_key.get() {
payload["new_key"] = json!({
let mut generated_key = json!({
"key_type": key_type.get_clone(),
"size": key_size.get_clone().parse::<i64>().unwrap_or(2048),
"name": format!("{} key", name.get_clone()),
});
add_key_parameters(
&mut generated_key,
&key_type.get_clone(),
&key_size.get_clone(),
&curve.get_clone(),
);
payload["new_key"] = generated_key;
} else if !key_id.get_clone().is_empty() {
payload["key_id"] = json!(key_id.get_clone());
} else {
@@ -180,13 +212,12 @@ pub fn RequestNewPage(vault_id: String) -> View {
input(class="form-control", bind:value=name)
}
div(class="col-md-6") {
label(class="form-label") { "Signature hash" }
select(class="form-select", bind:value=signature_hash) {
option(value="sha256") { "SHA-256" }
option(value="sha384") { "SHA-384" }
option(value="sha512") { "SHA-512" }
option(value="sha1") { "SHA-1" }
}
(signature_hash_input(
"Signature hash",
options,
signing_key_type,
signature_hash,
))
}
div(class="col-12") {
label(class="form-label") { "Comment" }
@@ -217,15 +248,10 @@ pub fn RequestNewPage(vault_id: String) -> View {
div(class="row g-3") {
div(class="col-md-4") {
label(class="form-label") { "Key type" }
select(class="form-select", bind:value=key_type) {
option(value="rsa") { "RSA" }
option(value="ec") { "EC" }
option(value="ed25519") { "ED25519" }
}
(key_type_select(options, key_type))
}
div(class="col-md-4") {
label(class="form-label") { "Key size" }
input(class="form-control", bind:value=key_size)
(key_parameter_input(options, key_type, key_size, curve))
}
}
}