Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
jose_jwe(3)		    Library Functions Manual		     jose_jwe(3)

NAME
     jose_jwe - JSON Web Encryption (RFC 7516)

SYNOPSIS
   Functions
     json_t * jose_jwe_hdr (const json_t *jwe, const json_t *rcp)
	 Merges the JOSE headers of a JWE object and a JWE recpient object.
     bool  jose_jwe_enc (jose_cfg_t *cfg, json_t *jwe, json_t *rcp, const json_t
	 *jwk, const void *pt, size_t ptl)
	 Wraps and encrypts plaintext.
     jose_io_t * jose_jwe_enc_io (jose_cfg_t *cfg,  json_t  *jwe,  json_t  *rcp,
	 const json_t *jwk, jose_io_t *next)
	 Wraps and encrypts plaintext using streaming.
     bool  jose_jwe_enc_jwk  (jose_cfg_t  *cfg,  json_t *jwe, json_t *rcp, const
	 json_t *jwk, json_t *cek)
	 Wraps a CEK with a JWK.
     bool jose_jwe_enc_cek (jose_cfg_t *cfg, json_t  *jwe,  const  json_t  *cek,
	 const void *pt, size_t ptl)
	 Encrypts plaintext with the CEK.
     jose_io_t * jose_jwe_enc_cek_io (jose_cfg_t *cfg, json_t *jwe, const json_t
	 *cek, jose_io_t *next)
	 Encrypts plaintext with the CEK using streaming.
     void * jose_jwe_dec (jose_cfg_t *cfg, const json_t *jwe, const json_t *rcp,
	 const json_t *jwk, size_t *ptl)
	 Unwraps and decrypts ciphertext.
     jose_io_t	*  jose_jwe_dec_io  (jose_cfg_t  *cfg,	const json_t *jwe, const
	 json_t *rcp, const json_t *jwk, jose_io_t *next)
	 Unwraps and decrypts ciphertext using streaming.
     json_t * jose_jwe_dec_jwk (jose_cfg_t *cfg, const json_t *jwe, const json_t
	 *rcp, const json_t *jwk)
	 Unwraps a CEK with a JWK.
     void * jose_jwe_dec_cek (jose_cfg_t *cfg, const json_t *jwe,  const  json_t
	 *cek, size_t *ptl)
	 Decrypts ciphertext with the CEK.
     jose_io_t	* jose_jwe_dec_cek_io (jose_cfg_t *cfg, const json_t *jwe, const
	 json_t *cek, jose_io_t *next)
	 Decrypts ciphertext with the CEK using streaming.

