Recent

Author Topic: Ejemplo, Ayuda con Impresora Fiscal AFIP  (Read 5387 times)

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Ejemplo, Ayuda con Impresora Fiscal AFIP
« on: September 11, 2021, 10:21:27 pm »
Hola compañeros estoy con la necesidad de implementar un modulo de facturación para impresoras fiscales, en el caso de argentina seria el vinculo con la AFIP, la cual tengo entendido brinda los accesos web para vincular con nuestros sistemas y poder tanto: generar facturas digitales como el uso de impresoras fiscales como puntos de venta...  Perdón si me equivoco en algunos términos, ya que solo "toco de oido" como se dice aquí, Nunca he usado estos sistemas y por eso acudo a uds. para q me puedan guiar y mejor aun si me pueden dar un ejemplo concreto en lazarus, para poder realizar esta tarea.

En otros sistemas (IDEs) de programación esta super implementado, pero yo sigo usando nuestro querido lazarus, y quiero darle la posibilidad, solo necesito una guía!

desde ya Muchísimas Gracias!
« Last Edit: August 02, 2022, 01:16:00 am by daragor »
Inculcando el software libre.
https://www.webscom.com.ar

Edson

  • Hero Member
  • *****
  • Posts: 1302
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #1 on: September 12, 2021, 05:01:03 am »
Hola. Tendrías que conocer primero los requerimientos de acceso (URL, protocolo, usuario, ... ) que necesitas implementar para generar facturas digitales.

A partir de allí podrías implementarlo en Lazarus, usando las librerías necesarias.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2770
    • havefunsoft.com
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #2 on: September 12, 2021, 08:54:00 pm »
En otros sistemas (IDEs) de programación esta super implementado, pero yo sigo usando nuestro querido lazarus, y quiero darle la posibilidad, solo necesito un guía!
es probable que tenga la misma complejidad.

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #3 on: September 12, 2021, 10:50:16 pm »
Hola @daragor el mes pasado alguien lo intentó, fijate en este hilo https://forum.lazarus.freepascal.org/index.php/topic,55130.0.html

Saludos.
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #4 on: September 13, 2021, 02:46:32 am »
Mm estamos lejos, hola muchahos, dejo aqui alguna info que voy recopilando por otros foros:

Esta es una web importante con los webservices:
http://wswhomo.afip.gov.ar/wsfev1/service.asmx

Manuales de Afip para facturacion electronica:
https://servicioscf.afip.gob.ar/facturadecreditoelectronica/ayuda/manuales.asp

Manual, no se si es actual pero creo q si:
https://www.afip.gob.ar/ws/WSAA/WSAAmanualDev.pdf

Mas links de interes:
Especificación Técnica del WebService de Autenticación y Autorización (WSAA):
http://www.afip.gob.ar/ws/WSAA/Especificacion_Tecnica_WSAA_1.2.2.pdf
Manual del Usuario del WSASS:
http://www.afip.gob.ar/ws/WSASS/WSASS_manual.pdf
Ejemplos open source de clientes del WSAA (PHP, Java, .NET, PowerShell):
http://www.afip.gob.ar/ws/documentacion/wsaa.asp

Un par de videos que dicen son buenos!
Parte 1: https://www.youtube.com/watch?v=6tu4QJVbDtI
Parte 2: https://www.youtube.com/watch?v=v6r4D3Ljuy8

La seguimos, saludos
Inculcando el software libre.
https://www.webscom.com.ar

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2770
    • havefunsoft.com
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #5 on: September 13, 2021, 05:32:57 pm »
el servicio de inicio de sesión viene con la interfaz WSDL. Es útil ya que puede generar el código necesario automáticamente.
Puede utilizar Web Service Toolkit para eso

Debería ser tan fácil como simplemente apuntar la herramienta a https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl


https://github.com/Xor-el/CryptoLib4Pascal
esta biblioteca debería ayudarlo con la firma de certificados

« Last Edit: September 13, 2021, 05:34:38 pm by skalogryz »

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #6 on: September 14, 2021, 02:00:43 am »
Gracias por responder skalogryz, creo q es muy bueno el aporte, ahora si seria ideal contar con algun ejemplo de uso mas allá de la wiki, pero vemos viendo quien se anima, yo en eso soy muy novato nunca use.  %)
Inculcando el software libre.
https://www.webscom.com.ar

Dperdi

  • New member
  • *
  • Posts: 7
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #7 on: June 05, 2022, 06:15:53 pm »
Estimado daragor.
Recién descubro este post y este foro.
En principio te cuento que estoy queriendo desembarcar y convertir mi código de delphi 2007 a lazarus y para ello lo primero es convertir algunos componentes de mi propia creación y luego pasar el código principal.
Quizá hasta aquí no te diga mucho pero es que parte de mi código principal son dos módulos uno de facturación electrónica que está perfectamente funcionando y del cual podría compartirte experiencia y allanarte el camino si vos estuvieras dispuesto también a colaborarme en la conversión de mis componentes a este entorno.
Saludos
Darío

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #8 on: June 11, 2022, 01:43:57 am »
Hola Dperdi, bienvenido. Si claro, estamos para ayudarnos.
Inculcando el software libre.
https://www.webscom.com.ar


