From e7d52450d6b615545ce8dfcc0e2af2c599893d41 Mon Sep 17 00:00:00 2001 From: Arun M Date: Sat, 4 Nov 2017 19:21:46 +0530 Subject: [PATCH] Payload data type addded --- include/jwt/algorithm.hpp | 34 ++++++++--- include/jwt/base64.hpp | 7 +++ include/jwt/jwt.hpp | 87 ++++++++++++++++++++++++++- include/jwt/test/compile.txt | 1 + include/jwt/test/test_jwt_payload | Bin 0 -> 166928 bytes include/jwt/test/test_jwt_payload.cc | 34 +++++++++++ include/jwt/test/test_rsa | Bin 0 -> 26164 bytes include/jwt/test/test_rsa.cc | 47 +++++++++++++++ 8 files changed, 199 insertions(+), 11 deletions(-) create mode 100644 include/jwt/test/compile.txt create mode 100755 include/jwt/test/test_jwt_payload create mode 100644 include/jwt/test/test_jwt_payload.cc create mode 100755 include/jwt/test/test_rsa create mode 100644 include/jwt/test/test_rsa.cc diff --git a/include/jwt/algorithm.hpp b/include/jwt/algorithm.hpp index 9cdb08d..46721d4 100644 --- a/include/jwt/algorithm.hpp +++ b/include/jwt/algorithm.hpp @@ -241,14 +241,20 @@ public: { std::error_code ec{}; - EVP_PKEY* pkey = load_key(key); + static auto evpkey_deletor = [](EVP_PKEY* ptr) { + if (ptr) EVP_PKEY_free(ptr); + }; + + std::unique_ptr + pkey{load_key(key), evpkey_deletor}; + if (!pkey) { //TODO: set valid error code return {std::string{}, ec}; } //TODO: Use stack string here ? - std::string sign = evp_digest(pkey, data, ec); + std::string sign = evp_digest(pkey.get(), data, ec); if (ec) { //TODO: handle error_code return {std::move(sign), ec}; @@ -257,7 +263,7 @@ public: if (Hasher::type != EVP_PKEY_EC) { return {std::move(sign), ec}; } else { - sign = public_key_ser(pkey, sign, ec); + sign = public_key_ser(pkey.get(), sign, ec); } return {std::move(sign), ec}; @@ -316,7 +322,7 @@ private: return std::string{}; } - uint32_t len = 0; + unsigned long len = 0; if (EVP_DigestSignFinal(mdctx_ptr.get(), nullptr, &len) != 1) { //TODO: set appropriate error_code @@ -327,7 +333,7 @@ private: sign.resize(len); //Get the signature - if (EVP_DigestSignFinal(mdctx_ptr.get(), &sign[0], &len) != 1) { + if (EVP_DigestSignFinal(mdctx_ptr.get(), (unsigned char*)&sign[0], &len) != 1) { //TODO: set appropriate error_code return std::string{}; } @@ -342,10 +348,14 @@ private: // (optionaly) an associated private key std::string new_sign; - auto eckey_deletor = [](EC_KEY* ptr) { + static auto eckey_deletor = [](EC_KEY* ptr) { if (ptr) EC_KEY_free(ptr); }; + static auto ecsig_deletor = [](ECDSA_SIG* ptr) { + if (ptr) ECDSA_SIG_free(ptr); + }; + std::unique_ptr ec_key{EVP_PKEY_get1_EC_KEY(pkey), eckey_deletor}; @@ -356,9 +366,13 @@ private: uint32_t degree = EC_GROUP_get_degree(EC_KEY_get0_group(ec_key.get())); - ECDSA_SIG* ec_sig = d2i_ECDSA_SIG(nullptr, - (const unsigned char**)&sign[0], - sign.length()); + + std::unique_ptr + ec_sig{d2i_ECDSA_SIG(nullptr, + (const unsigned char**)&sign[0], + sign.length()), + ecsig_deletor}; + if (!ec_sig) { //TODO set a valid error code return std::string{}; @@ -377,7 +391,7 @@ private: #endif - ECDSA_SIG_get0(ec_sig, &ec_sig_r, &ec_sig_s); + ECDSA_SIG_get0(ec_sig.get(), &ec_sig_r, &ec_sig_s); auto r_len = BN_num_bytes(ec_sig_r); auto s_len = BN_num_bytes(ec_sig_s); diff --git a/include/jwt/base64.hpp b/include/jwt/base64.hpp index 761dcea..faaad0f 100644 --- a/include/jwt/base64.hpp +++ b/include/jwt/base64.hpp @@ -127,6 +127,7 @@ std::string base64_decode(const char* in, size_t len) result.resize(128); int i = 0; size_t bytes_rem = len; + size_t bytes_wr = 0; constexpr static const DMap dmap{}; @@ -150,6 +151,7 @@ std::string base64_decode(const char* in, size_t len) i += 3; in += 4; } + bytes_wr = i; switch(bytes_rem) { case 4: @@ -157,6 +159,7 @@ std::string base64_decode(const char* in, size_t len) auto third = dmap.at(in[2]); auto fourth = dmap.at(in[3]); result[i + 2] = (third << 6) | fourth; + bytes_wr++; //FALLTHROUGH } case 3: @@ -164,6 +167,7 @@ std::string base64_decode(const char* in, size_t len) auto second = dmap.at(in[1]); auto third = dmap.at(in[2]); result[i + 1] = (second << 4) | (third >> 2); + bytes_wr++; //FALLTHROUGH } case 2: @@ -171,9 +175,12 @@ std::string base64_decode(const char* in, size_t len) auto first = dmap.at(in[0]); auto second = dmap.at(in[1]); result[i] = (first << 2) | (second >> 4); + bytes_wr++; } }; + result.resize(bytes_wr); + return result; } diff --git a/include/jwt/jwt.hpp b/include/jwt/jwt.hpp index 9ec6efc..5df200b 100644 --- a/include/jwt/jwt.hpp +++ b/include/jwt/jwt.hpp @@ -2,6 +2,8 @@ #define JWT_HPP #include +#include +#include #include #include @@ -156,12 +158,16 @@ struct write_interface template struct base64_enc_dec { + /*! + */ std::string base64_encode(bool with_pretty = false) const { std::string jstr = to_json_str(*static_cast(this), with_pretty); return jwt::base64_encode(jstr.c_str(), jstr.length()); } + /*! + */ static std::string base64_decode(const std::string& encoded_str) { return jwt::base64_decode(encoded_str.c_str(), encoded_str.length()); @@ -233,6 +239,7 @@ public: // Exposed APIs json_t create_json_obj() const { json_t obj = json_t::object(); + //TODO: should be able to do with string_view obj["typ"] = type_to_str(typ_).to_string(); obj["alg"] = alg_to_str(alg_).to_string(); @@ -247,10 +254,88 @@ private: // Data members enum type typ_ = type::JWT; }; + /*! + * JWT Payload */ -struct jwt_payload +struct jwt_payload: write_interface + , base64_enc_dec { +public: // 'tors + /*! + */ + jwt_payload() = default; + + /// Default copy and assignment operations + jwt_payload(const jwt_payload&) = default; + jwt_payload& operator=(const jwt_payload&) = default; + + ~jwt_payload() = default; + +public: // Exposed APIs + /*! + */ + template + bool add_claim(const std::string& cname, T&& cvalue, bool overwrite=false) + { + // Duplicate claim names not allowed + // if overwrite flag is set to true. + auto itr = claim_names_.find(cname); + if (itr != claim_names_.end() && !overwrite) { + return false; + } + + // Add it to the known set of claims + claim_names_.emplace(cname.data(), cname.length()); + + //Add it to the json payload + //TODO: claim name copied twice inside json + //and in the set + payload_[cname.data()] = std::forward(cvalue); + + return true; + } + + /*! + */ + bool has_claim(const std::string& cname) const noexcept + { + return claim_names_.count(cname); + } + + /*! + */ + template + bool has_claim_with_value(const std::string& cname, T&& cvalue) const + { + auto itr = claim_names_.find(cname); + if (itr == claim_names_.end()) return false; + + return (cvalue == payload_[cname]); + } + + /*! + */ + const json_t& create_json_obj() const + { + return payload_; + } + +private: + /*! + */ + struct case_compare { + bool operator()(const std::string& lhs, const std::string& rhs) const + { + int ret = strcasecmp(lhs.c_str(), rhs.c_str()); + return (ret < 0); + } + }; + + /// JSON object containing payload + json_t payload_; + /// The set of claim names in the payload + std::set claim_names_; }; /*! diff --git a/include/jwt/test/compile.txt b/include/jwt/test/compile.txt new file mode 100644 index 0000000..b2cc8eb --- /dev/null +++ b/include/jwt/test/compile.txt @@ -0,0 +1 @@ +g++ -std=c++14 -I /usr/local/Cellar/openssl/1.0.2j/include/ -I /Users/amuralid/dev_test/cpp-jwt/include/ -o test_rsa test_rsa.cc -L /usr/local/Cellar//openssl/1.0.2j/lib/ -lssl -lcrypto diff --git a/include/jwt/test/test_jwt_payload b/include/jwt/test/test_jwt_payload new file mode 100755 index 0000000000000000000000000000000000000000..2e39d243f42b0e2c0886c389ce13dcf4925a5af9 GIT binary patch literal 166928 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 literal 0 HcmV?d00001 diff --git a/include/jwt/test/test_jwt_payload.cc b/include/jwt/test/test_jwt_payload.cc new file mode 100644 index 0000000..809b669 --- /dev/null +++ b/include/jwt/test/test_jwt_payload.cc @@ -0,0 +1,34 @@ +#include +#include "jwt/jwt.hpp" + +void basic_payload_test() +{ + jwt::jwt_payload jp; + jp.add_claim("iss", "myself"); + jp.add_claim("exp", 1234567); + jp.add_claim("Exp", 1234567, true); + + auto jstr = jwt::to_json_str(jp); + std::cout << jstr << std::endl; + + auto enc = jp.base64_encode(); + std::cout << "Base64 enc: " << enc << std::endl; + + auto dec = jp.base64_decode(enc); + std::cout << "Base64 dec: " << dec << std::endl; + std::cout << "Base64 dec: " << jstr << std::endl; + + assert (jstr == dec && "Encoded and decoded messages do not match"); + assert (jp.has_claim("exp") && "Claim exp must exist"); + assert (jp.has_claim("Exp") && "Claim Exp must exist"); + + assert (!jp.has_claim("aud") && "Claim aud does not exist"); + assert (jp.has_claim_with_value("exp", 1234567) && "Claim exp with value 1234567 does not exist"); + + return; +} + +int main() { + basic_payload_test(); + return 0; +} diff --git a/include/jwt/test/test_rsa b/include/jwt/test/test_rsa new file mode 100755 index 0000000000000000000000000000000000000000..c9adf8374aa3a8c6b992ccc748cc2e08e2e15caa GIT binary patch literal 26164 zcmeHveQ;z~b!W?Cyo+z^ssZ>x1 z%k1x*d!N*5X$UstkFAq)e)T6m{MoGzN6{&VWAP@3!*M6> z%WrWww8i_7b2$DLZWXuR@AI@Oqe^c#QIB3lN6`~8k~4<}{QiDrxc?{%*KasVb4VP0 zbKHWPAYFccCOnrBd4V65=X@ImgMvSKQ1B3b^C3GSi}|SEpUz~*(g&o%{=HTysbFLf zA+J;lA^eEE1HmHW_XpFNR5U&z>4oyj>V&*aIUvIGuR_^=e>OfFjfecv_;>=0h4OYj zB;@^XDTMGs8Ts=4{&2)Uo(fEb1+`G#l@AMfcDD$}+`aBa^KKcs_WPSX{hmCw1|i2$ zDrvy^k~qybl55W$zds)Hr{|}}5;1==le(@vTb!feXun9EkKnd1zkec;H;s?UD{T<{ zyIWQuJb#=d&ne3Y`2DfK&+Ffr1|csg=N;ks@@Tx6>IawK9|~jw2k5c>U4$-4)M?2= zc)q;Dnj&{-M>@P+?Mkz^Uvl{5b0|B+DOdF_fm6Sz9s7DO>=ch1^{DOBfDyY8FbTW? z5A711w&Li^XfZ6?mPS9+yyc|_U52*dRBm5h9dPn*D=F^$*)FX`t zod*AdxJhsOc+Sv~;~|ODbG~ui(7+81+|a-c4cyScuUZ2Gs{Va->Gf5}RgLPwDgg8R zj`bPrN2*!<3bt?H+tw1{Ms`Ov&ReQ}epS`87lCgBzY2T>_%ayRR1^_oL6;aUp3$MXSY#l=N?+wzxH3i7qR(l z(QDSDLiD!vg9o^=9qYT4S$dI%^u!C)ypF2MqHcZ^wXGKf+ePa?A+!5V(ZjVPES6x| zwti1!cC4o;W1L@PJ&faeq~zWUsOoUA{yy<~>6Y?SLai_V?AkTgruvB&OP_dQ1(#h8 zCGA5=JQOHy&#ESo%ywMf((8Nhfm9tjFgO42wQH(wZVPY~U`rz!wFZr-OwTniSg&KS z;RLY0ObzJT6(SiLml&s2!*^QMbC;OUTq9s^5U~Cdo*UTDATO0G=$|FJu|afI-?&U* zi2-$>L|dSan%W{4YdZuC0d&n07z16~W6WfroBIM|pqmb8O*I72&C`VGS{V}sK*t2e zK-ZiCW1wqy1KZN>LQ0)l+Mpacza^h|7^%S}`tz!hBSv-W=9h>~kZ&nMR%edg7cf6C z7Sb*h&qFeDq)TXQhidBPRR-EN0gRJ@AR6mT)U|!VxyNAL5}ZslOhGgq)DVVC0KI2m zmI@+c#yVrVd4|i@%S0JthQRc7Cle+3kgC_K#>en*=kbtdN>zQj6iskN-Bd+=2D<4J z7z5oL78nEFYyh^UJ%*HYL{9*Egh5VVyr8UCNdk}1+#tI3We~u+$rZ6wVR4o|ObjI#`Y}Zgrv(dRn?!cW zo*qdWnr=oIXlKPhnP>>2vCc$YS%yJdRQ2^a<^gID+PMM&ivdpqm~aiOGL_TUtLT(3WF&opr{lEqr*5Whnp32|6{e zh~*@Jtyxtprv?UEomfsxG)yKM>rB+Ovx0M&!MaayGSM&v(Tp%r09{)Y73KtyF=L%E z-CW_a^<`1Um?1EI{UQ@3IQdDKTv0bKiTVt5^RmDg=;o%t80h92ur2Kmk;;cuN)Ks+ z2;w;jQ${#1JmNoiT3k;qJmRnyo{yNYy%NCA%7C66$v*kX$>n1C?xocwwwI+BX*LkPaS}~MaW$QTn5CVXPFR3 zqIsPg*)^a}fntd(SiH(*Fk{JgZUSxsUIDyP^3^+*zQ@D*i5QmL9oUi{4C}OzWT6Hv z_dUQpzPntF|6~39)2jaMW57{=+{!SRX$=vD|s+A7(MC^LwiPA$95Nr>W;l=l1}h zhOAX`0ZR{hI=^Stk{n&x5xbb7>;SpCi?;&~*Cq@Eo~T_yj}|kc2)%MX@d7DfOYi(| z7WP=j`0@V#+Y|d&YWoHn=?syEKq9lYL74uEr4tLbX0ljj&I0H#*|X{}+1=_eb61%7%voa5H`sdX z+8hz}XQaU+Vu$ez5miGF;YSFTi$v6)S>ZB4G@cPe?UGxUMobu5c* z=49`%!(h;9+}WWEXAVBED7FN%z{FD0bG!fz3GP&NOpy&?R^$;#Og2N#Ib{*cV^LkA z;3E8P=m(0{B9Kf3Y`w^ljo5vRG;M0b)F!(duynj_vo>9Ssb5jCIP|Zn`tw!?!r0{F zfmhBJ+uc^F`qBmgl3$|zXQU@L_zfyCd5hJ*1!)baqpv?k0@$i5t7sp#ju-c)x}{tu ziNH5OX9EX5VTX*{kcBNI8>nF34!|T0>;UeldNCHlC9WwP{*nvTEQY;*uw#lVFnZ)A zZCQ`s4NVa9ZYdHm=S?~mSmoHkc5fveVRz#`vJwv!c%VCBs%?ucwhept(CWw#Zn62M zW+03y7(H7^_M>4vRe=eB!3l@nFooF{8=8^x5tp7DW@Z6sxNL1%I(%nzwd4X`Hc?ZA zK+$Kpn%tSz*)(J5jlXun&~K)pJAaC51`ihoj8^1t@up4>%=#l#E4f#kXAuv$1r5Q@ zVI%%0YRhb3pzZyHunmhrZU?~n2fW$9<98ARRwaY=s|+?S17P8IqESB%;Bf z)4&)v_NW-^nwhmLf|)Q3euqKMVxk0MshU2aOa{6(EHDOmFal#>FWCPj9-Yvf7GVyP zfo>)R#sJ;~V>t$TZc$(i^xU$*80fhb!r(eGQ2@A{0%HJ|Q(z2qa~0T@_B2wOR!bX{ z%l9q`XYZ0254}qwOYf4h>|JhYAB0xe;`}DeJywmAmBoh(=(CJnOpYgzt*0_mJHsp+ zS9$tuSxt929C#KgsIW_~!Z8&k8{5qAZ5;1J?rZS8C}*8V4PAQ~Szg@+XCJ3tlwA1R zBO2y&I~E#u!>l7<2!P4Vm<*caRDm(jb3TDFz>*{k4~U5Z-~kDYfiB|&0^kIQvMnuy zRA`uT`5GpiHO%M8gHQyKrG_b6sNt(`5k^cagQ|4%JxF)|12)@3tzQu)f%YRP|0)5g zb%ZHcn;V-9wyf{piHgRCplX*%tycw!IdG(A#;;lLdIu@{SzuDxl$FZFyAPP5yhhrB{kK)6 zye1E(ukpb&ZyNqN*{m(C6v`nv2fC5_AG}DZ63n$%R5M46)`J*1EXCm%DJ#eLDoH`~ z0u<XuiF&sZCBq3l+iy@_fENxIOe-aVS zlZY4(G{Y6-BqEN&N%Yy9Stj7q=b_zA)$E7P739!}!#>~ABgEb#h9nNu zx^|iSyRix2`X+oG>tpZ%gfl>GVqP%6+_GR4#rPPAb2!GgM#Q7%ccY$W0nxGV1F$gc z`^?E+4~E$wFqME|GQb`uFb0T935>w8likLecsi>9B^Nx@T|*-TO)raj3}k@9kZ}t0 zq9_x9kFXa}Y4^8|2skU47{F2qi~%g1z!=y^SaVJg8Nkp9jDc>FeDsaMDG`swZcIe6 zvar^8EXFz!t>^H*U)MfGog%#%oR#bBpF}U^I=c${2h}mq%^iU;&`pc690NVKCol$j zZeL&w^qhk_i$k~QGXvc$6Bq-yVgh3Tj~&>Sb~{q)-_i!<@+T(YJTZy!aAFc!PE5)c zuDN$$Yr;8(CLG7X4(+$~e{fdY{UMi&32B%@1Lg{i1kalXq%mgX7{lp>%W@Y*8DoaP z^xPT~C2*^{Q#DejRXurHHF`@`-B(J_i|dORH@qN$T@lh4z!MS}1FR-sTiUZogxn0J;BOOx+NX(M*GjqCI!lJX z{W3ni5!NN|sPR$Mur~KdzVMmxJ__3ty^pf}qhG9NaSjaK0f7TbbP-972c! zuZr1B2AIJD6M#m0S`ernn4OH}80fh=fid9G60;m_GJmv$pmu{0qH?u$mW=7iiV^VzJ3e6C`os(LwyW^{*+F^hX~|Idey!{vJ|d$bB^T&R z8$=xtt3j7^<#mKN%AR;Z#$%Y@nm`Gi3c16of#V_b$Pmcu*1hQRN&T_oHT1sjpuOAd z_TEZTWrWi{FD=qK);EL$AY+(0;W3C9rpbpni|UHrz!|0;PM2pu22Y+|Hg5&>NsZFA zq7n^r#v(U}ja#_xjgGsMH-X5xl%fM5*hDudiM zgY_!_)?4XlV(^;<<0~s@8dLa3aGVcxOD-q6L(CW*g(u5IcoH!|I@idDrNDFLz~r;= zi7CKvHwo6YP1Iu+j!jAr>G(N>Tm~L|*jsFjCFlmX$#vcfk5Mvx)Vv^dc?y zCti@+5G%WuSpO%rK`$%0G47_N+A;*YY_<+mVTa5M=%)3#A7H<^x52h2J7}PJ84Hdd zB^Db^G=zvQGvL=s9lEv#Y+3swqAf8a4ZlRg6t$l_xpxn0P7IcrfgYQHh<%d^t0dJzH zFC>>5l1l+Xw?Wwr!K#W!vb14$x8$jD@jXLQ^o8h8=2*e<0H|~5ZaG&$t;wLD2dRq*+^bMnoVG}Go;E)&4E)<<7336rO9l|09StUnbyf$SYC3^8xf1OvRT zz`|O@!diwITc%ebfLLh!xz5FsufFT(n^I_8KB&DyVs#0xSN zEW3{jrAqcyu&;uB4R8$*<^Z>SmY|S8{+lgvG_pgmczYp_GDdEgTgST{3g>dT0N(-` zPQ2$iOWQq`L<4hdLH!~pUjQSh{Sw5~p_D%sa#A1Z!OMjw4k?fF+$_1EQs=KXIkxy^ zGS;AD_XEUdZX_X$S9XLlW(cYELClrihruP-!Dw?@cc2JCO>lj}D$=zNB2#kV??@hT z*&VtBGJ4D_gqPzo5w5>9#8R@ChA_MGB%a%6S%)82@X~Pb)DUHFU}<>s`nX1NWk_I) z;{-GU=zfnIRAD8|9nP8-vw~vpr@YXBZBxP0i)7R|;7mHSYJiFNPx|?v>e+oG`_o6W z`z4>-yuYaAtDEox58fwU#wf1gUE8$>THy3udqCy1jnfWJyEyf6+RJG_r-Pghb2`fD zM>zd$PS0{W#%YMtaZV$gp5rveX`Is}rzuV|oX&7M$LRv6ALaC8oGxUZijx=t1iFOLzbo>eKW!!u*?=-T|tK;ox!O??+-n4xK0v(e;9w#bY%uAVOO6a0Y z2kwi6khkTh3|-g0_|8*rqbAAGA^AnrG||1MJd{}xxX2(N>G&HWq@f>pnGOxGh`x3r zWD&4v21zXtzHC|FT3mFT>LL>TT^e7M`6%u$P_JKs$MF=H`)&jB2<8fjYXB^I55`N# zBY;KsBPj>Mmn|Fp2bueSKj1y$vrviS%?k~j8|4p z6-TFslFs?onuNQ$zC3=eHj?b=XsR0McdAnh&e^G%RJggVV!msvZ=!o9JvTELnpx;@ zdjq|r<*m``sf4pQmYyA&>8SCxF4X!)yPcE6{nPd7P-DDny0d%EU8{ydgZ1GGcSX|K zIT0Oe>mQq#pB-`cO}Z<4Mj~y=>Eib3iuizYF4j2S7w}exLZj~9ruxyY$-!`IV0NH= zWHQ~K%0@hcZPPPRwX3c%(Oxr{nDtf91n1`GyNA@`{`UIzRJM6~p~)MWp6%@qC!FbI zVzP0vzpJ97DH|D#&IDD@!a%fbFwpLnICKn>-lI;uizT&FtK*vCJRqCA6 z<(g=%8>pyJTmyZP>Ud||H<>CARVF&dCnMv1m80p($+p4Jd`r*JXtHN6+8^-NyIVrV z?%9r+u|B8jndofvc$B6IXuG*C)E}Qz`uqCM#TFvHS#NzT;mLT0J1a-e)z!3h_&SDa zTPFgEIVI6w9IuVFxyM?g!In<7(cRk}AL|~gpNR+3b?%8wccv}f8fZ+%rV@ds;AFC* zsk+}4ZX4=X#>%7RGohp}Sv)%$oN6CU%*@aCw)81gvsJChBxHYS^c zL$y5 zRvk+W_A0YYz4LB0P@jnpg_^qpsXAq3vO8Xvj#j1PzW#EhxN@{Z+Q&nQUvlTGQcd z5AvpF_cQ|%j> zo{22Xc2t%3L}o_2-DByLl8t-&hr6c+YMZ<@lhIh*(^c7#^;M~3)1woK;riILuh?7Z z8XQ^Z$R82^uP@-)ipsKy~^{zmBOZ&Nzfr|F# z+P3EQVsF=Y!V_styDQ7prk+SsQ)Y6ma<*sC0;0p~-WeL~Em`b0SmRvXG7?>-&?#q55d!(7A>2rtWy_K-5=L4Wl(Q z*;COs+%nx<-q#yVIm@T2Di;=7Ly4}L);8*LsHVNRKh!hU+~&+C!d0D#o^Uw1kQh}a zqE&6-`N_e7(TeQgc%nQWan{UxQiJ1lEpz=-wL^mo9j&bk6N435PjUHdCRP#b%_#Gp z^rWk%s(yZ`qFwbVUSHj0TWG}77EW~6&Gp65WslO^nVM|rt!-}|8EtiiTe^BfgT+&A zozvysvAOx#y2*4!(^%A79v%hNkT;tT3yQZT$m5OxrMB?Gj zs&L&@qP}IgxFgmRNRCYUW+p?a=^mqj3{V;x9oMV*CVY z+yqGv1W8{6Nk0tXQxm*oL+F_BZ3&%{kMu_Lq-~BAsSCzoq)*RxNd0Rh6ZkE;D!cnXyAqhZfM|!25xBJh6ZkE;D!cnXyBLDz#Z>B zbC&+X@f{6*|7cfVrqb_sRRt5-jN<4?m9FGbtAm;OWY`;2+|iKYpc4PY+?*djbC*uU z1F>jk-aq4XtlZT=zk0>Ls^=fW55wVC@D{J)#S>peE2+(*I~)9s-fsNJTR4pOKB+4< zAs(LfPlc!aW7%<{ZxdY^^!b~k6XA5GFFFx#iJ~DYyL!CL8;@qFXy<6rKoV~)xE;$b z=xp{k^$+`lsjw{BD<}z}xm04Fr0v^9=}5p`T|=bBo6s+x(&F7dON?iLDNNjeA@m@MAt5S?NfdPjDQzs8tsZ3(d^4KoFiQ3iUv1~db zTHkyV^=s1McqTR9Nw@N^ll`32$o)Y_vTGy&P#7A+dH*aR93c#yX?}f+jp0hIUAhYr}u6v z13xaRc2Ciw!;XK_i&nzz_~z3Rx8tGTw)x*F;&*Kb<`F-|jVZ22u~@?G_~xF(?Kr0o z4O00f8TT|LZpTOeT;e_%Fa3tZlM;Um0?kx^MdI|;7U6bW_WO3ZjGx|*SH#?&#KRJ| zioFy5j}oUCJmI(BD&$ctp747mPBD4H-4dtRJmHGODMnBDFyV;B z+rMu)37kIPuzy!}k?~S+3jWW@a{7Hns{aMxfOsn6`ojWzy#Rly0RO83e6IjMh4%&d z@_(%We_sLqn82Z7adilsUPthiF2FxifWKCNzyCIF|Db-X0RMvm{Ivr7*NczVr;pJw zo&$N=0{oK&_?HUsXAAHj7T~wh2OD|v-(7$|T!4S50Ph$0f&M;HfRhsOi1>k{Y5q-0 z`Z5D;@^6gd^^pTpgWtcvB=C15^u-F6i33xY2Tq^bl;D0J?)z~+fcrt*@5g-x_d~cp zfV&*`!?>}u9OSb(al3H4anma+{1_R%4sl@WJL+-M2fvTvehfE#dq{r`{XyIfxIMUW zHDKEF*FE+JB>z8-rOZLTYvsAwjH@=^HS*6y!?WZruvdG`M^dm```UvCm22VDk(cR( z^HddxO(d#&`{45_N>v(Ea;e^!c%`q-e<1vgRptHr&>@e(r~AdcJaR7mt^$Xt-{0@_ zD@tFzzqg%=kNS^&HU7R@f4>VH+*^4Dz}6f)xmD%oHc~6bETtp^(G=;kpv_-&G*r_W zPNfnlI4Gg8q7*2m>Q^q`4aetA&L;Q4Y&v{*5osN6V>f!#*;$WnCoibm(j1%)jkmO)zE1&ol!71ls?a)@yN4ADEUSD z@-O@}M0Z`4;rNVy3NCzR?x5RB{`z-U`TaPT`RQ~T2x6M!*fE_A$AgF?(5xstw*GUb z#n;|f<)7lYAlDdI1mfwrzEn3}7XM@U2%{899V568B3tnssS7;XF~GkS1b zQqX9An+3hbT%X3-8b8mE_=pmX{v6iIZ~~vdIa-^V@_y1k7Iq$^xQ|h)k5TH6QCyYB zNma*5b;n5V6MEpHadf!cbcS*}tLhNxVa*>uTlxLR&tQH&o*f2yIF}#cIWe?TK;)QC z9!&;wm~u3VlTWh4H%yapo9hN_3J;uQ`+tGRO&;69G&u~}P^p}sNB7zjCq1Ux^V-o+A@p)6S%ymw2}dKP vhxGj5%pvt){`_K5nG-4=gkw;4G!7%fEcpSLW09AW +#include "jwt/algorithm.hpp" + +static const char* rsa_2048_pem = +R"(-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDC2kwAziXUf33m +iqWp0yG6o259+nj7hpQLC4UT0Hmz0wmvreDJ/yNbSgOvsxvVdvzL2IaRZ+Gi5mo0 +lswWvL6IGz7PZO0kXTq9sdBnNqMOx27HddV9e/2/p0MgibJTbgywY2Sk23QYhJpq +Kq/nU0xlBfSaI5ddZ2RC9ZNkVeGawUKYksTruhAVJqviHN8BoK6VowP5vcxyyOWH +TK9KruDqzCIhqwRTeo0spokBkTN/LCuhVivcHAzUiJVtB4qAiTI9L/zkzhjpKz9P +45aLU54rj011gG8U/6E1USh5nMnPkr+d3oLfkhfS3Zs3kJVdyFQWZpQxiTaI92Fd +2wLvbS0HAgMBAAECggEAD8dTnkETSSjlzhRuI9loAtAXM3Zj86JLPLW7GgaoxEoT +n7lJ2bGicFMHB2ROnbOb9vnas82gtOtJsGaBslmoaCckp/C5T1eJWTEb+i+vdpPp +wZcmKZovyyRFSE4+NYlU17fEv6DRvuaGBpDcW7QgHJIl45F8QWEM+msee2KE+V4G +z/9vAQ+sOlvsb4mJP1tJIBx9Lb5loVREwCRy2Ha9tnWdDNar8EYkOn8si4snPT+E +3ZCy8mlcZyUkZeiS/HdtydxZfoiwrSRYamd1diQpPhWCeRteQ802a7ds0Y2YzgfF +UaYjNuRQm7zA//hwbXS7ELPyNMU15N00bajlG0tUOQKBgQDnLy01l20OneW6A2cI +DIDyYhy5O7uulsaEtJReUlcjEDMkin8b767q2VZHb//3ZH+ipnRYByUUyYUhdOs2 +DYRGGeAebnH8wpTT4FCYxUsIUpDfB7RwfdBONgaKewTJz/FPswy1Ye0b5H2c6vVi +m2FZ33HQcoZ3wvFFqyGVnMzpOwKBgQDXxL95yoxUGKa8vMzcE3Cn01szh0dFq0sq +cFpM+HWLVr84CItuG9H6L0KaStEEIOiJsxOVpcXfFFhsJvOGhMA4DQTwH4WuXmXp +1PoVMDlV65PYqvhzwL4+QhvZO2bsrEunITXOmU7CI6kilnAN3LuP4HbqZgoX9lqP +I31VYzLupQKBgGEYck9w0s/xxxtR9ILv5XRnepLdoJzaHHR991aKFKjYU/KD7JDK +INfoAhGs23+HCQhCCtkx3wQVA0Ii/erM0II0ueluD5fODX3TV2ZibnoHW2sgrEsW +vFcs36BnvIIaQMptc+f2QgSV+Z/fGsKYadG6Q+39O7au/HB7SHayzWkjAoGBAMgt +Fzslp9TpXd9iBWjzfCOnGUiP65Z+GWkQ/SXFqD+SRir0+m43zzGdoNvGJ23+Hd6K +TdQbDJ0uoe4MoQeepzoZEgi4JeykVUZ/uVfo+nh06yArVf8FxTm7WVzLGGzgV/uA ++wtl/cRtEyAsk1649yW/KHPEIP8kJdYAJeoO8xSlAoGAERMrkFR7KGYZG1eFNRdV +mJMq+Ibxyw8ks/CbiI+n3yUyk1U8962ol2Q0T4qjBmb26L5rrhNQhneM4e8mo9FX +LlQapYkPvkdrqW0Bp72A/UNAvcGTmN7z5OCJGMUutx2hmEAlrYmpLKS8pM/p9zpK +tEOtzsP5GMDYVlEp1jYSjzQ= +-----END PRIVATE KEY-----)"; + +void basic_rsa_test() +{ + jwt::string_view sv = rsa_2048_pem; + jwt::string_view d = "Some random data string"; + + auto res = jwt::PEMSign::sign(sv, d); + + std::cout << res.first << std::endl; +} + +int main() { + basic_rsa_test(); + return 0; +}