Detailed Description
     JSON Web Encryption (RFC 7516)

     A JSON Web Encryption (JWE) object contains (usually) two levels of encryp-
     tion. First, the plaintext is encrypted with a  random  symmetric	key.  In
     JosA(C),  we  call this key the Content Encryption Key (CEK). Next, the CEK
     is wrapped (encrypted) with one or more keys. These keys are standard  JSON
     Web Keys (JWK) and may be symmetric or asymmetric.

     Thus  there  is  (usually) one CEK and one or more JWKs. However, there are
     some exceptions to this rule. Two such examples are the  algorithms:  'dir'
     and  'ECDH-ES'.  In  the first case, the JWK is a symmetric key and is used
     directly as the CEK. In the second case, an ECDH key exchange is  performed
     and  the  result  is  used  directly  as the CEK. But in general, the maxim
     holds.

     This means that you can encrypt the data using one CEK and then encrypt the
     CEK to multiple recipients. With this schema, multiple recipients can  each
     decrypt  the  data  using their own key without having to send separate ci-
     phertext to each recipient.

     For maximum flexibility, JosA(C) structures its API to  take  advantage  of
     this schema. For example, when encrypting to two recipients, the code could
     look like this (error handling omitted):

     json_t *enc(void *plaintext, size_t len, json_t *jwk0, json_t *jwk1) {
	 json_auto_t *jwe = json_object();
	 json_auto_t *cek = json_object();

	 // Wrap to the first recipient (CEK generated implicitly)
	 jose_jwe_enc_jwk(NULL, jwe, NULL, jwk0, cek);

	 // Wrap to the second recipient
	 jose_jwe_enc_jwk(NULL, jwe, NULL, jwk1, cek);

	 // Encrypt plaintext using the generated CEK
	 jose_jwe_enc_cek(NULL, jwe, cek, plaintext, len);

	 return json_incref(jwe);
     }

     However,  because JosA(C) intends to be easy to use, we also provide short-
     cuts. For example, you could use a JWKSet which contains multiple JWKs:

     json_t *enc(void *plaintext, size_t len, json_t *jwkset) {
	 json_auto_t *jwe = json_object();

	 // Perform wrapping and encryption to all recipients
	 jose_jwe_enc(NULL, jwe, NULL, jwkset, plaintext, len);

	 return json_incref(jwe);
     }

     Here are two tips to remember. First, let JosA(C) generate your CEK implic-
     itly. Second, always perform wrapping before encryption. Both of these tips
     are important because some wrapping algorithms may  impose  constraints  on
     the generation of the CEK.

     To  decrypt  a JWE, we just reverse the process. First, we use a JWK to un-
     wrap the CEK. Then we use the CEK to decrypt the ciphertext.  Here  is  how
     that might look in code (again, error handling omitted):

     void *dec(json_t *jwe, json_t *jwk, size_t *len) {
	 json_auto_t *cek = NULL;

	 // Unwrap the CEK using our JWK
	 cek = jose_jwe_dec_jwk(NULL, jwe, NULL, jwk);

	 // Decrypt ciphertext using the CEK
	 return jose_jwe_dec_cek(NULL, jwe, cek, len);
     }

     Or, again, in simplified form:

     void *dec(json_t *jwe, json_t *jwk, size_t *len) {
	 return jose_jwe_dec(NULL, jwe, NULL, jwk, len);
     }

     If  you  need  to forward a JWE to a new recipient, you can do this without
     performing re-encryption. Just unwrap the CEK and then wrap the  CEK  again
     using a new JWK. For example:

     void fwd(json_t *jwe, json_t *oldjwk, json_t *newjwk) {
	 json_auto_t *cek = NULL;

	 // Unwrap the CEK using the old JWK
	 cek = jose_jwe_dec_jwk(NULL, jwe, NULL, oldjwk);

	 // Wrap the CEK to the new JWK
	 jose_jwe_enc_jwk(NULL, jwe, NULL, newjwk, cek);
     }

     In  all  the above examples, parameters like which encryption algorithms to
     use were inferred from our keys. Where such an inference  cannot  be  made,
     sensible  and  secure defaults were chosen automatically. If you would like
     more control over the process, simply set parameters in the appropriate ob-
     jects (more on this in the function documentation). For example, to  enable
     plaintext	compression,  you  can	specify the zip property in the JWE Pro-
     tected Header:

     json_t *enc(void *plaintext, size_t len, json_t *jwkset) {
	 json_auto_t *jwe = json_pack("{s:{s:s}}", "protected", "zip", "DEF");

	 // Perform compressed wrapping and encryption to all recipients
	 jose_jwe_enc(NULL, jwe, NULL, jwkset, plaintext, len);

	 return json_incref(jwe);
     }

     JosA(C) currently supports the 'alg', 'enc' and 'zip' header parameters, as
     well as any algorithm-specific header parameters used by the specific algo-
     rithms we implement. Other header parameters may be specified, but  do  not
     effect the behavior of JosA(C)'s JWE implementation.

     See also:
	 https://tools.ietf.org/html/rfc7516

