Lindenii Project Forge
Just use one SHA-256 oid type
use crypto::sha1;
use crypto::sha256; use encoding::hex; use errors; use io;
export type oid = (oid_sha1 | oid_sha256); export type oid_sha1 = [sha1::SZ]u8; export type oid_sha256 = [sha256::SZ]u8;
export type oid = [sha256::SZ]u8;
// oid_from_str converts a hex string to an oid. export fn oid_from_str(s: const str) (oid | nomem | errors::invalid) = { const d = match (hex::decodestr(s)) { case let u: []u8 => yield u; case nomem => return nomem; case errors::invalid => return errors::invalid; case => abort("unreachable"); };
// Parses a hex-encoded string representation of an [[oid]]. export fn parse_oid(s: const str) (oid | nomem | errors::invalid) = { const d = hex::decodestr(s)?;
defer free(d);
let o: oid = switch (len(s)) { case sha1::SZ => let p: oid_sha1 = [0...]; p[..] = d[..]; yield p; case sha256::SZ => let p: oid_sha256 = [0...]; p[..] = d[..]; yield p; case => return errors::invalid; };
let o: oid; o[..] = d[..];
return o; };
// Returns a hex-encoded string representation of the given [[oid]]. // The returned string is allocated on the heap and must be freed by the caller. export fn oid_string(id: oid) const str { return hex::encodestr(id); }