Encapsulate binary file into a BIM
|
|
Type: | Programming |
Rating: | 3 (intermediate) |
Description: | The 'bpack' tool encapsulates a user-specified binary file into a BIM file using the 'datablock' functionality. The binary file gets extracted into the working directory when running the resulting BIM file. The model can be deployed as an executable (requires a C compiler): mosel comp bpack.mos -o deploy.exe:bpack bpack name_of_file_to_includeor run as a standard Mosel model, e.g. from the command line: mosel bpack.mos F=name_of_file_to_includeThe name of the binary file to be included needs to be specified via a runtime parameter. A file myfile.extension will result in the creation of a BIM file named myfile_extension.bim from which the original binary file is extracted when running the BIM, e.g via the command mosel run myfile_extension.bim |
File(s): | bpack.mos |
|
bpack.mos |
(!****************************************************** Mosel Example Problems ====================== file bpack.mos `````````````` Encapsulate any kind of binary file into a .bim file. The binary gets extracted when running the resulting .bim file. - Using the 'datablock' functionality - Compilation into an executable (requires a C compiler): mosel comp bpack.mos -o deploy.exe:bpack Usage: bpack mybinaryfile.ext (results in a file mybinaryfile_ext.bim) mosel run mybinaryfile_ext.bim (to extract the original binary file from the .bim) Usage without generation of an executable: mosel bpack.mos F=mybinaryfile.ext (c) 2019 Fair Isaac Corporation author: Y. Colombani, 25 Apr 2019 *******************************************************!) model bpack version 0.1.0 uses 'mmsystem','deploy','mmjobs' parameters F="" !@doc.descr Name of binary file to be encapsulated end-parameters public declarations !@doc.descr Source of the model file used for the generation of a .bim that contains the specified binary file SRC=` model bextract uses 'mmsystem' include "mem:srcfile" write("Extract '",F,"' ?[Y/n] ");fflush a:="Y" readln(a) if a.size>=1 and (getchar(a,1)=89 or getchar(a,1)=121) then if getfstat(F)<>0 then write("File already exists: overwrite it?[y/N] ");fflush a:="N" readln(a) if a.size<1 or (getchar(a,1)<>89 and getchar(a,1)<>121) then writeln("Operation aborted.") exit(1) end-if else fcopy(datablock(FSRC),F_BINARY,F,F_BINARY) exit(getsysstat) end-if else writeln("Operation aborted.") exit(0) end-if end-model ` end-declarations declarations ! Internal subroutines procedure banner ! Display a banner procedure showhelp ! Display help text function basename(f:text):text ! Aux. routine returning basename function build_kls:text ! Build KLS parameter procedure readkeys(f:string) ! Read public keys from a file fname:text ! Name of binary file to encapsulate flags:text ! Compilation flags kls:list of text ! List of public keys pke:text ! Private key (for signing) pass:text ! Encryption password silent:boolean ! Whether to report activity force:boolean ! Whether to overwrite existing files end-declarations ! Handling of run mode (Mosel model or executable) and runtime parameters if argc=1 and argv(1)="mosel" then ! Not deployed: use parameter fname:=F elif argc=1 then banner showhelp exit(0) else a:=2 repeat if argv(a)="-V" then banner exit(0) elif argv(a)="-s" then silent:=true elif argv(a)="-f" then force:=true elif argv(a)="-S" then flags+="-S" elif argv(a)="-E" then flags+="-E" elif argv(a)="-T" then flags+="-T" elif argv(a)="-k" then if a<argc then a+=1 kls+=[text(argv(a))] end-if elif argv(a)="-kf" then if a<argc then a+=1 readkeys(argv(a)) end-if elif argv(a)="-pwd" then if a<argc then a+=1 pass:=argv(a) end-if elif argv(a)="-pk" then if a<argc then a+=1 pke:=argv(a) end-if else break end-if a+=1 until a>argc if a<>argc or getchar(argv(a),1)=45 then banner showhelp exit(1) else fname:=argv(a) end-if end-if ! Remove leading or trailing blanks from input filename trim(fname) if fname.size=0 or bittest(getfstat(fname),SYS_TYP)<>SYS_REG then if not silent then writeln("File '",fname,"' not found or invalid") end-if exit(1) else if getfsize(fname)=0 and not silent then writeln("Warning: file '",fname,"' is empty") end-if dst:=pathsplit(SYS_FNAME,fname) ! Write binary file contents into an 'include' file for the generated model fopen("mem:srcfile",F_OUTPUT) writeln("declarations\nFSRC='",fname,"'\nF='",dst,"'\nend-declarations\n") fclose(F_OUTPUT) ! Create the Mosel model file name from the original filename asproc(regreplace(dst,'\.','_')) dst+=".bim" ! Check whether it is acceptable to overwrite an existing file if getfstat(dst)<>0 and not force then if silent then exit(2) else write("File '",dst,"' already exists.: overwrite it?[y/N] ");fflush ans:="N" readln(ans) if ans.size<1 or (getchar(ans,1)<>89 and getchar(ans,1)<>121) then writeln("Operation aborted.") exit(1) end-if end-if end-if ! Compile the resulting generated model if compile(flags,"text:SRC",dst,"Produced by BPACK "+getparam("model_version"),pass,pke,build_kls)<>0 then if not silent then writeln("Compilation failed. Aborting") end-if exit(1) elif not silent then writeln("File recorded in '",dst,"'. Execute the following to restore it:") writeln(" mosel run ",dst) if findtext(flags,"S",1)>0 then if pke.size>0 then writeln("The file is signed with the private key '",pke,"'.") else writeln("The file is signed with your personal private key.") end-if end-if if findtext(flags,"E",1)>0 then if pass.size>0 then writeln("The file is encrypted using password '",pass,"'.") elif kls.size>0 then writeln("The file is encrypted using the following public keys: ",kls,".") else writeln("The file is encrypted using your personal public key.") end-if end-if end-if end-if !*********************** !* Display Banner !*********************** procedure banner writeln("FICO Xpress ",basename(argv(1))," v",getparam("model_version")) writeln("(c) Copyright Fair Isaac Corporation 2019. All rights reserved") writeln(_("Link date"),": ",getparam("parser_date")," ",getparam("parser_time")) end-procedure !*********************** !* Display some help !*********************** procedure showhelp writeln_("\nUsage: ",argv(1)," -V|[-s] [-f] [-S] [-E] [-k key] [-kf kfile] [-pwd pass] filename\n") write_(` -V: display banner and exit -s: silent mode -f: overwrite existing file -S: sign the generated bim file -E: encrypt the generated bim file -k key: add public key 'k' for encryption -kf kfile: add public keys from file 'kfile' for encryption -pwd pass: use 'pass' for encryption -pk priv: use 'priv' key for signing By default a bim file including the provided file is created. The provided file can be extracted by running the resulting bim file. `) end-procedure !********************************************************************** !* Extract the basename of a path (i.e. strip directory and extension) !********************************************************************** function basename(f:text):text returned:=pathsplit(SYS_FNAME,f) asproc(pathsplit(SYS_EXTN,returned,returned)) end-function !******************************************** !* Produce the kls file from a list of texts !******************************************** function build_kls:text if kls.size>0 then returned:="mem:pkeys" fopen(returned,F_APPEND) forall(k in kls) writeln(k) fclose(F_OUTPUT) end-if end-function !****************************** !* Get public keys from a file !****************************** procedure readkeys(f:string) declarations l:text end-declarations fopen(f,F_INPUT) while(readtextline(l)>0) do trim(l) if l.size>0 and getchar(l,1)<>35 then kls+=[text(l)] end-if end-do fclose(F_INPUT) end-procedure end-model |
© 2001-2019 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.