12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824 |
- /*
- +----------------------------------------------------------------------+
- | Copyright (c) The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | https://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Frank Denis <jedisct1@php.net> |
- +----------------------------------------------------------------------+
- */
- #ifdef HAVE_CONFIG_H
- # include "config.h"
- #endif
- #include "php.h"
- #include "php_ini.h"
- #include "ext/standard/info.h"
- #include "php_libsodium.h"
- #include "zend_exceptions.h"
- #include <sodium.h>
- #include <stdint.h>
- #include <string.h>
- #define PHP_SODIUM_ZSTR_TRUNCATE(zs, len) do { ZSTR_LEN(zs) = (len); } while(0)
- static zend_class_entry *sodium_exception_ce;
- #if (defined(__amd64) || defined(__amd64__) || defined(__x86_64__) || defined(__i386__) || \
- defined(_M_AMD64) || defined(_M_IX86))
- # define HAVE_AESGCM 1
- #endif
- static zend_always_inline zend_string *zend_string_checked_alloc(size_t len, int persistent)
- {
- zend_string *zs;
- if (ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)) < len) {
- zend_error_noreturn(E_ERROR, "Memory allocation too large (%zu bytes)", len);
- }
- zs = zend_string_alloc(len, persistent);
- ZSTR_VAL(zs)[len] = 0;
- return zs;
- }
- #include "libsodium_arginfo.h"
- #ifndef crypto_aead_chacha20poly1305_IETF_KEYBYTES
- # define crypto_aead_chacha20poly1305_IETF_KEYBYTES crypto_aead_chacha20poly1305_KEYBYTES
- #endif
- #ifndef crypto_aead_chacha20poly1305_IETF_NSECBYTES
- # define crypto_aead_chacha20poly1305_IETF_NSECBYTES crypto_aead_chacha20poly1305_NSECBYTES
- #endif
- #ifndef crypto_aead_chacha20poly1305_IETF_ABYTES
- # define crypto_aead_chacha20poly1305_IETF_ABYTES crypto_aead_chacha20poly1305_ABYTES
- #endif
- #if defined(crypto_secretstream_xchacha20poly1305_ABYTES) && SODIUM_LIBRARY_VERSION_MAJOR < 10
- # undef crypto_secretstream_xchacha20poly1305_ABYTES
- #endif
- #ifndef crypto_pwhash_OPSLIMIT_MIN
- # define crypto_pwhash_OPSLIMIT_MIN crypto_pwhash_OPSLIMIT_INTERACTIVE
- #endif
- #ifndef crypto_pwhash_MEMLIMIT_MIN
- # define crypto_pwhash_MEMLIMIT_MIN crypto_pwhash_MEMLIMIT_INTERACTIVE
- #endif
- #ifndef crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN
- # define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE
- #endif
- #ifndef crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN
- # define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE
- #endif
- /* Load after the "standard" module in order to give it
- * priority in registering argon2i/argon2id password hashers.
- */
- static const zend_module_dep sodium_deps[] = {
- ZEND_MOD_REQUIRED("standard")
- ZEND_MOD_END
- };
- zend_module_entry sodium_module_entry = {
- STANDARD_MODULE_HEADER_EX,
- NULL,
- sodium_deps,
- "sodium",
- ext_functions,
- PHP_MINIT(sodium),
- PHP_MSHUTDOWN(sodium),
- NULL,
- NULL,
- PHP_MINFO(sodium),
- PHP_SODIUM_VERSION,
- STANDARD_MODULE_PROPERTIES
- };
- /* }}} */
- #ifdef COMPILE_DL_SODIUM
- ZEND_GET_MODULE(sodium)
- #endif
- /* Remove argument information from backtrace to prevent information leaks */
- static void sodium_remove_param_values_from_backtrace(zend_object *obj) {
- zval rv;
- zval *trace = zend_read_property(zend_get_exception_base(obj), obj, "trace", sizeof("trace")-1, 0, &rv);
- if (trace && Z_TYPE_P(trace) == IS_ARRAY) {
- zval *frame;
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(trace), frame) {
- if (Z_TYPE_P(frame) == IS_ARRAY) {
- zval *args = zend_hash_str_find(Z_ARRVAL_P(frame), "args", sizeof("args")-1);
- if (args) {
- zval_ptr_dtor(args);
- ZVAL_EMPTY_ARRAY(args);
- }
- }
- } ZEND_HASH_FOREACH_END();
- }
- }
- static zend_object *sodium_exception_create_object(zend_class_entry *ce) {
- zend_object *obj = zend_ce_exception->create_object(ce);
- sodium_remove_param_values_from_backtrace(obj);
- return obj;
- }
- static void sodium_separate_string(zval *zv) {
- ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
- if (!Z_REFCOUNTED_P(zv) || Z_REFCOUNT_P(zv) > 1) {
- zend_string *copy = zend_string_init(Z_STRVAL_P(zv), Z_STRLEN_P(zv), 0);
- Z_TRY_DELREF_P(zv);
- ZVAL_STR(zv, copy);
- }
- }
- PHP_MINIT_FUNCTION(sodium)
- {
- if (sodium_init() < 0) {
- zend_error(E_ERROR, "sodium_init()");
- }
- sodium_exception_ce = register_class_SodiumException(zend_ce_exception);
- sodium_exception_ce->create_object = sodium_exception_create_object;
- REGISTER_STRING_CONSTANT("SODIUM_LIBRARY_VERSION",
- (char *) (void *) sodium_version_string(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_LIBRARY_MAJOR_VERSION",
- sodium_library_version_major(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_LIBRARY_MINOR_VERSION",
- sodium_library_version_minor(), CONST_CS | CONST_PERSISTENT);
- #ifdef HAVE_AESGCM
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES",
- crypto_aead_aes256gcm_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES",
- crypto_aead_aes256gcm_NSECBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES",
- crypto_aead_aes256gcm_NPUBBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES",
- crypto_aead_aes256gcm_ABYTES, CONST_CS | CONST_PERSISTENT);
- #endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES",
- crypto_aead_chacha20poly1305_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES",
- crypto_aead_chacha20poly1305_NSECBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES",
- crypto_aead_chacha20poly1305_NPUBBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES",
- crypto_aead_chacha20poly1305_ABYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES",
- crypto_aead_chacha20poly1305_IETF_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES",
- crypto_aead_chacha20poly1305_IETF_NSECBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES",
- crypto_aead_chacha20poly1305_IETF_NPUBBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES",
- crypto_aead_chacha20poly1305_IETF_ABYTES, CONST_CS | CONST_PERSISTENT);
- #ifdef crypto_aead_xchacha20poly1305_IETF_NPUBBYTES
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES",
- crypto_aead_xchacha20poly1305_IETF_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NSECBYTES",
- crypto_aead_xchacha20poly1305_IETF_NSECBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES",
- crypto_aead_xchacha20poly1305_IETF_NPUBBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES",
- crypto_aead_xchacha20poly1305_IETF_ABYTES, CONST_CS | CONST_PERSISTENT);
- #endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AUTH_BYTES",
- crypto_auth_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_AUTH_KEYBYTES",
- crypto_auth_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_SEALBYTES",
- crypto_box_SEALBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_SECRETKEYBYTES",
- crypto_box_SECRETKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_PUBLICKEYBYTES",
- crypto_box_PUBLICKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_KEYPAIRBYTES",
- crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_MACBYTES",
- crypto_box_MACBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_NONCEBYTES",
- crypto_box_NONCEBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_BOX_SEEDBYTES",
- crypto_box_SEEDBYTES, CONST_CS | CONST_PERSISTENT);
- #ifndef crypto_kdf_BYTES_MIN
- # define crypto_kdf_BYTES_MIN 16
- # define crypto_kdf_BYTES_MAX 64
- # define crypto_kdf_CONTEXTBYTES 8
- # define crypto_kdf_KEYBYTES 32
- #endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KDF_BYTES_MIN",
- crypto_kdf_BYTES_MIN, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KDF_BYTES_MAX",
- crypto_kdf_BYTES_MAX, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KDF_CONTEXTBYTES",
- crypto_kdf_CONTEXTBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KDF_KEYBYTES",
- crypto_kdf_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- #ifndef crypto_kx_SEEDBYTES
- # define crypto_kx_SEEDBYTES 32
- # define crypto_kx_SESSIONKEYBYTES 32
- # define crypto_kx_PUBLICKEYBYTES 32
- # define crypto_kx_SECRETKEYBYTES 32
- #endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KX_SEEDBYTES",
- crypto_kx_SEEDBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KX_SESSIONKEYBYTES",
- crypto_kx_SESSIONKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KX_PUBLICKEYBYTES",
- crypto_kx_PUBLICKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KX_SECRETKEYBYTES",
- crypto_kx_SECRETKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_KX_KEYPAIRBYTES",
- crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES,
- CONST_CS | CONST_PERSISTENT);
- #ifdef crypto_secretstream_xchacha20poly1305_ABYTES
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES",
- crypto_secretstream_xchacha20poly1305_ABYTES,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES",
- crypto_secretstream_xchacha20poly1305_HEADERBYTES,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES",
- crypto_secretstream_xchacha20poly1305_KEYBYTES,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX",
- crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE",
- crypto_secretstream_xchacha20poly1305_TAG_MESSAGE,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH",
- crypto_secretstream_xchacha20poly1305_TAG_PUSH,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY",
- crypto_secretstream_xchacha20poly1305_TAG_REKEY,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL",
- crypto_secretstream_xchacha20poly1305_TAG_FINAL,
- CONST_CS | CONST_PERSISTENT);
- #endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_BYTES",
- crypto_generichash_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_BYTES_MIN",
- crypto_generichash_BYTES_MIN, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_BYTES_MAX",
- crypto_generichash_BYTES_MAX, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_KEYBYTES",
- crypto_generichash_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN",
- crypto_generichash_KEYBYTES_MIN, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX",
- crypto_generichash_KEYBYTES_MAX, CONST_CS | CONST_PERSISTENT);
- #ifdef crypto_pwhash_SALTBYTES
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13",
- crypto_pwhash_ALG_ARGON2I13, CONST_CS | CONST_PERSISTENT);
- # ifdef crypto_pwhash_ALG_ARGON2ID13
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13",
- crypto_pwhash_ALG_ARGON2ID13, CONST_CS | CONST_PERSISTENT);
- # endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_DEFAULT",
- crypto_pwhash_ALG_DEFAULT, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SALTBYTES",
- crypto_pwhash_SALTBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_STRING_CONSTANT("SODIUM_CRYPTO_PWHASH_STRPREFIX",
- crypto_pwhash_STRPREFIX, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE",
- crypto_pwhash_opslimit_interactive(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE",
- crypto_pwhash_memlimit_interactive(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE",
- crypto_pwhash_opslimit_moderate(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE",
- crypto_pwhash_memlimit_moderate(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE",
- crypto_pwhash_opslimit_sensitive(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE",
- crypto_pwhash_memlimit_sensitive(), CONST_CS | CONST_PERSISTENT);
- #endif
- #ifdef crypto_pwhash_scryptsalsa208sha256_SALTBYTES
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES",
- crypto_pwhash_scryptsalsa208sha256_SALTBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_STRING_CONSTANT("SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX",
- crypto_pwhash_scryptsalsa208sha256_STRPREFIX, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE",
- crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE",
- crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE",
- crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(), CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE",
- crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(), CONST_CS | CONST_PERSISTENT);
- #endif
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SCALARMULT_BYTES",
- crypto_scalarmult_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SCALARMULT_SCALARBYTES",
- crypto_scalarmult_SCALARBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SHORTHASH_BYTES",
- crypto_shorthash_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SHORTHASH_KEYBYTES",
- crypto_shorthash_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETBOX_KEYBYTES",
- crypto_secretbox_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETBOX_MACBYTES",
- crypto_secretbox_MACBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SECRETBOX_NONCEBYTES",
- crypto_secretbox_NONCEBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SIGN_BYTES",
- crypto_sign_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SIGN_SEEDBYTES",
- crypto_sign_SEEDBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES",
- crypto_sign_PUBLICKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SIGN_SECRETKEYBYTES",
- crypto_sign_SECRETKEYBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SIGN_KEYPAIRBYTES",
- crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES,
- CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_STREAM_NONCEBYTES",
- crypto_stream_NONCEBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_STREAM_KEYBYTES",
- crypto_stream_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- #ifdef crypto_stream_xchacha20_KEYBYTES
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES",
- crypto_stream_xchacha20_NONCEBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES",
- crypto_stream_xchacha20_KEYBYTES, CONST_CS | CONST_PERSISTENT);
- #endif
- #ifdef sodium_base64_VARIANT_ORIGINAL
- REGISTER_LONG_CONSTANT("SODIUM_BASE64_VARIANT_ORIGINAL",
- sodium_base64_VARIANT_ORIGINAL, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING",
- sodium_base64_VARIANT_ORIGINAL_NO_PADDING, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_BASE64_VARIANT_URLSAFE",
- sodium_base64_VARIANT_URLSAFE, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING",
- sodium_base64_VARIANT_URLSAFE_NO_PADDING, CONST_CS | CONST_PERSISTENT);
- #endif
- #ifdef crypto_core_ristretto255_HASHBYTES
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES",
- crypto_scalarmult_ristretto255_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES",
- crypto_scalarmult_ristretto255_SCALARBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES",
- crypto_core_ristretto255_BYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES",
- crypto_core_ristretto255_HASHBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES",
- crypto_core_ristretto255_SCALARBYTES, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES",
- crypto_core_ristretto255_NONREDUCEDSCALARBYTES, CONST_CS | CONST_PERSISTENT);
- #endif
- #if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
- if (FAILURE == PHP_MINIT(sodium_password_hash)(INIT_FUNC_ARGS_PASSTHRU)) {
- return FAILURE;
- }
- #endif
- return SUCCESS;
- }
- PHP_MSHUTDOWN_FUNCTION(sodium)
- {
- randombytes_close();
- return SUCCESS;
- }
- PHP_MINFO_FUNCTION(sodium)
- {
- php_info_print_table_start();
- php_info_print_table_header(2, "sodium support", "enabled");
- php_info_print_table_row(2, "libsodium headers version", SODIUM_VERSION_STRING);
- php_info_print_table_row(2, "libsodium library version", sodium_version_string());
- php_info_print_table_end();
- }
- PHP_FUNCTION(sodium_memzero)
- {
- zval *buf_zv;
- if (zend_parse_parameters(ZEND_NUM_ARGS(),
- "z", &buf_zv) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(buf_zv);
- if (Z_TYPE_P(buf_zv) != IS_STRING) {
- zend_throw_exception(sodium_exception_ce, "a PHP string is required", 0);
- RETURN_THROWS();
- }
- if (Z_REFCOUNTED_P(buf_zv) && Z_REFCOUNT_P(buf_zv) == 1) {
- char *buf = Z_STRVAL(*buf_zv);
- size_t buf_len = Z_STRLEN(*buf_zv);
- if (buf_len > 0) {
- sodium_memzero(buf, (size_t) buf_len);
- }
- }
- convert_to_null(buf_zv);
- }
- PHP_FUNCTION(sodium_increment)
- {
- zval *val_zv;
- unsigned char *val;
- size_t val_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(),
- "z", &val_zv) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(val_zv);
- if (Z_TYPE_P(val_zv) != IS_STRING) {
- zend_throw_exception(sodium_exception_ce, "a PHP string is required", 0);
- RETURN_THROWS();
- }
- sodium_separate_string(val_zv);
- val = (unsigned char *) Z_STRVAL(*val_zv);
- val_len = Z_STRLEN(*val_zv);
- sodium_increment(val, val_len);
- }
- PHP_FUNCTION(sodium_add)
- {
- zval *val_zv;
- unsigned char *val;
- unsigned char *addv;
- size_t val_len;
- size_t addv_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(),
- "zs", &val_zv, &addv, &addv_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(val_zv);
- if (Z_TYPE_P(val_zv) != IS_STRING) {
- zend_throw_exception(sodium_exception_ce, "PHP strings are required", 0);
- RETURN_THROWS();
- }
- sodium_separate_string(val_zv);
- val = (unsigned char *) Z_STRVAL(*val_zv);
- val_len = Z_STRLEN(*val_zv);
- if (val_len != addv_len) {
- zend_argument_error(sodium_exception_ce, 1, "and argument #2 ($string_2) must have the same length");
- RETURN_THROWS();
- }
- sodium_add(val, addv, val_len);
- }
- PHP_FUNCTION(sodium_memcmp)
- {
- char *buf1;
- char *buf2;
- size_t len1;
- size_t len2;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &buf1, &len1,
- &buf2, &len2) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (len1 != len2) {
- zend_argument_error(sodium_exception_ce, 1, "and argument #2 ($string_2) must have the same length");
- RETURN_THROWS();
- }
- RETURN_LONG(sodium_memcmp(buf1, buf2, len1));
- }
- PHP_FUNCTION(sodium_crypto_shorthash)
- {
- zend_string *hash;
- unsigned char *key;
- unsigned char *msg;
- size_t key_len;
- size_t msg_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &msg, &msg_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (key_len != crypto_shorthash_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SHORTHASH_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- hash = zend_string_alloc(crypto_shorthash_BYTES, 0);
- if (crypto_shorthash((unsigned char *) ZSTR_VAL(hash), msg,
- (unsigned long long) msg_len, key) != 0) {
- zend_string_efree(hash);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(hash)[crypto_shorthash_BYTES] = 0;
- RETURN_NEW_STR(hash);
- }
- PHP_FUNCTION(sodium_crypto_secretbox)
- {
- zend_string *ciphertext;
- unsigned char *key;
- unsigned char *msg;
- unsigned char *nonce;
- size_t key_len;
- size_t msg_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &msg, &msg_len,
- &nonce, &nonce_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (nonce_len != crypto_secretbox_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SECRETBOX_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_secretbox_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_SECRETBOX_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_secretbox_MACBYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- ciphertext = zend_string_alloc((size_t) msg_len + crypto_secretbox_MACBYTES, 0);
- if (crypto_secretbox_easy((unsigned char *) ZSTR_VAL(ciphertext),
- msg, (unsigned long long) msg_len,
- nonce, key) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[msg_len + crypto_secretbox_MACBYTES] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_secretbox_open)
- {
- zend_string *msg;
- unsigned char *key;
- unsigned char *ciphertext;
- unsigned char *nonce;
- size_t key_len;
- size_t ciphertext_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &ciphertext, &ciphertext_len,
- &nonce, &nonce_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (nonce_len != crypto_secretbox_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SECRETBOX_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_secretbox_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_SECRETBOX_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (ciphertext_len < crypto_secretbox_MACBYTES) {
- RETURN_FALSE;
- }
- msg = zend_string_alloc
- ((size_t) ciphertext_len - crypto_secretbox_MACBYTES, 0);
- if (crypto_secretbox_open_easy((unsigned char *) ZSTR_VAL(msg), ciphertext,
- (unsigned long long) ciphertext_len,
- nonce, key) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- } else {
- ZSTR_VAL(msg)[ciphertext_len - crypto_secretbox_MACBYTES] = 0;
- RETURN_NEW_STR(msg);
- }
- }
- PHP_FUNCTION(sodium_crypto_generichash)
- {
- zend_string *hash;
- unsigned char *key = NULL;
- unsigned char *msg;
- zend_long hash_len = crypto_generichash_BYTES;
- size_t key_len = 0;
- size_t msg_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|sl",
- &msg, &msg_len,
- &key, &key_len,
- &hash_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (hash_len < crypto_generichash_BYTES_MIN ||
- hash_len > crypto_generichash_BYTES_MAX) {
- zend_throw_exception(sodium_exception_ce, "unsupported output length", 0);
- RETURN_THROWS();
- }
- if (key_len != 0 &&
- (key_len < crypto_generichash_KEYBYTES_MIN ||
- key_len > crypto_generichash_KEYBYTES_MAX)) {
- zend_throw_exception(sodium_exception_ce, "unsupported key length", 0);
- RETURN_THROWS();
- }
- hash = zend_string_alloc(hash_len, 0);
- if (crypto_generichash((unsigned char *) ZSTR_VAL(hash), (size_t) hash_len,
- msg, (unsigned long long) msg_len,
- key, (size_t) key_len) != 0) {
- zend_string_efree(hash);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(hash)[hash_len] = 0;
- RETURN_NEW_STR(hash);
- }
- PHP_FUNCTION(sodium_crypto_generichash_init)
- {
- crypto_generichash_state state_tmp;
- zend_string *state;
- unsigned char *key = NULL;
- size_t state_len = sizeof (crypto_generichash_state);
- zend_long hash_len = crypto_generichash_BYTES;
- size_t key_len = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sl",
- &key, &key_len,
- &hash_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (hash_len < crypto_generichash_BYTES_MIN ||
- hash_len > crypto_generichash_BYTES_MAX) {
- zend_throw_exception(sodium_exception_ce, "unsupported output length", 0);
- RETURN_THROWS();
- }
- if (key_len != 0 &&
- (key_len < crypto_generichash_KEYBYTES_MIN ||
- key_len > crypto_generichash_KEYBYTES_MAX)) {
- zend_throw_exception(sodium_exception_ce, "unsupported key length", 0);
- RETURN_THROWS();
- }
- memset(&state_tmp, 0, sizeof state_tmp);
- if (crypto_generichash_init((void *) &state_tmp, key, (size_t) key_len,
- (size_t) hash_len) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- state = zend_string_alloc(state_len, 0);
- memcpy(ZSTR_VAL(state), &state_tmp, state_len);
- sodium_memzero(&state_tmp, sizeof state_tmp);
- ZSTR_VAL(state)[state_len] = 0;
- RETURN_STR(state);
- }
- PHP_FUNCTION(sodium_crypto_generichash_update)
- {
- crypto_generichash_state state_tmp;
- zval *state_zv;
- unsigned char *msg;
- unsigned char *state;
- size_t msg_len;
- size_t state_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs",
- &state_zv, &msg, &msg_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(state_zv);
- if (Z_TYPE_P(state_zv) != IS_STRING) {
- zend_argument_error(sodium_exception_ce, 1, "must be a reference to a state");
- RETURN_THROWS();
- }
- sodium_separate_string(state_zv);
- state = (unsigned char *) Z_STRVAL(*state_zv);
- state_len = Z_STRLEN(*state_zv);
- if (state_len != sizeof (crypto_generichash_state)) {
- zend_throw_exception(sodium_exception_ce, "incorrect state length", 0);
- RETURN_THROWS();
- }
- memcpy(&state_tmp, state, sizeof state_tmp);
- if (crypto_generichash_update((void *) &state_tmp, msg,
- (unsigned long long) msg_len) != 0) {
- sodium_memzero(&state_tmp, sizeof state_tmp);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- memcpy(state, &state_tmp, state_len);
- sodium_memzero(&state_tmp, sizeof state_tmp);
- RETURN_TRUE;
- }
- PHP_FUNCTION(sodium_crypto_generichash_final)
- {
- crypto_generichash_state state_tmp;
- zend_string *hash;
- zval *state_zv;
- unsigned char *state;
- size_t state_len;
- zend_long hash_len = crypto_generichash_BYTES;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|l",
- &state_zv, &hash_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(state_zv);
- if (Z_TYPE_P(state_zv) != IS_STRING) {
- zend_argument_error(sodium_exception_ce, 1, "must be a reference to a state");
- RETURN_THROWS();
- }
- sodium_separate_string(state_zv);
- state = (unsigned char *) Z_STRVAL(*state_zv);
- state_len = Z_STRLEN(*state_zv);
- if (state_len != sizeof (crypto_generichash_state)) {
- zend_throw_exception(sodium_exception_ce, "incorrect state length", 0);
- RETURN_THROWS();
- }
- if (hash_len < crypto_generichash_BYTES_MIN ||
- hash_len > crypto_generichash_BYTES_MAX) {
- zend_throw_exception(sodium_exception_ce, "unsupported output length", 0);
- RETURN_THROWS();
- }
- hash = zend_string_alloc(hash_len, 0);
- memcpy(&state_tmp, state, sizeof state_tmp);
- if (crypto_generichash_final((void *) &state_tmp,
- (unsigned char *) ZSTR_VAL(hash),
- (size_t) hash_len) != 0) {
- sodium_memzero(&state_tmp, sizeof state_tmp);
- zend_string_efree(hash);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- sodium_memzero(&state_tmp, sizeof state_tmp);
- sodium_memzero(state, state_len);
- convert_to_null(state_zv);
- ZSTR_VAL(hash)[hash_len] = 0;
- RETURN_NEW_STR(hash);
- }
- PHP_FUNCTION(sodium_crypto_box_keypair)
- {
- zend_string *keypair;
- size_t keypair_len;
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- keypair_len = crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES;
- keypair = zend_string_alloc(keypair_len, 0);
- if (crypto_box_keypair((unsigned char *) ZSTR_VAL(keypair) +
- crypto_box_SECRETKEYBYTES,
- (unsigned char *) ZSTR_VAL(keypair)) != 0) {
- zend_string_efree(keypair);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(keypair)[keypair_len] = 0;
- RETURN_NEW_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_box_seed_keypair)
- {
- zend_string *keypair;
- unsigned char *seed;
- size_t keypair_len;
- size_t seed_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &seed, &seed_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (seed_len != crypto_box_SEEDBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_BOX_SEEDBYTES bytes long");
- RETURN_THROWS();
- }
- keypair_len = crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES;
- keypair = zend_string_alloc(keypair_len, 0);
- if (crypto_box_seed_keypair((unsigned char *) ZSTR_VAL(keypair) +
- crypto_box_SECRETKEYBYTES,
- (unsigned char *) ZSTR_VAL(keypair),
- seed) != 0) {
- zend_string_efree(keypair);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(keypair)[keypair_len] = 0;
- RETURN_NEW_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_box_keypair_from_secretkey_and_publickey)
- {
- zend_string *keypair;
- char *publickey;
- char *secretkey;
- size_t keypair_len;
- size_t publickey_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &secretkey, &secretkey_len,
- &publickey, &publickey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_box_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_BOX_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (publickey_len != crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_BOX_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- keypair_len = crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES;
- keypair = zend_string_alloc(keypair_len, 0);
- memcpy(ZSTR_VAL(keypair), secretkey, crypto_box_SECRETKEYBYTES);
- memcpy(ZSTR_VAL(keypair) + crypto_box_SECRETKEYBYTES, publickey,
- crypto_box_PUBLICKEYBYTES);
- ZSTR_VAL(keypair)[keypair_len] = 0;
- RETURN_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_box_secretkey)
- {
- zend_string *secretkey;
- unsigned char *keypair;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len !=
- crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_BOX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- secretkey = zend_string_alloc(crypto_box_SECRETKEYBYTES, 0);
- memcpy(ZSTR_VAL(secretkey), keypair, crypto_box_SECRETKEYBYTES);
- ZSTR_VAL(secretkey)[crypto_box_SECRETKEYBYTES] = 0;
- RETURN_STR(secretkey);
- }
- PHP_FUNCTION(sodium_crypto_box_publickey)
- {
- zend_string *publickey;
- unsigned char *keypair;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len !=
- crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_BOX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- publickey = zend_string_alloc(crypto_box_PUBLICKEYBYTES, 0);
- memcpy(ZSTR_VAL(publickey), keypair + crypto_box_SECRETKEYBYTES,
- crypto_box_PUBLICKEYBYTES);
- ZSTR_VAL(publickey)[crypto_box_PUBLICKEYBYTES] = 0;
- RETURN_STR(publickey);
- }
- PHP_FUNCTION(sodium_crypto_box_publickey_from_secretkey)
- {
- zend_string *publickey;
- unsigned char *secretkey;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_box_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_BOX_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- publickey = zend_string_alloc(crypto_box_PUBLICKEYBYTES, 0);
- (void) sizeof(int[crypto_scalarmult_BYTES ==
- crypto_box_PUBLICKEYBYTES ? 1 : -1]);
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES ==
- crypto_box_SECRETKEYBYTES ? 1 : -1]);
- crypto_scalarmult_base((unsigned char *) ZSTR_VAL(publickey), secretkey);
- ZSTR_VAL(publickey)[crypto_box_PUBLICKEYBYTES] = 0;
- RETURN_STR(publickey);
- }
- PHP_FUNCTION(sodium_crypto_box)
- {
- zend_string *ciphertext;
- unsigned char *keypair;
- unsigned char *msg;
- unsigned char *nonce;
- unsigned char *publickey;
- unsigned char *secretkey;
- size_t keypair_len;
- size_t msg_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &msg, &msg_len,
- &nonce, &nonce_len,
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (nonce_len != crypto_box_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_BOX_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (keypair_len != crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_BOX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- secretkey = keypair;
- publickey = keypair + crypto_box_SECRETKEYBYTES;
- if (SIZE_MAX - msg_len <= crypto_box_MACBYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- ciphertext = zend_string_alloc((size_t) msg_len + crypto_box_MACBYTES, 0);
- if (crypto_box_easy((unsigned char *) ZSTR_VAL(ciphertext), msg,
- (unsigned long long) msg_len,
- nonce, publickey, secretkey) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[msg_len + crypto_box_MACBYTES] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_box_open)
- {
- zend_string *msg;
- unsigned char *ciphertext;
- unsigned char *keypair;
- unsigned char *nonce;
- unsigned char *publickey;
- unsigned char *secretkey;
- size_t ciphertext_len;
- size_t keypair_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &ciphertext, &ciphertext_len,
- &nonce, &nonce_len,
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (nonce_len != crypto_box_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_BOX_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (keypair_len != crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_BOX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- secretkey = keypair;
- publickey = keypair + crypto_box_SECRETKEYBYTES;
- if (ciphertext_len < crypto_box_MACBYTES) {
- RETURN_FALSE;
- }
- msg = zend_string_alloc((size_t) ciphertext_len - crypto_box_MACBYTES, 0);
- if (crypto_box_open_easy((unsigned char *) ZSTR_VAL(msg), ciphertext,
- (unsigned long long) ciphertext_len,
- nonce, publickey, secretkey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- } else {
- ZSTR_VAL(msg)[ciphertext_len - crypto_box_MACBYTES] = 0;
- RETURN_NEW_STR(msg);
- }
- }
- PHP_FUNCTION(sodium_crypto_box_seal)
- {
- zend_string *ciphertext;
- unsigned char *msg;
- unsigned char *publickey;
- size_t msg_len;
- size_t publickey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &msg, &msg_len,
- &publickey, &publickey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (publickey_len != crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_BOX_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_box_SEALBYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- ciphertext = zend_string_alloc((size_t) msg_len + crypto_box_SEALBYTES, 0);
- if (crypto_box_seal((unsigned char *) ZSTR_VAL(ciphertext), msg,
- (unsigned long long) msg_len, publickey) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[msg_len + crypto_box_SEALBYTES] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_box_seal_open)
- {
- zend_string *msg;
- unsigned char *ciphertext;
- unsigned char *keypair;
- unsigned char *publickey;
- unsigned char *secretkey;
- size_t ciphertext_len;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &ciphertext, &ciphertext_len,
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len != crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_BOX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- secretkey = keypair;
- publickey = keypair + crypto_box_SECRETKEYBYTES;
- if (ciphertext_len < crypto_box_SEALBYTES) {
- RETURN_FALSE;
- }
- msg = zend_string_alloc((size_t) ciphertext_len - crypto_box_SEALBYTES, 0);
- if (crypto_box_seal_open((unsigned char *) ZSTR_VAL(msg), ciphertext,
- (unsigned long long) ciphertext_len,
- publickey, secretkey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- } else {
- ZSTR_VAL(msg)[ciphertext_len - crypto_box_SEALBYTES] = 0;
- RETURN_NEW_STR(msg);
- }
- }
- PHP_FUNCTION(sodium_crypto_sign_keypair)
- {
- zend_string *keypair;
- size_t keypair_len;
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- keypair_len = crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES;
- keypair = zend_string_alloc(keypair_len, 0);
- if (crypto_sign_keypair((unsigned char *) ZSTR_VAL(keypair) +
- crypto_sign_SECRETKEYBYTES,
- (unsigned char *) ZSTR_VAL(keypair)) != 0) {
- zend_string_efree(keypair);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(keypair)[keypair_len] = 0;
- RETURN_NEW_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_sign_seed_keypair)
- {
- zend_string *keypair;
- unsigned char *seed;
- size_t keypair_len;
- size_t seed_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &seed, &seed_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (seed_len != crypto_sign_SEEDBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_SEEDBYTES bytes long");
- RETURN_THROWS();
- }
- keypair_len = crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES;
- keypair = zend_string_alloc(keypair_len, 0);
- if (crypto_sign_seed_keypair((unsigned char *) ZSTR_VAL(keypair) +
- crypto_sign_SECRETKEYBYTES,
- (unsigned char *) ZSTR_VAL(keypair),
- seed) != 0) {
- zend_string_efree(keypair);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(keypair)[keypair_len] = 0;
- RETURN_NEW_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_sign_keypair_from_secretkey_and_publickey)
- {
- zend_string *keypair;
- char *publickey;
- char *secretkey;
- size_t keypair_len;
- size_t publickey_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &secretkey, &secretkey_len,
- &publickey, &publickey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_sign_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (publickey_len != crypto_sign_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- keypair_len = crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES;
- keypair = zend_string_alloc(keypair_len, 0);
- memcpy(ZSTR_VAL(keypair), secretkey, crypto_sign_SECRETKEYBYTES);
- memcpy(ZSTR_VAL(keypair) + crypto_sign_SECRETKEYBYTES, publickey,
- crypto_sign_PUBLICKEYBYTES);
- ZSTR_VAL(keypair)[keypair_len] = 0;
- RETURN_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_sign_publickey_from_secretkey)
- {
- zend_string *publickey;
- char *secretkey;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_sign_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- publickey = zend_string_alloc(crypto_sign_PUBLICKEYBYTES, 0);
- if (crypto_sign_ed25519_sk_to_pk((unsigned char *) ZSTR_VAL(publickey),
- (const unsigned char *) secretkey) != 0) {
- zend_throw_exception(sodium_exception_ce,
- "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(publickey)[crypto_sign_PUBLICKEYBYTES] = 0;
- RETURN_STR(publickey);
- }
- PHP_FUNCTION(sodium_crypto_sign_secretkey)
- {
- zend_string *secretkey;
- unsigned char *keypair;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len !=
- crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- secretkey = zend_string_alloc(crypto_sign_SECRETKEYBYTES, 0);
- memcpy(ZSTR_VAL(secretkey), keypair, crypto_sign_SECRETKEYBYTES);
- ZSTR_VAL(secretkey)[crypto_sign_SECRETKEYBYTES] = 0;
- RETURN_STR(secretkey);
- }
- PHP_FUNCTION(sodium_crypto_sign_publickey)
- {
- zend_string *publickey;
- unsigned char *keypair;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len !=
- crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- publickey = zend_string_alloc(crypto_sign_PUBLICKEYBYTES, 0);
- memcpy(ZSTR_VAL(publickey), keypair + crypto_sign_SECRETKEYBYTES,
- crypto_sign_PUBLICKEYBYTES);
- ZSTR_VAL(publickey)[crypto_sign_PUBLICKEYBYTES] = 0;
- RETURN_STR(publickey);
- }
- PHP_FUNCTION(sodium_crypto_sign)
- {
- zend_string *msg_signed;
- unsigned char *msg;
- unsigned char *secretkey;
- unsigned long long msg_signed_real_len;
- size_t msg_len;
- size_t msg_signed_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &msg, &msg_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_sign_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_sign_BYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- msg_signed_len = msg_len + crypto_sign_BYTES;
- msg_signed = zend_string_alloc((size_t) msg_signed_len, 0);
- if (crypto_sign((unsigned char *) ZSTR_VAL(msg_signed),
- &msg_signed_real_len, msg,
- (unsigned long long) msg_len, secretkey) != 0) {
- zend_string_efree(msg_signed);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- if (msg_signed_real_len >= SIZE_MAX || msg_signed_real_len > msg_signed_len) {
- zend_string_efree(msg_signed);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg_signed, (size_t) msg_signed_real_len);
- ZSTR_VAL(msg_signed)[msg_signed_real_len] = 0;
- RETURN_NEW_STR(msg_signed);
- }
- PHP_FUNCTION(sodium_crypto_sign_open)
- {
- zend_string *msg;
- unsigned char *msg_signed;
- unsigned char *publickey;
- unsigned long long msg_real_len;
- size_t msg_len;
- size_t msg_signed_len;
- size_t publickey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &msg_signed, &msg_signed_len,
- &publickey, &publickey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (publickey_len != crypto_sign_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- msg_len = msg_signed_len;
- if (msg_len >= SIZE_MAX) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- msg = zend_string_alloc((size_t) msg_len, 0);
- if (crypto_sign_open((unsigned char *) ZSTR_VAL(msg), &msg_real_len,
- msg_signed, (unsigned long long) msg_signed_len,
- publickey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- }
- if (msg_real_len >= SIZE_MAX || msg_real_len > msg_signed_len) {
- zend_string_efree(msg);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg, (size_t) msg_real_len);
- ZSTR_VAL(msg)[msg_real_len] = 0;
- RETURN_NEW_STR(msg);
- }
- PHP_FUNCTION(sodium_crypto_sign_detached)
- {
- zend_string *signature;
- unsigned char *msg;
- unsigned char *secretkey;
- unsigned long long signature_real_len;
- size_t msg_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &msg, &msg_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_sign_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- signature = zend_string_alloc((size_t) crypto_sign_BYTES, 0);
- memset(ZSTR_VAL(signature), 0, (size_t) crypto_sign_BYTES);
- if (crypto_sign_detached((unsigned char *) ZSTR_VAL(signature),
- &signature_real_len, msg,
- (unsigned long long) msg_len, secretkey) != 0) {
- zend_string_efree(signature);
- zend_throw_exception(sodium_exception_ce, "signature creation failed", 0);
- RETURN_THROWS();
- }
- if (signature_real_len <= 0U || signature_real_len > crypto_sign_BYTES) {
- zend_string_efree(signature);
- zend_throw_exception(sodium_exception_ce, "signature has a bogus size", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(signature, (size_t) signature_real_len);
- ZSTR_VAL(signature)[signature_real_len] = 0;
- RETURN_NEW_STR(signature);
- }
- PHP_FUNCTION(sodium_crypto_sign_verify_detached)
- {
- unsigned char *msg;
- unsigned char *publickey;
- unsigned char *signature;
- size_t msg_len;
- size_t publickey_len;
- size_t signature_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &signature, &signature_len,
- &msg, &msg_len,
- &publickey, &publickey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (signature_len != crypto_sign_BYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_BYTES bytes long");
- RETURN_THROWS();
- }
- if (publickey_len != crypto_sign_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (crypto_sign_verify_detached(signature,
- msg, (unsigned long long) msg_len,
- publickey) != 0) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- PHP_FUNCTION(sodium_crypto_stream)
- {
- zend_string *ciphertext;
- unsigned char *key;
- unsigned char *nonce;
- zend_long ciphertext_len;
- size_t key_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lss",
- &ciphertext_len,
- &nonce, &nonce_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (ciphertext_len <= 0 || ciphertext_len >= SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 1, "must be greater than 0");
- RETURN_THROWS();
- }
- if (nonce_len != crypto_stream_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_STREAM_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_stream_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_STREAM_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- ciphertext = zend_string_alloc((size_t) ciphertext_len, 0);
- if (crypto_stream((unsigned char *) ZSTR_VAL(ciphertext),
- (unsigned long long) ciphertext_len, nonce, key) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[ciphertext_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_stream_xor)
- {
- zend_string *ciphertext;
- unsigned char *key;
- unsigned char *msg;
- unsigned char *nonce;
- size_t ciphertext_len;
- size_t key_len;
- size_t msg_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &msg, &msg_len,
- &nonce, &nonce_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (nonce_len != crypto_stream_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_STREAM_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_stream_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_STREAM_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- ciphertext_len = msg_len;
- ciphertext = zend_string_alloc((size_t) ciphertext_len, 0);
- if (crypto_stream_xor((unsigned char *) ZSTR_VAL(ciphertext), msg,
- (unsigned long long) msg_len, nonce, key) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[ciphertext_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- #ifdef crypto_stream_xchacha20_KEYBYTES
- PHP_FUNCTION(sodium_crypto_stream_xchacha20)
- {
- zend_string *ciphertext;
- unsigned char *key;
- unsigned char *nonce;
- zend_long ciphertext_len;
- size_t key_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lss",
- &ciphertext_len,
- &nonce, &nonce_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (ciphertext_len <= 0 || ciphertext_len >= SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 1, "must be greater than 0");
- RETURN_THROWS();
- }
- if (nonce_len != crypto_stream_xchacha20_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_stream_xchacha20_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- ciphertext = zend_string_checked_alloc((size_t) ciphertext_len, 0);
- if (crypto_stream_xchacha20((unsigned char *) ZSTR_VAL(ciphertext),
- (unsigned long long) ciphertext_len, nonce, key) != 0) {
- zend_string_free(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[ciphertext_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor)
- {
- zend_string *ciphertext;
- unsigned char *key;
- unsigned char *msg;
- unsigned char *nonce;
- size_t ciphertext_len;
- size_t key_len;
- size_t msg_len;
- size_t nonce_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &msg, &msg_len,
- &nonce, &nonce_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (nonce_len != crypto_stream_xchacha20_NONCEBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_stream_xchacha20_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- ciphertext_len = msg_len;
- ciphertext = zend_string_checked_alloc((size_t) ciphertext_len, 0);
- if (crypto_stream_xchacha20_xor((unsigned char *) ZSTR_VAL(ciphertext), msg,
- (unsigned long long) msg_len, nonce, key) != 0) {
- zend_string_free(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ciphertext)[ciphertext_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- #endif
- #ifdef crypto_pwhash_SALTBYTES
- PHP_FUNCTION(sodium_crypto_pwhash)
- {
- zend_string *hash;
- unsigned char *salt;
- char *passwd;
- zend_long hash_len;
- zend_long memlimit;
- zend_long opslimit;
- zend_long alg;
- size_t passwd_len;
- size_t salt_len;
- int ret;
- alg = (zend_long) crypto_pwhash_ALG_DEFAULT;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lssll|l",
- &hash_len,
- &passwd, &passwd_len,
- &salt, &salt_len,
- &opslimit, &memlimit, &alg) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (hash_len <= 0) {
- zend_argument_error(sodium_exception_ce, 1, "must be greater than 0");
- RETURN_THROWS();
- }
- if (hash_len >= 0xffffffff) {
- zend_argument_error(sodium_exception_ce, 1, "is too large");
- RETURN_THROWS();
- }
- if (passwd_len >= 0xffffffff) {
- zend_argument_error(sodium_exception_ce, 2, "is too long");
- RETURN_THROWS();
- }
- if (opslimit <= 0) {
- zend_argument_error(sodium_exception_ce, 4, "must be greater than 0");
- RETURN_THROWS();
- }
- if (memlimit <= 0 || memlimit > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 5, "must be greater than 0");
- RETURN_THROWS();
- }
- if (alg != crypto_pwhash_ALG_ARGON2I13
- # ifdef crypto_pwhash_ALG_ARGON2ID13
- && alg != crypto_pwhash_ALG_ARGON2ID13
- # endif
- && alg != crypto_pwhash_ALG_DEFAULT) {
- zend_throw_exception(sodium_exception_ce, "unsupported password hashing algorithm", 0);
- RETURN_THROWS();
- }
- if (passwd_len <= 0) {
- zend_error(E_WARNING, "empty password");
- }
- if (salt_len != crypto_pwhash_SALTBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_PWHASH_SALTBYTES bytes long");
- RETURN_THROWS();
- }
- if (opslimit < crypto_pwhash_OPSLIMIT_MIN) {
- zend_argument_error(sodium_exception_ce, 4, "must be greater than or equal to %d", crypto_pwhash_OPSLIMIT_MIN);
- RETURN_THROWS();
- }
- if (memlimit < crypto_pwhash_MEMLIMIT_MIN) {
- zend_argument_error(sodium_exception_ce, 5, "must be greater than or equal to %d", crypto_pwhash_MEMLIMIT_MIN);
- }
- hash = zend_string_alloc((size_t) hash_len, 0);
- ret = -1;
- # ifdef crypto_pwhash_ALG_ARGON2ID13
- if (alg == crypto_pwhash_ALG_ARGON2ID13) {
- ret = crypto_pwhash_argon2id
- ((unsigned char *) ZSTR_VAL(hash), (unsigned long long) hash_len,
- passwd, (unsigned long long) passwd_len, salt,
- (unsigned long long) opslimit, (size_t) memlimit, (int) alg);
- }
- # endif
- if (ret == -1) {
- ret = crypto_pwhash
- ((unsigned char *) ZSTR_VAL(hash), (unsigned long long) hash_len,
- passwd, (unsigned long long) passwd_len, salt,
- (unsigned long long) opslimit, (size_t) memlimit, (int) alg);
- }
- if (ret != 0) {
- zend_string_efree(hash);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(hash)[hash_len] = 0;
- RETURN_NEW_STR(hash);
- }
- PHP_FUNCTION(sodium_crypto_pwhash_str)
- {
- zend_string *hash_str;
- char *passwd;
- zend_long memlimit;
- zend_long opslimit;
- size_t passwd_len;
- size_t len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sll",
- &passwd, &passwd_len,
- &opslimit, &memlimit) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (opslimit <= 0) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than 0");
- RETURN_THROWS();
- }
- if (memlimit <= 0 || memlimit > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 3, "must be greater than 0");
- RETURN_THROWS();
- }
- if (passwd_len >= 0xffffffff) {
- zend_argument_error(sodium_exception_ce, 1, "is too long");
- RETURN_THROWS();
- }
- if (passwd_len <= 0) {
- zend_error(E_WARNING, "empty password");
- }
- if (opslimit < crypto_pwhash_OPSLIMIT_MIN) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than or equal to %d", crypto_pwhash_OPSLIMIT_MIN);
- }
- if (memlimit < crypto_pwhash_MEMLIMIT_MIN) {
- zend_argument_error(sodium_exception_ce, 3, "must be greater than or equal to %d", crypto_pwhash_MEMLIMIT_MIN);
- }
- hash_str = zend_string_alloc(crypto_pwhash_STRBYTES - 1, 0);
- if (crypto_pwhash_str
- (ZSTR_VAL(hash_str), passwd, (unsigned long long) passwd_len,
- (unsigned long long) opslimit, (size_t) memlimit) != 0) {
- zend_string_efree(hash_str);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(hash_str)[crypto_pwhash_STRBYTES - 1] = 0;
- len = strlen(ZSTR_VAL(hash_str));
- PHP_SODIUM_ZSTR_TRUNCATE(hash_str, len);
- RETURN_NEW_STR(hash_str);
- }
- #if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
- PHP_FUNCTION(sodium_crypto_pwhash_str_needs_rehash)
- {
- char *hash_str;
- zend_long memlimit;
- zend_long opslimit;
- size_t hash_str_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sll",
- &hash_str, &hash_str_len, &opslimit, &memlimit) == FAILURE) {
- RETURN_THROWS();
- }
- if (crypto_pwhash_str_needs_rehash(hash_str, opslimit, memlimit) == 0) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- #endif
- PHP_FUNCTION(sodium_crypto_pwhash_str_verify)
- {
- char *hash_str;
- char *passwd;
- size_t hash_str_len;
- size_t passwd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &hash_str, &hash_str_len,
- &passwd, &passwd_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (passwd_len >= 0xffffffff) {
- zend_argument_error(sodium_exception_ce, 2, "is too long");
- RETURN_THROWS();
- }
- if (passwd_len <= 0) {
- zend_error(E_WARNING, "empty password");
- }
- if (crypto_pwhash_str_verify
- (hash_str, passwd, (unsigned long long) passwd_len) == 0) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
- }
- #endif
- #ifdef crypto_pwhash_scryptsalsa208sha256_SALTBYTES
- PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256)
- {
- zend_string *hash;
- unsigned char *salt;
- char *passwd;
- zend_long hash_len;
- zend_long memlimit;
- zend_long opslimit;
- size_t passwd_len;
- size_t salt_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lssll",
- &hash_len,
- &passwd, &passwd_len,
- &salt, &salt_len,
- &opslimit, &memlimit) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (hash_len <= 0 || hash_len >= SIZE_MAX || hash_len > 0x1fffffffe0ULL) {
- zend_argument_error(sodium_exception_ce, 1, "must be greater than 0");
- RETURN_THROWS();
- }
- if (opslimit <= 0) {
- zend_argument_error(sodium_exception_ce, 4, "must be greater than 0");
- RETURN_THROWS();
- }
- if (memlimit <= 0 || memlimit > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 5, "must be greater than 0");
- RETURN_THROWS();
- }
- if (passwd_len <= 0) {
- zend_error(E_WARNING, "empty password");
- }
- if (salt_len != crypto_pwhash_scryptsalsa208sha256_SALTBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES bytes long");
- RETURN_THROWS();
- }
- if (opslimit < crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE) {
- zend_argument_error(sodium_exception_ce, 4, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE);
- }
- if (memlimit < crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) {
- zend_argument_error(sodium_exception_ce, 5, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE);
- }
- hash = zend_string_alloc((size_t) hash_len, 0);
- if (crypto_pwhash_scryptsalsa208sha256
- ((unsigned char *) ZSTR_VAL(hash), (unsigned long long) hash_len,
- passwd, (unsigned long long) passwd_len, salt,
- (unsigned long long) opslimit, (size_t) memlimit) != 0) {
- zend_string_efree(hash);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(hash)[hash_len] = 0;
- RETURN_NEW_STR(hash);
- }
- PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str)
- {
- zend_string *hash_str;
- char *passwd;
- zend_long memlimit;
- zend_long opslimit;
- size_t passwd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sll",
- &passwd, &passwd_len,
- &opslimit, &memlimit) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (opslimit <= 0) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than 0");
- RETURN_THROWS();
- }
- if (memlimit <= 0 || memlimit > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 3, "must be greater than 0");
- RETURN_THROWS();
- }
- if (passwd_len <= 0) {
- zend_error(E_WARNING, "empty password");
- }
- if (opslimit < crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE);
- }
- if (memlimit < crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) {
- zend_argument_error(sodium_exception_ce, 3, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE);
- }
- hash_str = zend_string_alloc
- (crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1, 0);
- if (crypto_pwhash_scryptsalsa208sha256_str
- (ZSTR_VAL(hash_str), passwd, (unsigned long long) passwd_len,
- (unsigned long long) opslimit, (size_t) memlimit) != 0) {
- zend_string_efree(hash_str);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(hash_str)[crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1] = 0;
- RETURN_NEW_STR(hash_str);
- }
- PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str_verify)
- {
- char *hash_str;
- char *passwd;
- size_t hash_str_len;
- size_t passwd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &hash_str, &hash_str_len,
- &passwd, &passwd_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (passwd_len <= 0) {
- zend_error(E_WARNING, "empty password");
- }
- if (hash_str_len != crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1) {
- zend_error(E_WARNING, "wrong size for the hashed password");
- RETURN_FALSE;
- }
- if (crypto_pwhash_scryptsalsa208sha256_str_verify
- (hash_str, passwd, (unsigned long long) passwd_len) == 0) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
- }
- #endif
- PHP_FUNCTION(sodium_crypto_aead_aes256gcm_is_available)
- {
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- #ifdef HAVE_AESGCM
- RETURN_BOOL(crypto_aead_aes256gcm_is_available());
- #else
- RETURN_FALSE;
- #endif
- }
- #ifdef HAVE_AESGCM
- PHP_FUNCTION(sodium_crypto_aead_aes256gcm_encrypt)
- {
- zend_string *ciphertext;
- unsigned char *ad;
- unsigned char *msg;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long ciphertext_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &msg, &msg_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_aes256gcm_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_aes256gcm_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_aead_aes256gcm_ABYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- if ((unsigned long long) msg_len > (16ULL * ((1ULL << 32) - 2ULL)) - crypto_aead_aes256gcm_ABYTES) {
- zend_throw_exception(sodium_exception_ce, "message too long for a single key", 0);
- RETURN_THROWS();
- }
- ciphertext_len = msg_len + crypto_aead_aes256gcm_ABYTES;
- ciphertext = zend_string_alloc((size_t) ciphertext_len, 0);
- if (crypto_aead_aes256gcm_encrypt
- ((unsigned char *) ZSTR_VAL(ciphertext), &ciphertext_real_len, msg,
- (unsigned long long) msg_len,
- ad, (unsigned long long) ad_len, NULL, npub, secretkey) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- if (ciphertext_real_len <= 0U || ciphertext_real_len >= SIZE_MAX ||
- ciphertext_real_len > ciphertext_len) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(ciphertext, (size_t) ciphertext_real_len);
- ZSTR_VAL(ciphertext)[ciphertext_real_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_aead_aes256gcm_decrypt)
- {
- zend_string *msg;
- unsigned char *ad;
- unsigned char *ciphertext;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long msg_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &ciphertext, &ciphertext_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_aes256gcm_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_aes256gcm_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (ciphertext_len < crypto_aead_aes256gcm_ABYTES) {
- RETURN_FALSE;
- }
- if (ciphertext_len - crypto_aead_aes256gcm_ABYTES > 16ULL * ((1ULL << 32) - 2ULL)) {
- zend_argument_error(sodium_exception_ce, 1, "is too long");
- RETURN_THROWS();
- }
- msg_len = ciphertext_len;
- if (msg_len >= SIZE_MAX) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- msg = zend_string_alloc((size_t) msg_len, 0);
- if (crypto_aead_aes256gcm_decrypt
- ((unsigned char *) ZSTR_VAL(msg), &msg_real_len, NULL,
- ciphertext, (unsigned long long) ciphertext_len,
- ad, (unsigned long long) ad_len, npub, secretkey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- }
- if (msg_real_len >= SIZE_MAX || msg_real_len > msg_len) {
- zend_string_efree(msg);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg, (size_t) msg_real_len);
- ZSTR_VAL(msg)[msg_real_len] = 0;
- RETURN_NEW_STR(msg);
- }
- #endif
- PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_encrypt)
- {
- zend_string *ciphertext;
- unsigned char *ad;
- unsigned char *msg;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long ciphertext_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &msg, &msg_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_chacha20poly1305_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_chacha20poly1305_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_aead_chacha20poly1305_ABYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- ciphertext_len = msg_len + crypto_aead_chacha20poly1305_ABYTES;
- ciphertext = zend_string_alloc((size_t) ciphertext_len, 0);
- if (crypto_aead_chacha20poly1305_encrypt
- ((unsigned char *) ZSTR_VAL(ciphertext), &ciphertext_real_len, msg,
- (unsigned long long) msg_len,
- ad, (unsigned long long) ad_len, NULL, npub, secretkey) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- if (ciphertext_real_len <= 0U || ciphertext_real_len >= SIZE_MAX ||
- ciphertext_real_len > ciphertext_len) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(ciphertext, (size_t) ciphertext_real_len);
- ZSTR_VAL(ciphertext)[ciphertext_real_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_decrypt)
- {
- zend_string *msg;
- unsigned char *ad;
- unsigned char *ciphertext;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long msg_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &ciphertext, &ciphertext_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_chacha20poly1305_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_chacha20poly1305_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (ciphertext_len < crypto_aead_chacha20poly1305_ABYTES) {
- RETURN_FALSE;
- }
- msg_len = ciphertext_len;
- if (msg_len >= SIZE_MAX) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- msg = zend_string_alloc((size_t) msg_len, 0);
- if (crypto_aead_chacha20poly1305_decrypt
- ((unsigned char *) ZSTR_VAL(msg), &msg_real_len, NULL,
- ciphertext, (unsigned long long) ciphertext_len,
- ad, (unsigned long long) ad_len, npub, secretkey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- }
- if (msg_real_len >= SIZE_MAX || msg_real_len > msg_len) {
- zend_string_efree(msg);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg, (size_t) msg_real_len);
- ZSTR_VAL(msg)[msg_real_len] = 0;
- RETURN_NEW_STR(msg);
- }
- PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_encrypt)
- {
- zend_string *ciphertext;
- unsigned char *ad;
- unsigned char *msg;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long ciphertext_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &msg, &msg_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_chacha20poly1305_IETF_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_chacha20poly1305_IETF_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_aead_chacha20poly1305_IETF_ABYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- if ((unsigned long long) msg_len > 64ULL * (1ULL << 32) - 64ULL) {
- zend_throw_exception(sodium_exception_ce, "message too long for a single key", 0);
- RETURN_THROWS();
- }
- ciphertext_len = msg_len + crypto_aead_chacha20poly1305_IETF_ABYTES;
- ciphertext = zend_string_alloc((size_t) ciphertext_len, 0);
- if (crypto_aead_chacha20poly1305_ietf_encrypt
- ((unsigned char *) ZSTR_VAL(ciphertext), &ciphertext_real_len, msg,
- (unsigned long long) msg_len,
- ad, (unsigned long long) ad_len, NULL, npub, secretkey) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- if (ciphertext_real_len <= 0U || ciphertext_real_len >= SIZE_MAX ||
- ciphertext_real_len > ciphertext_len) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(ciphertext, (size_t) ciphertext_real_len);
- ZSTR_VAL(ciphertext)[ciphertext_real_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_decrypt)
- {
- zend_string *msg;
- unsigned char *ad;
- unsigned char *ciphertext;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long msg_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &ciphertext, &ciphertext_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_chacha20poly1305_IETF_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_chacha20poly1305_IETF_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- msg_len = ciphertext_len;
- if (msg_len >= SIZE_MAX) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- if (ciphertext_len < crypto_aead_chacha20poly1305_IETF_ABYTES) {
- RETURN_FALSE;
- }
- if ((unsigned long long) ciphertext_len -
- crypto_aead_chacha20poly1305_IETF_ABYTES > 64ULL * (1ULL << 32) - 64ULL) {
- zend_throw_exception(sodium_exception_ce, "message too long for a single key", 0);
- RETURN_THROWS();
- }
- msg = zend_string_alloc((size_t) msg_len, 0);
- if (crypto_aead_chacha20poly1305_ietf_decrypt
- ((unsigned char *) ZSTR_VAL(msg), &msg_real_len, NULL,
- ciphertext, (unsigned long long) ciphertext_len,
- ad, (unsigned long long) ad_len, npub, secretkey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- }
- if (msg_real_len >= SIZE_MAX || msg_real_len > msg_len) {
- zend_string_efree(msg);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg, (size_t) msg_real_len);
- ZSTR_VAL(msg)[msg_real_len] = 0;
- RETURN_NEW_STR(msg);
- }
- #ifdef crypto_aead_xchacha20poly1305_IETF_NPUBBYTES
- PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_encrypt)
- {
- zend_string *ciphertext;
- unsigned char *ad;
- unsigned char *msg;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long ciphertext_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &msg, &msg_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_xchacha20poly1305_IETF_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_xchacha20poly1305_IETF_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (SIZE_MAX - msg_len <= crypto_aead_xchacha20poly1305_IETF_ABYTES) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- ciphertext_len = msg_len + crypto_aead_xchacha20poly1305_IETF_ABYTES;
- ciphertext = zend_string_alloc((size_t) ciphertext_len, 0);
- if (crypto_aead_xchacha20poly1305_ietf_encrypt
- ((unsigned char *) ZSTR_VAL(ciphertext), &ciphertext_real_len, msg,
- (unsigned long long) msg_len,
- ad, (unsigned long long) ad_len, NULL, npub, secretkey) != 0) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- if (ciphertext_real_len <= 0U || ciphertext_real_len >= SIZE_MAX ||
- ciphertext_real_len > ciphertext_len) {
- zend_string_efree(ciphertext);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(ciphertext, (size_t) ciphertext_real_len);
- ZSTR_VAL(ciphertext)[ciphertext_real_len] = 0;
- RETURN_NEW_STR(ciphertext);
- }
- PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_decrypt)
- {
- zend_string *msg;
- unsigned char *ad;
- unsigned char *ciphertext;
- unsigned char *npub;
- unsigned char *secretkey;
- unsigned long long msg_real_len;
- size_t ad_len;
- size_t ciphertext_len;
- size_t msg_len;
- size_t npub_len;
- size_t secretkey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssss",
- &ciphertext, &ciphertext_len,
- &ad, &ad_len,
- &npub, &npub_len,
- &secretkey, &secretkey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (npub_len != crypto_aead_xchacha20poly1305_IETF_NPUBBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES bytes long");
- RETURN_THROWS();
- }
- if (secretkey_len != crypto_aead_xchacha20poly1305_IETF_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (ciphertext_len < crypto_aead_xchacha20poly1305_IETF_ABYTES) {
- RETURN_FALSE;
- }
- msg_len = ciphertext_len;
- if (msg_len - crypto_aead_xchacha20poly1305_IETF_ABYTES >= SIZE_MAX) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- if ((unsigned long long) ciphertext_len -
- crypto_aead_xchacha20poly1305_IETF_ABYTES > 64ULL * (1ULL << 32) - 64ULL) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- msg = zend_string_alloc((size_t) msg_len, 0);
- if (crypto_aead_xchacha20poly1305_ietf_decrypt
- ((unsigned char *) ZSTR_VAL(msg), &msg_real_len, NULL,
- ciphertext, (unsigned long long) ciphertext_len,
- ad, (unsigned long long) ad_len, npub, secretkey) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- }
- if (msg_real_len >= SIZE_MAX || msg_real_len > msg_len) {
- zend_string_efree(msg);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg, (size_t) msg_real_len);
- ZSTR_VAL(msg)[msg_real_len] = 0;
- RETURN_NEW_STR(msg);
- }
- #endif
- PHP_FUNCTION(sodium_bin2hex)
- {
- zend_string *hex;
- unsigned char *bin;
- size_t bin_len;
- size_t hex_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &bin, &bin_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (bin_len >= SIZE_MAX / 2U) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- hex_len = bin_len * 2U;
- hex = zend_string_alloc((size_t) hex_len, 0);
- sodium_bin2hex(ZSTR_VAL(hex), hex_len + 1U, bin, bin_len);
- ZSTR_VAL(hex)[hex_len] = 0;
- RETURN_STR(hex);
- }
- PHP_FUNCTION(sodium_hex2bin)
- {
- zend_string *bin;
- const char *end;
- char *hex;
- char *ignore = NULL;
- size_t bin_real_len;
- size_t bin_len;
- size_t hex_len;
- size_t ignore_len = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s",
- &hex, &hex_len,
- &ignore, &ignore_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- bin_len = hex_len / 2;
- bin = zend_string_alloc(bin_len, 0);
- if (sodium_hex2bin((unsigned char *) ZSTR_VAL(bin), bin_len, hex, hex_len,
- ignore, &bin_real_len, &end) != 0 ||
- end != hex + hex_len) {
- zend_string_efree(bin);
- zend_argument_error(sodium_exception_ce, 1, "must be a valid hexadecimal string");
- RETURN_THROWS();
- }
- if (bin_real_len >= SIZE_MAX || bin_real_len > bin_len) {
- zend_string_efree(bin);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(bin, (size_t) bin_real_len);
- ZSTR_VAL(bin)[bin_real_len] = 0;
- RETURN_NEW_STR(bin);
- }
- #ifdef sodium_base64_VARIANT_ORIGINAL
- PHP_FUNCTION(sodium_bin2base64)
- {
- zend_string *b64;
- unsigned char *bin;
- zend_long variant;
- size_t bin_len;
- size_t b64_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl",
- &bin, &bin_len, &variant) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if ((((unsigned int) variant) & ~ 0x6U) != 0x1U) {
- zend_argument_error(sodium_exception_ce, 2, "must be a valid base64 variant identifier");
- RETURN_THROWS();
- }
- if (bin_len >= SIZE_MAX / 4U * 3U - 3U - 1U) {
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- b64_len = sodium_base64_ENCODED_LEN(bin_len, variant);
- b64 = zend_string_alloc((size_t) b64_len - 1U, 0);
- sodium_bin2base64(ZSTR_VAL(b64), b64_len, bin, bin_len, (int) variant);
- RETURN_STR(b64);
- }
- PHP_FUNCTION(sodium_base642bin)
- {
- zend_string *bin;
- char *b64;
- const char *end;
- char *ignore = NULL;
- zend_long variant;
- size_t bin_real_len;
- size_t bin_len;
- size_t b64_len;
- size_t ignore_len = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|s",
- &b64, &b64_len, &variant,
- &ignore, &ignore_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if ((((unsigned int) variant) & ~ 0x6U) != 0x1U) {
- zend_argument_error(sodium_exception_ce, 2, "must be a valid base64 variant identifier");
- RETURN_THROWS();
- }
- bin_len = b64_len / 4U * 3U + 2U;
- bin = zend_string_alloc(bin_len, 0);
- if (sodium_base642bin((unsigned char *) ZSTR_VAL(bin), bin_len,
- b64, b64_len,
- ignore, &bin_real_len, &end, (int) variant) != 0 ||
- end != b64 + b64_len) {
- zend_string_efree(bin);
- zend_argument_error(sodium_exception_ce, 1, "must be a valid base64 string");
- RETURN_THROWS();
- }
- if (bin_real_len >= SIZE_MAX || bin_real_len > bin_len) {
- zend_string_efree(bin);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(bin, (size_t) bin_real_len);
- ZSTR_VAL(bin)[bin_real_len] = 0;
- RETURN_NEW_STR(bin);
- }
- #endif
- PHP_FUNCTION(sodium_crypto_scalarmult)
- {
- zend_string *q;
- unsigned char *n;
- unsigned char *p;
- size_t n_len;
- size_t p_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &n, &n_len, &p, &p_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (n_len != crypto_scalarmult_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SCALARMULT_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- if (p_len != crypto_scalarmult_BYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SCALARMULT_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- q = zend_string_alloc(crypto_scalarmult_BYTES, 0);
- if (crypto_scalarmult((unsigned char *) ZSTR_VAL(q), n, p) != 0) {
- zend_string_efree(q);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(q)[crypto_scalarmult_BYTES] = 0;
- RETURN_NEW_STR(q);
- }
- #ifdef crypto_core_ristretto255_HASHBYTES
- PHP_FUNCTION(sodium_crypto_scalarmult_ristretto255)
- {
- zend_string *q;
- unsigned char *n;
- unsigned char *p;
- size_t n_len;
- size_t p_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &n, &n_len, &p, &p_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (n_len != crypto_scalarmult_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- if (p_len != crypto_scalarmult_ristretto255_BYTES) {
- zend_argument_error(sodium_exception_ce, 2,
- "must be SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES bytes long");
- RETURN_THROWS();
- }
- q = zend_string_alloc(crypto_scalarmult_ristretto255_BYTES, 0);
- if (crypto_scalarmult_ristretto255((unsigned char *) ZSTR_VAL(q), n, p) != 0) {
- zend_string_efree(q);
- zend_throw_exception(sodium_exception_ce, "Result is identity element", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(q)[crypto_scalarmult_ristretto255_BYTES] = 0;
- RETURN_NEW_STR(q);
- }
- PHP_FUNCTION(sodium_crypto_scalarmult_ristretto255_base)
- {
- zend_string *q;
- unsigned char *n;
- size_t n_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &n, &n_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (n_len != crypto_scalarmult_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- q = zend_string_alloc(crypto_scalarmult_ristretto255_BYTES, 0);
- if (crypto_scalarmult_ristretto255_base((unsigned char *) ZSTR_VAL(q), n) != 0) {
- zend_string_efree(q);
- zend_argument_error(sodium_exception_ce, 1, "must not be zero", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(q)[crypto_scalarmult_BYTES] = 0;
- RETURN_NEW_STR(q);
- }
- #endif
- PHP_FUNCTION(sodium_crypto_kx_seed_keypair)
- {
- unsigned char *sk;
- unsigned char *pk;
- unsigned char *seed;
- size_t seed_len;
- zend_string *keypair;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &seed, &seed_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (seed_len != crypto_kx_SEEDBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_KX_SEEDBYTES bytes long");
- RETURN_THROWS();
- }
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES == crypto_kx_PUBLICKEYBYTES ? 1 : -1]);
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES == crypto_kx_SECRETKEYBYTES ? 1 : -1]);
- keypair = zend_string_alloc(crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES, 0);
- sk = (unsigned char *) ZSTR_VAL(keypair);
- pk = sk + crypto_kx_SECRETKEYBYTES;
- crypto_generichash(sk, crypto_kx_SECRETKEYBYTES,
- seed, crypto_kx_SEEDBYTES, NULL, 0);
- if (crypto_scalarmult_base(pk, sk) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(keypair)[crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES] = 0;
- RETURN_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_kx_keypair)
- {
- unsigned char *sk;
- unsigned char *pk;
- zend_string *keypair;
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- keypair = zend_string_alloc(crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES, 0);
- sk = (unsigned char *) ZSTR_VAL(keypair);
- pk = sk + crypto_kx_SECRETKEYBYTES;
- randombytes_buf(sk, crypto_kx_SECRETKEYBYTES);
- if (crypto_scalarmult_base(pk, sk) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(keypair)[crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES] = 0;
- RETURN_STR(keypair);
- }
- PHP_FUNCTION(sodium_crypto_kx_secretkey)
- {
- zend_string *secretkey;
- unsigned char *keypair;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len !=
- crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- secretkey = zend_string_alloc(crypto_kx_SECRETKEYBYTES, 0);
- memcpy(ZSTR_VAL(secretkey), keypair, crypto_kx_SECRETKEYBYTES);
- ZSTR_VAL(secretkey)[crypto_kx_SECRETKEYBYTES] = 0;
- RETURN_STR(secretkey);
- }
- PHP_FUNCTION(sodium_crypto_kx_publickey)
- {
- zend_string *publickey;
- unsigned char *keypair;
- size_t keypair_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &keypair, &keypair_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len !=
- crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- publickey = zend_string_alloc(crypto_kx_PUBLICKEYBYTES, 0);
- memcpy(ZSTR_VAL(publickey), keypair + crypto_kx_SECRETKEYBYTES,
- crypto_kx_PUBLICKEYBYTES);
- ZSTR_VAL(publickey)[crypto_kx_PUBLICKEYBYTES] = 0;
- RETURN_STR(publickey);
- }
- PHP_FUNCTION(sodium_crypto_kx_client_session_keys)
- {
- crypto_generichash_state h;
- unsigned char q[crypto_scalarmult_BYTES];
- unsigned char *keypair;
- unsigned char *client_sk;
- unsigned char *client_pk;
- unsigned char *server_pk;
- unsigned char session_keys[2 * crypto_kx_SESSIONKEYBYTES];
- size_t keypair_len;
- size_t server_pk_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &keypair, &keypair_len,
- &server_pk, &server_pk_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len != crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- if (server_pk_len != crypto_kx_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- client_sk = &keypair[0];
- client_pk = &keypair[crypto_kx_SECRETKEYBYTES];
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES == crypto_kx_PUBLICKEYBYTES ? 1 : -1]);
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES == crypto_kx_SECRETKEYBYTES ? 1 : -1]);
- if (crypto_scalarmult(q, client_sk, server_pk) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- crypto_generichash_init(&h, NULL, 0U, 2 * crypto_kx_SESSIONKEYBYTES);
- crypto_generichash_update(&h, q, sizeof q);
- sodium_memzero(q, sizeof q);
- crypto_generichash_update(&h, client_pk, crypto_kx_PUBLICKEYBYTES);
- crypto_generichash_update(&h, server_pk, crypto_kx_PUBLICKEYBYTES);
- crypto_generichash_final(&h, session_keys, 2 * crypto_kx_SESSIONKEYBYTES);
- sodium_memzero(&h, sizeof h);
- array_init(return_value);
- add_next_index_stringl(return_value,
- (const char *) session_keys,
- crypto_kx_SESSIONKEYBYTES);
- add_next_index_stringl(return_value,
- (const char *) session_keys + crypto_kx_SESSIONKEYBYTES,
- crypto_kx_SESSIONKEYBYTES);
- }
- PHP_FUNCTION(sodium_crypto_kx_server_session_keys)
- {
- crypto_generichash_state h;
- unsigned char q[crypto_scalarmult_BYTES];
- unsigned char *keypair;
- unsigned char *server_sk;
- unsigned char *server_pk;
- unsigned char *client_pk;
- unsigned char session_keys[2 * crypto_kx_SESSIONKEYBYTES];
- size_t keypair_len;
- size_t client_pk_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &keypair, &keypair_len,
- &client_pk, &client_pk_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (keypair_len != crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes long");
- RETURN_THROWS();
- }
- if (client_pk_len != crypto_kx_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- server_sk = &keypair[0];
- server_pk = &keypair[crypto_kx_SECRETKEYBYTES];
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES == crypto_kx_PUBLICKEYBYTES ? 1 : -1]);
- (void) sizeof(int[crypto_scalarmult_SCALARBYTES == crypto_kx_SECRETKEYBYTES ? 1 : -1]);
- if (crypto_scalarmult(q, server_sk, client_pk) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- crypto_generichash_init(&h, NULL, 0U, 2 * crypto_kx_SESSIONKEYBYTES);
- crypto_generichash_update(&h, q, sizeof q);
- sodium_memzero(q, sizeof q);
- crypto_generichash_update(&h, client_pk, crypto_kx_PUBLICKEYBYTES);
- crypto_generichash_update(&h, server_pk, crypto_kx_PUBLICKEYBYTES);
- crypto_generichash_final(&h, session_keys, 2 * crypto_kx_SESSIONKEYBYTES);
- sodium_memzero(&h, sizeof h);
- array_init(return_value);
- add_next_index_stringl(return_value,
- (const char *) session_keys + crypto_kx_SESSIONKEYBYTES,
- crypto_kx_SESSIONKEYBYTES);
- add_next_index_stringl(return_value,
- (const char *) session_keys,
- crypto_kx_SESSIONKEYBYTES);
- }
- PHP_FUNCTION(sodium_crypto_auth)
- {
- zend_string *mac;
- char *key;
- char *msg;
- size_t msg_len;
- size_t key_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &msg, &msg_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (key_len != crypto_auth_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_AUTH_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- mac = zend_string_alloc(crypto_auth_BYTES, 0);
- if (crypto_auth((unsigned char *) ZSTR_VAL(mac),
- (const unsigned char *) msg, msg_len,
- (const unsigned char *) key) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(mac)[crypto_auth_BYTES] = 0;
- RETURN_STR(mac);
- }
- PHP_FUNCTION(sodium_crypto_auth_verify)
- {
- char *mac;
- char *key;
- char *msg;
- size_t mac_len;
- size_t msg_len;
- size_t key_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss",
- &mac, &mac_len,
- &msg, &msg_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (key_len != crypto_auth_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_AUTH_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (mac_len != crypto_auth_BYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_AUTH_BYTES bytes long");
- RETURN_THROWS();
- }
- if (crypto_auth_verify((const unsigned char *) mac,
- (const unsigned char *) msg, msg_len,
- (const unsigned char *) key) != 0) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- PHP_FUNCTION(sodium_crypto_sign_ed25519_sk_to_curve25519)
- {
- zend_string *ecdhkey;
- char *eddsakey;
- size_t eddsakey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &eddsakey, &eddsakey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (eddsakey_len != crypto_sign_SECRETKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes long");
- RETURN_THROWS();
- }
- ecdhkey = zend_string_alloc(crypto_box_SECRETKEYBYTES, 0);
- if (crypto_sign_ed25519_sk_to_curve25519((unsigned char *) ZSTR_VAL(ecdhkey),
- (const unsigned char *) eddsakey) != 0) {
- zend_throw_exception(sodium_exception_ce, "conversion failed", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ecdhkey)[crypto_box_SECRETKEYBYTES] = 0;
- RETURN_STR(ecdhkey);
- }
- PHP_FUNCTION(sodium_crypto_sign_ed25519_pk_to_curve25519)
- {
- zend_string *ecdhkey;
- char *eddsakey;
- size_t eddsakey_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &eddsakey, &eddsakey_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (eddsakey_len != crypto_sign_PUBLICKEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes long");
- RETURN_THROWS();
- }
- ecdhkey = zend_string_alloc(crypto_sign_PUBLICKEYBYTES, 0);
- if (crypto_sign_ed25519_pk_to_curve25519((unsigned char *) ZSTR_VAL(ecdhkey),
- (const unsigned char *) eddsakey) != 0) {
- zend_throw_exception(sodium_exception_ce, "conversion failed", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(ecdhkey)[crypto_box_PUBLICKEYBYTES] = 0;
- RETURN_STR(ecdhkey);
- }
- PHP_FUNCTION(sodium_compare)
- {
- char *buf1;
- char *buf2;
- size_t len1;
- size_t len2;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &buf1, &len1,
- &buf2, &len2) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (len1 != len2) {
- zend_argument_error(sodium_exception_ce, 1, "and argument #2 ($string_2) must have the same length");
- RETURN_THROWS();
- } else {
- RETURN_LONG(sodium_compare((const unsigned char *) buf1,
- (const unsigned char *) buf2, (size_t) len1));
- }
- }
- #ifdef HAVE_AESGCM
- PHP_FUNCTION(sodium_crypto_aead_aes256gcm_keygen)
- {
- unsigned char key[crypto_aead_aes256gcm_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- #endif
- PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_keygen)
- {
- unsigned char key[crypto_aead_chacha20poly1305_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_keygen)
- {
- unsigned char key[crypto_aead_chacha20poly1305_IETF_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- #ifdef crypto_aead_xchacha20poly1305_IETF_NPUBBYTES
- PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_keygen)
- {
- unsigned char key[crypto_aead_xchacha20poly1305_IETF_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- #endif
- PHP_FUNCTION(sodium_crypto_auth_keygen)
- {
- unsigned char key[crypto_auth_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_generichash_keygen)
- {
- unsigned char key[crypto_generichash_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_kdf_keygen)
- {
- unsigned char key[crypto_kdf_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_secretbox_keygen)
- {
- unsigned char key[crypto_secretbox_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_shorthash_keygen)
- {
- unsigned char key[crypto_shorthash_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_stream_keygen)
- {
- unsigned char key[crypto_stream_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- #ifdef crypto_stream_xchacha20_KEYBYTES
- PHP_FUNCTION(sodium_crypto_stream_xchacha20_keygen)
- {
- unsigned char key[crypto_stream_xchacha20_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- return;
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- #endif
- PHP_FUNCTION(sodium_crypto_kdf_derive_from_key)
- {
- unsigned char ctx_padded[crypto_generichash_blake2b_PERSONALBYTES];
- #ifndef crypto_kdf_PRIMITIVE
- unsigned char salt[crypto_generichash_blake2b_SALTBYTES];
- #endif
- char *ctx;
- char *key;
- zend_string *subkey;
- zend_long subkey_id;
- zend_long subkey_len;
- size_t ctx_len;
- size_t key_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "llss",
- &subkey_len,
- &subkey_id,
- &ctx, &ctx_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (subkey_len < crypto_kdf_BYTES_MIN) {
- zend_argument_error(sodium_exception_ce, 1, "must be greater than or equal to SODIUM_CRYPTO_KDF_BYTES_MIN");
- RETURN_THROWS();
- }
- if (subkey_len > crypto_kdf_BYTES_MAX || subkey_len > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 1, "must be less than or equal to SODIUM_CRYPTO_KDF_BYTES_MAX");
- RETURN_THROWS();
- }
- if (subkey_id < 0) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than or equal to 0");
- RETURN_THROWS();
- }
- if (ctx_len != crypto_kdf_CONTEXTBYTES) {
- zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_KDF_CONTEXTBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_kdf_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_KDF_BYTES_MIN bytes long");
- RETURN_THROWS();
- }
- memcpy(ctx_padded, ctx, crypto_kdf_CONTEXTBYTES);
- memset(ctx_padded + crypto_kdf_CONTEXTBYTES, 0, sizeof ctx_padded - crypto_kdf_CONTEXTBYTES);
- subkey = zend_string_alloc((size_t) subkey_len, 0);
- #ifdef crypto_kdf_PRIMITIVE
- crypto_kdf_derive_from_key((unsigned char *) ZSTR_VAL(subkey),
- (size_t) subkey_len, (uint64_t) subkey_id,
- ctx, (const unsigned char *) key);
- #else
- salt[0] = (unsigned char) (((uint64_t) subkey_id) );
- salt[1] = (unsigned char) (((uint64_t) subkey_id) >> 8);
- salt[2] = (unsigned char) (((uint64_t) subkey_id) >> 16);
- salt[3] = (unsigned char) (((uint64_t) subkey_id) >> 24);
- salt[4] = (unsigned char) (((uint64_t) subkey_id) >> 32);
- salt[5] = (unsigned char) (((uint64_t) subkey_id) >> 40);
- salt[6] = (unsigned char) (((uint64_t) subkey_id) >> 48);
- salt[7] = (unsigned char) (((uint64_t) subkey_id) >> 56);
- memset(salt + 8, 0, (sizeof salt) - 8);
- crypto_generichash_blake2b_salt_personal((unsigned char *) ZSTR_VAL(subkey),
- (size_t) subkey_len,
- NULL, 0,
- (const unsigned char *) key,
- crypto_kdf_KEYBYTES,
- salt, ctx_padded);
- #endif
- ZSTR_VAL(subkey)[subkey_len] = 0;
- RETURN_STR(subkey);
- }
- PHP_FUNCTION(sodium_pad)
- {
- zend_string *padded;
- char *unpadded;
- zend_long blocksize;
- volatile size_t st;
- size_t i, j, k;
- size_t unpadded_len;
- size_t xpadlen;
- size_t xpadded_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl",
- &unpadded, &unpadded_len, &blocksize) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (blocksize <= 0) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than 0");
- RETURN_THROWS();
- }
- if (blocksize > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 2, "is too large");
- RETURN_THROWS();
- }
- xpadlen = blocksize - 1U;
- if ((blocksize & (blocksize - 1U)) == 0U) {
- xpadlen -= unpadded_len & ((size_t) blocksize - 1U);
- } else {
- xpadlen -= unpadded_len % (size_t) blocksize;
- }
- if ((size_t) SIZE_MAX - unpadded_len <= xpadlen) {
- zend_throw_exception(sodium_exception_ce, "input is too large", 0);
- RETURN_THROWS();
- }
- xpadded_len = unpadded_len + xpadlen;
- padded = zend_string_alloc(xpadded_len + 1U, 0);
- if (unpadded_len > 0) {
- st = 1U;
- i = 0U;
- k = unpadded_len;
- for (j = 0U; j <= xpadded_len; j++) {
- ZSTR_VAL(padded)[j] = unpadded[i];
- k -= st;
- st = (size_t) (~(((( (((uint64_t) k) >> 48) | (((uint64_t) k) >> 32) |
- (k >> 16) | k) & 0xffff) - 1U) >> 16)) & 1U;
- i += st;
- }
- }
- #if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
- if (sodium_pad(NULL, (unsigned char *) ZSTR_VAL(padded), unpadded_len,
- (size_t) blocksize, xpadded_len + 1U) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- #else
- {
- char *tail;
- volatile unsigned char mask;
- unsigned char barrier_mask;
- tail = &ZSTR_VAL(padded)[xpadded_len];
- mask = 0U;
- for (i = 0; i < blocksize; i++) {
- barrier_mask = (unsigned char)
- (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT));
- tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask);
- mask |= barrier_mask;
- }
- }
- #endif
- ZSTR_VAL(padded)[xpadded_len + 1U] = 0;
- RETURN_STR(padded);
- }
- PHP_FUNCTION(sodium_unpad)
- {
- zend_string *unpadded;
- char *padded;
- size_t padded_len;
- size_t unpadded_len;
- zend_long blocksize;
- int ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl",
- &padded, &padded_len, &blocksize) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (blocksize <= 0) {
- zend_argument_error(sodium_exception_ce, 2, "must be greater than 0");
- RETURN_THROWS();
- }
- if (blocksize > SIZE_MAX) {
- zend_argument_error(sodium_exception_ce, 2, "is too large");
- RETURN_THROWS();
- }
- if (padded_len < blocksize) {
- zend_argument_error(sodium_exception_ce, 1, "must be at least as long as the block size");
- RETURN_THROWS();
- }
- #if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
- ret = sodium_unpad(&unpadded_len, (const unsigned char *) padded,
- padded_len, (size_t) blocksize);
- #else
- {
- const char *tail;
- unsigned char acc = 0U;
- unsigned char c;
- unsigned char valid = 0U;
- volatile size_t pad_len = 0U;
- size_t i;
- size_t is_barrier;
- tail = &padded[padded_len - 1U];
- for (i = 0U; i < (size_t) blocksize; i++) {
- c = tail[-i];
- is_barrier =
- (( (acc - 1U) & (pad_len - 1U) & ((c ^ 0x80) - 1U) ) >> 8) & 1U;
- acc |= c;
- pad_len |= i & (1U + ~is_barrier);
- valid |= (unsigned char) is_barrier;
- }
- unpadded_len = padded_len - 1U - pad_len;
- ret = (int) (valid - 1U);
- }
- #endif
- if (ret != 0 || unpadded_len > LONG_MAX) {
- zend_throw_exception(sodium_exception_ce, "invalid padding", 0);
- RETURN_THROWS();
- }
- unpadded = zend_string_init(padded, padded_len, 0);
- PHP_SODIUM_ZSTR_TRUNCATE(unpadded, unpadded_len);
- ZSTR_VAL(unpadded)[unpadded_len] = 0;
- RETURN_STR(unpadded);
- }
- #ifdef crypto_secretstream_xchacha20poly1305_ABYTES
- PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_keygen)
- {
- unsigned char key[crypto_secretstream_xchacha20poly1305_KEYBYTES];
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- randombytes_buf(key, sizeof key);
- RETURN_STRINGL((const char *) key, sizeof key);
- }
- PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_init_push)
- {
- crypto_secretstream_xchacha20poly1305_state state;
- unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES];
- unsigned char *key;
- size_t key_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (key_len != crypto_secretstream_xchacha20poly1305_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (crypto_secretstream_xchacha20poly1305_init_push(&state,
- header, key) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- array_init(return_value);
- add_next_index_stringl(return_value, (const char *) &state, sizeof state);
- add_next_index_stringl(return_value, (const char *) header, sizeof header);
- }
- PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_push)
- {
- zval *state_zv;
- zend_string *c;
- unsigned char *ad = NULL;
- unsigned char *msg;
- unsigned char *state;
- unsigned long long c_real_len;
- zend_long tag = crypto_secretstream_xchacha20poly1305_TAG_MESSAGE;
- size_t ad_len = (size_t) 0U;
- size_t c_len;
- size_t msg_len;
- size_t state_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|sl",
- &state_zv,
- &msg, &msg_len, &ad, &ad_len, &tag) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(state_zv);
- if (Z_TYPE_P(state_zv) != IS_STRING) {
- zend_argument_error(sodium_exception_ce, 1, "must be a reference to a state");
- RETURN_THROWS();
- }
- sodium_separate_string(state_zv);
- state = (unsigned char *) Z_STRVAL(*state_zv);
- state_len = Z_STRLEN(*state_zv);
- if (state_len != sizeof (crypto_secretstream_xchacha20poly1305_state)) {
- zend_argument_error(sodium_exception_ce, 1, "must have a correct length");
- RETURN_THROWS();
- }
- if (msg_len > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX ||
- msg_len > SIZE_MAX - crypto_secretstream_xchacha20poly1305_ABYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be at most SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes long");
- RETURN_THROWS();
- }
- if (tag < 0 || tag > 255) {
- zend_argument_error(sodium_exception_ce, 4, "must be in the range of 0-255");
- RETURN_THROWS();
- }
- c_len = msg_len + crypto_secretstream_xchacha20poly1305_ABYTES;
- c = zend_string_alloc((size_t) c_len, 0);
- if (crypto_secretstream_xchacha20poly1305_push
- ((void *) state, (unsigned char *) ZSTR_VAL(c), &c_real_len,
- msg, (unsigned long long) msg_len, ad, (unsigned long long) ad_len,
- (unsigned char) tag) != 0) {
- zend_string_efree(c);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- if (c_real_len <= 0U || c_real_len >= SIZE_MAX || c_real_len > c_len) {
- zend_string_efree(c);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(c, (size_t) c_real_len);
- ZSTR_VAL(c)[c_real_len] = 0;
- RETURN_NEW_STR(c);
- }
- PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_init_pull)
- {
- crypto_secretstream_xchacha20poly1305_state state;
- unsigned char *header;
- unsigned char *key;
- size_t header_len;
- size_t key_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &header, &header_len,
- &key, &key_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (header_len != crypto_secretstream_xchacha20poly1305_HEADERBYTES) {
- zend_argument_error(sodium_exception_ce, 1, "must be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES bytes long");
- RETURN_THROWS();
- }
- if (key_len != crypto_secretstream_xchacha20poly1305_KEYBYTES) {
- zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES bytes long");
- RETURN_THROWS();
- }
- if (crypto_secretstream_xchacha20poly1305_init_pull(&state,
- header, key) != 0) {
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- RETURN_STRINGL((const char *) &state, sizeof state);
- }
- PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_pull)
- {
- zval *state_zv;
- zend_string *msg;
- unsigned char *ad = NULL;
- unsigned char *c;
- unsigned char *state;
- unsigned long long msg_real_len;
- size_t ad_len = (size_t) 0U;
- size_t msg_len;
- size_t c_len;
- size_t state_len;
- unsigned char tag;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|s",
- &state_zv,
- &c, &c_len, &ad, &ad_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(state_zv);
- if (Z_TYPE_P(state_zv) != IS_STRING) {
- zend_argument_error(sodium_exception_ce, 1, "must be a reference to a state");
- RETURN_THROWS();
- }
- sodium_separate_string(state_zv);
- state = (unsigned char *) Z_STRVAL(*state_zv);
- state_len = Z_STRLEN(*state_zv);
- if (state_len != sizeof (crypto_secretstream_xchacha20poly1305_state)) {
- zend_throw_exception(sodium_exception_ce, "incorrect state length", 0);
- RETURN_THROWS();
- }
- if (c_len < crypto_secretstream_xchacha20poly1305_ABYTES) {
- RETURN_FALSE;
- }
- msg_len = c_len - crypto_secretstream_xchacha20poly1305_ABYTES;
- msg = zend_string_alloc((size_t) msg_len, 0);
- if (crypto_secretstream_xchacha20poly1305_pull
- ((void *) state, (unsigned char *) ZSTR_VAL(msg), &msg_real_len, &tag,
- c, (unsigned long long) c_len, ad, (unsigned long long) ad_len) != 0) {
- zend_string_efree(msg);
- RETURN_FALSE;
- }
- if (msg_real_len >= SIZE_MAX || msg_real_len > msg_len) {
- zend_string_efree(msg);
- zend_throw_exception(sodium_exception_ce, "arithmetic overflow", 0);
- RETURN_THROWS();
- }
- PHP_SODIUM_ZSTR_TRUNCATE(msg, (size_t) msg_real_len);
- ZSTR_VAL(msg)[msg_real_len] = 0;
- array_init(return_value);
- add_next_index_str(return_value, msg);
- add_next_index_long(return_value, (long) tag);
- }
- PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_rekey)
- {
- zval *state_zv;
- unsigned char *state;
- size_t state_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &state_zv) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- ZVAL_DEREF(state_zv);
- if (Z_TYPE_P(state_zv) != IS_STRING) {
- zend_argument_error(sodium_exception_ce, 1, "must be a reference to a state");
- RETURN_THROWS();
- }
- sodium_separate_string(state_zv);
- state = (unsigned char *) Z_STRVAL(*state_zv);
- state_len = Z_STRLEN(*state_zv);
- if (state_len != sizeof (crypto_secretstream_xchacha20poly1305_state)) {
- zend_throw_exception(sodium_exception_ce, "incorrect state length", 0);
- RETURN_THROWS();
- }
- crypto_secretstream_xchacha20poly1305_rekey((void *) state);
- }
- #endif
- #ifdef crypto_core_ristretto255_HASHBYTES
- PHP_FUNCTION(sodium_crypto_core_ristretto255_add)
- {
- zend_string *r;
- unsigned char *p;
- unsigned char *q;
- size_t p_len;
- size_t q_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &p, &p_len, &q, &q_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (p_len != crypto_core_ristretto255_BYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES bytes long");
- RETURN_THROWS();
- }
- if (q_len != crypto_core_ristretto255_BYTES) {
- zend_argument_error(sodium_exception_ce, 2,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_BYTES, 0);
- if (crypto_core_ristretto255_add((unsigned char *) ZSTR_VAL(r), p, q) != 0) {
- zend_string_efree(r);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(r)[crypto_core_ristretto255_BYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_from_hash)
- {
- zend_string *r;
- unsigned char *s;
- size_t s_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &s, &s_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (s_len != crypto_core_ristretto255_HASHBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_SCALARBYTES, 0);
- if (crypto_core_ristretto255_from_hash((unsigned char *) ZSTR_VAL(r), s) != 0) {
- zend_string_efree(r);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_is_valid_point)
- {
- unsigned char *s;
- size_t s_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &s, &s_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (s_len != crypto_core_ristretto255_BYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES bytes long");
- RETURN_THROWS();
- }
- RETURN_BOOL(crypto_core_ristretto255_is_valid_point(s));
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_random)
- {
- zend_string *r;
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_BYTES, 0);
- crypto_core_ristretto255_random((unsigned char *) ZSTR_VAL(r));
- ZSTR_VAL(r)[crypto_core_ristretto255_BYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_add)
- {
- zend_string *r;
- unsigned char *p;
- unsigned char *q;
- size_t p_len;
- size_t q_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &p, &p_len, &q, &q_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (p_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- if (q_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 2,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_BYTES, 0);
- crypto_core_ristretto255_scalar_add((unsigned char *) ZSTR_VAL(r), p, q);
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_complement)
- {
- zend_string *r;
- unsigned char *s;
- size_t s_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &s, &s_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (s_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_SCALARBYTES, 0);
- crypto_core_ristretto255_scalar_complement((unsigned char *) ZSTR_VAL(r), s);
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_invert)
- {
- zend_string *r;
- unsigned char *s;
- size_t s_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &s, &s_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (s_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_SCALARBYTES, 0);
- if (crypto_core_ristretto255_scalar_invert((unsigned char *) ZSTR_VAL(r), s) != 0) {
- zend_string_efree(r);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_mul)
- {
- zend_string *r;
- unsigned char *x;
- unsigned char *y;
- size_t x_len;
- size_t y_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &x, &x_len, &y, &y_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (x_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- if (y_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 2,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_BYTES, 0);
- crypto_core_ristretto255_scalar_mul((unsigned char *) ZSTR_VAL(r), x, y);
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_negate)
- {
- zend_string *r;
- unsigned char *s;
- size_t s_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &s, &s_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (s_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_SCALARBYTES, 0);
- crypto_core_ristretto255_scalar_negate((unsigned char *) ZSTR_VAL(r), s);
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_random)
- {
- zend_string *r;
- if (zend_parse_parameters_none() == FAILURE) {
- RETURN_THROWS();
- };
- r = zend_string_alloc(crypto_core_ristretto255_SCALARBYTES, 0);
- crypto_core_ristretto255_scalar_random((unsigned char *) ZSTR_VAL(r));
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_reduce)
- {
- zend_string *r;
- unsigned char *s;
- size_t s_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
- &s, &s_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (s_len != crypto_core_ristretto255_NONREDUCEDSCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_SCALARBYTES, 0);
- crypto_core_ristretto255_scalar_reduce((unsigned char *) ZSTR_VAL(r), s);
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_sub)
- {
- zend_string *r;
- unsigned char *p;
- unsigned char *q;
- size_t p_len;
- size_t q_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &p, &p_len, &q, &q_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (p_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- if (q_len != crypto_core_ristretto255_SCALARBYTES) {
- zend_argument_error(sodium_exception_ce, 2,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_BYTES, 0);
- crypto_core_ristretto255_scalar_sub((unsigned char *) ZSTR_VAL(r), p, q);
- ZSTR_VAL(r)[crypto_core_ristretto255_SCALARBYTES] = 0;
- RETURN_NEW_STR(r);
- }
- PHP_FUNCTION(sodium_crypto_core_ristretto255_sub)
- {
- zend_string *r;
- unsigned char *p;
- unsigned char *q;
- size_t p_len;
- size_t q_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
- &p, &p_len, &q, &q_len) == FAILURE) {
- sodium_remove_param_values_from_backtrace(EG(exception));
- RETURN_THROWS();
- }
- if (p_len != crypto_core_ristretto255_BYTES) {
- zend_argument_error(sodium_exception_ce, 1,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES bytes long");
- RETURN_THROWS();
- }
- if (q_len != crypto_core_ristretto255_BYTES) {
- zend_argument_error(sodium_exception_ce, 2,
- "must be SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES bytes long");
- RETURN_THROWS();
- }
- r = zend_string_alloc(crypto_core_ristretto255_BYTES, 0);
- if (crypto_core_ristretto255_sub((unsigned char *) ZSTR_VAL(r), p, q) != 0) {
- zend_string_efree(r);
- zend_throw_exception(sodium_exception_ce, "internal error", 0);
- RETURN_THROWS();
- }
- ZSTR_VAL(r)[crypto_core_ristretto255_BYTES] = 0;
- RETURN_NEW_STR(r);
- }
- #endif
|