import { hchacha , stream , streamXOR } from "./xchacha20" ; import { encode , decode } from "@stablelib/hex" ; describe ( "xchacha20.hchacha" , ( ) => { it ( "should produce correct value" , ( ) => { const key = decode ( "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F" ) ; const nonce = decode ( "000000090000004A0000000031415927" ) ; const good = "82413B4227B27BFED30E42508A877D73A0F9E4D58A74A853C12EC41326D3ECDC" ; const dst = new Uint8Array ( 32 ) ; const subkey = hchacha ( key , nonce . subarray ( 0 , 16 ) , dst ) ; expect ( encode ( subkey ) ) . toBe ( good ) ; } ) ; } ) ; describe ( "xchacha20.stream" , ( ) => { it ( "should produce correct result" , ( ) => { const key = decode ( "79C99798AC67300BBB2704C95C341E3245F3DCB21761B98E52FF45B24F304FC4" ) ; const nonce = decode ( "B33FFD3096479BCFBC9AEE49417688A0A2554F8D95389419" ) ; const good = "C6E9758160083AC604EF90E712CE6E75D7797590744E0CF060F013739C" ; const dst = new Uint8Array ( good . length / 2 ) ; expect ( encode ( stream ( key , nonce , dst ) ) ) . toBe ( good ) ; } ) ; } ) ; describe ( "xchacha20.streamXOR" , ( ) => { it ( "should produce correct result" , ( ) => { const key = decode ( "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" ) ; const plaintext = decode ( "5468652064686F6C65202870726F6E6F756E6365642022646F6C652229206973" + "20616C736F206B6E6F776E2061732074686520417369617469632077696C6420" + "646F672C2072656420646F672C20616E642077686973746C696E6720646F672E" + "2049742069732061626F7574207468652073697A65206F662061204765726D61" + "6E20736865706865726420627574206C6F6F6B73206D6F7265206C696B652061" + "206C6F6E672D6C656767656420666F782E205468697320686967686C7920656C" + "757369766520616E6420736B696C6C6564206A756D70657220697320636C6173" + "736966696564207769746820776F6C7665732C20636F796F7465732C206A6163" + "6B616C732C20616E6420666F78657320696E20746865207461786F6E6F6D6963" + "2066616D696C792043616E696461652E" ) ; const nonce = decode ( "404142434445464748494A4B4C4D4E4F5051525354555658" ) ; const ciphertext = "4559ABBA4E48C16102E8BB2C05E6947F" + "50A786DE162F9B0B7E592A9B53D0D4E9" + "8D8D6410D540A1A6375B26D80DACE4FA" + "B52384C731ACBF16A5923C0C48D3575D" + "4D0D2C673B666FAA731061277701093A" + "6BF7A158A8864292A41C48E3A9B4C0DA" + "ECE0F8D98D0D7E05B37A307BBB663331" + "64EC9E1B24EA0D6C3FFDDCEC4F68E744" + "3056193A03C810E11344CA06D8ED8A2B" + "FB1E8D48CFA6BC0EB4E2464B74814240" + "7C9F431AEE769960E15BA8B96890466E" + "F2457599852385C661F752CE20F9DA0C" + "09AB6B19DF74E76A95967446F8D0FD41" + "5E7BEE2A12A114C20EB5292AE7A349AE" + "577820D5520A1F3FB62A17CE6A7E68FA" + "7C79111D8860920BC048EF43FE84486C" + "CB87C25F0AE045F0CCE1E7989A9AA220" + "A28BDD4827E751A24A6D5C62D790A663" + "93B93111C1A55DD7421A10184974C7C5" ; const dst = new Uint8Array ( ciphertext . length / 2 ) ; expect ( encode ( streamXOR ( key , nonce , plaintext , dst ) ) ) . toBe ( ciphertext ) ; } ) ; } ) ;