From ee388f7645e87feafb73540736eade802e5056ab Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Mon, 4 Sep 2023 16:33:03 +0200 Subject: [PATCH] The GSM package [ver. 0.21.1] The GSM package [ver. 0.21.1] Package regenerated with the latest version of the SAS Packages Framework (20230904). SHA256 digest for the latest version of `GSM`: F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682 --- README.md | 2 +- gsm.md | 6 +- gsm.zip | Bin 17742 -> 17841 bytes hist/0.21.1/gsm.md | 329 ++++++++++++++++++++++++++++++++++++++++++++ hist/0.21.1/gsm.zip | Bin 0 -> 17841 bytes 5 files changed, 333 insertions(+), 4 deletions(-) create mode 100644 hist/0.21.1/gsm.md create mode 100644 hist/0.21.1/gsm.zip diff --git a/README.md b/README.md index b3b86a8..343e9db 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ to create secured macros stored in SAS Proc FCMP functions. The dataset with functions can be shared between different operating systems and allows to generate macros on site without showing their code. -SHA256 digest for the latest version of `GSM`: F*56DC0DCCE06B4281BF3FA6FA3875CBA87772BDA7FAB601B06740A7980FFB0E07 +SHA256 digest for the latest version of `GSM`: F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682 [**Documentation for GSM**](./gsm.md "Documentation for GSM") diff --git a/gsm.md b/gsm.md index 3564c17..40b167b 100644 --- a/gsm.md +++ b/gsm.md @@ -8,7 +8,7 @@ --- -# The GSM package [ver. 0.21.0] ############################################### +# The GSM package [ver. 0.21.1] ############################################### The **GSM** (a.k.a. *Generate Secure Macros*) package allows to create secured macros stored in SAS Proc FCMP functions. @@ -91,10 +91,10 @@ Package contains: Required SAS Components: `Base SAS Software` -*SAS package generated by generatePackage, version 20230520* +*SAS package generated by generatePackage, version 20230905* The SHA256 hash digest for package GSM: -`F*56DC0DCCE06B4281BF3FA6FA3875CBA87772BDA7FAB601B06740A7980FFB0E07` +`F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682` ## >>> `%GSM()` macro: <<< ####################### diff --git a/gsm.zip b/gsm.zip index f5610a663d609c752fce296230cb7587f92a2efd..f48a0b9d8f34958c23d8c2468bee7d3a2a566647 100644 GIT binary patch delta 9414 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 diff --git a/hist/0.21.1/gsm.md b/hist/0.21.1/gsm.md new file mode 100644 index 0000000..40b167b --- /dev/null +++ b/hist/0.21.1/gsm.md @@ -0,0 +1,329 @@ +- [The GSM package](#gsm-package) +- [Content description](#content-description) + * [`%GSM()` macro](#gsm-macro) + * [`%GSMpck_makeFCMPcode()` macro](#gsmpck-makefcmpcode-macro) + + * [License](#license) + +--- + + +# The GSM package [ver. 0.21.1] ############################################### + +The **GSM** (a.k.a. *Generate Secure Macros*) package allows +to create secured macros stored in SAS Proc FCMP functions. +The dataset with functions can be shared and allows to generate +macros without showing their code. + +The GSM package is basically an automated version of the following: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +proc fcmp outlib = work.gsm.secure ENCRYPT; + function generateMacro() $; + rc = RESOLVE(' + %macro secretMacro(x) / SECURE; + data test; + a = "&x."; + run; + %mend; + '); + return (rc); + endsub; +run; + +/* share work.gsm dataset */ +options cmplib = work.gsm; +data _null_; + rc = generateMacro(); + put rc=; +run; + +/* enjoy */ +%secretMacro(42) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +See examples for more details. + +Recording of presentation with "how it works" description, in Polish, is avaliable [here](https://www.youtube.com/watch?v=LtaWPe2sgRY&t=1s). + +*How to use it:* + - Copy all files with your secured macros code into a directory. + Best approach is to have one file for one macro. + - Copy a path to the directory. + - Run the following code: + ``` + %GSM(, cmplib=) + ``` + - Share generated `ZIP` file (unzip and run the code). + +**Limitations:** + - Single macro file cannot be longer than 32760 bytes. + + - Multiline text variable. Consider the following code text file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%macro~test()/SECURE;~#@ +data~test;~#@ +a~=~"abc~#@ +~#@ +def";~#@ +put~a~hex20.;~#@ +run;~#@ +%mend~test;~#@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +where `~` symbols the space character, +`#` symbols the carriage return (`0D`), +and `@` symbols the line feed (`0A`). +The code file is scanned and inserted into +the `resolve()` function argument in a "byte by byte" +fashion hence also the "end of line" characters are included. +As the result value of variable `a` will be: + +`a = "abc~#@~#@def"`. + +If you want to use the `GSM` package avoid +such "style" of coding in your macros. + + +--- + +Package contains: + 1. macro gsm + 2. macro gsmpck_makefcmpcode + +Required SAS Components: + `Base SAS Software` + +*SAS package generated by generatePackage, version 20230905* + +The SHA256 hash digest for package GSM: +`F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682` + + +## >>> `%GSM()` macro: <<< ####################### + +The `%GSM()` macro is the main macro of +the **GSM** (a.k.a. *Generate Secure Macros*) package. + +It converts a list of macros provided by the user into +a data set of the Proc FCMP functions. The macros are stored +in functions are encrypted which allow to share them without +showing their code. *Important* thing is that macros provided +by the user *has* to be "secure", i.e. the `secure` option has to +be added to the macro definition. See the example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%macro secretMacro(x) / SECURE; /* <- the secure option */ + <... some code ...> +%mend secretMacro; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +As a result a zip file, containing dataset with functions and +code to be executed on site, is generated. + +Since encrypted code is stored in a SAS dataset it has +no limitation in sharing between operating systems (like catalogs have). + +*Limitation:* Due to the `Resolve()` function limitations + a single macro file cannot be longer than 32760 bytes. + +*Notes:* +- All macros have to have the `secure` option added, i.e. `%macro aMacroname(...) / SECURE ;`. +- During the execution a test macro, named `%GSMpck_dummyMacroForTests()`, is generated. +- The `%GSM()` macro calls the `%GSMpck_makeFCMPcode(...)` macro internally. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%GSM( + path + <,trim=0> + <,cmplib=work.generateMacros> + <,source2=> + <,outpath=> + <,encodingRestricted=> + <,secret=> + <,lineEnd=> + <,encrypt=> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `path` - *Required*, indicates a directory which contains files with macros. + Only files with `sas` extension are used. + +* `cmplib=` - *Optional*, the default value is `work.generateMacros`. + Names the dataset which will contain generated functions. + +* `source2=` - *Optional*, the default value is null. + Indicate if `%includ`-ed files are printed out. + Any value other than null enables printing. + +* `outpath=` - *Optional*, the default value is set the same as the `path`. + Points a directory in which a result (a zip file) is generated. + +* `encodingRestricted=` - *Optional*, the default value is `0`. + If set to 1 then if User session encoding is different from + encoding of the session which generates the dataset then + the generateMacros() function will not execute macro code. + +* `secret=` - *Optional*, the default value is null, in such case the + secret is generated from the `sha256(datetime(), hex32.)` function + and is printed in the log. When not null then should be + alphanumerical constant. Non-alphanumerical characters are removed. + Required to execute the `resolve()` function. + User who do not know the value will not be able + to run the `_maxro_XX_()` function. + +* `lineEnd=` - *Optional*, the default value is `0D0A`, indicates which of: + line feed, carriage return, or both, or a space be inserted + at the end of line in the intermediate code file that is generated. + Value has to be hexadecimal code (_NOT_ null), + since the value is resolved as `"&lineEnd."x`, so use e.g. + `0A` for line feed, `0D` for carriage return, + `0D0A` for both, and `20` for space. + +* `encrypt=` - *Optional*, the default value is `ENCRYPT`. + Indicate if `FCMP` functions generated by the package + are encrypted. Value has to be either empty or `ENCRYPT`, + all other are converted to default. The option is + dedicated for debugging, keep the default value + for production use. + +* `trim=` - *Deprecated*, the default value is `0`. + *Kept for backward compatibility.* + +--- + +### Example: ################################################################### + +Example 1. Prepare 2 files: `f1.sas` and `f2.sas` and use the `%GSM()` macro. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let path = %sysfunc(pathname(work))/path2files; + +%put &=path.; +options dlcreatedir; +libname path "&path."; +filename path "&path."; + +data _null_; + file path(f1.sas); + input; + put _infile_; +cards4; +%macro abc(x) / SECURE; + data test; + do i = 1 to &x.; + put i=; + end; + run; +%mend; +;;;; +run; + +data _null_; + file path(f2.sas); + input; + put _infile_; +cards4; +%macro xyz(x) / SECURE; + %do i = 1 %to &x.; + %put &=i; + %end; +%mend; +;;;; +run; + +%GSM(&path., cmplib=work.myMacros) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## >>> `%GSMpck_makeFCMPcode()` macro: <<< ####################### + +The `%GSMpck_makeFCMPcode()` macro is an internal macro of +the **GSM** (a.k.a. *Generate Secure Macros*) package. + +It executes a process of converting +a macro provided by the user into +a Proc FCMP function. + +Since encrypted code is stored in a SAS dataset it has +no limitation in sharing between operating systems (like catalogs have). + +*Limitation:* Single macro file cannot be longer than 32760 bytes. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%GSMpck_makeFCMPcode( + path + ,number + <,outlib=work.generateMacros.secure> + <,source2=> + <,fileNameCode=FNC> + <,secret=123456789> + <,lineEnd=0A> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `path` - *Required*, indicates a directory which contains files with macros. + Only files with `sas` extension are used. + +2. `number` - *Required*, a sequential number. + + +* `cmplib=` - *Optional*, the default value is `work.generateMacros`. + Names the dataset which will contain generated functions. + +* `source2=` - *Optional*, the default value is null. + Indicate if `%includ`-ed files are printed out. + Any value other than null enables printing. + +* `fileNameCode=` - *Optional*, the default value is `FNC`. + Internal fileref. + +* `secret=` - *Optional*, internal, the default value is `1234567890`. + Alphanumerical constant required to execute the `resolve()` + function. User who do not know the value will not be able + to run the `_maxro_XX_()` function. + +* `lineEnd=` - *Optional*, the default value is `0D0A`, indicates which of: + line feed, carriage return, or both, or a space be inserted + at the end of line in the intermediate code file that is generated. + Value has to be hexadecimal code (_NOT_ null), + since the value is resolved as `"&lineEnd."x`, so use e.g. + `0A` for line feed, `0D` for carriage return, + `0D0A` for both, and `20` for space. + +* `trim=` - *Deprecated*, the default value is `0`. + *Kept for backward compatibility.* + +--- + + +## License #################################################################### + +Copyright (c) Bartosz Jablonski, since 2021 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- diff --git a/hist/0.21.1/gsm.zip b/hist/0.21.1/gsm.zip new file mode 100644 index 0000000000000000000000000000000000000000..f48a0b9d8f34958c23d8c2468bee7d3a2a566647 GIT binary patch literal 17841 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