how to print ubyte*

2014-04-30 Thread brad clawsie via Digitalmars-d-learn

hi, I'm back again with another openssl related question.

given this program

--

  import std.stdio;
  import deimos.openssl.hmac;
  import deimos.openssl.evp;

  void main() {
  HMAC_CTX *ctx = new HMAC_CTX;
  HMAC_CTX_init(ctx);
  auto key = 123456;
  auto s = hello;

  auto digest = HMAC(EVP_sha1(),
 cast(void *) key,
 cast(int) key.length,
 cast(ubyte*) s,
 cast(int) s.length,
 null,null);
  }

--

digest should be of type ubyte*

does anyone know how to print this out as ascii?

thanks!
brad


Re: how to print ubyte*

2014-04-30 Thread bearophile via Digitalmars-d-learn

brad clawsie:


  auto digest = HMAC(EVP_sha1(),
 cast(void *) key,


Better to attach the * to void.



 cast(int) key.length,
 cast(ubyte*) s,


Here you are casting a struct of pointer to immutable plus length 
to a mutable ubyte pointer.




 cast(int) s.length,
 null,null);


This whole function call is quite bug-prone.



digest should be of type ubyte*

does anyone know how to print this out as ascii?


Do you mean in hex? Perhaps something like this? But hardcodes 
the hash function output length:


writefln(%-(%02x%), digest[0 .. 40])

Bye,
bearophile


Re: how to print ubyte*

2014-04-30 Thread Jonathan M Davis via Digitalmars-d-learn
On Wed, 30 Apr 2014 07:27:23 +
brad clawsie via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 hi, I'm back again with another openssl related question.
 
 given this program
 
 --
 
import std.stdio;
import deimos.openssl.hmac;
import deimos.openssl.evp;
 
void main() {
HMAC_CTX *ctx = new HMAC_CTX;
HMAC_CTX_init(ctx);
auto key = 123456;
auto s = hello;
 
auto digest = HMAC(EVP_sha1(),
   cast(void *) key,
   cast(int) key.length,
   cast(ubyte*) s,
   cast(int) s.length,
   null,null);
}
 
 --
 
 digest should be of type ubyte*
 
 does anyone know how to print this out as ascii?

If you want to print a ubyte*, then you can do something like

auto str = cast(char[])digest[0 .. lengthOfDigest];
writeln(str);

Slicing the pointer results in an array, and you can cast ubyte[] to
char[], which will print as characters rather than their integral
values.

- Jonathan M Davis