From 59cda1333039d03efea016afb6c3ccaf334dc276 Mon Sep 17 00:00:00 2001 From: yabwon Date: Fri, 16 Jul 2021 13:05:42 +0200 Subject: [PATCH 1/2] GSM package, version 0.1 **GSM** (Generate Secure Macros) package, version 0.1 The Package allows 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. --- README.md | 9 ++ packages/README.md | 11 ++ packages/SHA256_for_packages.txt | 3 + packages/gsm.md | 251 +++++++++++++++++++++++++++++++ packages/gsm.zip | Bin 0 -> 14239 bytes 5 files changed, 274 insertions(+) create mode 100644 packages/gsm.md create mode 100644 packages/gsm.zip diff --git a/README.md b/README.md index 6252746..70e5313 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,15 @@ SHA256 digest for BasePlus: A321A4BC54D444B82575EC5D443553A096557AD69DC171D578A3 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") +- **GSM** (Generate Secure Macros)\[0.1\], package allows + 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 GSM: 7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278 + +[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") + - **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) SHA256 digest for dynMacroArray: 67956116578E71327748B7EB3DAFF9D872DBC6F6EDD0DC11B7CF2A54FDA71785 diff --git a/packages/README.md b/packages/README.md index c8a8d86..6d06263 100644 --- a/packages/README.md +++ b/packages/README.md @@ -110,6 +110,17 @@ SHA256 digest for BasePlus: A321A4BC54D444B82575EC5D443553A096557AD69DC171D578A3 --- +- **GSM** (Generate Secure Macros)\[0.1\], package allows + 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 GSM: 7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278 + +[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") + +--- + - **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) SHA256 digest for dynMacroArray: 67956116578E71327748B7EB3DAFF9D872DBC6F6EDD0DC11B7CF2A54FDA71785 diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 774cf38..587f086 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20210716 */ +GSM: 7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278 + /* 20210528 */ BasePlus: A321A4BC54D444B82575EC5D443553A096557AD69DC171D578A330277E67637A DFA: 22AB51B85E3344B8C0FB7AF164247881B656F5CBA88BBA974AD8BC41ED79327F diff --git a/packages/gsm.md b/packages/gsm.md new file mode 100644 index 0000000..34d8f48 --- /dev/null +++ b/packages/gsm.md @@ -0,0 +1,251 @@ +- [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.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. + + +*How to use it:* + - Copy all files with your macros into a directory. + Best approach is to have one file for one macro. + - Copy a path 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. + +--- + +Package contains: + 1. macro gsm + 2. macro gsmpck_makefcmpcode + +Required SAS Components: + `Base SAS Software` + +* SAS package generated by generatePackage, version 20210528 * + +The SHA256 hash digest for package BasePlus: +`7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278` + + +## >>> `%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 +as encrypted code which allow to share the macros +without showing their code. + +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=> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `path` - *Required*, indicates a directory which contains files with macros. + Only files with `sas` extension are used. + +* `trim=` - *Optional*, the default value is `0`. + If set to `1` then lines of macro code are trimmed. + If set to `2` then lines of macro code are stripped. + +* `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. + +--- + + +### 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 + <,trim=0> + <,outlib=work.generateMacros.secure> + <,source2=> + <,fileNameCode=FNC> +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**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. + +* `trim=` - *Optional*, the default value is `0`. + If set to `1` then lines of macro code are trimmed. + If set to `2` then lines of macro code are stripped. + +* `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. + +--- + + +## License #################################################################### + +Copyright (c) 2021 Bartosz Jablonski + +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. + +--- \ No newline at end of file diff --git a/packages/gsm.zip b/packages/gsm.zip new file mode 100644 index 0000000000000000000000000000000000000000..bbb98e97ffeae30a4bcd5178653ec14efd32f410 GIT binary patch literal 14239 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 literal 0 HcmV?d00001 From 2ce8a834998e13a34576654d1d7070fb08ff0c8d Mon Sep 17 00:00:00 2001 From: yabwon Date: Mon, 19 Jul 2021 12:58:52 +0200 Subject: [PATCH 2/2] **GSM** (Generate Secure Macros) package, version 0.11 **GSM** (Generate Secure Macros) package, version 0.11 The Package allows 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. --- README.md | 4 ++-- packages/README.md | 4 ++-- packages/SHA256_for_packages.txt | 3 +++ packages/gsm.md | 4 ++-- packages/gsm.zip | Bin 14239 -> 14824 bytes 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 70e5313..d776c37 100644 --- a/README.md +++ b/README.md @@ -162,12 +162,12 @@ SHA256 digest for BasePlus: A321A4BC54D444B82575EC5D443553A096557AD69DC171D578A3 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") -- **GSM** (Generate Secure Macros)\[0.1\], package allows +- **GSM** (Generate Secure Macros)\[0.11\], package allows 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 GSM: 7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278 +SHA256 digest for GSM: 4322D79C382B9D58EF5E51AFD0856331F8B38B1B35AC21295DADFC43F81B2AF8 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") diff --git a/packages/README.md b/packages/README.md index 6d06263..8ffbdfc 100644 --- a/packages/README.md +++ b/packages/README.md @@ -110,12 +110,12 @@ SHA256 digest for BasePlus: A321A4BC54D444B82575EC5D443553A096557AD69DC171D578A3 --- -- **GSM** (Generate Secure Macros)\[0.1\], package allows +- **GSM** (Generate Secure Macros)\[0.11\], package allows 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 GSM: 7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278 +SHA256 digest for GSM: 4322D79C382B9D58EF5E51AFD0856331F8B38B1B35AC21295DADFC43F81B2AF8 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 587f086..8cb9dbc 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20210719 */ +GSM: 4322D79C382B9D58EF5E51AFD0856331F8B38B1B35AC21295DADFC43F81B2AF8 + /* 20210716 */ GSM: 7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278 diff --git a/packages/gsm.md b/packages/gsm.md index 34d8f48..dbe6a06 100644 --- a/packages/gsm.md +++ b/packages/gsm.md @@ -8,7 +8,7 @@ --- -# The GSM package [ver. 0.1] ############################################### +# The GSM package [ver. 0.11] ############################################### The **GSM** (a.k.a. *Generate Secure Macros*) package allows to create secured macros stored in SAS Proc FCMP functions. @@ -68,7 +68,7 @@ Required SAS Components: * SAS package generated by generatePackage, version 20210528 * The SHA256 hash digest for package BasePlus: -`7134C8672023972BA0D5D5CE1E611F0DBB5F60ADAE847BC59C94FF7E2BEC0278` +`4322D79C382B9D58EF5E51AFD0856331F8B38B1B35AC21295DADFC43F81B2AF8` ## >>> `%GSM()` macro: <<< ####################### diff --git a/packages/gsm.zip b/packages/gsm.zip index bbb98e97ffeae30a4bcd5178653ec14efd32f410..f7e6fde8bf3c2bd095a5564a7596d33eca120ee4 100644 GIT binary patch delta 10786 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