From 2612dc3c41f6945b34423d382099dfcd7e06348f Mon Sep 17 00:00:00 2001 From: RaINi_ Date: Mon, 10 Feb 2020 00:34:45 +0100 Subject: [PATCH] Upload --- .github/workflows/mac.yml | 18 + .github/workflows/ubuntu.yml | 18 + .github/workflows/windows.yml | 18 + .gitignore | 11 + Cargo.toml | 8 + LICENSE | 674 ++++++++++++++++++++++++++++++++++ README.md | 13 + resources/preview.png | Bin 0 -> 76319 bytes src/main.rs | 192 ++++++++++ 9 files changed, 952 insertions(+) create mode 100644 .github/workflows/mac.yml create mode 100644 .github/workflows/ubuntu.yml create mode 100644 .github/workflows/windows.yml create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 resources/preview.png create mode 100644 src/main.rs diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml new file mode 100644 index 0000000..d9f15e8 --- /dev/null +++ b/.github/workflows/mac.yml @@ -0,0 +1,18 @@ +name: MacOS + +on: + push: + paths: + - 'src/**' + +jobs: + build: + + runs-on: macos-latest + + steps: + - uses: actions/checkout@v2 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml new file mode 100644 index 0000000..593d9c2 --- /dev/null +++ b/.github/workflows/ubuntu.yml @@ -0,0 +1,18 @@ +name: Ubuntu + +on: + push: + paths: + - 'src/**' + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000..bad93cd --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,18 @@ +name: Windows + +on: + push: + paths: + - 'src/**' + +jobs: + build: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0002ba5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk +.vscode diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6b4626e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "aida64_keygen" +version = "0.1.0" +authors = ["RaINi_"] +edition = "2018" + +[dependencies] +rand = "0.7.3" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 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 General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + 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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + 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 GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e75d54 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +![MacOS](https://github.com/LeagueRaINi/Aida64-Keygen/workflows/MacOS/badge.svg) +![Ubuntu](https://github.com/LeagueRaINi/Aida64-Keygen/workflows/Ubuntu/badge.svg) +![Windows](https://github.com/LeagueRaINi/Aida64-Keygen/workflows/Windows/badge.svg) + +# **This is for educational purposes only!** +- this project contains methods for generating and verifying aida64 keys + +![preview](https://github.com/LeagueRaINi/Aida64-Keygen/blob/master/resources/preview.png) + +**Thanks to:** +- approved for helping reverse some of this +- wildbook & veykril for helping me alot converting this to rust +- moonshadow565 for explaining and simplifying some of the methods diff --git a/resources/preview.png b/resources/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..03442063d6ced621a9212089486e8d9313bf7ebc GIT binary patch literal 76319 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 p$)W~}Ye}@Zl>|w$xM|a-{~z!Pc@8aH3 i32 { + self.year = self.year.max(2003).min(2099) - 2003; + self.month = self.month.max(2).min(12); + self.day = self.day.max(1).min(31); + (self.year * 512) + (self.month * 32) + self.day + } + + fn dec(val: i32) -> Date { + Date { + day: val & 31, + month: (val >> 5) & 15, + year: ((val >> 9) & 31) + 2003 + } + } +} + +#[derive(Debug, Copy, Clone)] +enum KeyEdition { + Business = 0, + Extreme = 1, + Engineer = 2, + NetworkAudit = 3 +} + +impl TryFrom for KeyEdition { + type Error = &'static str; + + fn try_from(value: i32) -> Result { + match value { + 0 => Ok(Business), + 1 => Ok(Extreme), + 2 => Ok(Engineer), + 3 => Ok(NetworkAudit), + _ => Err("Unknown edition"), + } + } +} + +impl TryFrom<&str> for KeyEdition { + type Error = &'static str; + + fn try_from(value: &str) -> Result { + match value { + "business" => Ok(Business), + "extreme" => Ok(Extreme), + "engineer" => Ok(Engineer), + "network" => Ok(NetworkAudit), + _ => Err("Unknown edition"), + } + } +} + +const KEYS_SIZE: i32 = KEY_CHARS.len() as i32; +const KEY_CHARS: [u8; 34] = [ + b'D', b'Y', b'1', b'4', b'U', b'F', b'3', b'R', b'H', + b'W', b'C', b'X', b'L', b'Q', b'B', b'6', b'I', b'K', + b'J', b'T', b'9', b'N', b'5', b'A', b'G', b'S', b'2', + b'P', b'M', b'8', b'V', b'Z', b'7', b'E' +]; + +fn get_checksum>(key_part: T) -> u16 { + (key_part + .as_ref() + .iter() + .fold(0u32, |result, b| { + (0..8).fold(result ^ (*b as u32) << 8, |result, _| { + if result & 0x8000 == 0 { + result << 1 + } else { + result << 1 ^ 0x8201 + } + }) + }) & 0xFFFF) as u16 +} + +fn dec_part>(key_part: T) -> i32 { + key_part + .as_ref() + .iter() + .enumerate() + .fold(0i32, |result, (_, c1)| { + (result * 34) + KEY_CHARS + .iter() + .position(|&c2| c2 == *c1) + .unwrap_or(0) as i32 + }) +} + +fn enc_part(mut val: i32, slice: &mut [u8]) { + slice + .iter_mut() + .rev() + .for_each(|x| { + *x = KEY_CHARS[(val % KEYS_SIZE) as usize]; + val /= KEYS_SIZE; + }) +} + +fn gen_pair(slice: &mut [u8]) { + slice + .iter_mut() + .for_each(|x| *x = KEY_CHARS[thread_rng().gen_range(0, KEYS_SIZE) as usize]) +} + +fn verify_checksum>(key: T) -> bool { + let key = key.as_ref(); + key.len() == 25 && { + let mut enc_checksum: [u8; 3] = [0; 3]; + enc_part(get_checksum(&key[0..24]) as i32, &mut enc_checksum); + enc_checksum[1] == key[24] + } +} + +fn is_valid_key>(key: T) -> bool { + let key = key.as_ref(); + verify_checksum(key) && { + let key_parts: [i32; 9] = [ + dec_part(&key[22..24]), + dec_part(&key[0..2]), + dec_part(&key[2..4]), + dec_part(&key[4..6]), + dec_part(&key[6..8]), + dec_part(&key[8..12]), + dec_part(&key[12..16]), + dec_part(&key[16..19]), + dec_part(&key[19..22]), + ]; + + let edition = KeyEdition::try_from(((key_parts[0] & 0xFF) ^ key_parts[1] ^ 0xBF) - 1); + let unk1 = (key_parts[0] & 0xFF) ^ key_parts[2] ^ 0xED; + let unk2 = (key_parts[0] & 0xFF) ^ (key_parts[3] & 0xFFFF) ^ 0x77; + let unk3 = (key_parts[0] & 0xFF) ^ (key_parts[4] & 0xFFFF) ^ 0xDF; + let license_count = key_parts[0] ^ key_parts[5] ^ 0x4755; + let purchase_date = key_parts[0] ^ key_parts[6] ^ 0x7CC1; + let expire_val1 = (key_parts[0] & 0xFF) ^ key_parts[7] ^ 0x3FD; + let expire_val2 = (key_parts[0] & 0xFF) ^ key_parts[7] ^ 0x935; + + edition.is_ok() && + unk1 < 990 && unk2 <= 100 && unk3 <= 100 && + license_count > 0 && license_count < 798 && + expire_val1 <= 3660 && expire_val2 > 0 && expire_val2 <= 3660 && (expire_val1 != 3660 || expire_val2 != 1830) && + purchase_date >= 577 && purchase_date <= 49567 + } +} + +fn generate_key(edition: KeyEdition, license_count: i32, purchase_val: i32, expire1_val: i32, expire2_val: i32) -> String { + let mut rng = thread_rng(); + let unk1 = rng.gen_range(100, 989); + let unk2 = rng.gen_range(0, 100) & 0xFFFF; + let unk3 = rng.gen_range(0, 100) & 0xFFFF; + + let mut enc_key: [u8; 25] = [0; 25]; + gen_pair(&mut enc_key[22..24]); + + let base_val = dec_part(&mut enc_key[22..24]); + enc_part((base_val & 0xFF) ^ (edition as i32 + 1) ^ 0xBF, &mut enc_key[0..2]); + enc_part((base_val & 0xFF) ^ unk1 ^ 0xED, &mut enc_key[2..4]); + enc_part((base_val & 0xFF) ^ unk2 ^ 0x77, &mut enc_key[4..6]); + enc_part((base_val & 0xFF) ^ unk3 ^ 0xDF, &mut enc_key[6..8]); + enc_part((base_val & 0xFFFFFF) ^ license_count ^ 0x4755, &mut enc_key[8..12]); + enc_part((base_val & 0xFFFFFF) ^ purchase_val ^ 0x7CC1, &mut enc_key[12..16]); + enc_part((base_val & 0xFF) ^ expire1_val ^ 0x3FD, &mut enc_key[16..19]); + enc_part((base_val & 0xFF) ^ expire2_val ^ 0x935, &mut enc_key[19..22]); + + let mut enc_checksum: [u8; 3] = [0; 3]; + enc_part(get_checksum(&mut enc_key[0..24]) as i32, &mut enc_checksum); + enc_key[24] = enc_checksum[1]; + + String::from_utf8(enc_key.to_vec()).unwrap() +} + +fn main() { + for i in 0..4 { + let edition = KeyEdition::try_from(i).unwrap(); + let new_key = generate_key(edition, 1, Date {day: 1, month: 1, year: 2020}.enc(), 0, 3660); + println!(" generated key {} for edition {:?}", new_key, edition); + println!(" └ is valid: {}", is_valid_key(new_key)); + } +} \ No newline at end of file