/* * create an "oct" symmetric JWK */ oidc_jwk_t *oidc_jwk_create_symmetric_key(apr_pool_t *pool, const char *skid, const unsigned char *key, unsigned int key_len, apr_byte_t set_kid, oidc_jose_error_t *err) { cjose_err cjose_err; cjose_jwk_t *cjose_jwk = cjose_jwk_create_oct_spec(key, key_len, &cjose_err); if (cjose_jwk == NULL) { oidc_jose_error(err, "cjose_jwk_create_oct_spec failed: %s", oidc_cjose_e2s(pool, cjose_err)); return FALSE; } if (set_kid == TRUE) { if (oidc_jwk_set_or_generate_kid(pool, cjose_jwk, skid, (const char *) key, key_len, err) == FALSE) { cjose_jwk_release(cjose_jwk); return FALSE; } } oidc_jwk_t *jwk = oidc_jwk_new(pool); jwk->cjose_jwk = cjose_jwk; jwk->kid = apr_pstrdup(pool, cjose_jwk_get_kid(jwk->cjose_jwk, &cjose_err)); jwk->kty = cjose_jwk_get_kty(jwk->cjose_jwk, &cjose_err); return jwk; }
/* * create a JWK struct from a cjose_jwk object */ static oidc_jwk_t *oidc_jwk_from_cjose(apr_pool_t *pool, cjose_jwk_t *cjose_jwk) { cjose_err cjose_err; oidc_jwk_t *jwk = oidc_jwk_new(pool); jwk->cjose_jwk = cjose_jwk; jwk->kid = apr_pstrdup(pool, cjose_jwk_get_kid(jwk->cjose_jwk, &cjose_err)); jwk->kty = cjose_jwk_get_kty(jwk->cjose_jwk, &cjose_err); return jwk; }
cjose_jwe_t *cjose_jwe_encrypt( const cjose_jwk_t *jwk, cjose_header_t *protected_header, const uint8_t *plaintext, size_t plaintext_len, cjose_err *err) { cjose_jwe_t *jwe = NULL; if (NULL == jwk || NULL == protected_header) { CJOSE_ERROR(err, CJOSE_ERR_INVALID_ARG); return NULL; } // if not already set, add kid header to JWE to match that of JWK const char *kid = cjose_jwk_get_kid(jwk, err); if (NULL != kid) { if (!cjose_header_set(protected_header, CJOSE_HDR_KID, kid, err)) { CJOSE_ERROR(err, CJOSE_ERR_INVALID_STATE); return false; } } // allocate and initialize a new JWE object if (!_cjose_jwe_malloc(sizeof(cjose_jwe_t), false, (uint8_t **)&jwe, err)) { return NULL; } // validate JWE header if (!_cjose_jwe_validate_hdr(jwe, protected_header, err)) { cjose_jwe_release(jwe); return NULL; } // build JWE header if (!_cjose_jwe_build_hdr(jwe, protected_header, err)) { cjose_jwe_release(jwe); return NULL; } // build JWE content-encryption key and encrypted key if (!jwe->fns.encrypt_ek(jwe, jwk, err)) { cjose_jwe_release(jwe); return NULL; } // build JWE initialization vector if (!jwe->fns.set_iv(jwe, err)) { cjose_jwe_release(jwe); return NULL; } // build JWE encrypted data and authentication tag if (!jwe->fns.encrypt_dat(jwe, plaintext, plaintext_len, err)) { cjose_jwe_release(jwe); return NULL; } return jwe; }