[keymanager/wsd] Add /keys:decaps KOL API with DecapAndSeal + Open orchestration#650
[keymanager/wsd] Add /keys:decaps KOL API with DecapAndSeal + Open orchestration#650atulpatildbz wants to merge 1 commit intogoogle:mainfrom
Conversation
NilanjanDaw
left a comment
There was a problem hiding this comment.
Thanks for the PR. Over-all comment: I think we need to align the message formats for the APIs. Lets define them in a separate proto file, so that they can be easily reviewed.
| // Use a sentinel byte so the pointer is always valid. | ||
| var aadSentinel [1]byte | ||
| aadPtr := (*C.uint8_t)(unsafe.Pointer(&aadSentinel[0])) | ||
| aadLen := C.size_t(0) | ||
| if len(aad) > 0 { | ||
| aadPtr = (*C.uint8_t)(unsafe.Pointer(&aad[0])) | ||
| aadLen = C.size_t(len(aad)) | ||
| } |
There was a problem hiding this comment.
Should we add a AAD context for the HPKE seal/open operation?
There was a problem hiding this comment.
Good point. I added an explicit AAD context for the decaps flow and pass it through both KPS DecapAndSeal and WSD Open: "wsd:keys:decaps:v1::". Addressed in commit 02d8655.
| return | ||
| } | ||
|
|
||
| encapsulatedKey, err := base64.StdEncoding.DecodeString(req.EncapsulatedKey) |
There was a problem hiding this comment.
I think we need to align the message format and the params a bit. The encapsulatedKey is expected to be raw bytes and packed as below
message DecapsRequest {
KeyHandle key_handle = 1;
KemCiphertext ciphertext = 2;
}
// The results of an Encaps operation.
message KemCiphertext {
KemAlgorithm algorithm = 1;
bytes ciphertext = 2; // `Nenc` bytes long.
}
| resp := DecapsResponse{ | ||
| SharedSecret: base64.StdEncoding.EncodeToString(plaintext), | ||
| } |
There was a problem hiding this comment.
Response should be encoded as follows
// The results of a Decaps operation.
message KemSharedSecret {
KemAlgorithm algorithm = 1;
bytes secret = 2; // `Nsecret` bytes long.
}
There was a problem hiding this comment.
Updated response encoding to KemSharedSecret shape: sharedSecret{ algorithm, secret }. Implemented in commit 02d8655 (including test updates).
Thanks for the review. I aligned the API message formats and added a dedicated proto file: |
acab338 to
4f935f5
Compare
d2ae0b3 to
4deb925
Compare
4deb925 to
448b861
Compare
Implements the Go orchestration layer (KOL) for
POST /v1/keys:decap. This key exchange endpoint allows workloads to recover a shared secret from a KEM encapsulation.Flow:
{key_handle, ciphertext: {algorithm, ciphertext}}to WSD/v1/keys:generate_kem)DecapAndSeal— decapsulates the shared secret using the KEM private key, reseals it with the binding public keyOpen— unseals the shared secret using the binding private keyChanges:
POST /v1/keys:decap(aligned with API contract)snake_casefor JSON fields inDecapsRequestandDecapsResponsekey_manager_decap_and_seal(KPS) andkey_manager_open(WSD) declarationsDecapAndSeal()andOpen()Go wrappers for the Rust FFI functionsServicewithDecapAndSealmethodDecapSealer/Openerinterfaces,handleDecapshandlerTestHandleDecapsSuccessin and Rust unit testsTesting
tested with encap operation manually.
Testing generate + decap + seal + open
Code for manual testing: atulpatildbz@ac4b947