diff --git a/go.mod b/go.mod index b827c0e2915..2a62ac8897c 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/grafana/xk6-output-prometheus-remote v0.3.1 github.com/grafana/xk6-redis v0.2.0 github.com/grafana/xk6-timers v0.2.3 - github.com/grafana/xk6-webcrypto v0.1.0 + github.com/grafana/xk6-webcrypto v0.1.1 github.com/grafana/xk6-websockets v0.2.1 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/influxdata/influxdb1-client v0.0.0-20190402204710-8ff2fc3824fc diff --git a/go.sum b/go.sum index 0378416ffdb..eac75e03e5c 100644 --- a/go.sum +++ b/go.sum @@ -101,8 +101,8 @@ github.com/grafana/xk6-redis v0.2.0 h1:iXmAKVlAxafZ/h8ptuXTFhGu63IFsyDI8QjUgWm66 github.com/grafana/xk6-redis v0.2.0/go.mod h1:B3PA9PAPJa2/WUfNJCdQwZrbb6D4e6UHIk8dssQbj7w= github.com/grafana/xk6-timers v0.2.3 h1:uShQZ6T+9fpCc9j8AAuBPRMKNneG/TRtkM1uuwhXH4g= github.com/grafana/xk6-timers v0.2.3/go.mod h1:QbhJwMBHm9k8ukFm1AtnsoCbeRSngk+8iFaxnKZaKdo= -github.com/grafana/xk6-webcrypto v0.1.0 h1:StrQZkUi4vo3bAMmBUHvIQ8P+zNKCH3AwN22TZdDwHs= -github.com/grafana/xk6-webcrypto v0.1.0/go.mod h1:JKxlKj03+zI6Bf/PUuXxrx4lJraBZx9UOrX4mtqB5+E= +github.com/grafana/xk6-webcrypto v0.1.1 h1:SSGjm3mea8V9AkbqHkzlle+6KOu87gLE2xf9kfM3jlg= +github.com/grafana/xk6-webcrypto v0.1.1/go.mod h1:2pyN4Lmf5cK6EH9xnSn2B81k9vpCdBzcklWhZ/dH+18= github.com/grafana/xk6-websockets v0.2.1 h1:99tuI5g9UPTCpGbiEo/9E7VFKQIOvTLq231qoMVef5c= github.com/grafana/xk6-websockets v0.2.1/go.mod h1:f0XN0IGHx6m8jWh/w8ZFG6mZlRgzpztSHmvd4uK9RJo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= diff --git a/vendor/github.com/grafana/xk6-webcrypto/LICENSE b/vendor/github.com/grafana/xk6-webcrypto/LICENSE new file mode 100644 index 00000000000..7aab016207a --- /dev/null +++ b/vendor/github.com/grafana/xk6-webcrypto/LICENSE @@ -0,0 +1,660 @@ +### GNU AFFERO GENERAL PUBLIC LICENSE + +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains +free software for all its users. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing +under this license. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public +License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your +version supports such interaction) an opportunity to receive the +Corresponding Source of your version by providing access to the +Corresponding Source from a network server at no charge, through some +standard or customary means of facilitating copying of software. This +Corresponding Source shall include the Corresponding Source for any +work covered by version 3 of the GNU General Public License that is +incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Affero General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever +published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for +the specific requirements. + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/aes.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/aes.go index fe9f1269e41..347208baf1c 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/aes.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/aes.go @@ -10,38 +10,38 @@ import ( "github.com/dop251/goja" ) -// AesKeyGenParams represents the object that should be passed as +// AESKeyGenParams represents the object that should be passed as // the algorithm parameter into `SubtleCrypto.generateKey`, when generating // an AES key: that is, when the algorithm is identified as any // of AES-CBC, AES-CTR, AES-GCM, or AES-KW. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-keygen-params -type AesKeyGenParams struct { +type AESKeyGenParams struct { Algorithm // The length, in bits, of the key. - Length int64 `json:"length"` + Length bitLength `js:"length"` } -// newAesKeyGenParams creates a new AesKeyGenParams object, from the +// newAESKeyGenParams creates a new AESKeyGenParams object, from the // normalized algorithm, and the algorithm parameters. // // It handles the logic involved in handling the `length` attribute, // which is not part of the normalized algorithm. -func newAesKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Value) (*AesKeyGenParams, error) { +func newAESKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Value) (*AESKeyGenParams, error) { // We extract the length attribute from the params object, as it's not // part of the normalized algorithm, and as accessing the runtime from the // callback below could lead to a race condition. algorithmLengthValue, err := traverseObject(rt, params, "length") if err != nil { - return nil, NewError(0, SyntaxError, "could not get length from algorithm parameter") + return nil, NewError(SyntaxError, "could not get length from algorithm parameter") } algorithmLength := algorithmLengthValue.ToInteger() - return &AesKeyGenParams{ + return &AESKeyGenParams{ Algorithm: normalized, - Length: algorithmLength, + Length: bitLength(algorithmLength), }, nil } @@ -49,7 +49,7 @@ func newAesKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Valu // described in the specification. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-keygen-params -func (akgp *AesKeyGenParams) GenerateKey( +func (akgp *AESKeyGenParams) GenerateKey( extractable bool, keyUsages []CryptoKeyUsage, ) (*CryptoKey, error) { @@ -65,28 +65,28 @@ func (akgp *AesKeyGenParams) GenerateKey( continue } - return nil, NewError(0, SyntaxError, "invalid key usage") + return nil, NewError(SyntaxError, "invalid key usage") default: - return nil, NewError(0, SyntaxError, "invalid key usage") + return nil, NewError(SyntaxError, "invalid key usage") } } if akgp.Length != 128 && akgp.Length != 192 && akgp.Length != 256 { - return nil, NewError(0, OperationError, "invalid key length") + return nil, NewError(OperationError, "invalid key length") } - randomKey := make([]byte, akgp.Length/8) + randomKey := make([]byte, akgp.Length.asByteLength()) if _, err := rand.Read(randomKey); err != nil { // 4. - return nil, NewError(0, OperationError, "could not generate random key") + return nil, NewError(OperationError, "could not generate random key") } // 5. 6. 7. 8. 9. key := CryptoKey{} key.Type = SecretCryptoKeyType - key.Algorithm = AesKeyAlgorithm{ + key.Algorithm = AESKeyAlgorithm{ Algorithm: akgp.Algorithm, - Length: akgp.Length, + Length: int64(akgp.Length), } // 10. @@ -102,16 +102,16 @@ func (akgp *AesKeyGenParams) GenerateKey( return &key, nil } -// Ensure that AesKeyGenParams implements the KeyGenerator interface. -var _ KeyGenerator = &AesKeyGenParams{} +// Ensure that AESKeyGenParams implements the KeyGenerator interface. +var _ KeyGenerator = &AESKeyGenParams{} -// AesKeyAlgorithm is the algorithm for AES keys as defined in the [specification]. +// AESKeyAlgorithm is the algorithm for AES keys as defined in the [specification]. // -// [specification]: https://www.w3.org/TR/WebCryptoAPI/#dfn-AesKeyAlgorithm -type AesKeyAlgorithm struct { +// [specification]: https://www.w3.org/TR/WebCryptoAPI/#dfn-AESKeyAlgorithm +type AESKeyAlgorithm struct { Algorithm - Length int64 `json:"length"` + Length int64 `js:"length"` } // exportAESKey exports an AES key to its raw representation. @@ -119,37 +119,37 @@ type AesKeyAlgorithm struct { // TODO @oleiade: support JWK format. func exportAESKey(key *CryptoKey, format KeyFormat) ([]byte, error) { if !key.Extractable { - return nil, NewError(0, InvalidAccessError, "the key is not extractable") + return nil, NewError(InvalidAccessError, "the key is not extractable") } // 1. if key.handle == nil { - return nil, NewError(0, OperationError, "the key is not valid, no data") + return nil, NewError(OperationError, "the key is not valid, no data") } switch format { case RawKeyFormat: handle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, ImplementationError, "exporting key data's bytes failed") + return nil, NewError(ImplementationError, "exporting key data's bytes failed") } return handle, nil default: // FIXME: note that we do not support JWK format, yet. - return nil, NewError(0, NotSupportedError, "unsupported key format "+format) + return nil, NewError(NotSupportedError, "unsupported key format "+format) } } -// aesImportParams is an internal placeholder struct for AES import parameters. +// AESImportParams is an internal placeholder struct for AES import parameters. // Although not described by the specification, we define it to be able to implement // our internal KeyImporter interface. -type aesImportParams struct { +type AESImportParams struct { Algorithm } -func newAesImportParams(normalized Algorithm) *aesImportParams { - return &aesImportParams{ +func newAESImportParams(normalized Algorithm) *AESImportParams { + return &AESImportParams{ Algorithm: normalized, } } @@ -158,7 +158,7 @@ func newAesImportParams(normalized Algorithm) *aesImportParams { // It implements the KeyImporter interface. // // TODO @oleiade: support JWK format #37 -func (aip *aesImportParams) ImportKey( +func (aip *AESImportParams) ImportKey( format KeyFormat, keyData []byte, keyUsages []CryptoKeyUsage, @@ -168,7 +168,7 @@ func (aip *aesImportParams) ImportKey( case EncryptCryptoKeyUsage, DecryptCryptoKeyUsage, WrapKeyCryptoKeyUsage, UnwrapKeyCryptoKeyUsage: continue default: - return nil, NewError(0, SyntaxError, "invalid key usage: "+usage) + return nil, NewError(SyntaxError, "invalid key usage: "+usage) } } @@ -181,16 +181,16 @@ func (aip *aesImportParams) ImportKey( ) if !has128Bits && !has192Bits && !has256Bits { - return nil, NewError(0, DataError, "invalid key length") + return nil, NewError(DataError, "invalid key length") } default: - return nil, NewError(0, NotSupportedError, "unsupported key format "+format) + return nil, NewError(NotSupportedError, "unsupported key format "+format) } key := &CryptoKey{ - Algorithm: AesKeyAlgorithm{ + Algorithm: AESKeyAlgorithm{ Algorithm: aip.Algorithm, - Length: int64(len(keyData) * 8), + Length: int64(byteLength(len(keyData)).asBitLength()), }, Type: SecretCryptoKeyType, handle: keyData, @@ -199,54 +199,54 @@ func (aip *aesImportParams) ImportKey( return key, nil } -// Ensure that aesImportParams implements the KeyImporter interface. -var _ KeyImporter = &aesImportParams{} +// Ensure that AESImportParams implements the KeyImporter interface. +var _ KeyImporter = &AESImportParams{} -// AesCbcParams represents the object that should be passed as the algorithm parameter +// AESCBCParams represents the object that should be passed as the algorithm parameter // into `SubtleCrypto.Encrypt`, `SubtleCrypto.Decrypt`, `SubtleCrypto.WrapKey`, or // `SubtleCrypto.UnwrapKey`, when using the AES-CBC algorithm. // // As defined in the [specification]. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-cbc-params -type AesCbcParams struct { +type AESCBCParams struct { Algorithm // Name should be set to AES-CBC. - Name string `json:"name"` + Name string `js:"name"` // Iv holds (an ArrayBuffer, a TypedArray, or a DataView) the initialization vector. // Must be 16 bytes, unpredictable, and preferably cryptographically random. // However, it need not be secret (for example, it may be transmitted unencrypted along with the ciphertext). - Iv []byte `json:"iv"` + Iv []byte `js:"iv"` } // Encrypt encrypts the given plaintext using the AES-CBC algorithm, and returns the ciphertext. // Implements the WebCryptoAPI `encrypt` method's [specification] for the AES-CBC algorithm. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-cbc -func (acp *AesCbcParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error) { +func (acp *AESCBCParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error) { // 1. // Note that aes.BlockSize stands for the `k` variable as per the specification. if len(acp.Iv) != aes.BlockSize { - return nil, NewError(0, OperationError, "iv length is not 16 bytes") + return nil, NewError(OperationError, "iv length is not 16 bytes") } // 2. paddedPlainText, err := pKCS7Pad(plaintext, aes.BlockSize) if err != nil { - return nil, NewError(0, OperationError, "could not pad plaintext") + return nil, NewError(OperationError, "could not pad plaintext") } keyHandle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, ImplementationError, "could not get key handle") + return nil, NewError(ImplementationError, "could not get key handle") } // 3. block, err := aes.NewCipher(keyHandle) if err != nil { - return nil, NewError(0, OperationError, "could not create cipher") + return nil, NewError(OperationError, "could not create cipher") } ciphertext := make([]byte, len(paddedPlainText)) @@ -260,21 +260,21 @@ func (acp *AesCbcParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error // Implements the WebCryptoAPI's `decrypt` method's [specification] for the AES-CBC algorithm. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-cbc -func (acp *AesCbcParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, error) { +func (acp *AESCBCParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, error) { // 1. if len(acp.Iv) != aes.BlockSize { - return nil, NewError(0, OperationError, "iv length is invalid, should be 16 bytes") + return nil, NewError(OperationError, "iv length is invalid, should be 16 bytes") } keyHandle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, OperationError, "invalid key handle") + return nil, NewError(OperationError, "invalid key handle") } // 2. block, err := aes.NewCipher(keyHandle) if err != nil { - return nil, NewError(0, OperationError, "could not create AES cipher") + return nil, NewError(OperationError, "could not create AES cipher") } paddedPlainText := make([]byte, len(ciphertext)) @@ -284,12 +284,12 @@ func (acp *AesCbcParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, erro // 3. p := paddedPlainText[len(paddedPlainText)-1] if p == 0 || p > aes.BlockSize { - return nil, NewError(0, OperationError, "invalid padding") + return nil, NewError(OperationError, "invalid padding") } // 4. if !bytes.HasSuffix(paddedPlainText, bytes.Repeat([]byte{p}, int(p))) { - return nil, NewError(0, OperationError, "invalid padding") + return nil, NewError(OperationError, "invalid padding") } // 5. @@ -298,17 +298,17 @@ func (acp *AesCbcParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, erro return plaintext, nil } -// Ensure that AesCbcParams implements the EncryptDecrypter interface. -var _ EncryptDecrypter = &AesCbcParams{} +// Ensure that AESCBCParams implements the EncryptDecrypter interface. +var _ EncryptDecrypter = &AESCBCParams{} -// AesCtrParams represents the object that should be passed as the algorithm parameter +// AESCTRParams represents the object that should be passed as the algorithm parameter // into `SubtleCrypto.Encrypt`, `SubtleCrypto.Decrypt`, `SubtleCrypto.WrapKey`, or // `SubtleCrypto.UnwrapKey`, when using the AES-CTR algorithm. // // As defined in the [specification]. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-ctr-params -type AesCtrParams struct { +type AESCTRParams struct { Algorithm // Counter holds (an ArrayBuffer, a TypedArray, or a DataView) the initial value of the counter block. @@ -317,7 +317,7 @@ type AesCtrParams struct { // // For example, if length is set to 64, then the first half of counter is // the nonce and the second half is used for the counter. - Counter []byte `json:"counter"` + Counter []byte `js:"counter"` // Length holds (a Number) the number of bits in the counter block that are used for the actual counter. // The counter must be big enough that it doesn't wrap: if the message is n blocks and the counter is m bits long, then @@ -325,34 +325,34 @@ type AesCtrParams struct { // // The NIST SP800-38A standard, which defines CTR, suggests that the counter should occupy half of the counter // block (see Appendix B.2), so for AES it would be 64. - Length int `json:"length"` + Length int `js:"length"` } // Encrypt encrypts the given plaintext using the AES-CTR algorithm, and returns the ciphertext. // Implements the WebCryptoAPI's `encrypt` method's [specification] for the AES-CTR algorithm. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-ctr -func (acp *AesCtrParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error) { +func (acp *AESCTRParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error) { // 1. // Note that aes.BlockSize stands for the `k` variable as per the specification. if len(acp.Counter) != aes.BlockSize { - return nil, NewError(0, OperationError, "counter length is not 16 bytes") + return nil, NewError(OperationError, "counter length is not 16 bytes") } // 2. if acp.Length <= 0 || acp.Length > 128 { - return nil, NewError(0, OperationError, "invalid counter length, out of the 0 < x < 128 bounds") + return nil, NewError(OperationError, "invalid counter length, out of the 0 < x < 128 bounds") } keyHandle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, ImplementationError, "could not get key handle") + return nil, NewError(ImplementationError, "could not get key handle") } // 3. block, err := aes.NewCipher(keyHandle) if err != nil { - return nil, NewError(0, OperationError, "could not create cipher") + return nil, NewError(OperationError, "could not create cipher") } ciphertext := make([]byte, len(plaintext)) @@ -366,26 +366,26 @@ func (acp *AesCtrParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error // Implements the WebCryptoAPI's `decrypt` method's [specification] for the AES-CTR algorithm. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-ctr -func (acp *AesCtrParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, error) { +func (acp *AESCTRParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, error) { // 1. if len(acp.Counter) != aes.BlockSize { - return nil, NewError(0, OperationError, "counter length is invalid, should be 16 bytes") + return nil, NewError(OperationError, "counter length is invalid, should be 16 bytes") } // 2. if acp.Length <= 0 || acp.Length > 128 { - return nil, NewError(0, OperationError, "invalid length, should be within 1 <= length <= 128 bounds") + return nil, NewError(OperationError, "invalid length, should be within 1 <= length <= 128 bounds") } keyHandle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, OperationError, "invalid key handle") + return nil, NewError(OperationError, "invalid key handle") } // 3. block, err := aes.NewCipher(keyHandle) if err != nil { - return nil, NewError(0, OperationError, "could not create AES cipher") + return nil, NewError(OperationError, "could not create AES cipher") } plaintext := make([]byte, len(ciphertext)) @@ -395,16 +395,16 @@ func (acp *AesCtrParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, erro return plaintext, nil } -// Ensure that AesCtrParams implements the EncryptDecrypter interface. -var _ EncryptDecrypter = &AesCtrParams{} +// Ensure that AESCTRParams implements the EncryptDecrypter interface. +var _ EncryptDecrypter = &AESCTRParams{} -// AesGcmParams represents the object that should be passed as the algorithm parameter +// AESGCMParams represents the object that should be passed as the algorithm parameter // into `SubtleCrypto.Encrypt`, `SubtleCrypto.Decrypt`, `SubtleCrypto.WrapKey`, or // `SubtleCrypto.UnwrapKey`, when using the AES-GCM algorithm. // As defined in the [specification]. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm-params -type AesGcmParams struct { +type AESGCMParams struct { Algorithm // Iv holds (an ArrayBuffer, a TypedArray, or a DataView) with the initialization vector. @@ -417,7 +417,7 @@ type AesGcmParams struct { // Section 8.2 of the specification outlines methods for constructing IVs. // Note that the IV does not have to be secret, just unique: so it is OK, for example, to // transmit it in the clear alongside the encrypted message. - Iv []byte `json:"iv"` + Iv []byte `js:"iv"` // AdditionalData (an ArrayBuffer, a TypedArray, or a DataView) contains additional data that will // not be encrypted but will be authenticated along with the encrypted data. @@ -431,7 +431,7 @@ type AesGcmParams struct { // // The additionalData property is optional and may be omitted without compromising the // security of the encryption operation. - AdditionalData []byte `json:"additionalData"` + AdditionalData []byte `js:"additionalData"` // TagLength (a Number) determines the size in bits of the authentication tag generated in // the encryption operation and used for authentication in the corresponding decryption. @@ -443,19 +443,19 @@ type AesGcmParams struct { // in some applications: Appendix C of the specification provides additional guidance here. // // tagLength is optional and defaults to 128 if it is not specified. - TagLength int `json:"tagLength"` + TagLength bitLength `js:"tagLength"` } // Encrypt encrypts the given plaintext using the AES-GCM algorithm, and returns the ciphertext. // Implements the WebCryptoAPI's `encrypt` method's [specification] for the AES-GCM algorithm. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm -func (agp *AesGcmParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error) { +func (agp *AESGCMParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error) { // 1. // As described in section 8 of AES-GCM [NIST SP800-38D]. // [NIST SP800-38D] https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf - if len(plaintext) > maxAesGcmPlaintextLength { - return nil, NewError(0, OperationError, "plaintext length is too long") + if uint64(len(plaintext)) > maxAESGCMPlaintextLength { + return nil, NewError(OperationError, "plaintext length is too long") } // 2. @@ -466,18 +466,18 @@ func (agp *AesGcmParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error // but go only supports 12 bytes IVs. We therefore are diverging from the // spec here, and have adjusted the test suite accordingly. if len(agp.Iv) != 12 { - return nil, NewError(0, NotSupportedError, "only 12 bytes long iv are supported") + return nil, NewError(NotSupportedError, "only 12 bytes long iv are supported") } // 3. // As described in section 8 of AES-GCM [NIST SP800-38D]. // [NIST SP800-38D] https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf - if agp.AdditionalData != nil && (uint64(len(agp.AdditionalData)) > maxAesGcmAdditionalDataLength) { - return nil, NewError(0, OperationError, "additional data length is too long") + if agp.AdditionalData != nil && (uint64(len(agp.AdditionalData)) > maxAESGcmAdditionalDataLength) { + return nil, NewError(OperationError, "additional data length is too long") } // 4. - var tagLength int + var tagLength bitLength if agp.TagLength == 0 { tagLength = 128 } else { @@ -486,32 +486,32 @@ func (agp *AesGcmParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error tagLength = agp.TagLength case 32, 64: // Go's GCM implementation does not support 32 or 64 bit tag lengths. - return nil, NewError(0, NotSupportedError, "tag length 32 and 64 are not supported") + return nil, NewError(NotSupportedError, "tag length 32 and 64 are not supported") default: - return nil, NewError(0, OperationError, "invalid tag length, should be one of 96, 104, 112, 120, 128") + return nil, NewError(OperationError, "invalid tag length, should be one of 96, 104, 112, 120, 128") } } keyHandle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, ImplementationError, "could not get key data") + return nil, NewError(ImplementationError, "could not get key data") } // 6. block, err := aes.NewCipher(keyHandle) if err != nil { - return nil, NewError(0, OperationError, "could not create cipher") + return nil, NewError(OperationError, "could not create cipher") } - gcm, err := cipher.NewGCMWithTagSize(block, tagLength/8) + gcm, err := cipher.NewGCMWithTagSize(block, int(tagLength.asByteLength())) if err != nil { - return nil, NewError(0, ImplementationError, "could not create cipher") + return nil, NewError(ImplementationError, "could not create cipher") } // The Golang AES GCM cipher only supports a Nonce/Iv length of 12 bytes, // as opposed to the looser requirements of the Web Crypto API spec. if len(agp.Iv) != gcm.NonceSize() { - return nil, NewError(0, NotSupportedError, "only 12 bytes long iv are supported") + return nil, NewError(NotSupportedError, "only 12 bytes long iv are supported") } // 7. 8. @@ -524,9 +524,9 @@ func (agp *AesGcmParams) Encrypt(plaintext []byte, key CryptoKey) ([]byte, error // Implements the WebCryptoAPI's `decrypt` method's [specification] for the AES-GCM algorithm. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm -func (agp *AesGcmParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, error) { +func (agp *AESGCMParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, error) { // 1. - var tagLength int + var tagLength bitLength if agp.TagLength == 0 { tagLength = 128 } else { @@ -535,73 +535,73 @@ func (agp *AesGcmParams) Decrypt(ciphertext []byte, key CryptoKey) ([]byte, erro tagLength = agp.TagLength case 32, 64: // Go's AES GCM implementation does not support 32 or 64 bit tag lengths. - return nil, NewError(0, OperationError, "invalid tag length, should be within 96 <= length <= 128 bounds") + return nil, NewError(OperationError, "invalid tag length, should be within 96 <= length <= 128 bounds") default: - return nil, NewError(0, OperationError, "invalid tag length, accepted values are 96, 104, 112, 120, 128") + return nil, NewError(OperationError, "invalid tag length, accepted values are 96, 104, 112, 120, 128") } } // 2. // Note that we multiply the length of the ciphertext by 8, in order // to get the length in bits. - if len(ciphertext)*8 < tagLength { - return nil, NewError(0, OperationError, "ciphertext is too short") + if byteLength(len(ciphertext)).asBitLength() < tagLength { + return nil, NewError(OperationError, "ciphertext is too short") } // 3. - if len(agp.Iv) < 1 || uint64(len(agp.Iv)) > maxAesGcmIvLength { - return nil, NewError(0, OperationError, "iv length is too long") + if len(agp.Iv) < 1 || uint64(len(agp.Iv)) > maxAESGcmIvLength { + return nil, NewError(OperationError, "iv length is too long") } // 4. - if agp.AdditionalData != nil && uint64(len(agp.AdditionalData)) > maxAesGcmAdditionalDataLength { - return nil, NewError(0, OperationError, "additional data is too long") + if agp.AdditionalData != nil && uint64(len(agp.AdditionalData)) > maxAESGcmAdditionalDataLength { + return nil, NewError(OperationError, "additional data is too long") } // 5. 6. are not necessary as Go's AES GCM implementation perform those steps for us keyHandle, ok := key.handle.([]byte) if !ok { - return nil, NewError(0, OperationError, "invalid key handle") + return nil, NewError(OperationError, "invalid key handle") } // 7. 8. block, err := aes.NewCipher(keyHandle) if err != nil { - return nil, NewError(0, OperationError, "could not create AES cipher") + return nil, NewError(OperationError, "could not create AES cipher") } - gcm, err := cipher.NewGCMWithTagSize(block, tagLength/8) + gcm, err := cipher.NewGCMWithTagSize(block, int(tagLength.asByteLength())) if err != nil { - return nil, NewError(0, OperationError, "could not create GCM cipher") + return nil, NewError(OperationError, "could not create GCM cipher") } // The Golang AES GCM cipher only supports a Nonce/Iv length of 12 bytes, plaintext, err := gcm.Open(nil, agp.Iv, ciphertext, agp.AdditionalData) if err != nil { - return nil, NewError(0, OperationError, "could not decrypt ciphertext") + return nil, NewError(OperationError, "could not decrypt ciphertext") } return plaintext, nil } -// maxAesGcmPlaintextLength holds the value (2 ^ 39) - 256 as specified in +// maxAESGCMPlaintextLength holds the value (2 ^ 39) - 256 as specified in // The [Web Crypto API spec] for the AES-GCM algorithm encryption operation. // // [Web Crypto API spec]: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm-encryption-operation -const maxAesGcmPlaintextLength int = 549755813632 +const maxAESGCMPlaintextLength uint64 = (1 << 39) - 256 -// maxAesGcmAdditionalDataLength holds the value 2 ^ 64 - 1 as specified in +// maxAESGcmAdditionalDataLength holds the value 2 ^ 64 - 1 as specified in // the [Web Crypto API spec] for the AES-GCM algorithm encryption operation. // // [Web Crypto API spec]: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm-encryption-operation -const maxAesGcmAdditionalDataLength uint64 = 18446744073709551615 +const maxAESGcmAdditionalDataLength uint64 = (1 << 64) - 1 -// maxAesGcmIvLength holds the value 2 ^ 64 - 1 as specified in +// maxAESGcmIvLength holds the value 2 ^ 64 - 1 as specified in // the [Web Crypto API spec] for the AES-GCM algorithm encryption operation. // // [Web Crypto API spec]: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm-encryption-operation -const maxAesGcmIvLength uint64 = 18446744073709551615 +const maxAESGcmIvLength uint64 = (1 << 64) - 1 var ( // ErrInvalidBlockSize is returned when the given block size is invalid. diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/algorithm.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/algorithm.go index 741dbca1807..fa540b30460 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/algorithm.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/algorithm.go @@ -9,7 +9,7 @@ import ( // Algorithm represents type Algorithm struct { - Name AlgorithmIdentifier `json:"name"` + Name AlgorithmIdentifier `js:"name"` } // AlgorithmIdentifier represents the name of an algorithm. @@ -60,17 +60,17 @@ const ( type HashAlgorithmIdentifier = AlgorithmIdentifier const ( - // Sha1 represents the SHA-1 algorithm. - Sha1 HashAlgorithmIdentifier = "SHA-1" + // SHA1 represents the SHA-1 algorithm. + SHA1 HashAlgorithmIdentifier = "SHA-1" - // Sha256 represents the SHA-256 algorithm. - Sha256 = "SHA-256" + // SHA256 represents the SHA-256 algorithm. + SHA256 = "SHA-256" - // Sha384 represents the SHA-384 algorithm. - Sha384 = "SHA-384" + // SHA384 represents the SHA-384 algorithm. + SHA384 = "SHA-384" - // Sha512 represents the SHA-512 algorithm. - Sha512 = "SHA-512" + // SHA512 represents the SHA-512 algorithm. + SHA512 = "SHA-512" ) // OperationIdentifier represents the name of an operation. @@ -130,19 +130,19 @@ func normalizeAlgorithm(rt *goja.Runtime, v goja.Value, op AlgorithmIdentifier) if v.ExportType().Kind() == reflect.String { algorithmString, ok := v.Export().(string) if !ok { - return Algorithm{}, NewError(0, ImplementationError, "algorithm cannot be interpreted as a string") + return Algorithm{}, NewError(ImplementationError, "algorithm cannot be interpreted as a string") } algorithmObject := rt.NewObject() if err := algorithmObject.Set("name", algorithmString); err != nil { - return Algorithm{}, NewError(0, ImplementationError, "unable to transform algorithm string into an object") + return Algorithm{}, NewError(ImplementationError, "unable to transform algorithm string into an object") } return normalizeAlgorithm(rt, algorithmObject, op) } if err := rt.ExportTo(v, &algorithm); err != nil { - return Algorithm{}, NewError(0, SyntaxError, "algorithm cannot be interpreted as a string or an object") + return Algorithm{}, NewError(SyntaxError, "algorithm cannot be interpreted as a string or an object") } // Algorithm identifers are always upper cased. @@ -151,7 +151,7 @@ func normalizeAlgorithm(rt *goja.Runtime, v goja.Value, op AlgorithmIdentifier) algorithm.Name = strings.ToUpper(algorithm.Name) if !isRegisteredAlgorithm(algorithm.Name, op) { - return Algorithm{}, NewError(0, NotSupportedError, "unsupported algorithm: "+algorithm.Name) + return Algorithm{}, NewError(NotSupportedError, "unsupported algorithm: "+algorithm.Name) } return algorithm, nil @@ -185,5 +185,5 @@ func isAesAlgorithm(algorithmName string) bool { } func isHashAlgorithm(algorithmName string) bool { - return algorithmName == Sha1 || algorithmName == Sha256 || algorithmName == Sha384 || algorithmName == Sha512 + return algorithmName == SHA1 || algorithmName == SHA256 || algorithmName == SHA384 || algorithmName == SHA512 } diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/crypto.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/crypto.go index 1ba7b8fef25..484de93c06f 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/crypto.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/crypto.go @@ -15,8 +15,8 @@ import ( type Crypto struct { vu modules.VU - Subtle *SubtleCrypto `json:"subtle"` - CryptoKey *CryptoKey `json:"CryptoKey"` + Subtle *SubtleCrypto `js:"subtle"` + CryptoKey *CryptoKey `js:"CryptoKey"` } // GetRandomValues lets you get cryptographically strong random values. @@ -48,7 +48,7 @@ func (c *Crypto) GetRandomValues(typedArray goja.Value) goja.Value { // 1. if !IsInstanceOf(c.vu.Runtime(), typedArray, acceptedTypes...) { - common.Throw(c.vu.Runtime(), NewError(0, TypeMismatchError, "typedArray parameter isn't a TypedArray instance")) + common.Throw(c.vu.Runtime(), NewError(TypeMismatchError, "typedArray parameter isn't a TypedArray instance")) } // 2. @@ -58,16 +58,13 @@ func (c *Crypto) GetRandomValues(typedArray goja.Value) goja.Value { obj := typedArray.ToObject(c.vu.Runtime()) objLength, ok := obj.Get("length").ToNumber().Export().(int64) if !ok { - common.Throw(c.vu.Runtime(), NewError(0, TypeMismatchError, "typedArray parameter isn't a TypedArray instance")) + common.Throw(c.vu.Runtime(), NewError(TypeMismatchError, "typedArray parameter isn't a TypedArray instance")) } if objLength > maxRandomValuesLength { - // TODO: ideally we would prefer this to be an error that can be - // matched upon using something along the lines of `err isinstanceof QuotaExceededError`. common.Throw( c.vu.Runtime(), NewError( - 0, QuotaExceededError, fmt.Sprintf("typedArray parameter is too big; maximum length is %d", maxRandomValuesLength), ), diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/elliptic_curve.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/elliptic_curve.go index 4bb1438be3d..23db18172b3 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/elliptic_curve.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/elliptic_curve.go @@ -5,10 +5,10 @@ package webcrypto // key pair: that is, when the algorithm is identified as either of ECDSA or ECDH. type EcKeyImportParams struct { // Name should be set to AlgorithmKindEcdsa or AlgorithmKindEcdh. - Name AlgorithmIdentifier `json:"name"` + Name AlgorithmIdentifier `js:"name"` // NamedCurve holds (a String) the name of the elliptic curve to use. - NamedCurve EllipticCurveKind `json:"namedCurve"` + NamedCurve EllipticCurveKind `js:"namedCurve"` } // EllipticCurveKind represents the kind of elliptic curve that is being used. diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/encryption.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/encryption.go index 8e60ca1b203..40b81a89e89 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/encryption.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/encryption.go @@ -38,21 +38,21 @@ func newEncryptDecrypter( switch algorithm.Name { case AESCbc: - ed = new(AesCbcParams) + ed = new(AESCBCParams) paramsObjectName = "AesCbcParams" case AESCtr: - ed = new(AesCtrParams) + ed = new(AESCTRParams) paramsObjectName = "AesCtrParams" case AESGcm: - ed = new(AesGcmParams) + ed = new(AESGCMParams) paramsObjectName = "AesGcmParams" default: - return nil, NewError(0, NotSupportedError, "unsupported algorithm") + return nil, NewError(NotSupportedError, "unsupported algorithm") } if err = rt.ExportTo(params, ed); err != nil { errMsg := fmt.Sprintf("invalid algorithm parameters, unable to interpret as %sParams object", paramsObjectName) - return nil, NewError(0, SyntaxError, errMsg) + return nil, NewError(SyntaxError, errMsg) } return ed, nil diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/errors.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/errors.go index 15844f61a8e..9f1f95a72af 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/errors.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/errors.go @@ -44,14 +44,11 @@ const ( // Error represents a custom error emitted by the // Web Crypto API. type Error struct { - // Code is one of the legacy error code constants, or 0 if none match. - Code int `json:"code"` - // Name contains one of the strings associated with an error name. - Name string `json:"name"` + Name string `js:"name"` // Message represents message or description associated with the given error name. - Message string `json:"message"` + Message string `js:"message"` } // Error implements the `error` interface, so WebCryptoError are normal Go errors. @@ -60,9 +57,8 @@ func (e *Error) Error() string { } // NewError returns a new WebCryptoError with the given name and message. -func NewError(code int, name, message string) *Error { +func NewError(name, message string) *Error { return &Error{ - Code: code, Name: name, Message: message, } diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/goja.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/goja.go index 8418e46e0b1..52140b4bfe1 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/goja.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/goja.go @@ -11,7 +11,7 @@ import ( // and returns a copy of the underlying byte slice. func exportArrayBuffer(rt *goja.Runtime, v goja.Value) ([]byte, error) { if isNullish(v) { - return nil, NewError(0, TypeError, "data is null or undefined") + return nil, NewError(TypeError, "data is null or undefined") } asObject := v.ToObject(rt) @@ -22,12 +22,12 @@ func exportArrayBuffer(rt *goja.Runtime, v goja.Value) ([]byte, error) { if IsTypedArray(rt, v) { ab, ok = asObject.Get("buffer").Export().(goja.ArrayBuffer) if !ok { - return nil, NewError(0, TypeError, "TypedArray.buffer is not an ArrayBuffer") + return nil, NewError(TypeError, "TypedArray.buffer is not an ArrayBuffer") } } else { ab, ok = asObject.Export().(goja.ArrayBuffer) if !ok { - return nil, NewError(0, OperationError, "data is neither an ArrayBuffer, nor a TypedArray nor DataView") + return nil, NewError(OperationError, "data is neither an ArrayBuffer, nor a TypedArray nor DataView") } } @@ -46,19 +46,18 @@ func exportArrayBuffer(rt *goja.Runtime, v goja.Value) ([]byte, error) { // at the end of the traversal. It assumes that all the traversed fields are Objects. func traverseObject(rt *goja.Runtime, src goja.Value, fields ...string) (goja.Value, error) { if isNullish(src) { - return nil, NewError(0, TypeError, "Object is null or undefined") + return nil, NewError(TypeError, "Object is null or undefined") } obj := src.ToObject(rt) if isNullish(obj) { - return nil, NewError(0, TypeError, "Object is null or undefined") + return nil, NewError(TypeError, "Object is null or undefined") } for idx, field := range fields { src = obj.Get(field) if isNullish(src) { return nil, NewError( - 0, TypeError, fmt.Sprintf("field %s is null or undefined", strings.Join(fields[:idx+1], ".")), ) @@ -67,7 +66,6 @@ func traverseObject(rt *goja.Runtime, src goja.Value, fields ...string) (goja.Va obj = src.ToObject(rt) if isNullish(obj) { return nil, NewError( - 0, TypeError, fmt.Sprintf("field %s is not an Object", strings.Join(fields[:idx+1], ".")), ) diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hash.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hash.go index 911af7fb365..cedd4f19603 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hash.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hash.go @@ -11,13 +11,13 @@ import ( // hash.Hash instance. func getHashFn(name string) (func() hash.Hash, bool) { switch name { - case Sha1: + case SHA1: return crypto.SHA1.New, true - case Sha256: + case SHA256: return crypto.SHA256.New, true - case Sha384: + case SHA384: return crypto.SHA384.New, true - case Sha512: + case SHA512: return crypto.SHA512.New, true default: return nil, false diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hmac.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hmac.go index 5c504c3809a..1574fe54675 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hmac.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/hmac.go @@ -12,25 +12,25 @@ import ( "gopkg.in/guregu/null.v3" ) -// HmacKeyGenParams represents the object that should be passed as the algorithm parameter +// HMACKeyGenParams represents the object that should be passed as the algorithm parameter // into `SubtleCrypto.GenerateKey`, when generating an HMAC key. -type HmacKeyGenParams struct { +type HMACKeyGenParams struct { Algorithm // Hash represents the name of the digest function to use. You can // use any of the following: [Sha256], [Sha384], // or [Sha512]. - Hash Algorithm `json:"hash"` + Hash Algorithm `js:"hash"` // Length holds (a Number) the length of the key, in bits. // If this is omitted, the length of the key is equal to the block size // of the hash function you have chosen. // Unless you have a good reason to use a different length, omit // use the default. - Length null.Int `json:"length"` + Length null.Int `js:"length"` } -// newHmacKeyGenParams creates a new HmacKeyGenParams object, from the normalized +// newHMACKeyGenParams creates a new HMACKeyGenParams object, from the normalized // algorithm, and the params parameters passed by the user. // // It handles the logic of extracting the hash algorithm from the params object, @@ -39,13 +39,13 @@ type HmacKeyGenParams struct { // not present as described in the hmac `generateKey` [specification]. // // [specification]: https://www.w3.org/TR/WebCryptoAPI/#hmac-operations -func newHmacKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Value) (*HmacKeyGenParams, error) { +func newHMACKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Value) (*HMACKeyGenParams, error) { // The specification doesn't explicitly tell us what to do if the // hash field is not present, but we assume it's a mandatory field // and throw an error if it's not present. hashValue, err := traverseObject(rt, params, "hash") if err != nil { - return nil, NewError(0, SyntaxError, "could not get hash from algorithm parameter") + return nil, NewError(SyntaxError, "could not get hash from algorithm parameter") } // Although the specification doesn't explicitly ask us to do so, we @@ -71,7 +71,7 @@ func newHmacKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Val length = null.IntFrom(algorithmLengthValue.ToInteger()) } - return &HmacKeyGenParams{ + return &HMACKeyGenParams{ Algorithm: normalized, Hash: normalizedHash, Length: length, @@ -79,7 +79,7 @@ func newHmacKeyGenParams(rt *goja.Runtime, normalized Algorithm, params goja.Val } // GenerateKey generates a new HMAC key. -func (hkgp *HmacKeyGenParams) GenerateKey( +func (hkgp *HMACKeyGenParams) GenerateKey( extractable bool, keyUsages []CryptoKeyUsage, ) (*CryptoKey, error) { @@ -89,7 +89,7 @@ func (hkgp *HmacKeyGenParams) GenerateKey( case SignCryptoKeyUsage, VerifyCryptoKeyUsage: continue default: - return nil, NewError(0, SyntaxError, "invalid key usage: "+usage) + return nil, NewError(SyntaxError, "invalid key usage: "+usage) } } @@ -98,38 +98,41 @@ func (hkgp *HmacKeyGenParams) GenerateKey( // part of the normalized algorithm, and as accessing the runtime from the // callback below could lead to a race condition. if !hkgp.Length.Valid { + var length bitLength switch hkgp.Hash.Name { - case Sha1: - hkgp.Length = null.IntFrom(sha1.BlockSize * 8) - case Sha256: - hkgp.Length = null.IntFrom(sha256.BlockSize * 8) - case Sha384: - hkgp.Length = null.IntFrom(sha512.BlockSize * 8) - case Sha512: - hkgp.Length = null.IntFrom(sha512.BlockSize * 8) + case SHA1: + length = byteLength(sha1.BlockSize).asBitLength() + case SHA256: + length = byteLength(sha256.BlockSize).asBitLength() + case SHA384: + length = byteLength(sha512.BlockSize).asBitLength() + case SHA512: + length = byteLength(sha512.BlockSize).asBitLength() default: // This case should never happen, as the normalization algorithm // should have thrown an error if the hash algorithm is invalid. - return nil, NewError(0, ImplementationError, "invalid hash algorithm: "+hkgp.Hash.Name) + return nil, NewError(ImplementationError, "invalid hash algorithm: "+hkgp.Hash.Name) } + + hkgp.Length = null.IntFrom(int64(length)) } if hkgp.Length.Int64 == 0 { - return nil, NewError(0, OperationError, "algorithm's length cannot be 0") + return nil, NewError(OperationError, "algorithm's length cannot be 0") } // 3. - randomKey := make([]byte, hkgp.Length.Int64/8) + randomKey := make([]byte, bitLength(hkgp.Length.Int64).asByteLength()) if _, err := rand.Read(randomKey); err != nil { // 4. - return nil, NewError(0, OperationError, "failed to generate random key; reason: "+err.Error()) + return nil, NewError(OperationError, "failed to generate random key; reason: "+err.Error()) } // 5. key := &CryptoKey{Type: SecretCryptoKeyType, handle: randomKey} // 6. - algorithm := HmacKeyAlgorithm{} + algorithm := HMACKeyAlgorithm{} // 7. algorithm.Name = HMAC @@ -152,30 +155,30 @@ func (hkgp *HmacKeyGenParams) GenerateKey( return key, nil } -// Ensure that HmacKeyGenParams implements the KeyGenerator interface. -var _ KeyGenerator = &HmacKeyGenParams{} +// Ensure that HMACKeyGenParams implements the KeyGenerator interface. +var _ KeyGenerator = &HMACKeyGenParams{} -// HmacKeyAlgorithm represents the algorithm of an HMAC key. -type HmacKeyAlgorithm struct { +// HMACKeyAlgorithm represents the algorithm of an HMAC key. +type HMACKeyAlgorithm struct { KeyAlgorithm // Hash represents the inner hash function to use. - Hash KeyAlgorithm `json:"hash"` + Hash KeyAlgorithm `js:"hash"` // Length represents he length (in bits) of the key. - Length int64 `json:"length"` + Length int64 `js:"length"` } -func exportHmacKey(ck *CryptoKey, format KeyFormat) ([]byte, error) { +func exportHMACKey(ck *CryptoKey, format KeyFormat) ([]byte, error) { // 1. if ck.handle == nil { - return nil, NewError(0, OperationError, "key data is not accesible") + return nil, NewError(OperationError, "key data is not accesible") } // 2. bits, ok := ck.handle.([]byte) if !ok { - return nil, NewError(0, OperationError, "key underlying data is not of the correct type") + return nil, NewError(OperationError, "key underlying data is not of the correct type") } // 4. @@ -184,47 +187,47 @@ func exportHmacKey(ck *CryptoKey, format KeyFormat) ([]byte, error) { return bits, nil default: // FIXME: note that we do not support JWK format, yet #37. - return nil, NewError(0, NotSupportedError, "unsupported key format "+format) + return nil, NewError(NotSupportedError, "unsupported key format "+format) } } // HashFn returns the hash function to use for the HMAC key. -func (hka *HmacKeyAlgorithm) HashFn() (func() hash.Hash, error) { +func (hka *HMACKeyAlgorithm) HashFn() (func() hash.Hash, error) { hashFn, ok := getHashFn(hka.Hash.Name) if !ok { - return nil, NewError(0, NotSupportedError, fmt.Sprintf("unsupported key hash algorithm %q", hka.Hash.Name)) + return nil, NewError(NotSupportedError, fmt.Sprintf("unsupported key hash algorithm %q", hka.Hash.Name)) } return hashFn, nil } -// HmacImportParams represents the object that should be passed as the algorithm parameter +// HMACImportParams represents the object that should be passed as the algorithm parameter // into `SubtleCrypto.GenerateKey`, when generating an HMAC key. -type HmacImportParams struct { +type HMACImportParams struct { Algorithm // Hash represents the name of the digest function to use. You can // use any of the following: [Sha256], [Sha384], // or [Sha512]. - Hash Algorithm `json:"hash"` + Hash Algorithm `js:"hash"` // Length holds (a Number) the length of the key, in bits. // If this is omitted, the length of the key is equal to the block size // of the hash function you have chosen. // Unless you have a good reason to use a different length, omit // use the default. - Length null.Int `json:"length"` + Length null.Int `js:"length"` } -// newHmacImportParams creates a new HmacImportParams object from the given +// newHMACImportParams creates a new HMACImportParams object from the given // algorithm and params objects. -func newHmacImportParams(rt *goja.Runtime, normalized Algorithm, params goja.Value) (*HmacImportParams, error) { +func newHMACImportParams(rt *goja.Runtime, normalized Algorithm, params goja.Value) (*HMACImportParams, error) { // The specification doesn't explicitly tell us what to do if the // hash field is not present, but we assume it's a mandatory field // and throw an error if it's not present. hashValue, err := traverseObject(rt, params, "hash") if err != nil { - return nil, NewError(0, SyntaxError, "could not get hash from algorithm parameter") + return nil, NewError(SyntaxError, "could not get hash from algorithm parameter") } // Although the specification doesn't explicitly ask us to do so, we @@ -250,7 +253,7 @@ func newHmacImportParams(rt *goja.Runtime, normalized Algorithm, params goja.Val length = null.IntFrom(algorithmLengthValue.ToInteger()) } - return &HmacImportParams{ + return &HMACImportParams{ Algorithm: normalized, Hash: normalizedHash, Length: length, @@ -258,7 +261,7 @@ func newHmacImportParams(rt *goja.Runtime, normalized Algorithm, params goja.Val } // ImportKey imports a key from raw key data. It implements the KeyImporter interface. -func (hip *HmacImportParams) ImportKey( +func (hip *HMACImportParams) ImportKey( format KeyFormat, keyData []byte, keyUsages []CryptoKeyUsage, @@ -269,7 +272,7 @@ func (hip *HmacImportParams) ImportKey( case SignCryptoKeyUsage, VerifyCryptoKeyUsage: continue default: - return nil, NewError(0, SyntaxError, "invalid key usage: "+usage) + return nil, NewError(SyntaxError, "invalid key usage: "+usage) } } @@ -281,42 +284,34 @@ func (hip *HmacImportParams) ImportKey( case RawKeyFormat: hash = KeyAlgorithm{Algorithm{Name: hip.Hash.Name}} default: - return nil, NewError(0, NotSupportedError, "unsupported key format "+format) + return nil, NewError(NotSupportedError, "unsupported key format "+format) } // 5. 6. - length := int64(len(keyData) * 8) + length := byteLength(len(keyData)).asBitLength() if length == 0 { - return nil, NewError(0, DataError, "key length cannot be 0") + return nil, NewError(DataError, "key length cannot be 0") } // 7. - if hip.Length.Valid { - if hip.Length.Int64 > length { - return nil, NewError(0, DataError, "key length cannot be greater than the length of the imported data") - } - - if hip.Length.Int64 < length { - return nil, NewError(0, DataError, "key length cannot be less than the length of the imported data") - } - - length = hip.Length.Int64 + if hip.Length.Valid && hip.Length.Int64 != int64(length) { + return nil, NewError(DataError, "key length cannot be different from the length of the imported data") } // 8. key := CryptoKey{ Type: SecretCryptoKeyType, - handle: keyData[:length/8], + handle: keyData[:length.asByteLength()], } // 9. - algorithm := HmacKeyAlgorithm{} + algorithm := HMACKeyAlgorithm{} // 10. algorithm.Name = HMAC // 11. - algorithm.Length = length + algorithm.Length = int64(length) // 12. algorithm.Hash = hash @@ -327,5 +322,5 @@ func (hip *HmacImportParams) ImportKey( return &key, nil } -// Ensure that HmacImportParams implements the KeyImporter interface. -var _ KeyImporter = &HmacImportParams{} +// Ensure that HMACImportParams implements the KeyImporter interface. +var _ KeyImporter = &HMACImportParams{} diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/key.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/key.go index ebf3a30f7b9..68c1886bb9b 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/key.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/key.go @@ -123,9 +123,9 @@ func newKeyGenerator(rt *goja.Runtime, normalized Algorithm, params goja.Value) switch normalized.Name { case AESCbc, AESCtr, AESGcm, AESKw: - kg, err = newAesKeyGenParams(rt, normalized, params) + kg, err = newAESKeyGenParams(rt, normalized, params) case HMAC: - kg, err = newHmacKeyGenParams(rt, normalized, params) + kg, err = newHMACKeyGenParams(rt, normalized, params) } if err != nil { @@ -147,9 +147,9 @@ func newKeyImporter(rt *goja.Runtime, normalized Algorithm, params goja.Value) ( switch normalized.Name { case AESCbc, AESCtr, AESGcm, AESKw: - ki = newAesImportParams(normalized) + ki = newAESImportParams(normalized) case HMAC: - ki, err = newHmacImportParams(rt, normalized, params) + ki, err = newHMACImportParams(rt, normalized, params) } if err != nil { diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/module.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/module.go index 48d33929782..f82b9ccc888 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/module.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/module.go @@ -2,7 +2,10 @@ package webcrypto import ( + "fmt" + "github.com/dop251/goja" + "go.k6.io/k6/js/common" "go.k6.io/k6/js/modules" ) @@ -14,8 +17,6 @@ type ( // ModuleInstance represents an instance of the JS module. ModuleInstance struct { vu modules.VU - - *Crypto } ) @@ -33,15 +34,8 @@ func New() *RootModule { // NewModuleInstance implements the modules.Module interface and returns // a new instance for each VU. func (*RootModule) NewModuleInstance(vu modules.VU) modules.Instance { - vu.Runtime().SetFieldNameMapper(goja.TagFieldNameMapper("json", true)) - return &ModuleInstance{ vu: vu, - Crypto: &Crypto{ - vu: vu, - Subtle: &SubtleCrypto{vu: vu}, - CryptoKey: &CryptoKey{}, - }, } } @@ -49,6 +43,109 @@ func (*RootModule) NewModuleInstance(vu modules.VU) modules.Instance { // the exports of the JS module. func (mi *ModuleInstance) Exports() modules.Exports { return modules.Exports{Named: map[string]interface{}{ - "crypto": mi.Crypto, + "crypto": newCryptoObject(mi.vu), }} } + +func newCryptoObject(vu modules.VU) *goja.Object { + rt := vu.Runtime() + + obj := rt.NewObject() + + crypto := &Crypto{ + vu: vu, + Subtle: &SubtleCrypto{vu: vu}, + CryptoKey: &CryptoKey{}, + } + + if err := setReadOnlyPropertyOf(obj, "getRandomValues", rt.ToValue(crypto.GetRandomValues)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "randomUUID", rt.ToValue(crypto.RandomUUID)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "subtle", rt.ToValue(newSubtleCryptoObject(vu))); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "CryptoKey", rt.ToValue(crypto.CryptoKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + return obj +} + +func newSubtleCryptoObject(vu modules.VU) *goja.Object { + rt := vu.Runtime() + + obj := rt.NewObject() + + subtleCrypto := &SubtleCrypto{vu: vu} + + if err := setReadOnlyPropertyOf(obj, "decrypt", rt.ToValue(subtleCrypto.Decrypt)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "deriveBits", rt.ToValue(subtleCrypto.DeriveBits)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "deriveKey", rt.ToValue(subtleCrypto.DeriveKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "digest", rt.ToValue(subtleCrypto.Digest)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "encrypt", rt.ToValue(subtleCrypto.Encrypt)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "exportKey", rt.ToValue(subtleCrypto.ExportKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "generateKey", rt.ToValue(subtleCrypto.GenerateKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "importKey", rt.ToValue(subtleCrypto.ImportKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "sign", rt.ToValue(subtleCrypto.Sign)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "unwrapKey", rt.ToValue(subtleCrypto.UnwrapKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "verify", rt.ToValue(subtleCrypto.Verify)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + if err := setReadOnlyPropertyOf(obj, "wrapKey", rt.ToValue(subtleCrypto.WrapKey)); err != nil { + common.Throw(rt, NewError(ImplementationError, err.Error())) + } + + return obj +} + +// setReadOnlyPropertyOf sets a read-only property on the given [goja.Object]. +func setReadOnlyPropertyOf(obj *goja.Object, name string, value goja.Value) error { + err := obj.DefineDataProperty(name, + value, + goja.FLAG_FALSE, + goja.FLAG_FALSE, + goja.FLAG_TRUE, + ) + if err != nil { + return fmt.Errorf("unable to define %s read-only property on TextEncoder object; reason: %w", name, err) + } + + return nil +} diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/params.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/params.go index c89fb4ab3a0..c1f1d80a7d8 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/params.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/params.go @@ -10,18 +10,6 @@ type From[Input, Output any] interface { From(Input) (Output, error) } -// AESKeyGenParams represents the object that should be passed as -// the algorithm parameter into `SubtleCrypto.generateKey`, when generating -// an AES key: that is, when the algorithm is identified as any -// of AES-CBC, AES-CTR, AES-GCM, or AES-KW. -type AESKeyGenParams struct { - // Name should be set to `AES-CBC`, `AES-CTR`, `AES-GCM`, or `AES-KW`. - Name AlgorithmIdentifier - - // Length holds (a Number) the length of the key, in bits. - Length int -} - // AESKwParams represents the object that should be passed as the algorithm parameter // into `SubtleCrypto.Encrypt`, `SubtleCrypto.Decrypt`, `SubtleCrypto.WrapKey`, or // `SubtleCrypto.UnwrapKey`, when using the AES-KW algorithm. @@ -107,17 +95,6 @@ type HMACSignatureParams struct { Name AlgorithmIdentifier } -// HMACImportParams represents the object that should be passed as the -// algorithm parameter into `SubtleCrypto.ImportKey` or `SubtleCrypto.UnwrapKey`, when -// generating a key for the HMAC algorithm. -type HMACImportParams struct { - // Name should be set to AlgorithmKindHmac. - Name AlgorithmIdentifier - - // Hash represents the name of the digest function to use. - Hash AlgorithmIdentifier -} - // PBKDF2Params represents the object that should be passed as the algorithm // parameter into `SubtleCrypto.DeriveKey`, when using the PBKDF2 algorithm. type PBKDF2Params struct { diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/subtle_crypto.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/subtle_crypto.go index 1cc2f6a074f..10ec17cb919 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/subtle_crypto.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/subtle_crypto.go @@ -56,7 +56,7 @@ func (sc *SubtleCrypto) Encrypt(algorithm, key, data goja.Value) *goja.Promise { var ck CryptoKey if err = rt.ExportTo(key, &ck); err != nil { - reject(NewError(0, TypeError, "key argument does hold not a valid CryptoKey object")) + reject(NewError(TypeError, "key argument does hold not a valid CryptoKey object")) return promise } @@ -68,7 +68,7 @@ func (sc *SubtleCrypto) Encrypt(algorithm, key, data goja.Value) *goja.Promise { // 8. if normalized.Name != keyAlgorithmNameValue.String() { - reject(NewError(0, InvalidAccessError, "algorithm name does not match key algorithm name")) + reject(NewError(InvalidAccessError, "algorithm name does not match key algorithm name")) return promise } @@ -81,7 +81,7 @@ func (sc *SubtleCrypto) Encrypt(algorithm, key, data goja.Value) *goja.Promise { go func() { // 9. if !ck.ContainsUsage(EncryptCryptoKeyUsage) { - reject(NewError(0, InvalidAccessError, "key does not contain the 'encrypt' usage")) + reject(NewError(InvalidAccessError, "key does not contain the 'encrypt' usage")) return } @@ -99,7 +99,7 @@ func (sc *SubtleCrypto) Encrypt(algorithm, key, data goja.Value) *goja.Promise { resolve(rt.NewArrayBuffer(ciphertext)) return default: - reject(NewError(0, NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalized.Name))) + reject(NewError(NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalized.Name))) return } }() @@ -148,7 +148,7 @@ func (sc *SubtleCrypto) Decrypt(algorithm, key, data goja.Value) *goja.Promise { var ck CryptoKey if err = rt.ExportTo(key, &ck); err != nil { - reject(NewError(0, InvalidAccessError, "key argument does hold not a valid CryptoKey object")) + reject(NewError(InvalidAccessError, "key argument does hold not a valid CryptoKey object")) return promise } @@ -160,7 +160,7 @@ func (sc *SubtleCrypto) Decrypt(algorithm, key, data goja.Value) *goja.Promise { // 8. if normalized.Name != keyAlgorithmNameValue.String() { - reject(NewError(0, InvalidAccessError, "algorithm name does not match key algorithm name")) + reject(NewError(InvalidAccessError, "algorithm name does not match key algorithm name")) return promise } @@ -173,7 +173,7 @@ func (sc *SubtleCrypto) Decrypt(algorithm, key, data goja.Value) *goja.Promise { go func() { // 9. if !ck.ContainsUsage(DecryptCryptoKeyUsage) { - reject(NewError(0, InvalidAccessError, "key does not contain the 'decrypt' usage")) + reject(NewError(InvalidAccessError, "key does not contain the 'decrypt' usage")) return } @@ -190,7 +190,7 @@ func (sc *SubtleCrypto) Decrypt(algorithm, key, data goja.Value) *goja.Promise { resolve(rt.NewArrayBuffer(plaintext)) default: - reject(NewError(0, NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalized.Name))) + reject(NewError(NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalized.Name))) } }() @@ -238,7 +238,7 @@ func (sc *SubtleCrypto) Sign(algorithm, key, data goja.Value) *goja.Promise { var ck CryptoKey if err = rt.ExportTo(key, &ck); err != nil { - reject(NewError(0, InvalidAccessError, "key argument does hold not a valid CryptoKey object")) + reject(NewError(InvalidAccessError, "key argument does hold not a valid CryptoKey object")) return promise } @@ -251,28 +251,28 @@ func (sc *SubtleCrypto) Sign(algorithm, key, data goja.Value) *goja.Promise { go func() { // 8. if normalized.Name != keyAlgorithmNameValue.String() { - reject(NewError(0, InvalidAccessError, "algorithm name does not match key algorithm name")) + reject(NewError(InvalidAccessError, "algorithm name does not match key algorithm name")) return } // 9. for !ck.ContainsUsage(SignCryptoKeyUsage) { - reject(NewError(0, InvalidAccessError, "key does not contain the 'sign' usage")) + reject(NewError(InvalidAccessError, "key does not contain the 'sign' usage")) return } // 10. switch normalized.Name { case HMAC: - keyAlgorithm, ok := ck.Algorithm.(HmacKeyAlgorithm) + keyAlgorithm, ok := ck.Algorithm.(HMACKeyAlgorithm) if !ok { - reject(NewError(0, InvalidAccessError, "key algorithm does not describe a HMAC key")) + reject(NewError(InvalidAccessError, "key algorithm does not describe a HMAC key")) return } keyHandle, ok := ck.handle.([]byte) if !ok { - reject(NewError(0, InvalidAccessError, "key handle is of incorrect type")) + reject(NewError(InvalidAccessError, "key handle is of incorrect type")) return } @@ -290,7 +290,7 @@ func (sc *SubtleCrypto) Sign(algorithm, key, data goja.Value) *goja.Promise { resolve(rt.NewArrayBuffer(mac)) default: - reject(NewError(0, NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalized.Name))) + reject(NewError(NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalized.Name))) } }() @@ -347,7 +347,7 @@ func (sc *SubtleCrypto) Verify(algorithm, key, signature, data goja.Value) *goja var ck CryptoKey if err = rt.ExportTo(key, &ck); err != nil { - reject(NewError(0, InvalidAccessError, "key argument does hold not a valid CryptoKey object")) + reject(NewError(InvalidAccessError, "key argument does hold not a valid CryptoKey object")) return promise } @@ -360,27 +360,27 @@ func (sc *SubtleCrypto) Verify(algorithm, key, signature, data goja.Value) *goja go func() { // 9. if normalizedAlgorithm.Name != keyAlgorithmNameValue.String() { - reject(NewError(0, InvalidAccessError, "algorithm name does not match key algorithm name")) + reject(NewError(InvalidAccessError, "algorithm name does not match key algorithm name")) return } // 10. for !ck.ContainsUsage(VerifyCryptoKeyUsage) { - reject(NewError(0, InvalidAccessError, "key does not contain the 'sign' usage")) + reject(NewError(InvalidAccessError, "key does not contain the 'sign' usage")) return } switch normalizedAlgorithm.Name { case HMAC: - keyAlgorithm, ok := ck.Algorithm.(HmacKeyAlgorithm) + keyAlgorithm, ok := ck.Algorithm.(HMACKeyAlgorithm) if !ok { - reject(NewError(0, InvalidAccessError, "key algorithm does not describe a HMAC key")) + reject(NewError(InvalidAccessError, "key algorithm does not describe a HMAC key")) return } keyHandle, ok := ck.handle.([]byte) if !ok { - reject(NewError(0, InvalidAccessError, "key handle is of incorrect type")) + reject(NewError(InvalidAccessError, "key handle is of incorrect type")) return } @@ -395,7 +395,7 @@ func (sc *SubtleCrypto) Verify(algorithm, key, signature, data goja.Value) *goja resolve(hmac.Equal(signatureData, hasher.Sum(nil))) default: - reject(NewError(0, NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalizedAlgorithm.Name))) + reject(NewError(NotSupportedError, fmt.Sprintf("unsupported algorithm %q", normalizedAlgorithm.Name))) } }() @@ -433,29 +433,12 @@ func (sc *SubtleCrypto) Digest(algorithm goja.Value, data goja.Value) *goja.Prom } // 2. - // Cast the data to a Goja Object, and, as we're now sure it's - // either an ArrayBuffer, or a view on an ArrayBuffer, we can - // get the underlying ArrayBuffer by exporting its buffer property - // to a Goja ArrayBuffer, and then getting its underlying Go slice - // by calling the `Bytes()` method. - // - // Doing so conviniently also copies the underlying buffer, which - // is required by the specification. - // See https://www.w3.org/TR/WebCryptoAPI/#SubtleCrypto-method-digest - asObject := data.ToObject(rt) - arrayBuffer, ok := asObject.Get("buffer").Export().(goja.ArrayBuffer) - if !ok { - reject(errors.New("could not get ArrayBuffer from data")) + bytes, err := exportArrayBuffer(rt, data) + if err != nil { + reject(err) return promise } - bytes := arrayBuffer.Bytes() - - // The specification explicitly requires us to copy the underlying - // bytes held by the array buffer - bytesCopy := make([]byte, len(bytes)) - copy(bytesCopy, bytes) - // 3. normalized, err := normalizeAlgorithm(rt, algorithm, OperationIdentifierDigest) if err != nil { @@ -470,7 +453,7 @@ func (sc *SubtleCrypto) Digest(algorithm goja.Value, data goja.Value) *goja.Prom hashFn, ok := getHashFn(normalized.Name) if !ok { // 7. - reject(NewError(0, NotSupportedError, "unsupported algorithm: "+normalized.Name)) + reject(NewError(NotSupportedError, "unsupported algorithm: "+normalized.Name)) return } @@ -532,7 +515,7 @@ func (sc *SubtleCrypto) GenerateKey(algorithm goja.Value, extractable bool, keyU isPrivateKey := result.Type == PrivateCryptoKeyType isUsagesEmpty := len(result.Usages) == 0 if (isSecretKey || isPrivateKey) && isUsagesEmpty { - reject(NewError(0, SyntaxError, "usages cannot not be empty for a secret or private CryptoKey")) + reject(NewError(SyntaxError, "usages cannot not be empty for a secret or private CryptoKey")) return } @@ -573,6 +556,8 @@ func (sc *SubtleCrypto) GenerateKey(algorithm goja.Value, extractable bool, keyU // using `SubtleCrypto.ExportKey` or `SubtleCrypto.WrapKey`. // // The `keyUsages` parameter is an array of strings indicating what the key can be used for. +// +//nolint:revive // remove the nolint directive when the method is implemented func (sc *SubtleCrypto) DeriveKey( algorithm goja.Value, baseKey goja.Value, @@ -610,6 +595,8 @@ func (sc *SubtleCrypto) DeriveKey( // using `SubtleCrypto.ImportKey`. // // The `length` parameter is the number of bits to derive. The number should be a multiple of 8. +// +//nolint:revive // remove the nolint directive when the method is implemented func (sc *SubtleCrypto) DeriveBits(algorithm goja.Value, baseKey goja.Value, length int) *goja.Promise { // TODO: implementation return nil @@ -681,7 +668,7 @@ func (sc *SubtleCrypto) ImportKey( isPrivateKey := result.Type == PrivateCryptoKeyType isUsagesEmpty := len(keyUsages) == 0 if (isSecretKey || isPrivateKey) && isUsagesEmpty { - reject(NewError(0, SyntaxError, "usages cannot not be empty for a secret or private CryptoKey")) + reject(NewError(SyntaxError, "usages cannot not be empty for a secret or private CryptoKey")) return } @@ -721,32 +708,32 @@ func (sc *SubtleCrypto) ExportKey(format KeyFormat, key goja.Value) *goja.Promis var algorithm Algorithm algValue := key.ToObject(rt).Get("algorithm") if err := rt.ExportTo(algValue, &algorithm); err != nil { - reject(NewError(0, SyntaxError, "key is not a valid CryptoKey")) + reject(NewError(SyntaxError, "key is not a valid CryptoKey")) return promise } ck, ok := key.Export().(*CryptoKey) if !ok { - reject(NewError(0, ImplementationError, "unable to extract CryptoKey")) + reject(NewError(ImplementationError, "unable to extract CryptoKey")) return promise } keyAlgorithmName := key.ToObject(rt).Get("algorithm").ToObject(rt).Get("name").String() if algorithm.Name != keyAlgorithmName { - reject(NewError(0, InvalidAccessError, "algorithm name does not match key algorithm name")) + reject(NewError(InvalidAccessError, "algorithm name does not match key algorithm name")) return promise } go func() { // 5. if !isRegisteredAlgorithm(algorithm.Name, OperationIdentifierExportKey) { - reject(NewError(0, NotSupportedError, "unsupported algorithm "+algorithm.Name)) + reject(NewError(NotSupportedError, "unsupported algorithm "+algorithm.Name)) return } // 6. if !ck.Extractable { - reject(NewError(0, InvalidAccessError, "the key is not extractable")) + reject(NewError(InvalidAccessError, "the key is not extractable")) return } @@ -761,13 +748,13 @@ func (sc *SubtleCrypto) ExportKey(format KeyFormat, key goja.Value) *goja.Promis return } case HMAC: - result, err = exportHmacKey(ck, format) + result, err = exportHMACKey(ck, format) if err != nil { reject(err) return } default: - reject(NewError(0, NotSupportedError, "unsupported algorithm "+keyAlgorithmName)) + reject(NewError(NotSupportedError, "unsupported algorithm "+keyAlgorithmName)) return } @@ -804,6 +791,8 @@ func (sc *SubtleCrypto) ExportKey(format KeyFormat, key goja.Value) *goja.Promis // - an `SubtleCrypto.AesCbcParams` object // - an `SubtleCrypto.AesGcmParams` object // - for the AES-KW algorithm, pass the string "AES-KW", or an object of the form `{ name: "AES-KW" }` +// +//nolint:revive // remove the nolint directive when the method is implemented func (sc *SubtleCrypto) WrapKey( format KeyFormat, key goja.Value, @@ -857,6 +846,8 @@ func (sc *SubtleCrypto) WrapKey( // The `extractable` parameter identifies whether the key is extractable. // // The `keyUsages` parameter identifies the operations that the key can be used for. +// +//nolint:revive // remove the nolint directive when the method is implemented func (sc *SubtleCrypto) UnwrapKey( format KeyFormat, wrappedKey []byte, diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/test_setup.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/test_setup.go index 3759d1cfb49..3f27b6aa67a 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/test_setup.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/test_setup.go @@ -36,7 +36,7 @@ func newTestSetup(t testing.TB) testSetup { tb := httpmultibin.NewHTTPMultiBin(t) rt := goja.New() - rt.SetFieldNameMapper(goja.TagFieldNameMapper("json", true)) + rt.SetFieldNameMapper(common.FieldNameMapper{}) // We compile the Web Platform testharness script into a goja.Program harnessProgram, err := CompileFile("./tests/util", "testharness.js") @@ -105,6 +105,7 @@ func newTestSetup(t testing.TB) testSetup { func CompileFile(base, name string) (*goja.Program, error) { fname := path.Join(base, name) + //nolint:forbidigo // Allow os.Open in tests f, err := os.Open(filepath.Clean(fname)) if err != nil { return nil, err diff --git a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/types.go b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/types.go index a2c3a97ee72..73161d79e22 100644 --- a/vendor/github.com/grafana/xk6-webcrypto/webcrypto/types.go +++ b/vendor/github.com/grafana/xk6-webcrypto/webcrypto/types.go @@ -6,6 +6,22 @@ import ( "github.com/dop251/goja" ) +// bitLength is a type alias for the length of a bits collection. +type bitLength int + +// asByteLength returns the length of the bits collection in bytes. +func (b bitLength) asByteLength() byteLength { + return byteLength(b) / 8 +} + +// byteLength is a type alias for the length of a byte slice. +type byteLength int + +// asBitLength returns the length of the byte slice in bits. +func (b byteLength) asBitLength() bitLength { + return bitLength(b) * 8 +} + // ToBytes tries to return a byte slice from compatible types. func ToBytes(data interface{}) ([]byte, error) { switch dt := data.(type) { diff --git a/vendor/modules.txt b/vendor/modules.txt index e2a7e4adfb9..a289bc0b0be 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -173,7 +173,7 @@ github.com/grafana/xk6-redis/redis # github.com/grafana/xk6-timers v0.2.3 ## explicit; go 1.20 github.com/grafana/xk6-timers/timers -# github.com/grafana/xk6-webcrypto v0.1.0 +# github.com/grafana/xk6-webcrypto v0.1.1 ## explicit; go 1.19 github.com/grafana/xk6-webcrypto/webcrypto # github.com/grafana/xk6-websockets v0.2.1