From WikiChip
Difference between revisions of "mirc/identifiers/$sha1"
< mirc‎ | identifiers

(add warning)
Line 1: Line 1:
 
{{mirc title|$sha1 identifier}}'''$sha1''' calculates the [[sha1 hash]] of a text, {{mirc|binary variables|binary variable}}, or file. Hash is 160-bits, shown as 40 lower-case hexadecimal characters.
 
{{mirc title|$sha1 identifier}}'''$sha1''' calculates the [[sha1 hash]] of a text, {{mirc|binary variables|binary variable}}, or file. Hash is 160-bits, shown as 40 lower-case hexadecimal characters.
 
 
 
== Synopsis ==
 
== Synopsis ==
 
<pre>$sha1(plaintext|&binaryvar|filename,[N])</pre>
 
<pre>$sha1(plaintext|&binaryvar|filename,[N])</pre>
 
 
== Parameters ==
 
== Parameters ==
 
'''plaintext''' - Used with N = 0, just the string you want the sha1 hash of
 
'''plaintext''' - Used with N = 0, just the string you want the sha1 hash of
Line 15: Line 12:
  
 
If the N parameter isn't used, the default 0 is used (which is different than $crc which has default of N=2.)
 
If the N parameter isn't used, the default 0 is used (which is different than $crc which has default of N=2.)
 
 
== Properties ==
 
== Properties ==
 
None
 
None
 
 
== Example ==
 
== Example ==
 
Echo the SHA1 hash of plain text string ''abc'' to the active window:
 
Echo the SHA1 hash of plain text string ''abc'' to the active window:
Line 26: Line 21:
 
The DATA is case-sensitive, so hash of "abc" is different than hash of "ABC"
 
The DATA is case-sensitive, so hash of "abc" is different than hash of "ABC"
  
Echo the SHA1 hash of the zero-length null string to the active window:
+
Echo the SHA1 hash of the contents of the mIRC program you're running to the active window:
<pre>//echo -a $sha1($null)</pre>
+
<pre>//echo -a $sha1($mircexe,2)</pre>
  
 
Echo the SHA1 hash of the first 1000 bytes of the mIRC program you're running to the active window:
 
Echo the SHA1 hash of the first 1000 bytes of the mIRC program you're running to the active window:
 
<pre>//bread $qt($mircexe) 0 1000 &snip | echo -a $sha1(&snip,1)</pre>
 
<pre>//bread $qt($mircexe) 0 1000 &snip | echo -a $sha1(&snip,1)</pre>
  
Echo the SHA1 hash of the contents of the mIRC program you're running to the active window:
+
Mode 0 allows string to be null, including %variable not existing.
<pre>//echo -a $sha1($mircexe,2)</pre>
+
<pre>//unset %a | var %b $null | echo -a $sha1(%a) is $sha1(%b) is $sha1()</pre>
 +
 
 +
Mode 1 allows binvar to be zero length but not undefined.
 +
<pre>//noop $regsubex(foo,$null,,,&v) | echo -a $bvar(&v) $sha1(&v,1) | echo -a $bvar(&v2) $sha1(&v2,1)</pre>
 +
 
 +
Mode 2 allows filesize to be zero but not missing.
 +
<pre>//btrunc zero.dat 0 | echo -a $sha1(zero.dat,2) | remove zero.dat | echo -a $sha1(zero.dat,2)</pre>
  
 
Suggested Uses:
 
Suggested Uses:
Line 47: Line 48:
 
<pre>//bset -ta &string 1 chloé | echo -a $sha1(&string,1)</pre>
 
<pre>//bset -ta &string 1 chloé | echo -a $sha1(&string,1)</pre>
  
 +
== Warning ==
 +
From v7.54 back through at least v6.35, $sha1 corrupts the &binvar if the length is 128+ and a multiple of 64 and contains at least 1 byte that isn't 0x00. This affects using sha1 against &binvar in $hmac too. It returns the correct hash of the input &binvar in spite of destroying it.
 +
<pre>//bset &v 128 1 | noop $sha1(&v,1) | echo -a $bvar(&v,1-)</pre>
 
== Error Messages ==
 
== Error Messages ==
 
Note that $sha1 differs from $crc in that it generates error for non-existent files instead of returning hash of $null string. Also, hex string returned by $sha1 is lowercase while $crc returns uppercase hex.
 
Note that $sha1 differs from $crc in that it generates error for non-existent files instead of returning hash of $null string. Also, hex string returned by $sha1 is lowercase while $crc returns uppercase hex.
Line 57: Line 61:
  
 
<pre>Both above errors halt execution of the script</pre>
 
<pre>Both above errors halt execution of the script</pre>
 
 
== Compatibility ==
 
== Compatibility ==
 
{{mIRC compatibility|6.3}}
 
