| /* | |
| * sov_verifier.h -- Sovereign Stack Machine Verifier | |
| * | |
| * Matrix verification engines for invariants, linear systems, and least squares. | |
| * ALL operations use int64_t with overflow detection via __builtin_*_overflow. | |
| * NO floating-point arithmetic. ZERO tolerance for numerical error. | |
| * | |
| * Per verification-policy.md: | |
| * - VerifyInv: A*X = I (exact match only) | |
| * - VerifySol: A*x = b (exact match only) | |
| * - VerifyLstsq: A^T(Ax-b) = 0 (exact match only) | |
| * | |
| * FORGE Phase 2: Matrix Verifier Engine | |
| * | |
| * Build: part of libsov_forge.a | |
| * License: Apache 2.0 + AGPL 3.0 | |
| */ | |
| extern "C" { | |
| /* | |
| * ============================================================================ | |
| * VERIFICATION RESULTS | |
| * ============================================================================ | |
| */ | |
| typedef enum { | |
| VER_OK, /* Verification passed */ | |
| VER_FAIL, /* Verification failed */ | |
| VER_OVERFLOW, /* Arithmetic overflow detected */ | |
| VER_DIMENSION_MISMATCH, /* Matrix dimensions don't match */ | |
| VER_NULL_INPUT, /* Null pointer input */ | |
| VER_SINGULAR, /* Matrix is singular (for inversion) */ | |
| VER_ALLOC_FAILURE, /* Memory allocation failed */ | |
| VER_BUFFER_OVERFLOW, /* Buffer size exceeded capacity */ | |
| VER_DIMS_EXCEEDED, /* Matrix dimension exceeds maximum */ | |
| VER_CELLS_EXCEEDED, /* Total matrix cells exceed maximum */ | |
| VER_OPS_EXCEEDED, /* Operation count exceeds budget */ | |
| VER_RESOURCE_EXCEEDED, /* Generic resource limit exceeded */ | |
| } VerifyResult; | |
| /* | |
| * ============================================================================ | |
| * RESOURCE LIMITS (Phase 1, Step 2) | |
| * ============================================================================ | |
| */ | |
| /* | |
| * SovResourceBudget -- Track resource consumption within a verification call | |
| * | |
| * Fields: | |
| * max_dimensions - Maximum allowed dimension (n or m) | |
| * max_cells - Maximum allowed total cells in a matrix | |
| * max_operations - Maximum operations in a single call | |
| * operation_count - Current operation count (accumulates during call) | |
| * budget_exceeded - Flag indicating budget was exhausted | |
| */ | |
| typedef struct { | |
| size_t max_dimensions; | |
| size_t max_cells; | |
| size_t max_operations; | |
| size_t operation_count; | |
| bool budget_exceeded; | |
| } SovResourceBudget; | |
| /* | |
| * ============================================================================ | |
| * SAFE MEMORY MANAGEMENT | |
| * ============================================================================ | |
| */ | |
| /* | |
| * SafeMatrix -- Memory-safe matrix wrapper | |
| * | |
| * Tracks allocated capacity to prevent out-of-bounds access. | |
| * Fields: | |
| * rows - Number of rows | |
| * cols - Number of columns | |
| * data - Allocated matrix data (rows * cols elements) | |
| * capacity - Total capacity in elements (for validation) | |
| */ | |
| typedef struct { | |
| size_t rows; | |
| size_t cols; | |
| int64_t *data; | |
| size_t capacity; | |
| } SafeMatrix; | |
| /* | |
| * safe_alloc_matrix -- Allocate a matrix with overflow checking | |
| * | |
| * Allocates a rows x cols matrix of int64_t values. | |
| * Checks for overflow in rows * cols * sizeof(int64_t) before allocation. | |
| * | |
| * Parameters: | |
| * rows - Number of rows | |
| * cols - Number of columns | |
| * | |
| * Returns: | |
| * Pointer to SafeMatrix on success | |
| * NULL if allocation failed or overflow detected | |
| */ | |
| SafeMatrix* safe_alloc_matrix(size_t rows, size_t cols); | |
| /* | |
| * safe_free_matrix -- Free a SafeMatrix allocated by safe_alloc_matrix | |
| * | |
| * Parameters: | |
| * m - Pointer to SafeMatrix to free (safe to call with NULL) | |
| */ | |
| void safe_free_matrix(SafeMatrix *m); | |
| /* | |
| * validate_matrix_buffer -- Validate caller-provided buffer dimensions | |
| * | |
| * Checks that declared_rows * declared_cols does not exceed actual_capacity. | |
| * Used to validate buffers passed from callers that don't track capacity. | |
| * | |
| * Parameters: | |
| * data - Pointer to buffer (checked for NULL) | |
| * declared_rows - Declared number of rows | |
| * declared_cols - Declared number of columns | |
| * actual_capacity - Actual number of elements in buffer | |
| * | |
| * Returns: | |
| * VER_OK - Dimensions valid | |
| * VER_NULL_INPUT - data pointer is NULL | |
| * VER_BUFFER_OVERFLOW - declared_rows * declared_cols > actual_capacity | |
| * VER_OVERFLOW - Multiplication overflowed | |
| */ | |
| VerifyResult validate_matrix_buffer( | |
| const int64_t *data, | |
| size_t declared_rows, | |
| size_t declared_cols, | |
| size_t actual_capacity | |
| ); | |
| /* | |
| * ============================================================================ | |
| * RESOURCE VALIDATION FUNCTIONS | |
| * ============================================================================ | |
| */ | |
| /* | |
| * sov_check_dimensions -- Validate that dimensions do not exceed maximum | |
| * | |
| * Checks that both n and m are <= SOV_MAX_MATRIX_DIM. | |
| * | |
| * Parameters: | |
| * n, m - Matrix dimensions to check | |
| * | |
| * Returns: | |
| * VER_OK - Dimensions are valid | |
| * VER_DIMS_EXCEEDED - Either dimension exceeds maximum | |
| */ | |
| VerifyResult sov_check_dimensions(size_t n, size_t m); | |
| /* | |
| * sov_check_matrix_cells -- Validate that matrix does not exceed cell limit | |
| * | |
| * Checks that rows * cols <= SOV_MAX_MATRIX_CELLS. | |
| * Includes overflow checking. | |
| * | |
| * Parameters: | |
| * rows, cols - Matrix dimensions | |
| * | |
| * Returns: | |
| * VER_OK - Cell count is within limits | |
| * VER_CELLS_EXCEEDED - Total cells exceed maximum | |
| * VER_OVERFLOW - Multiplication overflowed | |
| */ | |
| VerifyResult sov_check_matrix_cells(size_t rows, size_t cols); | |
| /* | |
| * sov_add_operation_cost -- Track operation budget and check if exceeded | |
| * | |
| * Adds cost to the operation count in budget. Sets budget_exceeded if | |
| * operation_count would exceed max_operations. | |
| * | |
| * Parameters: | |
| * budget - Pointer to SovResourceBudget struct | |
| * cost - Number of operations to add (typically m*n*k for multiplication) | |
| * | |
| * Returns: | |
| * VER_OK - Operation added within budget | |
| * VER_OPS_EXCEEDED - Would exceed operation budget | |
| * VER_NULL_INPUT - budget pointer is NULL | |
| */ | |
| VerifyResult sov_add_operation_cost(SovResourceBudget *budget, size_t cost); | |
| /* | |
| * sov_init_resource_budget -- Initialize a resource budget to defaults | |
| * | |
| * Parameters: | |
| * budget - Pointer to SovResourceBudget struct to initialize | |
| * | |
| * Returns: | |
| * VER_OK or VER_NULL_INPUT | |
| */ | |
| VerifyResult sov_init_resource_budget(SovResourceBudget *budget); | |
| /* | |
| * ============================================================================ | |
| * VERIFICATION ENGINES | |
| * ============================================================================ | |
| */ | |
| /* | |
| * sov_verify_inv -- Verify that A*X = I (exact invariant) | |
| * | |
| * Given n x n matrix A and n x n matrix X, verify A*X = I exactly. | |
| * Uses int64_t arithmetic with overflow detection. | |
| * Enforces resource limits for dimension and operation budget. | |
| * | |
| * MEMORY SAFETY: Caller must provide A_len and X_len to indicate actual | |
| * buffer sizes. These are validated against n*n before computation. | |
| * | |
| * Parameters: | |
| * A - n x n matrix (row-major order, n*n elements) | |
| * A_len - Actual size of buffer A (in elements) | |
| * X - n x n matrix (row-major order, n*n elements) | |
| * X_len - Actual size of buffer X (in elements) | |
| * n - Matrix dimension (n x n) | |
| * budget - Optional resource budget (if NULL, defaults are used) | |
| * | |
| * Returns: | |
| * VER_OK - A*X = I verified exactly | |
| * VER_FAIL - A*X != I | |
| * VER_OVERFLOW - Arithmetic overflow or dimension overflow | |
| * VER_DIMENSION_MISMATCH - Inconsistent dimensions | |
| * VER_NULL_INPUT - Null pointer | |
| * VER_BUFFER_OVERFLOW - Buffer size validation failed | |
| * VER_ALLOC_FAILURE - Temporary buffer allocation failed | |
| * VER_DIMS_EXCEEDED - Dimension exceeds limit | |
| * VER_CELLS_EXCEEDED - Matrix cells exceed limit | |
| * VER_OPS_EXCEEDED - Operation budget exceeded | |
| */ | |
| VerifyResult sov_verify_inv(const int64_t *A, | |
| size_t A_len, | |
| const int64_t *X, | |
| size_t X_len, | |
| size_t n, | |
| SovResourceBudget *budget); | |
| /* | |
| * sov_verify_sol -- Verify that A*x = b (exact linear system solution) | |
| * | |
| * Given m x n matrix A, vector x (n elements), and vector b (m elements), | |
| * verify that A*x = b exactly. | |
| * Enforces resource limits for dimension and operation budget. | |
| * | |
| * MEMORY SAFETY: Caller must provide buffer lengths for validation. | |
| * | |
| * Parameters: | |
| * A - m x n matrix (row-major order, m*n elements) | |
| * A_len - Actual size of buffer A (in elements) | |
| * x - Solution vector (n elements) | |
| * x_len - Actual size of buffer x (in elements) | |
| * b - Right-hand side vector (m elements) | |
| * b_len - Actual size of buffer b (in elements) | |
| * m, n - Matrix dimensions | |
| * budget - Optional resource budget (if NULL, defaults are used) | |
| * | |
| * Returns: | |
| * VER_OK - A*x = b verified exactly | |
| * VER_FAIL - A*x != b | |
| * VER_OVERFLOW - Arithmetic overflow or dimension overflow | |
| * VER_DIMENSION_MISMATCH - Inconsistent dimensions | |
| * VER_NULL_INPUT - Null pointer | |
| * VER_BUFFER_OVERFLOW - Buffer size validation failed | |
| * VER_ALLOC_FAILURE - Temporary buffer allocation failed | |
| * VER_DIMS_EXCEEDED - Dimension exceeds limit | |
| * VER_CELLS_EXCEEDED - Matrix cells exceed limit | |
| * VER_OPS_EXCEEDED - Operation budget exceeded | |
| */ | |
| VerifyResult sov_verify_sol(const int64_t *A, | |
| size_t A_len, | |
| const int64_t *x, | |
| size_t x_len, | |
| const int64_t *b, | |
| size_t b_len, | |
| size_t m, | |
| size_t n, | |
| SovResourceBudget *budget); | |
| /* | |
| * sov_verify_lstsq -- Verify that A^T(Ax-b) = 0 (exact least squares) | |
| * | |
| * Given m x n matrix A, vector x (n elements), vector b (m elements), | |
| * verify that the normal equations hold exactly: A^T(Ax-b) = 0. | |
| * Enforces resource limits for dimension and operation budget. | |
| * | |
| * This checks: for all i in [0, n): | |
| * sum_j A[j][i] * (A[j][k] * x[k] - b[j]) = 0 | |
| * | |
| * MEMORY SAFETY: Caller must provide buffer lengths for validation. | |
| * | |
| * Parameters: | |
| * A - m x n matrix (row-major order, m*n elements) | |
| * A_len - Actual size of buffer A (in elements) | |
| * x - Solution vector (n elements) | |
| * x_len - Actual size of buffer x (in elements) | |
| * b - Right-hand side vector (m elements) | |
| * b_len - Actual size of buffer b (in elements) | |
| * m, n - Matrix dimensions | |
| * budget - Optional resource budget (if NULL, defaults are used) | |
| * | |
| * Returns: | |
| * VER_OK - A^T(Ax-b) = 0 verified exactly | |
| * VER_FAIL - Normal equations don't hold | |
| * VER_OVERFLOW - Arithmetic overflow or dimension overflow | |
| * VER_DIMENSION_MISMATCH - Inconsistent dimensions | |
| * VER_NULL_INPUT - Null pointer | |
| * VER_BUFFER_OVERFLOW - Buffer size validation failed | |
| * VER_ALLOC_FAILURE - Temporary buffer allocation failed | |
| * VER_DIMS_EXCEEDED - Dimension exceeds limit | |
| * VER_CELLS_EXCEEDED - Matrix cells exceed limit | |
| * VER_OPS_EXCEEDED - Operation budget exceeded | |
| */ | |
| VerifyResult sov_verify_lstsq(const int64_t *A, | |
| size_t A_len, | |
| const int64_t *x, | |
| size_t x_len, | |
| const int64_t *b, | |
| size_t b_len, | |
| size_t m, | |
| size_t n, | |
| SovResourceBudget *budget); | |
| /* | |
| * ============================================================================ | |
| * HELPER FUNCTIONS | |
| * ============================================================================ | |
| */ | |
| /* Compute A*x into result vector (m elements) with resource budget tracking | |
| * Returns VER_OK on success, VER_OVERFLOW on overflow, VER_OPS_EXCEEDED if budget exhausted | |
| */ | |
| VerifyResult sov_matrix_vec_mult_with_budget(const int64_t *A, | |
| const int64_t *x, | |
| int64_t *result, | |
| size_t m, | |
| size_t n, | |
| SovResourceBudget *budget); | |
| /* Compute A*x into result vector (m elements) | |
| * Returns VER_OK on success, VER_OVERFLOW on overflow | |
| */ | |
| VerifyResult sov_matrix_vec_mult(const int64_t *A, | |
| const int64_t *x, | |
| int64_t *result, | |
| size_t m, | |
| size_t n); | |
| /* Compute A*B into result matrix (m x p) with resource budget tracking | |
| * A is m x n, B is n x p | |
| * Returns VER_OK on success, VER_OVERFLOW on overflow, VER_OPS_EXCEEDED if budget exhausted | |
| */ | |
| VerifyResult sov_matrix_mult_with_budget(const int64_t *A, | |
| const int64_t *B, | |
| int64_t *result, | |
| size_t m, | |
| size_t n, | |
| size_t p, | |
| SovResourceBudget *budget); | |
| /* Compute A*B into result matrix (m x p) | |
| * A is m x n, B is n x p | |
| * Returns VER_OK on success, VER_OVERFLOW on overflow | |
| */ | |
| VerifyResult sov_matrix_mult(const int64_t *A, | |
| const int64_t *B, | |
| int64_t *result, | |
| size_t m, | |
| size_t n, | |
| size_t p); | |
| /* Transpose matrix: A is m x n, result is n x m | |
| * Returns VER_OK on success | |
| */ | |
| VerifyResult sov_matrix_transpose(const int64_t *A, | |
| int64_t *result, | |
| size_t m, | |
| size_t n); | |
| /* Check if all elements equal */ | |
| bool sov_matrix_equal(const int64_t *A, | |
| const int64_t *B, | |
| size_t nelems); | |
| /* Convert result enum to string */ | |
| const char *sov_verify_result_to_string(VerifyResult r); | |
| /* | |
| * sov_matrix_vec_mult_safe -- Safe matrix-vector multiply with buffer validation | |
| * | |
| * Like sov_matrix_vec_mult but validates buffer sizes first. | |
| * | |
| * Parameters: | |
| * A - m x n matrix | |
| * A_len - Actual size of A buffer | |
| * x - n-element vector | |
| * x_len - Actual size of x buffer | |
| * result - m-element result vector | |
| * result_len - Actual size of result buffer | |
| * m, n - Matrix dimensions | |
| * | |
| * Returns: | |
| * VER_OK on success, VER_BUFFER_OVERFLOW if buffers too small, VER_OVERFLOW on arithmetic overflow | |
| */ | |
| VerifyResult sov_matrix_vec_mult_safe( | |
| const int64_t *A, | |
| size_t A_len, | |
| const int64_t *x, | |
| size_t x_len, | |
| int64_t *result, | |
| size_t result_len, | |
| size_t m, | |
| size_t n | |
| ); | |
| } | |