se adiciona experimental/facho-wasm para crear wasm de firmado para facturacion electronica
FossilOrigin-Name: f5823c4b16ec6f81eaf92676dfe4a2bee3edc150ce3485ffcd8732c2c4284e5b
This commit is contained in:
		
							
								
								
									
										6
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| # ejemplo | ||||
|  | ||||
| ~~~ | ||||
| $ bash build.sh | ||||
| $ wasirun ./a.out sign1-tmpl.xml example.key | ||||
| ~~~ | ||||
							
								
								
									
										12
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/build.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/build.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| cp ../vendor/openssl/lib/*.a . | ||||
| cp ../xmlsec1-1.2.33/src/.libs/*.a . | ||||
| cp ../xmlsec1-1.2.33/src/openssl/.libs/*.a . | ||||
| cp ../libxml2/.libs/libxml2.a . | ||||
|  | ||||
| mkdir -p include | ||||
|  | ||||
| cp -r ../libxml2/include/libxml include/ | ||||
| cp -r ../xmlsec1-1.2.33/include/xmlsec include/ | ||||
| cp -r ../vendor/openssl/include/* include/ | ||||
|  | ||||
| wasicc -Iinclude libxml2.a libcrypto.a libssl.a libxmlsec1.a libxmlsec1-openssl.a sign.c  | ||||
							
								
								
									
										216
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/sign.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/sign.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| /**  | ||||
|  * XML Security Library example: Signing a template file. | ||||
|  *  | ||||
|  * Signs a template file using a key from PEM file | ||||
|  *  | ||||
|  * Usage:  | ||||
|  *      ./sign1 <xml-tmpl> <pem-key>  | ||||
|  * | ||||
|  * Example: | ||||
|  *      ./sign1 sign1-tmpl.xml rsakey.pem > sign1-res.xml | ||||
|  * | ||||
|  * The result signature could be validated using verify1 example: | ||||
|  *      ./verify1 sign1-res.xml rsapub.pem | ||||
|  * | ||||
|  * This is free software; see Copyright file in the source | ||||
|  * distribution for preciese wording. | ||||
|  *  | ||||
|  * Copyright (C) 2002-2016 Aleksey Sanin <aleksey@aleksey.com>. All Rights Reserved. | ||||
|  */ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <assert.h> | ||||
|  | ||||
| #include <libxml/tree.h> | ||||
| #include <libxml/xmlmemory.h> | ||||
| #include <libxml/parser.h> | ||||
|  | ||||
| #define XMLSEC_NO_XSLT | ||||
| #define XMLSEC_CRYPTO_OPENSSL | ||||
|  | ||||
| #ifndef XMLSEC_NO_XSLT | ||||
| #include <libxslt/xslt.h> | ||||
| #include <libxslt/security.h> | ||||
| #endif /* XMLSEC_NO_XSLT */ | ||||
|  | ||||
| #include <xmlsec/xmlsec.h> | ||||
| #include <xmlsec/xmltree.h> | ||||
| #include <xmlsec/xmldsig.h> | ||||
| #include <xmlsec/crypto.h> | ||||
|  | ||||
| int sign_file(const char* tmpl_file, const char* key_file); | ||||
|  | ||||
| int  | ||||
| main(int argc, char **argv) { | ||||
| #ifndef XMLSEC_NO_XSLT | ||||
|     xsltSecurityPrefsPtr xsltSecPrefs = NULL; | ||||
| #endif /* XMLSEC_NO_XSLT */ | ||||
| 	setenv("RANDFILE", "/dev/random", 1); | ||||
|     assert(argv); | ||||
|  | ||||
|     if(argc != 3) { | ||||
|         fprintf(stderr, "Error: wrong number of arguments.\n"); | ||||
|         fprintf(stderr, "Usage: %s <tmpl-file> <key-file>\n", argv[0]); | ||||
|         return(1); | ||||
|     } | ||||
|  | ||||
|     printf("template %s key %s\n", argv[1], argv[2]); | ||||
|     /* Init libxml and libxslt libraries */ | ||||
|     xmlInitParser(); | ||||
|     LIBXML_TEST_VERSION | ||||
|     xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; | ||||
|     xmlSubstituteEntitiesDefault(1); | ||||
| #ifndef XMLSEC_NO_XSLT | ||||
|     xmlIndentTreeOutput = 1;  | ||||
| #endif /* XMLSEC_NO_XSLT */ | ||||
|  | ||||
|     /* Init libxslt */ | ||||
| #ifndef XMLSEC_NO_XSLT | ||||
|     /* disable everything */ | ||||
|     xsltSecPrefs = xsltNewSecurityPrefs();  | ||||
|     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_READ_FILE,        xsltSecurityForbid); | ||||
|     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_WRITE_FILE,       xsltSecurityForbid); | ||||
|     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_CREATE_DIRECTORY, xsltSecurityForbid); | ||||
|     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_READ_NETWORK,     xsltSecurityForbid); | ||||
|     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_WRITE_NETWORK,    xsltSecurityForbid); | ||||
|     xsltSetDefaultSecurityPrefs(xsltSecPrefs);  | ||||
| #endif /* XMLSEC_NO_XSLT */                 | ||||
|  | ||||
|     /* Init xmlsec library */ | ||||
|     if(xmlSecInit() < 0) { | ||||
|         fprintf(stderr, "Error: xmlsec initialization failed.\n"); | ||||
|         return(-1); | ||||
|     } | ||||
| 	puts("done xmlSecInit"); | ||||
|  | ||||
|     /* Check loaded library version */ | ||||
|     if(xmlSecCheckVersion() != 1) { | ||||
|         fprintf(stderr, "Error: loaded xmlsec library version is not compatible.\n"); | ||||
|         return(-1); | ||||
|     } | ||||
| 	puts("done xmlSecCheckVersion"); | ||||
|     /* Load default crypto engine if we are supporting dynamic | ||||
|      * loading for xmlsec-crypto libraries. Use the crypto library | ||||
|      * name ("openssl", "nss", etc.) to load corresponding  | ||||
|      * xmlsec-crypto library. | ||||
|      */ | ||||
| #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING | ||||
|     if(xmlSecCryptoDLLoadLibrary(NULL) < 0) { | ||||
|         fprintf(stderr, "Error: unable to load default xmlsec-crypto library. Make sure\n" | ||||
|                         "that you have it installed and check shared libraries path\n" | ||||
|                         "(LD_LIBRARY_PATH and/or LTDL_LIBRARY_PATH) environment variables.\n"); | ||||
|         return(-1);      | ||||
|     } | ||||
| #endif /* XMLSEC_CRYPTO_DYNAMIC_LOADING */ | ||||
|  | ||||
|     /* Init crypto library */ | ||||
|     if(xmlSecCryptoAppInit(NULL) < 0) { | ||||
|         fprintf(stderr, "Error: crypto initialization failed.\n"); | ||||
|         return(-1); | ||||
|     } | ||||
| puts("done xmlSecCryptoAppInit"); | ||||
|     /* Init xmlsec-crypto library */ | ||||
|     if(xmlSecCryptoInit() < 0) { | ||||
|         fprintf(stderr, "Error: xmlsec-crypto initialization failed.\n"); | ||||
|         return(-1); | ||||
|     } | ||||
| puts("done xmlSecCryptoInit"); | ||||
|     if(sign_file(argv[1], argv[2]) < 0) { | ||||
|         return(-1); | ||||
|     }     | ||||
|      | ||||
|     /* Shutdown xmlsec-crypto library */ | ||||
|     xmlSecCryptoShutdown(); | ||||
|      | ||||
|     /* Shutdown crypto library */ | ||||
|     xmlSecCryptoAppShutdown(); | ||||
|      | ||||
|     /* Shutdown xmlsec library */ | ||||
|     xmlSecShutdown(); | ||||
|  | ||||
|     /* Shutdown libxslt/libxml */ | ||||
| #ifndef XMLSEC_NO_XSLT | ||||
|     xsltFreeSecurityPrefs(xsltSecPrefs); | ||||
|     xsltCleanupGlobals(); | ||||
| #endif /* XMLSEC_NO_XSLT */ | ||||
|     xmlCleanupParser(); | ||||
|      | ||||
|     return(0); | ||||
| } | ||||
|  | ||||
| /**  | ||||
|  * sign_file: | ||||
|  * @tmpl_file:          the signature template file name. | ||||
|  * @key_file:           the PEM private key file name. | ||||
|  * | ||||
|  * Signs the #tmpl_file using private key from #key_file. | ||||
|  * | ||||
|  * Returns 0 on success or a negative value if an error occurs. | ||||
|  */ | ||||
| int  | ||||
| sign_file(const char* tmpl_file, const char* key_file) { | ||||
|     xmlDocPtr doc = NULL; | ||||
|     xmlNodePtr node = NULL; | ||||
|     xmlSecDSigCtxPtr dsigCtx = NULL; | ||||
|     int res = -1; | ||||
|      | ||||
|     assert(tmpl_file); | ||||
|     assert(key_file); | ||||
|  | ||||
|     /* load template */ | ||||
|     doc = xmlParseFile(tmpl_file); | ||||
|     if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL)){ | ||||
|         fprintf(stderr, "Error: unable to parse file \"%s\"\n", tmpl_file); | ||||
|         goto done;       | ||||
|     } | ||||
|      | ||||
|     /* find start node */ | ||||
|     node = xmlSecFindNode(xmlDocGetRootElement(doc), xmlSecNodeSignature, xmlSecDSigNs); | ||||
|     if(node == NULL) { | ||||
|         fprintf(stderr, "Error: start node not found in \"%s\"\n", tmpl_file); | ||||
|         goto done;       | ||||
|     } | ||||
|  | ||||
|     /* create signature context, we don't need keys manager in this example */ | ||||
|     dsigCtx = xmlSecDSigCtxCreate(NULL); | ||||
|     if(dsigCtx == NULL) { | ||||
|         fprintf(stderr,"Error: failed to create signature context\n"); | ||||
|         goto done; | ||||
|     } | ||||
|  | ||||
|     /* load private key, assuming that there is not password */ | ||||
|     dsigCtx->signKey = xmlSecCryptoAppKeyLoad(key_file, xmlSecKeyDataFormatPem, NULL, NULL, NULL); | ||||
|     if(dsigCtx->signKey == NULL) { | ||||
|         fprintf(stderr,"Error: failed to load private pem key from \"%s\"\n", key_file); | ||||
|         goto done; | ||||
|     } | ||||
|  | ||||
|     /* set key name to the file name, this is just an example! */ | ||||
|     if(xmlSecKeySetName(dsigCtx->signKey, key_file) < 0) { | ||||
|         fprintf(stderr,"Error: failed to set key name for key from \"%s\"\n", key_file); | ||||
|         goto done; | ||||
|     } | ||||
|  | ||||
|     /* sign the template */ | ||||
|     if(xmlSecDSigCtxSign(dsigCtx, node) < 0) { | ||||
|         fprintf(stderr,"Error: signature failed\n"); | ||||
|         goto done; | ||||
|     } | ||||
|          | ||||
|     /* print signed document to stdout */ | ||||
|     xmlDocDump(stdout, doc); | ||||
|      | ||||
|     /* success */ | ||||
|     res = 0; | ||||
|  | ||||
| done:     | ||||
|     /* cleanup */ | ||||
|     if(dsigCtx != NULL) { | ||||
|         xmlSecDSigCtxDestroy(dsigCtx); | ||||
|     } | ||||
|      | ||||
|     if(doc != NULL) { | ||||
|         xmlFreeDoc(doc);  | ||||
|     } | ||||
|     return(res); | ||||
| } | ||||
							
								
								
									
										27
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/sign1-tmpl.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								experimental/facho-wasm/xmlsec-wasm/examples/sign1-tmpl.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!--  | ||||
| XML Security Library example: Simple signature template file for sign1 example.  | ||||
| --> | ||||
| <Envelope xmlns="urn:envelope"> | ||||
|   <Data> | ||||
| 	Hello, World! | ||||
|   </Data> | ||||
|   <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> | ||||
|     <SignedInfo> | ||||
|       <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> | ||||
|       <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> | ||||
|       <Reference URI=""> | ||||
|         <Transforms> | ||||
|           <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> | ||||
|         </Transforms> | ||||
|         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> | ||||
|         <DigestValue></DigestValue> | ||||
|       </Reference> | ||||
|     </SignedInfo> | ||||
|     <SignatureValue/> | ||||
|     <KeyInfo> | ||||
| 	<KeyName/> | ||||
|     </KeyInfo> | ||||
|   </Signature> | ||||
| </Envelope> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user