Sample code for 30+ languages & platforms
Objective-C

Validate JWS Using RSASSA-PKCS1-v1_5 SHA-256

See more JSON Web Signatures (JWS) Examples

Validates a JSON Web Signature (JWS) that uses RSASSA-PKCS1-v1_5 SHA-256.

Chilkat Objective-C Downloads

Objective-C
#import <CkoStringBuilder.h>
#import <CkoPublicKey.h>
#import <CkoJws.h>
#import <CkoJsonObject.h>

BOOL success = NO;

//  This requires the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

//  This example takes a JSON signature in compact serialization format,
//  and uses an RSA public key to validate and recover the protected header and payload.

//  We only need a public key for signature validation.  This is the RSA public key
//  that is used:

//       {"kty":"RSA", 
//        "n":"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddx
//             HmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMs
//             D1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSH
//             SXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdV
//             MTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8
//             NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ", 
//        "e":"AQAB"
//       }

CkoStringBuilder *sbPubKey = [[CkoStringBuilder alloc] init];
[sbPubKey Append: @"{\"kty\":\"RSA\","];
[sbPubKey Append: @"\"n\":\"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddx"];
[sbPubKey Append: @"HmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMs"];
[sbPubKey Append: @"D1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSH"];
[sbPubKey Append: @"SXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdV"];
[sbPubKey Append: @"MTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8"];
[sbPubKey Append: @"NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ\","];
[sbPubKey Append: @"\"e\":\"AQAB\""];
[sbPubKey Append: @"}"];

CkoPublicKey *pubKey = [[CkoPublicKey alloc] init];
success = [pubKey LoadFromString: [sbPubKey GetAsString]];
if (success == NO) {
    NSLog(@"%@",pubKey.LastErrorText);
    return;
}

CkoJws *jws = [[CkoJws alloc] init];

//  Set the RSA public key:
int signatureIndex = 0;
[jws SetPublicKey: [NSNumber numberWithInt: signatureIndex] pubKey: pubKey];

//  Load the JWS.
CkoStringBuilder *sbJws = [[CkoStringBuilder alloc] init];
[sbJws Append: @"eyJhbGciOiJSUzI1NiJ9"];
[sbJws Append: @"."];
[sbJws Append: @"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt"];
[sbJws Append: @"cGxlLmNvbS9pc19yb290Ijp0cnVlfQ"];
[sbJws Append: @"."];
[sbJws Append: @"cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7"];
[sbJws Append: @"AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4"];
[sbJws Append: @"BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K"];
[sbJws Append: @"0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqv"];
[sbJws Append: @"hJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrB"];
[sbJws Append: @"p0igcN_IoypGlUPQGe77Rw"];

success = [jws LoadJwsSb: sbJws];
if (success == NO) {
    NSLog(@"%@",jws.LastErrorText);
    return;
}

//  Validate the 1st (and only) signature at index 0..
int v = [[jws Validate: [NSNumber numberWithInt: signatureIndex]] intValue];
if (v < 0) {
    //  Perhaps Chilkat was not unlocked or the trial expired..
    NSLog(@"%@",@"Method call failed for some other reason.");
    NSLog(@"%@",jws.LastErrorText);
    return;
}

if (v == 0) {
    NSLog(@"%@",@"Invalid signature.  The RSA key was incorrect, the JWS was invalid, or both.");
    return;
}

//  If we get here, the signature was validated..
NSLog(@"%@",@"Signature validated.");
NSLog(@"%@",@"--");

//  Recover the original content:
NSLog(@"%@",@"Recovered content:");
NSLog(@"%@",[jws GetPayload: @"utf-8"]);
NSLog(@"%@",@"--");

//  Examine the protected header:

CkoJsonObject *joseHeader = [[CkoJsonObject alloc] init];
success = [jws GetProtectedH: [NSNumber numberWithInt: signatureIndex] json: joseHeader];
if (success == NO) {
    NSLog(@"%@",jws.LastErrorText);
    return;
}

joseHeader.EmitCompact = NO;

NSLog(@"%@",@"Protected (JOSE) header:");
NSLog(@"%@",[joseHeader Emit]);

//  Output:

//  	Signature validated.
//  	--
//  	Recovered content:
//  	{"iss":"joe", 
//  	 "exp":1300819380,
//  	 "http://example.com/is_root":true}
//  	--
//  	Protected (JOSE) header:
//  	{ 
//  	  "alg": "RS256"
//  	}