Function Documentation
   json_t* jose_jwe_hdr (const json_t * jwe, const json_t * rcp)
     Merges the JOSE headers of a JWE object and a JWE recpient object.

     Parameters:
	 jwe A JWE object.
	 rcp A JWE recipient object.

     Returns:
	 The newly allocated JOSE header.

   bool jose_jwe_enc (jose_cfg_t * cfg, json_t * jwe, json_t * rcp, const json_t
     * jwk, const void * pt, size_t ptl)
     Wraps  and  encrypts  plaintext. This function is a thin wrapper around the
     jose_jwe_enc_io() function allowing the user to specify the plaintext in  a
     single  call. The ciphertext output will be appended to the JWE as the 'ci-
     phertext' property.

     See also:
	 jose_jwe_enc_cek_io()

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 rcp The JWE recipient object(s) or NULL.
	 jwk The JWK(s) or JWKSet used for wrapping.
	 pt The plaintext.
	 ptl The length of the plaintext.

     Returns:
	 On success, true. Otherwise, false.

   jose_io_t* jose_jwe_enc_io (jose_cfg_t * cfg, json_t *  jwe,  json_t  *  rcp,
     const json_t * jwk, jose_io_t * next)
     Wraps and encrypts plaintext using streaming. This function is a thin wrap-
     per  around the jose_jwe_enc_jwk() and jose_jwe_enc_cek_io() functions, re-
     moving the complexity of managing the CEK.

     See also:
	 jose_jwe_enc_jwk()

	 jose_jwe_enc_cek_io()

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 rcp The JWE recipient object(s) or NULL.
	 jwk The JWK(s) or JWKSet used for wrapping.
	 next The next IO object in the chain.

     Returns:
	 The new IO object or NULL on error.

   bool jose_jwe_enc_jwk (jose_cfg_t * cfg, json_t * jwe, json_t  *  rcp,  const
     json_t * jwk, json_t * cek)
     Wraps  a  CEK with a JWK. The purpose of this function is to wrap (encrypt)
     or, in some cases, produce the CEK (cek) from the	provided  JWK(s)  (jwk).
     This function can be used in two modes: single-JWK and multi-JWK.

     In single-JWK mode, the jwk parameter contains a JWK object and the rcp pa-
     rameter must contain either a JWE recipient object or NULL, in which case a
     default empty JWE recipient object is created internally.

     Multi-JWK	mode  works  exactly  the same as single-JWK mode except that it
     performs multiple wrappings in a single call. This mode is enabled by pass-
     ing either an array of JWK objects or a JWKSet as	the  jwk  parameter.  In
     this mode, the rcp parameter contains one of the following values:

     1.  A  JWE  recipient  object  that will be used for all wrappings. In this
	 case, a copy will be made for each wrapping and rcp will not  be  modi-
	 fied in any way.

     2.  An  array  of	JWE recipient objects. Each object will be used with its
	 corresponding JWK from jwk. If the arrays in sig and jwk are a  differ-
	 ent size, an error will occur.

     3.  NULL. This has the same effect as passing NULL for each separate JWK.

     In  either mode, if the resulting JWE (jwe) would contain only a single re-
     cipient, the JWE will be represented in Flattened	JWE  JSON  Serialization
     Syntax. Otherwise, it will be represented in General JWE JSON Serialization
     Syntax.

     If  the 'alg' parameter is not specified in the JOSE Header, it will be in-
     ferred from the JWK and the chosen algorithm will be added to the JWE  Per-
     Recipient	Unprotected  Header. Likewise, any missing, required, algorithm-
     specific parameters will be either inferred or  sensible,	secure	defaults
     will  be  chosen and the results will be added to the JWE Per-Recipient Un-
     protected Header.

     If the provided CEK (cek) does not contain key material, it will be implic-
     itly generated during the first call to jose_jwe_enc_jwk(). This  important
     feature  enables the use of the 'dir' and 'ECDH-ES' algorithms. In the case
     of the 'dir' algorithm, the JWK is the CEK and thus  the  key  material  is
     copied  from  jwk	to  cek.  A  similar situation arises with the algorithm
     'ECDH-ES' where the result of a key exchange is used as the CEK; thus,  the
     CEK  is  produced during the wrapping process. This feature implies that if
     multiple wrappings are created, only one of them  may  have  the  algorithm
     'ECDH-ES'	and  it  must be the first wrapping. Attempting to use 'ECDH-ES'
     with an existing CEK will result in an error.

     It is additionally possible to pass a password JSON string as key input  to
     the PBES2 family of algorithms anywhere a JWK can be used. Likewise, if the
     'alg'  JOSE  Header parameter is not specified and a JSON string is used in
     place of a JWK, the PBES2 family of algorithms will be inferred.

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 rcp The JWE recipient object(s) or NULL.
	 jwk The JWK(s) or JWKSet used for wrapping.
	 cek The CEK to wrap (if empty, generated).

     Returns:
	 On success, true. Otherwise, false.

   bool jose_jwe_enc_cek (jose_cfg_t * cfg, json_t * jwe, const  json_t  *  cek,
     const void * pt, size_t ptl)
     Encrypts plaintext with the CEK. This function is a thin wrapper around the
     jose_jwe_enc_cek_io()  function  allowing the user to specify the plaintext
     in a single call. The ciphertext output will be appended to the JWE as  the
     'ciphertext' property.

     See also:
	 jose_jwe_enc_cek_io()

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 cek The CEK object.
	 pt The plaintext.
	 ptl The length of the plaintext.

     Returns:
	 On success, true. Otherwise, false.

   jose_io_t*  jose_jwe_enc_cek_io (jose_cfg_t * cfg, json_t * jwe, const json_t
     * cek, jose_io_t * next)
     Encrypts plaintext with the CEK using streaming. The plaintext is	provided
     through the returned IO object. The plaintext will be encrypted and written
     to the next IO object. This IO object works on binary data, so you may need
     to  use a URL-safe Base64 decoder on input and a URL-safe Base64 encoder on
     output, depending on your situation.

     Compressed plaintext can be implicitly enabled by specifying the 'zip'  pa-
     rameter the JWE Protected Header.

     If the JWE Protected Header is a JSON object rather than an encoded string,
     this  function  will encode the JWE Protected Header to its URL-safe Base64
     encoding as defined in RFC 7516. However, this function will never modify a
     JWE Protected Header that is already encoded.

     If the 'enc' parameter is not specified in the JWE Protected Header or  the
     JWE  Shared Unprotected Header, it will be inferred from the CEK and stored
     in either the JWE Protected Header or the	JWE  Shared  Unprotected  Header
     (preferring the JWE Protected header if it can be modified).

     Please  note  that  the  'tag'  property will only be added to the JWE when
     jose_io_t::done() returns.

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 cek The CEK object.
	 next The next IO object in the chain.

     Returns:
	 The new IO object or NULL on error.

   void* jose_jwe_dec (jose_cfg_t * cfg, const json_t * jwe, const json_t * rcp,
     const json_t * jwk, size_t * ptl)
     Unwraps and decrypts ciphertext. This function is a thin wrapper around the
     jose_jwe_dec_io() function allowing the user to obtain the plaintext  in  a
     single  call.  The  ciphertext input will be obtained from the JWE 'cipher-
     text' property.

     See also:
	 jose_jwe_dec_io()

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 rcp The JWE recipient object(s) or NULL.
	 jwk The JWK(s) or JWKSet used for wrapping.
	 ptl The length of the plaintext (output).

     Returns:
	 The newly-allocated plaintext.

   jose_io_t* jose_jwe_dec_io (jose_cfg_t *  cfg,  const  json_t  *  jwe,  const
     json_t * rcp, const json_t * jwk, jose_io_t * next)
     Unwraps  and  decrypts  ciphertext using streaming. This function is a thin
     wrapper around the jose_jwe_dec_jwk() and jose_jwe_dec_cek_io()  functions,
     removing the complexity of managing the CEK.

     See also:
	 jose_jwe_dec_jwk()

	 jose_jwe_dec_cek_io()

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 rcp The JWE recipient object(s) or NULL.
	 jwk The JWK(s) or JWKSet used for unwrapping.
	 next The next IO object in the chain.

     Returns:
	 The new IO object or NULL on error.

   json_t*  jose_jwe_dec_jwk (jose_cfg_t * cfg, const json_t * jwe, const json_t
     * rcp, const json_t * jwk)
     Unwraps a CEK with a JWK. The purpose of this function is	to  unwrap  (de-
     crypt)  or,  in  some cases, produce the CEK (cek) from the provided JWK(s)
     (jwk). This function can be used in two modes: single-JWK and multi-JWK.

     In single-JWK mode, the jwk parameter contains a JWK object and the rcp pa-
     rameter must contain either a JWE recipient object you wish  to  unwrap  or
     NULL, in which case all JWE recipients will be tried.

     Multi-JWK mode works exactly the same as single-JWK mode except that it at-
     tempts  to unwrap with multiple JWKs in a single call. This mode is enabled
     by passing either an array of JWK objects or a JWKSet as the jwk parameter.
     In this mode, the rcp parameter contains one of the following values:

     1.  A JWE recipient object that will be used for all attempted unwrappings.

     2.  An array of JWE recipient objects. Each object will be  used  with  its
	 corresponding	JWK from jwk. If the arrays in sig and jwk are a differ-
	 ent size, an error will occur.

     3.  NULL. This has the same effect as passing NULL for each separate JWK.

     In either mode, a CEK is returned for the first JWK that  successfully  un-
     wraps  a CEK. Two exceptions to this rule are if the 'dir' or 'ECDH-ES' al-
     gorithms are used. In this case, a CEK may be returned which will fail dur-
     ing decryption since there is no way to completely validate  the  JWK  with
     these  algorithms.  Thus,	we suggest placing the keys for these algorithms
     last when unwrapping with multiple JWKs.

     If the 'alg' parameter is not specified in the JOSE Header, it will be  in-
     ferred  from  the	JWK. This includes using a JSON string in place of a JWK
     for the PBES2 family of algorithms.

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 rcp The JWE recipient object(s) or NULL.
	 jwk The JWK(s) or JWKSet used for wrapping.

     Returns:
	 On success, a newly-allocated CEK object. Otherwise, NULL.

   void* jose_jwe_dec_cek (jose_cfg_t * cfg, const json_t * jwe, const json_t  *
     cek, size_t * ptl)
     Decrypts  ciphertext  with  the CEK. This function is a thin wrapper around
     the jose_jwe_dec_cek_io() function allowing the user to obtain  the  plain-
     text  in  a single call. The ciphertext input will be obtained from the JWE
     'ciphertext' property.

     See also:
	 jose_jwe_dec_cek_io()

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 cek The CEK object.
	 ptl The length of the plaintext (output).

     Returns:
	 The newly-allocated plaintext.

   jose_io_t* jose_jwe_dec_cek_io (jose_cfg_t * cfg, const json_t *  jwe,  const
     json_t * cek, jose_io_t * next)
     Decrypts  ciphertext  with  the CEK using streaming. The ciphertext is pro-
     vided through the returned IO object. The ciphertext will be decrypted  and
     written  to the next IO object. This IO object works on binary data, so you
     may need to use a URL-safe Base64 decoder on input and  a	URL-safe  Base64
     encoder on output, depending on your situation.

     Please  note  that validation of the ciphertext integrity protection is de-
     layed until jose_io_t::done() returns. This means it is  incredibly  impor-
     tant to check this return value and it is also important to be careful with
     the plaintext emitted until this check is performed.

     Compressed  plaintext will be internally decompressed if the 'zip' property
     is appropriately defined.

     If the 'enc' parameter is not specified in the JWE Protected Header or  the
     JWE Shared Unprotected Header, it will be inferred from the CEK.

     Please  note  that the 'tag' property on the JWE will only be accessed when
     jose_io_t::done() is called. So you may define it at any time  on	the  JWE
     object before calling jose_io_t::done().

     Parameters:
	 cfg The configuration context (optional).
	 jwe The JWE object.
	 cek The CEK object.
	 next The next IO object in the chain.

     Returns:
	 The new IO object or NULL on error.

Author
     Generated automatically by Doxygen for JosA(C) from the source code.

JosA(C) 			 Tue May 30 2017		     jose_jwe(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=jose_jwe&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help