IC SunsetThe developerWorks Connections platform will be sunset on December 31, 2019. On January 1, 2020, this forum will no longer be available. More details available on our FAQ.
Topic
  • 11 replies
  • Latest Post - ‏2019-07-14T22:22:58Z by cristhiansanchez
Ajay Kulkarni
Ajay Kulkarni
10 Posts

Pinned topic HMAC-SHA1

‏2015-12-18T13:00:02Z |

Hello,  Is there a way we can generate using HMAC-SHA1 key in RPGLE. We are on IBM i 7.2. The vendor has given us the secret key and wants us to use that to generate the SHA1 hash value. Do we have a sample program?

 

Thanks

 

 

  • JonParis
    JonParis
    348 Posts

    Re: HMAC-SHA1

    ‏2015-12-18T15:04:48Z  

    You can use the QC3CALHA or Qc3CalculateHash APIs to do this. This page has an example of using Qc3CalculateHash which for me would be the preferred approach.

     

    http://www.mysamplecode.com/2011/05/rpgle-generate-sha-1-hash-use.html

     

    P.S. Not wishing to be rude but it took me 30 seconds to find this with Google. Just sayin'

     

    Updated on 2015-12-18T15:05:43Z at 2015-12-18T15:05:43Z by JonParis
  • scott_klement
    scott_klement
    306 Posts

    Re: HMAC-SHA1

    ‏2015-12-18T15:20:08Z  

    Jon, I think Ajay wants to calculate an HMAC, not just a hash.  So he really wants the QC3CALHM API, right?

  • Ajay Kulkarni
    Ajay Kulkarni
    10 Posts

    Re: HMAC-SHA1

    ‏2015-12-18T15:33:27Z  

    Jon, I think Ajay wants to calculate an HMAC, not just a hash.  So he really wants the QC3CALHM API, right?

    Hello Jon and Scott,  I need  hash function applied to the body of a message along with a secret key.

     

    Updated on 2015-12-18T15:46:33Z at 2015-12-18T15:46:33Z by Ajay Kulkarni
  • JonParis
    JonParis
    348 Posts

    Re: HMAC-SHA1

    ‏2015-12-18T15:39:56Z  

    Jon, I think Ajay wants to calculate an HMAC, not just a hash.  So he really wants the QC3CALHM API, right?

    Ooppps - yes - you are correct Scott.

  • Ajay Kulkarni
    Ajay Kulkarni
    10 Posts

    Re: HMAC-SHA1

    ‏2015-12-23T04:10:14Z  

    I am not sure what is going wrong here. The program is getting me the HMAC but when i run the same TEXT and KEY on a online SHA1 (quickhash.com) the results don't tie

     

    H dftactgrp(*no) actgrp('QILE')                                                 
    H option(*srcstmt:*nodebugio)                                                   
    d binaryHMAC      s             20a                                             
    d SHA_1           c                   const(2)                                  
    D DataLen         s             10i 0                                           
    d dataToHash      s            500a                                             
    d $hex            s             17a                                             
    d Nullfield       s            100a                                             
     *---------------------------------------------------------------------         
     * Stand Alone Fields - BOTTOM                                                  
     *---------------------------------------------------------------------         
    D ErrorCode       DS                  qualified                                 
    D    bytesProv                  10i 0 inz(0)                                    
    D    bytesAvail                 10i 0 inz(0)                                    
                                                                                    
    D WsErrorCode     DS                  qualified                                 
    D    bytesProv                  10i 0 inz(0)                                    
    D    bytesAvail                 10i 0 inz(0)                                    
                                                      

    D my_key          DS                  qualified                    
    D    Type                       10i 0 inz(SHA_1)                   
    D    Len                        10i 0                              
    D    Fmt                         1a   inz('0')                     
    D                                3a                                
    D    Value                      64a                                
                                                                       
    d QDCXLATE        PR                  ExtPgm('QDCXLATE')           
    d   len                          5p 0 const                        
    d   data                     32702a   options(*varsize)            
    d   table                       10a   const                        
                                                                       
    d cvthc           PR                  ExtProc('cvthc')             
    d   target                   65534A   options(*varsize)            
    d   src_bits                 32767A   options(*varsize) const      
    d   tgt_length                  10I 0 value                        
                                                                       


    D  pinDataLen                   10i 0 const                                 
    D  pinFormat                     8a   const                                 
    D  palgDesc                     10i 0 const                                 
    D  palgDescFmt                   8a   const                                 
    D  pkeyDesc                  32767a   const options(*varsize)               
    D  pkeyDescFmt                   8a   const                                 
    D  pcryptoProv                   1a   const                                 
    D  pcryptoDev                   10a   const                                 
    D  pHMAC                        64a         options(*varsize)               
    D  pErrorCode                32767a         options(*varsize)               
                                                                                
    C     *ENTRY        Plist                                                   
    C                   Parm                    MyText           30             
    C                   Parm                    MySalt           10             

     

     /free                                                                   
      //---------------------------------------------------------            
      //            Calculate the SHA-1 HMAC hash                            
      //---------------------------------------------------------            
                                                                             
      Nullfield = *allx'00';                                                 
      DataToHash   = MyText;                                                 
      my_key.value = %TRIMR(MySalt) + Nullfield;                             
                                                                             
      DataLen      =  %len(%trim(DataToHash));                               
      my_key.len   =  %len(%trim(MYSALT));                                   
                                                                             
      QDCXLATE( DataLen:    DataToHash:   'QTCPASC');                        
      QDCXLATE( my_key.len: my_key.value: 'QTCPASC');                        
                                                                             
        my_key.len   = %size(my_key.value);                                  
        DataLen      = %size(DataToHash) ;                                   
                                                                             
      monitor;                                                               
        Qc3CalculateHMAC( DataToHash                                         


                        : DataLen                       
                        : 'DATA0100'                    
                        : SHA_1                         
                        : 'ALGD0500'                    
                        :  my_key                       
                        : 'KEYD0200'                    
                        : '0'                           
                        : *blanks                       
                        : binaryHMAC                    
                        : ErrorCode );                  
      on-error;                                         
        WsErrorCode = ErrorCode;                        
        Dsply 'Error in Conversion';                    
      endmon;                                           
                                                        
      cvthc( $hex: binaryHMAC: %len(binaryHMAC)*2);     
      dsply $hex;                                       
      *inlr = '1';                                      
       return;                                          

     /end-free

    Updated on 2015-12-23T04:12:10Z at 2015-12-23T04:12:10Z by Ajay Kulkarni
  • scott_klement
    scott_klement
    306 Posts

    Re: HMAC-SHA1

    ‏2015-12-28T15:33:40Z  

    I am not sure what is going wrong here. The program is getting me the HMAC but when i run the same TEXT and KEY on a online SHA1 (quickhash.com) the results don't tie

     

    H dftactgrp(*no) actgrp('QILE')                                                 
    H option(*srcstmt:*nodebugio)                                                   
    d binaryHMAC      s             20a                                             
    d SHA_1           c                   const(2)                                  
    D DataLen         s             10i 0                                           
    d dataToHash      s            500a                                             
    d $hex            s             17a                                             
    d Nullfield       s            100a                                             
     *---------------------------------------------------------------------         
     * Stand Alone Fields - BOTTOM                                                  
     *---------------------------------------------------------------------         
    D ErrorCode       DS                  qualified                                 
    D    bytesProv                  10i 0 inz(0)                                    
    D    bytesAvail                 10i 0 inz(0)                                    
                                                                                    
    D WsErrorCode     DS                  qualified                                 
    D    bytesProv                  10i 0 inz(0)                                    
    D    bytesAvail                 10i 0 inz(0)                                    
                                                      

    D my_key          DS                  qualified                    
    D    Type                       10i 0 inz(SHA_1)                   
    D    Len                        10i 0                              
    D    Fmt                         1a   inz('0')                     
    D                                3a                                
    D    Value                      64a                                
                                                                       
    d QDCXLATE        PR                  ExtPgm('QDCXLATE')           
    d   len                          5p 0 const                        
    d   data                     32702a   options(*varsize)            
    d   table                       10a   const                        
                                                                       
    d cvthc           PR                  ExtProc('cvthc')             
    d   target                   65534A   options(*varsize)            
    d   src_bits                 32767A   options(*varsize) const      
    d   tgt_length                  10I 0 value                        
                                                                       


    D  pinDataLen                   10i 0 const                                 
    D  pinFormat                     8a   const                                 
    D  palgDesc                     10i 0 const                                 
    D  palgDescFmt                   8a   const                                 
    D  pkeyDesc                  32767a   const options(*varsize)               
    D  pkeyDescFmt                   8a   const                                 
    D  pcryptoProv                   1a   const                                 
    D  pcryptoDev                   10a   const                                 
    D  pHMAC                        64a         options(*varsize)               
    D  pErrorCode                32767a         options(*varsize)               
                                                                                
    C     *ENTRY        Plist                                                   
    C                   Parm                    MyText           30             
    C                   Parm                    MySalt           10             

     

     /free                                                                   
      //---------------------------------------------------------            
      //            Calculate the SHA-1 HMAC hash                            
      //---------------------------------------------------------            
                                                                             
      Nullfield = *allx'00';                                                 
      DataToHash   = MyText;                                                 
      my_key.value = %TRIMR(MySalt) + Nullfield;                             
                                                                             
      DataLen      =  %len(%trim(DataToHash));                               
      my_key.len   =  %len(%trim(MYSALT));                                   
                                                                             
      QDCXLATE( DataLen:    DataToHash:   'QTCPASC');                        
      QDCXLATE( my_key.len: my_key.value: 'QTCPASC');                        
                                                                             
        my_key.len   = %size(my_key.value);                                  
        DataLen      = %size(DataToHash) ;                                   
                                                                             
      monitor;                                                               
        Qc3CalculateHMAC( DataToHash                                         


                        : DataLen                       
                        : 'DATA0100'                    
                        : SHA_1                         
                        : 'ALGD0500'                    
                        :  my_key                       
                        : 'KEYD0200'                    
                        : '0'                           
                        : *blanks                       
                        : binaryHMAC                    
                        : ErrorCode );                  
      on-error;                                         
        WsErrorCode = ErrorCode;                        
        Dsply 'Error in Conversion';                    
      endmon;                                           
                                                        
      cvthc( $hex: binaryHMAC: %len(binaryHMAC)*2);     
      dsply $hex;                                       
      *inlr = '1';                                      
       return;                                          

     /end-free

    Data on the web page is in UTF-8, data in your program is EBCDIC.  That means the underllying byte values are very different and should yield a very different result.

  • mstrickland
    mstrickland
    4 Posts

    Re: HMAC-SHA1

    ‏2017-04-06T19:36:49Z  

    for a web service i need to HMAC encode a string and send it.  

    Actually in the docmentation it says "Note that the result of the HMAC calculation needs to be output in binary format, then base64 encoded."

    Using the program example in this topic I have run the SHA1 HMAC encryption.  
    I have downloaded and created Scott's BASE64 service program.  

    I am confused as to how I will do this...  do I literally pass the field binaryHMAC?   All my testing with the base64 has been readable data.  
    This is my first venture into this crypto world and I'm getting lost in the fog.  

    Tests to this point have not produced the desired results.


    Marianne

     

     

  • EmmanuelW
    EmmanuelW
    5 Posts

    Re: HMAC-SHA1

    ‏2017-04-12T16:21:51Z  

    Sorry to hijack the thread, but SHA1? Really?!

     

     

    Pretty sure that's not considered secure anymore.

     

    Cheers,

     

    Emmanuel

  • _vlad_
    _vlad_
    88 Posts

    Re: HMAC-SHA1

    ‏2017-06-10T22:05:24Z  
    • EmmanuelW
    • ‏2017-04-12T16:21:51Z

    Sorry to hijack the thread, but SHA1? Really?!

     

     

    Pretty sure that's not considered secure anymore.

     

    Cheers,

     

    Emmanuel

    Yes, really. SHA1 is a good way to generate a checksum and unique identifier for an object. Widely used for this purpose. Bittorrent for example. 

  • EmmanuelW
    EmmanuelW
    5 Posts

    Re: HMAC-SHA1

    ‏2017-06-12T13:04:57Z  

    Vlad,

     

    Yes, I think I confused integrity checking and certificates - SHA-1 is still good for the former, though not the latter.


    Cheers,


    Emmanuel

  • cristhiansanchez
    cristhiansanchez
    1 Post

    Re: HMAC-SHA1

    ‏2019-07-14T22:22:58Z  

    I am using the CSNBHMG function to generate the HMAC I need to create the key I use the CSNBKPI2 function but it shows me an error code 8 reason code 33, please can you help me.