ocloma

  • New Member
  • *
  • Posts: 11
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #10 on: July 28, 2022, 04:12:34 pm »
Hola, cual es tu duda? yo implemente la facturacion electronica en freepascal hace varios años para la empresa donde trabajo.
Es sobre la generacion del WSAA? En caso que esta sea tu duda , la clave es escribir en formato S/MIME el mensaje que ya fue firmado con PKCS7_sign(), con la funcion SMIME_write_PKCS7(),  pero esta funcion no esta disponible en la libreria openssl de lazarus, tenes que enlazarla por tu cuenta.
« Last Edit: July 28, 2022, 04:52:36 pm by ocloma »

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #11 on: July 28, 2022, 05:05:23 pm »
Hola ocloma! buenísimo.. yo en mi caso, como dije en el primer post, me gustaria recibir un ejemplo, un codigo, una pequeña app que gestione una impresora fiscal a modo de ejemplo base para poder implementarlo en algunos sistemas lazarus..
Inculcando el software libre.
https://www.webscom.com.ar

lainz

  • Hero Member
  • *****
  • Posts: 4468
    • https://lainz.github.io/
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #12 on: July 28, 2022, 06:10:50 pm »
Algo que noté en este hilo es que se confunde lo que es una impresora fiscal con el webservice de afip, son dos cosas distintas.

Para una impresora fiscal, necesitas implementar segun el manual de la impresora fiscal.

Para el webservice de afip, como comentaron mas arriba.

ocloma

  • New Member
  • *
  • Posts: 11
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #13 on: July 28, 2022, 07:32:51 pm »
Asi es , entendi que aqui estamos hablando particularmente del servicios de factura electronica de AFIP. Impresora fiscal es otro tema.
Hay dos servicios por separado, uno es el WSAA, que es el mas complejo y otro es el webservice en si mismo WSFE. El WSFE es el mas sencillo , ya que se puede importar el wsdl para generar las clases desde el paquete 'Web Service Tools' que se instala desde el administrador de paquetes online de Lazarus como mencionaron anteriormente. Para el WSAA, en mi caso lo tuve que implementar directamente utilizando las librerias de XML de Freepascal y OpenSSL, pero tambien se puede firmar el paquete desde las herramientas de linea de comandos que vienen con openssl.
« Last Edit: July 28, 2022, 07:37:56 pm by ocloma »

ocloma

  • New Member
  • *
  • Posts: 11
Re: Ejemplo, Ayuda con Impresora Fiscal AFIP
« Reply #14 on: July 28, 2022, 08:15:57 pm »
Unidad para enlazar las funciones necesarias para OpenSSL (son las funciones que no se encuentran todavia enlazadas en la libreria openssl de freepascal 3.2.2):