{{mIRC compatibility|6.3}}
 
+
== See Also ==
== See also ==
+
{{collist
* {{mIRC|$crc}}
+
|count = 3
* {{mIRC|$md5}}
+
|style = width: 100%; display: inherit;
 +
|
 
* {{mIRC|$sha256}}
 
* {{mIRC|$sha256}}
 +
* {{mIRC|$sha512}}
 
* {{mIRC|$sha384}}
 
* {{mIRC|$sha384}}
* {{mIRC|$sha512}}
+
* {{mIRC|$md5}}
* [[List of identifiers - mIRC]]
+
* {{mIRC|$crc}}
{{mIRC identifier list}}
+
* {{mIRC|$hmac}}
[[Category:mIRC identifiers|sha1]]
+
* {{mIRC|$hotp}}
 +
* {{mIRC|$totp}}
 +
}}

Revision as of 22:44, 4 January 2019

$sha1 calculates the sha1 hash of a text, binary variable, or file. Hash is 160-bits, shown as 40 lower-case hexadecimal characters.

Synopsis

$sha1(plaintext|&binaryvar|filename,[N])

Parameters

plaintext - Used with N = 0, just the string you want the sha1 hash of

&binaryvar - A binary variable, used with N = 1, return the sha1 hash of the content of the binvar

filename - A filename, used with N = 2, return the sha1 hash of the content of the file

N: Optional integer 0-2, where 0 indicates data is treated as plaintext, 1 indicates a &binary variable, 2 treats data as contents of a filename

If the N parameter isn't used, the default 0 is used (which is different than $crc which has default of N=2.)

Properties

None

Example

Echo the SHA1 hash of plain text string abc to the active window:

//echo -a $sha1(abc)
or
//echo -a $sha1(abc,0)

The DATA is case-sensitive, so hash of "abc" is different than hash of "ABC"

Echo the SHA1 hash of the contents of the mIRC program you're running to the active window:

//echo -a $sha1($mircexe,2)

Echo the SHA1 hash of the first 1000 bytes of the mIRC program you're running to the active window:

//bread $qt($mircexe) 0 1000 &snip | echo -a $sha1(&snip,1)

Mode 0 allows string to be null, including %variable not existing.

//unset %a | var %b $null | echo -a $sha1(%a) is $sha1(%b) is $sha1()

Mode 1 allows binvar to be zero length but not undefined.

//noop $regsubex(foo,$null,,,&v) | echo -a $bvar(&v) $sha1(&v,1) | echo -a $bvar(&v2) $sha1(&v2,1)

Mode 2 allows filesize to be zero but not missing.

//btrunc zero.dat 0 | echo -a $sha1(zero.dat,2) | remove zero.dat | echo -a $sha1(zero.dat,2)

Suggested Uses:

  • Quick way to compare if 2 files are identical. (First check should always be comparing file sizes.)
  • Quick way to check if a file's contents have changed since stored sha1 hash was made.
  • Verify downloaded file hasn't been corrupted, matches the sender's original.


Note that because the default is N=0, $sha1($mircexe) is the SHA1 hash for the plaintext text string of the drive:\path\filename for the mIRC you're running, and not the hash of the filename contents. This differs from $crc($mircexe) giving the checksum of the filename contents because $crc has default of N=2.
mIRC v7.x Unicode-encodes plaintext before providing to $sha1, so v7.x and v6.x return different answers for //echo -a $sha1($chr(233))

If the text doesn't have Unicode code points above 255, to avoid having Unicode points 128-255 encoded to 2-byte pairs, the text must be fed to $sha1 as a binary variable:

//bset -ta &string 1 chloé | echo -a $sha1(&string,1)

Warning

From v7.54 back through at least v6.35, $sha1 corrupts the &binvar if the length is 128+ and a multiple of 64 and contains at least 1 byte that isn't 0x00. This affects using sha1 against &binvar in $hmac too. It returns the correct hash of the input &binvar in spite of destroying it.

//bset &v 128 1 | noop $sha1(&v,1) | echo -a $bvar(&v,1-)

Error Messages

Note that $sha1 differs from $crc in that it generates error for non-existent files instead of returning hash of $null string. Also, hex string returned by $sha1 is lowercase while $crc returns uppercase hex.

* Error accessing file: $sha1

Either file does not exist, or file permissions don't allow the file to be read. i.e. $sha1(non-existent-file,2) or $sha1(c:\hiberfil.sys,2)

* Invalid parameters: $sha1

Either using a zero-length/non-existent binary variable or specifying an N where $int(%N) isn't 0-2.

Both above errors halt execution of the script

Compatibility

Added: mIRC v6.3
Added on: 16 Aug 2007
Note: Unless otherwise stated, this was the date of original functionality.
Further enhancements may have been made in later versions.

See Also