view auth/auth_crypto.h @ 268:f7b1188d5fb1

support repo rules Copilot bundle path Match both +_repo_rules2+ and +http_archive+ Copilot CLI repository layouts during deployment and production startup. Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Fri, 07 Aug 2026 13:02:41 -0700
parents 04fee26ecce0
children
line wrap: on
line source

#ifndef ZENBU_AUTH_CRYPTO_H
#define ZENBU_AUTH_CRYPTO_H

#include "dowa/dowa.h"

#define AUTH_CRYPTO_PASSWORD_MAX_BYTES 1024
#define AUTH_CRYPTO_PASSWORD_SALT_BYTES 16
#define AUTH_CRYPTO_PASSWORD_HASH_BYTES 32
#define AUTH_CRYPTO_PASSWORD_HASH_ENCODED_SIZE 160

#define AUTH_CRYPTO_TOKEN_BYTES 32
#define AUTH_CRYPTO_TOKEN_SIZE 44
#define AUTH_CRYPTO_TOKEN_DIGEST_BYTES 32
#define AUTH_CRYPTO_TOKEN_DIGEST_SIZE 65

#define AUTH_CRYPTO_COOKIE_SECRET_MIN_BYTES 32
#define AUTH_CRYPTO_COOKIE_SECRET_MAX_BYTES 1024
#define AUTH_CRYPTO_IP_MAX_BYTES 128
#define AUTH_CRYPTO_IP_BINDING_DIGEST_SIZE 65
#define AUTH_CRYPTO_GUEST_UUID_SIZE 37
#define AUTH_CRYPTO_GUEST_COOKIE_SIZE 256

typedef enum {
  AUTH_CRYPTO_OK = 0,
  AUTH_CRYPTO_INVALID_ARGUMENT = 1,
  AUTH_CRYPTO_BUFFER_TOO_SMALL = 2,
  AUTH_CRYPTO_PASSWORD_TOO_LONG = 3,
  AUTH_CRYPTO_RANDOM_FAILED = 4,
  AUTH_CRYPTO_OPERATION_FAILED = 5,
  AUTH_CRYPTO_MALFORMED = 6,
  AUTH_CRYPTO_AUTHENTICATION_FAILED = 7,
  AUTH_CRYPTO_EXPIRED = 8,
  AUTH_CRYPTO_IP_MISMATCH = 9,
} Auth_Crypto_Result;

typedef struct {
  char guest_uuid[AUTH_CRYPTO_GUEST_UUID_SIZE];
  uint64 expiration_unix;
} Auth_Crypto_Guest_Cookie;

Auth_Crypto_Result Auth_Crypto_Password_Hash(
    const char *password,
    char *encoded_hash,
    size_t encoded_hash_capacity);

Auth_Crypto_Result Auth_Crypto_Password_Verify(
    const char *password,
    const char *encoded_hash);

Auth_Crypto_Result Auth_Crypto_Token_Generate(
    char *token,
    size_t token_capacity);

Auth_Crypto_Result Auth_Crypto_Token_Digest(
    const char *token,
    char *digest_hex,
    size_t digest_hex_capacity);

Auth_Crypto_Result Auth_Crypto_IP_Binding_Digest(
    const uint8 *cookie_secret,
    size_t cookie_secret_length,
    const char *canonical_peer_ip,
    char *digest_hex,
    size_t digest_hex_capacity);

Auth_Crypto_Result Auth_Crypto_Guest_Cookie_Create(
    const uint8 *cookie_secret,
    size_t cookie_secret_length,
    const char *guest_uuid,
    uint64 expiration_unix,
    const char *ip_binding_digest,
    char *cookie,
    size_t cookie_capacity);

Auth_Crypto_Result Auth_Crypto_Guest_Cookie_Verify(
    const uint8 *cookie_secret,
    size_t cookie_secret_length,
    const char *cookie,
    uint64 current_unix,
    const char *expected_ip_binding_digest,
    Auth_Crypto_Guest_Cookie *guest_cookie);

const char *Auth_Crypto_Result_String(Auth_Crypto_Result result);

/*
 * Validate an encoded password hash string without running scrypt.
 * Checks exact format, version string, parameters (N/r/p), hex salt length,
 * hex hash length, and that all hex characters are valid.
 * Returns AUTH_CRYPTO_OK if well-formed, AUTH_CRYPTO_MALFORMED otherwise.
 * Does NOT verify against a password; use Auth_Crypto_Password_Verify for that.
 */
Auth_Crypto_Result Auth_Crypto_Password_Hash_Validate(const char *encoded_hash);

/*
 * Encode byte_count bytes from bytes as unpadded base64url into out.
 * out_capacity must be at least ((byte_count + 2) / 3 * 4) - padding + 1;
 * for AUTH_CRYPTO_TOKEN_BYTES (32) bytes that is AUTH_CRYPTO_TOKEN_SIZE (44).
 * Returns number of characters written (without NUL), or 0 on error.
 */
size_t Auth_Crypto_Base64url_Encode(
    const uint8 *bytes,
    size_t       byte_count,
    char        *out,
    size_t       out_capacity);

#endif