Code: Pascal  [Select][+][-]
  1. unit UtilOpenSSL;
  2.  
  3. {$MODE DELPHI}{$H+}
  4. {$Packrecords C}
  5.  
  6. interface
  7.  
  8. uses
  9.   Classes, SysUtils;
  10.  
  11. const
  12.  
  13.   // PADDING constants
  14.   RSA_PKCS1_PADDING = 1;
  15.   RSA_SSLV23_PADDING = 2;
  16.   RSA_NO_PADDING = 3;
  17.   RSA_PKCS1_OAEP_PADDING = 4;
  18.  
  19.   // ASN1 type constants
  20.   NID_undef = 0;
  21.   NID_rsaEncryption = 6;
  22.   NID_pkcs7_signed = 22;
  23.   NID_pkcs7_signedAndEnveloped = 24;
  24.   NID_basic_constraints = 87;
  25.   NID_subject_alt_name = 85;
  26.  
  27.   V_ASN1_INTEGER = $02;
  28.   V_ASN1_ENUMERATED = 10;
  29.   V_ASN1_NEG_INTEGER = $102;
  30.   V_ASN1_UTCTIME = 23;
  31.   V_ASN1_GENERALIZEDTIME = 24;
  32.   V_ASN1_CONTEXT_SPECIFIC = $80;
  33.  
  34.   B_ASN1_NUMERICSTRING = $0001;
  35.   B_ASN1_PRINTABLESTRING = $0002;
  36.   B_ASN1_T61STRING = $0004;
  37.   B_ASN1_TELETEXSTRING = $0008;
  38.   B_ASN1_VIDEOTEXSTRING = $0008;
  39.   B_ASN1_IA5STRING = $0010;
  40.   B_ASN1_GRAPHICSTRING = $0020;
  41.   B_ASN1_ISO64STRING = $0040;
  42.   B_ASN1_VISIBLESTRING = $0040;
  43.   B_ASN1_GENERALSTRING = $0080;
  44.   B_ASN1_UNIVERSALSTRING = $0100;
  45.   B_ASN1_OCTET_STRING = $0200;
  46.   B_ASN1_BIT_STRING = $0400;
  47.   B_ASN1_BMPSTRING = $0800;
  48.   B_ASN1_UNKNOWN = $1000;
  49.   B_ASN1_UTF8STRING = $2000;
  50.  
  51.   MBSTRING_FLAG = $1000;
  52.   MBSTRING_ASC = MBSTRING_FLAG or 1;
  53.   MBSTRING_BMP = MBSTRING_FLAG or 2;
  54.   MBSTRING_UNIV = MBSTRING_FLAG or 3;
  55.   MBSTRING_UTF8 = MBSTRING_FLAG or 4;
  56.  
  57.   // These are the 'types' of BIOs
  58.   BIO_TYPE_NONE = $0000;
  59.   BIO_TYPE_MEM = $0001 or $0400;
  60.   BIO_TYPE_FILE = $0002 or $0400;
  61.  
  62.   BIO_TYPE_FD = $0004 or $0400 or $0100;
  63.   BIO_TYPE_SOCKET = $0005 or $0400 or $0100;
  64.   BIO_TYPE_NULL = $0006 or $0400;
  65.   BIO_TYPE_SSL = $0007 or $0200;
  66.   BIO_TYPE_MD = $0008 or $0200;  // passive filter
  67.   BIO_TYPE_BUFFER = $0009 or $0200;  // filter
  68.   BIO_TYPE_CIPHER = $00010 or $0200;  // filter
  69.   BIO_TYPE_BASE64 = $00011 or $0200;  // filter
  70.   BIO_TYPE_CONNECT = $00012 or $0400 or $0100;  // socket - connect
  71.   BIO_TYPE_ACCEPT = $00013 or $0400 or $0100;  // socket for accept
  72.   BIO_TYPE_PROXY_CLIENT = $00014 or $0200;  // client proxy BIO
  73.   BIO_TYPE_PROXY_SERVER = $00015 or $0200;  // server proxy BIO
  74.   BIO_TYPE_NBIO_TEST = $00016 or $0200;  // server proxy BIO
  75.   BIO_TYPE_NULL_FILTER = $00017 or $0200;
  76.   BIO_TYPE_BER = $00018 or $0200;  // BER -> bin filter
  77.   BIO_TYPE_BIO = $00019 or $0400;  // (half a; BIO pair
  78.   BIO_TYPE_LINEBUFFER = $00020 or $0200;  // filter
  79.  
  80.   BIO_TYPE_DESCRIPTOR = $0100;  // socket, fd, connect or accept
  81.   BIO_TYPE_FILTER = $0200;
  82.   BIO_TYPE_SOURCE_SINK = $0400;
  83.  
  84.   // BIO ops constants
  85.   // BIO_FILENAME_READ|BIO_CLOSE to open or close on free.
  86.   // BIO_set_fp(in,stdin,BIO_NOCLOSE);
  87.   BIO_NOCLOSE = $00;
  88.   BIO_CLOSE = $01;
  89.   BIO_FP_READ = $02;
  90.   BIO_FP_WRITE = $04;
  91.   BIO_FP_APPEND = $08;
  92.   BIO_FP_TEXT = $10;
  93.  
  94.   BIO_C_SET_FILENAME = 108;
  95.   BIO_CTRL_RESET = 1;  // opt - rewind/zero etc
  96.   BIO_CTRL_EOF = 2;  // opt - are we at the eof
  97.   BIO_CTRL_INFO = 3;  // opt - extra tit-bits
  98.   BIO_CTRL_SET = 4;  // man - set the 'IO' type
  99.   BIO_CTRL_GET = 5;  // man - get the 'IO' type
  100.   BIO_CTRL_PUSH = 6;  // opt - internal, used to signify change
  101.   BIO_CTRL_POP = 7;  // opt - internal, used to signify change
  102.   BIO_CTRL_GET_CLOSE = 8;  // man - set the 'close' on free
  103.   BIO_CTRL_SET_CLOSE = 9;  // man - set the 'close' on free
  104.   BIO_CTRL_PENDING = 10;  // opt - is their more data buffered
  105.   BIO_CTRL_FLUSH = 11;  // opt - 'flush' buffered output
  106.   BIO_CTRL_DUP = 12;  // man - extra stuff for 'duped' BIO
  107.   BIO_CTRL_WPENDING = 13;  // opt - number of bytes still to write
  108.  
  109.   BIO_C_GET_MD_CTX = 120;
  110.  
  111.   BN_CTX_NUM = 16;
  112.   BN_CTX_NUM_POS = 12;
  113.  
  114.   // RSA key exponent
  115.   RSA_3: longint = $3;
  116.   RSA_F4: longint = $10001;
  117.  
  118.   FORMAT_UNDEF = 0;
  119.   FORMAT_ASN1 = 1;
  120.   FORMAT_TEXT = 2;
  121.   FORMAT_PEM = 3;
  122.   FORMAT_NETSCAPE = 4;
  123.   FORMAT_PKCS12 = 5;
  124.   FORMAT_SMIME = 6;
  125.   FORMAT_X509 = 509;
  126.  
  127.   PKCS7_TEXT = $001;
  128.   PKCS7_NOCERTS = $002;
  129.   PKCS7_NOSIGS = $004;
  130.   PKCS7_NOCHAIN = $008;
  131.   PKCS7_NOINTERN = $010;
  132.   PKCS7_NOVERIFY = $020;
  133.   PKCS7_DETACHED = $040;
  134.   PKCS7_BINARY = $080;
  135.   PKCS7_NOATTR = $100;
  136.   PKCS7_NOSMIMECAP = $200;
  137.   PKCS7_NOOLDMIMETYPE = $400;
  138.   PKCS7_CRLFEOL = $800;
  139.   PKCS7_STREAM = $1000;
  140.   PKCS7_NOCRL = $2000;
  141.   PKCS7_PARTIAL = $4000;
  142.   PKCS7_REUSE_DIGEST = $8000;
  143.  
  144.  
  145.  
  146.   X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT = 18;
  147.  
  148.   SHA_DIGEST_LENGTH = 20;
  149.  
  150.   EVP_MAX_MD_SIZE = 16 + 20;  // SSLv3 md5+sha1
  151.   EVP_PKEY_RSA = NID_rsaEncryption;
  152.  
  153.   EXFLAG_KUSAGE = $02;
  154.   EXFLAG_BCONS = $1;
  155.   EXFLAG_CA = $10;
  156.   EXFLAG_SS = $20;
  157.   EXFLAG_V1 = $40;
  158.   KU_KEY_CERT_SIGN = $0004;
  159.   V1_ROOT = EXFLAG_V1 or EXFLAG_SS;
  160.  
  161.   GEN_OTHERNAME = 0 or V_ASN1_CONTEXT_SPECIFIC;
  162.   GEN_EMAIL = 1 or V_ASN1_CONTEXT_SPECIFIC;
  163.   GEN_DNS = 2 or V_ASN1_CONTEXT_SPECIFIC;
  164.   GEN_X400 = 3 or V_ASN1_CONTEXT_SPECIFIC;
  165.   GEN_DIRNAME = 4 or V_ASN1_CONTEXT_SPECIFIC;
  166.   GEN_EDIPARTY = 5 or V_ASN1_CONTEXT_SPECIFIC;
  167.   GEN_URI = 6 or V_ASN1_CONTEXT_SPECIFIC;
  168.   GEN_IPADD = 7 or V_ASN1_CONTEXT_SPECIFIC;
  169.   GEN_RID = 8 or V_ASN1_CONTEXT_SPECIFIC;
  170.  
  171. type
  172.   PCharacter = PChar;
  173.   pSTACK = pointer;
  174.  
  175.   // ASN1 types
  176.   pASN1_OBJECT = pointer;
  177.   pASN1_STRING = ^ASN1_STRING;
  178.  
  179.   ASN1_STRING = record
  180.     length: integer;
  181.     asn1_type: integer;
  182.     Data: pointer;
  183.     flags: longint;
  184.   end;
  185.   pASN1_IA5STRING = pASN1_STRING;
  186.   pASN1_INTEGER = pASN1_STRING;
  187.   pASN1_ENUMERATED = pASN1_STRING;
  188.   pASN1_TIME = pASN1_STRING;
  189.   pASN1_OCTET_STRING = pASN1_STRING;
  190.  
  191.   pBN_ULONG = ^BN_ULONG;
  192.   BN_ULONG = array of byte;
  193.   pBIGNUM = ^BIGNUM;
  194.  
  195.   BIGNUM = record
  196.     d: pBN_ULONG;
  197.     top: integer;
  198.     dmax: integer;
  199.     neg: integer;
  200.     flags: integer;
  201.   end;
  202.  
  203.   pBN_CTX = ^BN_CTX;
  204.  
  205.   BN_CTX = record
  206.     tos: integer;
  207.     bn: array [0..BN_CTX_NUM - 1] of BIGNUM;
  208.     flags: integer;
  209.     depth: integer;
  210.     pos: array [0..BN_CTX_NUM_POS - 1] of integer;
  211.     too_many: integer;
  212.   end;
  213.  
  214.   pBN_BLINDING = ^BN_BLINDING;
  215.  
  216.   BN_BLINDING = record
  217.     init: integer;
  218.     A: pBIGNUM;
  219.     Ai: pBIGNUM;
  220.     _mod: pBIGNUM;
  221.   end;
  222.  
  223.   pBN_MONT_CTX = ^BN_MONT_CTX;
  224.  
  225.   BN_MONT_CTX = record
  226.     ri: integer;
  227.     RR: BIGNUM;
  228.     N: BIGNUM;
  229.     Ni: BIGNUM;
  230.     n0: BN_ULONG;
  231.     flags: integer;
  232.   end;
  233.  
  234.   pBN_RECP_CTX = ^BN_RECP_CTX;
  235.  
  236.   BN_RECP_CTX = record
  237.     N: BIGNUM;
  238.     Nr: BIGNUM;
  239.     num_bits: integer;
  240.     shift: integer;
  241.     flags: integer;
  242.   end;
  243.  
  244.   pX509_STORE_CTX = pointer;
  245.  
  246.   TPWCallbackFunction = function(buffer: PCharacter; length: integer; verify: integer; Data: pointer): integer; cdecl;
  247.   TCertificateVerifyFunction = function(ok: integer; ctx: pX509_STORE_CTX): integer; cdecl;
  248.  
  249.   pBIO = pointer;
  250.   pBIO_METHOD = pointer;
  251.   pBUF_MEM = pointer;
  252.  
  253.   des_cblock = array [0..7] of byte;
  254.  
  255.   MD2_CTX = record
  256.     num: integer;
  257.     Data: array [0..15] of byte;
  258.     cksm: array [0..15] of cardinal;
  259.     state: array [0..15] of cardinal;
  260.   end;
  261.  
  262.   MD4_CTX = record
  263.     A, B, C, D: cardinal;
  264.     Nl, Nh: cardinal;
  265.     Data: array [0..15] of cardinal;
  266.     num: integer;
  267.   end;
  268.  
  269.   MD5_CTX = record
  270.     A, B, C, D: cardinal;
  271.     Nl, Nh: cardinal;
  272.     Data: array [0..15] of cardinal;
  273.     num: integer;
  274.   end;
  275.  
  276.   RIPEMD160_CTX = record
  277.     A, B, C, D, E: cardinal;
  278.     Nl, Nh: cardinal;
  279.     Data: array [0..15] of cardinal;
  280.     num: integer;
  281.   end;
  282.  
  283.   SHA_CTX = record
  284.     h0, h1, h2, h3, h4: cardinal;
  285.     Nl, Nh: cardinal;
  286.     Data: array [0..16] of cardinal;
  287.     num: integer;
  288.   end;
  289.  
  290.   MDC2_CTX = record
  291.     num: integer;
  292.     Data: array [0..7] of byte;
  293.     h, hh: des_cblock;
  294.     pad_type: integer;
  295.   end;
  296.  
  297.   CRYPTO_EX_DATA = record
  298.     sk: pointer;
  299.     dummy: integer;
  300.   end;
  301.  
  302.   pAES_KEY = pointer;
  303.  
  304.   pRSA = pointer;
  305.   pRSA_METHOD = pointer;
  306.  
  307.   RSA = record
  308.     pad: integer;
  309.     version: integer;
  310.     meth: pRSA_METHOD;
  311.     n: pBIGNUM;
  312.     e: pBIGNUM;
  313.     d: pBIGNUM;
  314.     p: pBIGNUM;
  315.     q: pBIGNUM;
  316.     dmp1: pBIGNUM;
  317.     dmq1: pBIGNUM;
  318.     iqmp: pBIGNUM;
  319.     ex_data: CRYPTO_EX_DATA;
  320.     references: integer;
  321.     flags: integer;
  322.     _method_mod_n: pBN_MONT_CTX;
  323.     _method_mod_p: pBN_MONT_CTX;
  324.     _method_mod_q: pBN_MONT_CTX;
  325.     bignum_data: ^byte;
  326.     blinding: ^BN_BLINDING;
  327.   end;
  328.  
  329.   pDSA = ^DSA;
  330.  
  331.   DSA = record
  332.     pad: integer;
  333.     version: integer;
  334.     write_params: integer;
  335.     p: pointer;
  336.     q: pointer;
  337.     g: pointer;
  338.     pub_key: pointer;
  339.     priv_key: pointer;
  340.     kinv: pointer;
  341.     r: pointer;
  342.     flags: integer;
  343.     method_mont_p: PCharacter;
  344.     references: integer;
  345.     ex_data: record
  346.       sk: pointer;
  347.       dummy: integer;
  348.       end;
  349.     meth: pointer;
  350.   end;
  351.  
  352.   pDH = pointer;
  353.  
  354.   pEC_KEY = pointer;
  355.  
  356.   pEVP_CIPHER = pointer;
  357.  
  358.   pEVP_MD = ^EVP_MD;
  359.  
  360.   EVP_MD = record
  361.     _type: integer;
  362.     pkey_type: integer;
  363.     md_size: integer;
  364.     init: pointer;
  365.     update: pointer;
  366.     final: pointer;
  367.     sign: pointer;
  368.     verify: pointer;
  369.     required_pkey_type: array [0..4] of integer;
  370.     block_size: integer;
  371.     ctx_size: integer;
  372.   end;
  373.  
  374.   pEVP_MD_CTX = ^EVP_MD_CTX;
  375.  
  376.   EVP_MD_CTX = record
  377.     digest: pEVP_MD;
  378.     case integer of
  379.       0: (base: array [0..3] of byte);
  380.       1: (md2: MD2_CTX);
  381.       8: (md4: MD4_CTX);
  382.       2: (md5: MD5_CTX);
  383.       16: (ripemd160: RIPEMD160_CTX);
  384.       4: (sha: SHA_CTX);
  385.       32: (mdc2: MDC2_CTX);
  386.   end;
  387.  
  388.   pX509_NAME_ENTRY = ^X509_NAME_ENTRY;
  389.  
  390.   X509_NAME_ENTRY = record
  391.     obj: pASN1_OBJECT;
  392.     Value: pASN1_STRING;
  393.     _set: integer;
  394.     size: integer; // temp variable
  395.   end;
  396.  
  397.   pX509_NAME = ^X509_NAME;
  398.   pDN = ^X509_NAME;
  399.  
  400.   X509_NAME = record
  401.     entries: pointer;
  402.     modified: integer;
  403.     bytes: pointer;
  404.     hash: cardinal;
  405.   end;
  406.  
  407.   pX509_VAL = ^X509_VAL;
  408.  
  409.   X509_VAL = record
  410.     notBefore: pASN1_TIME;
  411.     notAfter: pASN1_TIME;
  412.   end;
  413.  
  414.   pX509_CINF = ^X509_CINF;
  415.  
  416.   X509_CINF = record
  417.     version: pointer;
  418.     serialNumber: pointer;
  419.     signature: pointer;
  420.     issuer: pointer;
  421.     validity: pX509_VAL;
  422.     subject: pointer;
  423.     key: pointer;
  424.     issuerUID: pointer;
  425.     subjectUID: pointer;
  426.     extensions: pointer;
  427.   end;
  428.  
  429.   pX509 = ^X509;
  430.  
  431.   X509 = record
  432.     cert_info: pX509_CINF;
  433.     sig_alg: pointer;  // ^X509_ALGOR
  434.     signature: pointer;  // ^ASN1_BIT_STRING
  435.     valid: integer;
  436.     references: integer;
  437.     Name: PCharacter;
  438.     ex_data: CRYPTO_EX_DATA;
  439.     ex_pathlen: integer;
  440.     ex_flags: integer;
  441.     ex_kusage: integer;
  442.     ex_xkusage: integer;
  443.     ex_nscert: integer;
  444.     skid: pASN1_OCTET_STRING;
  445.     akid: pointer;  // ?
  446.     sha1_hash: array [0..SHA_DIGEST_LENGTH - 1] of char;
  447.     aux: pointer;  // ^X509_CERT_AUX
  448.   end;
  449.   pSTACK_OFX509 = pointer;
  450.   pX509_STORE = ^X509_STORE;
  451.   pX509_LOOKUP = pointer;
  452.   pSTACK_OF509LOOKUP = pointer;
  453.   pX509_LOOKUP_METHOD = pointer;
  454.  
  455.   X509_STORE = record
  456.     cache: integer;
  457.     objs: pSTACK_OFX509;
  458.     get_cert_methods: pSTACK_OF509LOOKUP;
  459.     verify: pointer;  // function called to verify a certificate
  460.     verify_cb: TCertificateVerifyFunction;
  461.     ex_data: pointer;
  462.     references: integer;
  463.     depth: integer;
  464.   end;
  465.  
  466.   pX509V3_CTX = pointer;
  467.  
  468.   pX509_REQ = ^X509_REQ;
  469.   pX509_REQ_INFO = ^X509_REQ_INFO;
  470.  
  471.   X509_REQ_INFO = record
  472.     asn1: pointer;
  473.     length: integer;
  474.     version: pointer;
  475.     subject: pX509_NAME;
  476.     pubkey: pointer;
  477.     attributes: pointer;
  478.     req_kludge: integer;
  479.   end;
  480.  
  481.   X509_REQ = record
  482.     req_info: pX509_REQ_INFO;
  483.     sig_alg: pointer;
  484.     signature: pointer;
  485.     references: integer;
  486.   end;
  487.  
  488.   pX509_EXTENSION = ^X509_EXTENSION;
  489.  
  490.   X509_EXTENSION = record
  491.     obj: pASN1_OBJECT;
  492.     critical: smallint;
  493.     netscape_hack: smallint;
  494.     Value: pASN1_OCTET_STRING;
  495.     method: pointer;  // struct v3_ext_method *: V3 method to use
  496.     ext_val: pointer;  // extension value
  497.   end;
  498.   pSTACK_OFX509_EXTENSION = pointer;
  499.  
  500.   pX509_CRL = pointer;
  501.  
  502.   pX509_SIG = ^X509_SIG;
  503.  
  504.   X509_SIG = record
  505.     algor: Pointer; // X509_ALGOR *algor;
  506.     digest: pASN1_OCTET_STRING;
  507.   end;
  508.  
  509.   pBASIC_CONSTRAINTS = ^BASIC_CONSTRAINTS;
  510.  
  511.   BASIC_CONSTRAINTS = record
  512.     ca: integer;
  513.     pathlen: pASN1_INTEGER;
  514.   end;
  515.   pOTHERNAME = ^OTHERNAME;
  516.  
  517.   OTHERNAME = record
  518.     type_id: pASN1_OBJECT;  //There is a bug in x509v3/x509v3.h ?
  519.     Value: pointer;  //pASN1_TYPE;
  520.   end;
  521.   pGENERAL_NAME = ^GENERAL_NAME;
  522.   pGENERAL_NAMEDATA = record
  523.     case integer of
  524.       GEN_EMAIL: (ia5: pASN1_IA5STRING);  // also DNS and URI
  525.       GEN_IPADD: (ip: pASN1_OCTET_STRING);
  526.       GEN_DIRNAME: (dirn: pX509_NAME);
  527.       GEN_RID: (rid: pASN1_OBJECT);
  528.       GEN_OTHERNAME: (otherName: pOTHERNAME);
  529.       GEN_X400: (other: pointer);  // also EDI
  530.   end;
  531.  
  532.   GENERAL_NAME = record
  533.     nametype: integer;
  534.     d: pGENERAL_NAMEDATA;
  535.   end;
  536.  
  537.   pEVP_PKEY = ^EVP_PKEY;
  538.   EVP_PKEY_PKEY = record
  539.     case integer of
  540.       0: (ptr: PCharacter);
  541.       1: (rsa: pRSA);  // ^rsa_st
  542.       2: (dsa: pDSA);  // ^dsa_st
  543.       3: (dh: pDH);  // ^dh_st
  544.   end;
  545.  
  546.   EVP_PKEY = record
  547.     ktype: integer;
  548.     save_type: integer;
  549.     references: integer;
  550.     pkey: EVP_PKEY_PKEY;
  551.     save_parameters: integer;
  552.     attributes: pSTACK_OFX509;
  553.   end;
  554.  
  555.   pPKCS7_SIGNER_INFO = pointer;
  556.   pSTACK_OFPKCS7_SIGNER_INFO = pointer;
  557.   pPKCS7_signed = ^PKCS7_signed;
  558.  
  559.   PKCS7_signed = record
  560.     version: pASN1_INTEGER;
  561.     md_algs: pointer;  // ^STACK_OF(X509_ALGOR)
  562.     cert: pointer;  // ^STACK_OF(X509)
  563.     crl: pointer;  // ^STACK_OF(X509_CRL)
  564.     signer_info: pSTACK_OFPKCS7_SIGNER_INFO;
  565.     contents: pointer;  // ^struct pkcs7_st
  566.   end;
  567.  
  568.   pPKCS7_signedandenveloped = ^PKCS7_signedandenveloped;
  569.  
  570.   PKCS7_signedandenveloped = record
  571.     version: pASN1_INTEGER;
  572.     md_algs: pointer;  // ^STACK_OF(X509_ALGOR)
  573.     cert: pointer;  // ^STACK_OF(X509)
  574.     crl: pointer;  // ^STACK_OF(X509_CRL)
  575.     signer_info: pSTACK_OFPKCS7_SIGNER_INFO;
  576.     enc_data: pointer;  // ^PKCS7_ENC_CONTENT
  577.     recipientinfo: pointer;  // ^STACK_OF(PKCS7_RECIP_INFO)
  578.   end;
  579.  
  580.   pPKCS7 = ^PKCS7;
  581.  
  582.   PKCS7 = record
  583.     asn1: PCharacter;
  584.     length: integer;
  585.     state: integer;
  586.     detached: integer;
  587.     asn1_type: pointer; // ^ASN1_OBJECT
  588.     case integer of
  589.       0: (ptr: pASN1_OCTET_STRING);
  590.       1: (Data: pointer);  // ^PKCS7_SIGNED
  591.       2: (sign: pPKCS7_signed);  // ^PKCS7_SIGNED
  592.       3: (enveloped: pointer);  // ^PKCS7_ENVELOPE
  593.       4: (signed_and_enveloped: pPKCS7_signedandenveloped);
  594.       5: (digest: pointer);  // ^PKCS7_DIGEST
  595.       6: (encrypted: pointer);  // ^PKCS7_ENCRYPT
  596.       7: (other: pointer);  // ^ASN1_TYPE
  597.   end;
  598.  
  599.   {
  600.   void OpenSSL_add_all_algorithms(void);
  601.   void OpenSSL_add_all_ciphers(void);
  602.   void OpenSSL_add_all_digests(void);
  603.    }
  604. procedure OpenSSL_add_all_algorithms; cdecl;
  605. procedure OpenSSL_add_all_ciphers; cdecl;
  606. procedure OpenSSL_add_all_digests; cdecl;
  607.  
  608. procedure CRYPTO_cleanup_all_ex_data(); cdecl;
  609. procedure EVP_cleanup(); cdecl;
  610. procedure ERR_load_crypto_strings; cdecl;
  611. procedure ERR_free_strings; cdecl;
  612.  
  613.  
  614. // BIO
  615. function BIO_new(_type: pBIO_METHOD): pBIO; cdecl;
  616. function BIO_free(a: pBIO): integer; cdecl;
  617. procedure BIO_free_all(a: pBIO); cdecl;
  618. function BIO_ctrl(bp: pBIO; cmd: integer; larg: longint; parg: Pointer): longint; cdecl;
  619. function BIO_read(b: pBIO; buf: pointer; len: integer): integer; cdecl;
  620. function BIO_reset(bp: pBIO): integer;
  621. function BIO_pending(bp: pBIO): integer;
  622. function BIO_read_filename(bp: pBIO; filename: PCharacter): integer;
  623. function BIO_s_mem: pBIO_METHOD; cdecl;
  624. function BIO_new_mem_buf(buf: pointer; len: integer): pBIO; cdecl;
  625. function BIO_s_file: pBIO_METHOD; cdecl;
  626.  
  627. // PEM
  628. function PEM_read_bio_X509(bp: pBIO; var x: pX509; cb: TPWCallbackFunction; u: pointer): pX509; cdecl;
  629. function PEM_read_bio_PrivateKey(bp: pBIO; var x: pEVP_PKEY; cb: TPWCallbackFunction; u: pointer): pEVP_PKEY; cdecl;
  630.  
  631. // PKCS#7 functions
  632. function PKCS7_sign(signcert: pX509; pkey: pEVP_PKEY; certs: pointer; Data: pBIO; flags: integer): pPKCS7; cdecl;
  633. procedure PKCS7_free(p7: pPKCS7); cdecl;
  634.  
  635. // SMIME
  636. function SMIME_write_PKCS7(bp: pBIO; p7: pPKCS7; Data: pBIO; flags: integer): integer; cdecl;
  637. function SMIME_read_PKCS7(bp: pBIO; var bcont: pBIO): pPKCS7; cdecl;
  638.  
  639. implementation
  640.  
  641. const
  642.   Crypto_DLL_Names = 'libeay32.dll'; //libcrypto-1_1 o libcrypto-3
  643.  
  644.  
  645. procedure OpenSSL_add_all_algorithms; external Crypto_DLL_Names;
  646. procedure OpenSSL_add_all_ciphers; external Crypto_DLL_Names;
  647. procedure OpenSSL_add_all_digests; external Crypto_DLL_Names;
  648. procedure EVP_cleanup; external Crypto_DLL_Names;
  649.  
  650. procedure CRYPTO_cleanup_all_ex_data; external Crypto_DLL_Names;
  651. procedure ERR_load_crypto_strings; external Crypto_DLL_Names;
  652. procedure ERR_free_strings; external Crypto_DLL_Names;
  653. //BIO
  654. function BIO_new; external Crypto_DLL_Names;
  655. function BIO_free; external Crypto_DLL_Names;
  656. procedure BIO_vfree; external Crypto_DLL_Names;
  657. procedure BIO_free_all; external Crypto_DLL_Names;
  658. function BIO_ctrl; external Crypto_DLL_Names;
  659. function BIO_read; external Crypto_DLL_Names;
  660. function BIO_s_mem; external Crypto_DLL_Names;
  661. procedure BIO_set_mem_buf; external Crypto_DLL_Names;
  662. procedure BIO_get_mem_ptr; external Crypto_DLL_Names;
  663. function BIO_new_mem_buf; external Crypto_DLL_Names;
  664. function BIO_s_file; external Crypto_DLL_Names;
  665.  
  666. function BIO_reset(bp: pBIO): integer;
  667. begin
  668.   Result := BIO_ctrl(bp, BIO_CTRL_RESET, 0, nil);
  669. end;
  670.  
  671. function BIO_pending(bp: pBIO): integer;
  672. begin
  673.   Result := BIO_ctrl(bp, BIO_CTRL_PENDING, 0, nil);
  674. end;
  675.  
  676. function BIO_read_filename(bp: pBIO; filename: PCharacter): integer;
  677. begin
  678.   Result := BIO_ctrl(bp, BIO_C_SET_FILENAME, BIO_CLOSE or BIO_FP_READ, filename);
  679. end;
  680.  
  681. // PEM
  682. function PEM_read_bio_X509; external Crypto_DLL_Names;
  683. function PEM_read_bio_PrivateKey; external Crypto_DLL_Names;
  684.  
  685. // PKCS#7
  686. function PKCS7_sign; external Crypto_DLL_Names;
  687. procedure PKCS7_free; external Crypto_DLL_Names;
  688.  
  689. // SMIME
  690. function SMIME_write_PKCS7; external Crypto_DLL_Names;
  691. function SMIME_read_PKCS7; external Crypto_DLL_Names;
  692.  
  693. end.
  694.  
« Last Edit: July 28, 2022, 08:42:01 pm by ocloma »

 

TinyPortal © 2005-2018