UNPKG

@chittyos/core

Version:

ChittyOS Core - Essential package with ID, auth, verification, beacon tracking, and brand components for all ChittyOS applications

1 lines 9.23 kB
{"version":3,"sources":["../../src/verify/index.ts"],"sourcesContent":["/**\n * ChittyOS Verify - Data verification and validation\n */\n\nimport { z, ZodSchema } from 'zod'\nimport * as crypto from 'crypto'\n\nexport interface VerifyConfig {\n strictMode?: boolean\n hashAlgorithm?: string\n}\n\nexport interface VerificationResult {\n valid: boolean\n errors?: string[]\n warnings?: string[]\n}\n\nexport interface SignedData {\n data: any\n signature: string\n timestamp: string\n chittyId?: string\n}\n\nconst DEFAULT_CONFIG: VerifyConfig = {\n strictMode: false,\n hashAlgorithm: 'sha256'\n}\n\nlet config = { ...DEFAULT_CONFIG }\n\nexport function configure(customConfig: VerifyConfig): void {\n config = { ...config, ...customConfig }\n}\n\n/**\n * Validate data against a Zod schema\n */\nexport function validateSchema<T>(\n data: unknown,\n schema: ZodSchema<T>\n): VerificationResult & { data?: T } {\n try {\n const validated = schema.parse(data)\n return {\n valid: true,\n data: validated\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: error.errors.map(e => `${e.path.join('.')}: ${e.message}`)\n }\n }\n return {\n valid: false,\n errors: ['Validation failed']\n }\n }\n}\n\n/**\n * Common validation schemas\n */\nexport const schemas = {\n email: z.string().email(),\n\n chittyId: z.string().regex(/^CID_[A-Za-z0-9_-]{21}$/),\n\n uuid: z.string().uuid(),\n\n url: z.string().url(),\n\n phoneNumber: z.string().regex(/^\\+?[1-9]\\d{1,14}$/),\n\n dateTime: z.string().datetime(),\n\n ipAddress: z.string().ip(),\n\n semver: z.string().regex(/^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$/),\n\n strongPassword: z.string()\n .min(8)\n .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]/),\n\n jwt: z.string().regex(/^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/),\n\n base64: z.string().regex(/^[A-Za-z0-9+/]*={0,2}$/),\n\n hexColor: z.string().regex(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/),\n\n creditCard: z.string().regex(/^\\d{13,19}$/).refine(luhnCheck, {\n message: 'Invalid credit card number'\n })\n}\n\n/**\n * Luhn algorithm for credit card validation\n */\nfunction luhnCheck(cardNumber: string): boolean {\n const digits = cardNumber.replace(/\\D/g, '')\n let sum = 0\n let isEven = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = parseInt(digits[i], 10)\n\n if (isEven) {\n digit *= 2\n if (digit > 9) {\n digit -= 9\n }\n }\n\n sum += digit\n isEven = !isEven\n }\n\n return sum % 10 === 0\n}\n\n/**\n * Calculate hash of data\n */\nexport function hashData(data: any, algorithm = config.hashAlgorithm!): string {\n const stringData = typeof data === 'string' ? data : JSON.stringify(data)\n return crypto.createHash(algorithm).update(stringData).digest('hex')\n}\n\n/**\n * Verify data integrity using hash\n */\nexport function verifyIntegrity(data: any, expectedHash: string, algorithm = config.hashAlgorithm!): boolean {\n const actualHash = hashData(data, algorithm)\n return actualHash === expectedHash\n}\n\n/**\n * Create a signed data object\n */\nexport function signData(data: any, privateKey: string, chittyId?: string): SignedData {\n const timestamp = new Date().toISOString()\n const dataToSign = JSON.stringify({ data, timestamp })\n\n const sign = crypto.createSign('SHA256')\n sign.update(dataToSign)\n const signature = sign.sign(privateKey, 'base64')\n\n return {\n data,\n signature,\n timestamp,\n chittyId\n }\n}\n\n/**\n * Verify a signed data object\n */\nexport function verifySignedData(signedData: SignedData, publicKey: string): VerificationResult {\n try {\n const dataToVerify = JSON.stringify({\n data: signedData.data,\n timestamp: signedData.timestamp\n })\n\n const verify = crypto.createVerify('SHA256')\n verify.update(dataToVerify)\n const isValid = verify.verify(publicKey, signedData.signature, 'base64')\n\n return {\n valid: isValid,\n errors: isValid ? undefined : ['Invalid signature']\n }\n } catch (error) {\n return {\n valid: false,\n errors: ['Signature verification failed']\n }\n }\n}\n\n/**\n * Validate file checksum\n */\nexport async function validateChecksum(\n filePath: string,\n expectedChecksum: string,\n algorithm = 'sha256'\n): Promise<boolean> {\n const fs = await import('fs')\n const stream = fs.createReadStream(filePath)\n const hash = crypto.createHash(algorithm)\n\n return new Promise((resolve, reject) => {\n stream.on('data', (data) => hash.update(data))\n stream.on('end', () => {\n const actualChecksum = hash.digest('hex')\n resolve(actualChecksum === expectedChecksum)\n })\n stream.on('error', reject)\n })\n}\n\n/**\n * Sanitize user input\n */\nexport function sanitizeInput(input: string): string {\n // Remove control characters\n let sanitized = input.replace(/[\\x00-\\x1F\\x7F]/g, '')\n\n // Escape HTML entities\n sanitized = sanitized\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;')\n .replace(/\\//g, '&#x2F;')\n\n // Trim whitespace\n return sanitized.trim()\n}\n\n/**\n * Validate and sanitize JSON\n */\nexport function validateJSON(jsonString: string): VerificationResult & { data?: any } {\n try {\n const parsed = JSON.parse(jsonString)\n return {\n valid: true,\n data: parsed\n }\n } catch (error) {\n return {\n valid: false,\n errors: ['Invalid JSON: ' + (error as Error).message]\n }\n }\n}\n\nexport default {\n configure,\n validateSchema,\n schemas,\n hashData,\n verifyIntegrity,\n signData,\n verifySignedData,\n validateChecksum,\n sanitizeInput,\n validateJSON\n}"],"mappings":"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","names":[]}