| 
					
				 | 
			
			
				@@ -19,8 +19,10 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <assert.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <string.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "../lib/hooks.h" /* for MAX_COMPRESSED_SIZE */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-dec(json_t *jwe, json_t *jwk) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+dec_cmp(json_t *jwe, json_t *jwk, const char* expected_data, size_t expected_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     bool ret = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     char *pt = NULL; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -30,10 +32,10 @@ dec(json_t *jwe, json_t *jwk) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!pt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         goto error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (ptl != 4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (ptl != expected_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         goto error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp(pt, "foo") != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (strcmp(pt, expected_data) != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         goto error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ret = true; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -43,12 +45,40 @@ error: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+dec(json_t *jwe, json_t *jwk) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return dec_cmp(jwe, jwk, "foo", 4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+struct zip_test_data_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    char* data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    size_t datalen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    bool expected; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static char* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+make_data(size_t len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(len > 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    char *data = malloc(len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; i < len; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data[i] = 'A' + (random() % 26); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    data[len-1] = '\0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 main(int argc, char *argv[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_auto_t *jwke = json_pack("{s:s}", "alg", "ECDH-ES+A128KW"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_auto_t *jwkr = json_pack("{s:s}", "alg", "RSA1_5"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_auto_t *jwko = json_pack("{s:s}", "alg", "A128KW"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    json_auto_t *jwkz = json_pack("{s:s, s:i}", "kty", "oct", "bytes", 16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_auto_t *set0 = json_pack("{s:[O,O]}", "keys", jwke, jwko); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_auto_t *set1 = json_pack("{s:[O,O]}", "keys", jwkr, jwko); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_auto_t *set2 = json_pack("{s:[O,O]}", "keys", jwke, jwkr); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -57,6 +87,7 @@ main(int argc, char *argv[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert(jose_jwk_gen(NULL, jwke)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert(jose_jwk_gen(NULL, jwkr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert(jose_jwk_gen(NULL, jwko)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(jose_jwk_gen(NULL, jwkz)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     json_decref(jwe); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert((jwe = json_object())); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -98,5 +129,67 @@ main(int argc, char *argv[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert(dec(jwe, set1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert(dec(jwe, set2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    json_decref(jwe); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert((jwe = json_pack("{s:{s:s,s:s,s:s,s:s}}", "protected", "alg", "A128KW", "enc", "A128GCM", "typ", "JWE", "zip", "DEF"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(jose_jwe_enc(NULL, jwe, NULL, jwkz, "foo", 4)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(dec(jwe, jwkz)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(!dec(jwe, jwkr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(!dec(jwe, jwko)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(!dec(jwe, set0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(!dec(jwe, set1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(!dec(jwe, set2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* Some tests with "zip": "DEF" */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    struct zip_test_data_t zip[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .data =  make_data(5), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .datalen = 5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .expected = true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .data =  make_data(50), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .datalen = 50, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .expected = true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .data =  make_data(1000), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .datalen = 1000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .expected = true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .data =  make_data(10000000), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .datalen = 10000000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .expected = false, /* compressed len will be ~8000000+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                * (i.e. > MAX_COMPRESSED_SIZE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .data =  make_data(50000), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .datalen = 50000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .expected = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .data = NULL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; zip[i].data != NULL; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        json_decref(jwe); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert((jwe = json_pack("{s:{s:s,s:s,s:s,s:s}}", "protected", "alg", "A128KW", "enc", "A128GCM", "typ", "JWE", "zip", "DEF"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(jose_jwe_enc(NULL, jwe, NULL, jwkz, zip[i].data, zip[i].datalen)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /* Now let's get the ciphertext compressed len. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        char *ct = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        size_t ctl = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(json_unpack(jwe, "{s:s%}", "ciphertext", &ct, &ctl) != -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /* And check our expectation is correct. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(zip[i].expected == (ctl < MAX_COMPRESSED_SIZE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(dec_cmp(jwe, jwkz, zip[i].data, zip[i].datalen) == zip[i].expected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        free(zip[i].data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        zip[i].data = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return EXIT_SUCCESS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |