7.2.2.3 RS256: RSASSA PKCS1 v1.5 using SHA-256 . . . . . . . . . . . . . 76
7.2.2.3.1 Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.2.2.3.1.1 EMSA-PKCS1-v1_5 primitive . . . . . . . . . . . . 78
7.2.2.3.1.2 OS2IP primitive . . . . . . . . . . . . . . . . . . . . 79
7.2.2.3.1.3 RSASP1 primitive . . . . . . . . . . . . . . . . . . . 79
7.2.2.3.1.4 RSAVP1 primitive . . . . . . . . . . . . . . . . . . . 80
7.2.2.3.1.5 I2OSP primitive . . . . . . . . . . . . . . . . . . . . 80
7.2.2.3.2 Sample code . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.2.2.4 PS256: RSASSA-PSS using SHA-256 and MGF1 with SHA-256 . . 86
7.2.2.4.1 Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.2.2.4.1.1 MGF1: the mask generation function . . . . . . . . 87
7.2.2.4.1.2 EMSA-PSS-ENCODE primitive . . . . . . . . . . . 88
7.2.2.4.1.3 EMSA-PSS-VERIFY primitive . . . . . . . . . . . . 89
7.2.2.4.2 Sample code . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.2.3 Elliptic Curve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.2.3.1 Elliptic-Curve Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . 96
7.2.3.1.1 Point Addition . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.2.3.1.2 Point Doubling . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.2.3.1.3 Scalar Multiplication . . . . . . . . . . . . . . . . . . . . . 97
7.2.3.2 Elliptic-Curve Digital Signature Algorithm (ECDSA) . . . . . . . . 98
7.2.3.2.1 Elliptic-Curve Domain Parameters . . . . . . . . . . . . . . 100
7.2.3.2.2 Public and Private Keys . . . . . . . . . . . . . . . . . . . 101
7.2.3.2.2.1 The Discrete Logarithm Problem . . . . . . . . . . . 101
7.2.3.2.3 ES256: ECDSA using P-256 and SHA-256 . . . . . . . . . 101
7.3 Future Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
8 Annex A. Best Current Practices 105
8.1 Pitfalls and Common Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
8.1.1 “alg: none” Attack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
8.1.2 RS256 Public-Key as HS256 Secret Attack . . . . . . . . . . . . . . . . . . . . 108
8.1.3 Weak HMAC Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
8.1.4 Wrong Stacked Encryption + Signature Verication Assumptions . . . . . . . 110
8.1.5 Invalid Elliptic-Curve Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.1.6 Substitution Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.1.6.1 Dierent Recipient . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.1.6.2 Same Recipient/Cross JWT . . . . . . . . . . . . . . . . . . . . . . 114
8.2 Mitigations and Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.2.1 Always Perform Algorithm Verication . . . . . . . . . . . . . . . . . . . . . . 115
8.2.2 Use Appropriate Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.2.3 Always Perform All Validations . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.2.4 Always Validate Cryptographic Inputs . . . . . . . . . . . . . . . . . . . . . . 116
8.2.5 Pick Strong Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.2.6 Validate All Possible Claims . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.2.7 Use The typ Claim To Separate Types Of Tokens . . . . . . . . . . . . . . . 117
8.2.8 Use Dierent Validation Rules For Each Token . . . . . . . . . . . . . . . . . 117
8.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3