Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Agent skill for security-manager - invoke with $agent-security-manager
.claude/skills/agent-security-manager/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✗→✓ | ▲ Improved | — | — |
| case-21 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
Implements comprehensive security mechanisms for distributed consensus protocols with advanced threat detection.
javascriptclass ThresholdSignatureSystem { constructor(threshold, totalParties, curveType = 'secp256k1') { this.t = threshold; // Minimum signatures required this.n = totalParties; // Total number of parties this.curve = this.initializeCurve(curveType); this.masterPublicKey = null; this.privateKeyShares = new Map(); this.publicKeyShares = new Map(); this.polynomial = null; } // Distributed Key Generation (DKG) Protocol async generateDistributedKeys() { // Phase 1: Each party generates secret polynomial const secretPolynomial = this.generateSecretPolynomial(); const commitments = this.generateCommitments(secretPolynomial); // Phase 2: Broadcast commitments await this.broadcastCommitments(commitments); // Phase 3: Share secret values const secretShares = this.generateSecretShares(secretPolynomial); await this.distributeSecretShares(secretShares); // Phase 4: Verify received shares const validShares = await this.verifyReceivedShares(); // Phase 5: Combine to create master keys this.masterPublicKey = this.combineMasterPublicKey(validShares); return { masterPublicKey: this.masterPublicKey, privateKeyShare: this.privateKeyShares.get(this.nodeId), publicKeyShares: this.publicKeyShares }; } // Threshold Signature Creation async createThresholdSignature(message, signatories) { if (signatories.length < this.t) { throw new Error('Insufficient signatories for threshold'); } const partialSignatures = []; // Each signatory creates partial signature for (const signatory of signatories) { const partialSig = await this.createPartialSignature(message, signatory); partialSignatures.push({ signatory: signatory, signature: partialSig, publicKeyShare: this.publicKeyShares.get(signatory) }); } // Verify partial signatures const validPartials = partialSignatures.filter(ps => this.verifyPartialSignature(message, ps.signature, ps.publicKeyShare) ); if (validPartials.length < this.t) { throw new Error('Insufficient valid partial signatures'); } // Combine partial signatures using Lagrange interpolation return this.combinePartialSignatures(message, validPartials.slice(0, this.t)); } // Signature Verification verifyThresholdSignature(message, signature) { return this.curve.verify(message, signature, this.masterPublicKey); } // Lagrange Interpolation for Signature Combination combinePartialSignatures(message, partialSignatures) { const lambda = this.computeLagrangeCoefficients( partialSignatures.map(ps => ps.signatory) ); let combinedSignature = this.curve.infinity(); for (let i = 0; i < partialSignatures.length; i++) { const weighted = this.curve.multiply( partialSignatures[i].signature, lambda[i] ); combinedSignature = this.curve.add(combinedSignature, weighted); } return combinedSignature; } }
javascriptclass ZeroKnowledgeProofSystem { constructor() { this.curve = new EllipticCurve('secp256k1'); this.hashFunction = 'sha256'; this.proofCache = new Map(); } // Prove knowledge of discrete logarithm (Schnorr proof) async proveDiscreteLog(secret, publicKey, challenge = null) { // Generate random nonce const nonce = this.generateSecureRandom(); const commitment = this.curve.multiply(this.curve.generator, nonce); // Use provided challenge or generate Fiat-Shamir challenge const c = challenge || this.generateChallenge(commitment, publicKey); // Compute response const response = (nonce + c * secret) % this.curve.order; return { commitment: commitment, challenge: c, response: response }; } // Verify discrete logarithm proof verifyDiscreteLogProof(proof, publicKey) { const { commitment, challenge, response } = proof; // Verify: g^response = commitment * publicKey^challenge const leftSide = this.curve.multiply(this.curve.generator, response); const rightSide = this.curve.add( commitment, this.curve.multiply(publicKey, challenge) ); return this.curve.equals(leftSide, rightSide); } // Range proof for committed values async proveRange(value, commitment, min, max) { if (value < min || value > max) { throw new Error('Value outside specified range'); } const bitLength = Math.ceil(Math.log2(max - min + 1)); const bits = this.valueToBits(value - min, bitLength); const proofs = []; let currentCommitment = commitment; // Create proof for each bit for (let i = 0; i < bitLength; i++) { const bitProof = await this.proveBit(bits[i], currentCommitment); proofs.push(bitProof); // Update commitment for next bit currentCommitment = this.updateCommitmentForNextBit(currentCommitment, bits[i]); } return { bitProofs: proofs, range: { min, max }, bitLength: bitLength }; } // Bulletproof implementation for range proofs async createBulletproof(value, commitment, range) { const n = Math.ceil(Math.log2(range)); const generators = this.generateBulletproofGenerators(n); // Inner product argument const innerProductProof = await this.createInnerProductProof( value, commitment, generators ); return { type: 'bulletproof', commitment: commitment, proof: innerProductProof, generators: generators, range: range }; } }
javascriptclass ConsensusSecurityMonitor { constructor() { this.attackDetectors = new Map(); this.behaviorAnalyzer = new BehaviorAnalyzer(); this.reputationSystem = new ReputationSystem(); this.alertSystem = new SecurityAlertSystem(); this.forensicLogger = new ForensicLogger(); } // Byzantine Attack Detection async detectByzantineAttacks(consensusRound) { const participants = consensusRound.participants; const messages = consensusRound.messages; const anomalies = []; // Detect contradictory messages from same node const contradictions = this.detectContradictoryMessages(messages); if (contradictions.length > 0) { anomalies.push({ type: 'CONTRADICTORY_MESSAGES', severity: 'HIGH', details: contradictions }); } // Detect timing-based attacks const timingAnomalies = this.detectTimingAnomalies(messages); if (timingAnomalies.length > 0) { anomalies.push({ type: 'TIMING_ATTACK', severity: 'MEDIUM', details: timingAnomalies }); } // Detect collusion patterns const collusionPatterns = await this.detectCollusion(participants, messages); if (collusionPatterns.length > 0) { anomalies.push({ type: 'COLLUSION_DETECTED', severity: 'HIGH', details: collusionPatterns }); } // Update reputation scores for (const participant of participants) { await this.reputationSystem.updateReputation( participant, anomalies.filter(a => a.details.includes(participant)) ); } return anomalies; } // Sybil Attack Prevention async preventSybilAttacks(nodeJoinRequest) { const identityVerifiers = [ this.verifyProofOfWork(nodeJoinRequest), this.verifyStakeProof(nodeJoinRequest), this.verifyIdentityCredentials(nodeJoinRequest), this.checkReputationHistory(nodeJoinRequest) ]; const verificationResults = await Promise.all(identityVerifiers); const passedVerifications = verificationResults.filter(r => r.valid); // Require multiple verification methods const requiredVerifications = 2; if (passedVerifications.length < requiredVerifications) { throw new SecurityError('Insufficient identity verification for node join'); } // Additional checks for suspicious patterns const suspiciousPatterns = await this.detectSybilPatterns(nodeJoinRequest); if (suspiciousPatterns.length > 0) { await this.alertSystem.raiseSybilAlert(nodeJoinRequest, suspiciousPatterns); throw new SecurityError('Potential Sybil attack detected'); } return true; } // Eclipse Attack Protection async protectAgainstEclipseAttacks(nodeId, connectionRequests) { const diversityMetrics = this.analyzePeerDiversity(connectionRequests); // Check for geographic diversity if (diversityMetrics.geographicEntropy < 2.0) { await this.enforceGeographicDiversity(nodeId, connectionRequests); } // Check for network diversity (ASNs) if (diversityMetrics.networkEntropy < 1.5) { await this.enforceNetworkDiversity(nodeId, connectionRequests); } // Limit connections from single source const maxConnectionsPerSource = 3; const groupedConnections = this.groupConnectionsBySource(connectionRequests); for (const [source, connections] of groupedConnections) { if (connections.length > maxConnectionsPerSource) { await this.alertSystem.raiseEclipseAlert(nodeId, source, connections); // Randomly select subset of connections const allowedConnections = this.randomlySelectConnections( connections, maxConnectionsPerSource ); this.blockExcessConnections( connections.filter(c => !allowedConnections.includes(c)) ); } } } // DoS Attack Mitigation async mitigateDoSAttacks(incomingRequests) { const rateLimiter = new AdaptiveRateLimiter(); const requestAnalyzer = new RequestPatternAnalyzer(); // Analyze request patterns for anomalies const anomalousRequests = await requestAnalyzer.detectAnomalies(incomingRequests); if (anomalousRequests.length > 0) { // Implement progressive response strategies const mitigationStrategies = [ this.applyRateLimiting(anomalousRequests), this.implementPriorityQueuing(incomingRequests), this.activateCircuitBreakers(anomalousRequests), this.deployTemporaryBlacklisting(anomalousRequests) ]; await Promise.all(mitigationStrategies); } return this.filterLegitimateRequests(incomingRequests, anomalousRequests); } }
javascriptclass SecureKeyManager { constructor() { this.keyStore = new EncryptedKeyStore(); this.rotationScheduler = new KeyRotationScheduler(); this.distributionProtocol = new SecureDistributionProtocol(); this.backupSystem = new SecureBackupSystem(); } // Distributed Key Generation async generateDistributedKey(participants, threshold) { const dkgProtocol = new DistributedKeyGeneration(threshold, participants.length); // Phase 1: Initialize DKG ceremony const ceremony = await dkgProtocol.initializeCeremony(participants); // Phase 2: Each participant contributes randomness const contributions = await this.collectContributions(participants, ceremony); // Phase 3: Verify contributions const validContributions = await this.verifyContributions(contributions); // Phase 4: Combine contributions to generate master key const masterKey = await dkgProtocol.combineMasterKey(validContributions); // Phase 5: Generate and distribute key shares const keyShares = await dkgProtocol.generateKeyShares(masterKey, participants); // Phase 6: Secure distribution of key shares await this.securelyDistributeShares(keyShares, participants); return { masterPublicKey: masterKey.publicKey, ceremony: ceremony, participants: participants }; } // Key Rotation Protocol async rotateKeys(currentKeyId, participants) { // Generate new key using proactive secret sharing const newKey = await this.generateDistributedKey(participants, Math.floor(participants.length / 2) + 1); // Create transition period where both keys are valid const transitionPeriod = 24 * 60 * 60 * 1000; // 24 hours await this.scheduleKeyTransition(currentKeyId, newKey.masterPublicKey, transitionPeriod); // Notify all participants about key rotation await this.notifyKeyRotation(participants, newKey); // Gradually phase out old key setTimeout(async () => { await this.deactivateKey(currentKeyId); }, transitionPeriod); return newKey; } // Secure Key Backup and Recovery async backupKeyShares(keyShares, backupThreshold) { const backupShares = this.createBackupShares(keyShares, backupThreshold); // Encrypt backup shares with different passwords const encryptedBackups = await Promise.all( backupShares.map(async (share, index) => ({ id: `backup_${index}`, encryptedShare: await this.encryptBackupShare(share, `password_${index}`), checksum: this.computeChecksum(share) })) ); // Distribute backups to secure locations await this.distributeBackups(encryptedBackups); return encryptedBackups.map(backup => ({ id: backup.id, checksum: backup.checksum })); } async recoverFromBackup(backupIds, passwords) { const backupShares = []; // Retrieve and decrypt backup shares for (let i = 0; i < backupIds.length; i++) { const encryptedBackup = await this.retrieveBackup(backupIds[i]); const decryptedShare = await this.decryptBackupShare( encryptedBackup.encryptedShare, passwords[i] ); // Verify integrity const checksum = this.computeChecksum(decryptedShare); if (checksum !== encryptedBackup.checksum) { throw new Error(`Backup integrity check failed for ${backupIds[i]}`); } backupShares.push(decryptedShare); } // Reconstruct original key from backup shares return this.reconstructKeyFromBackup(backupShares); } }
javascript// Store security metrics in memory await this.mcpTools.memory_usage({ action: 'store', key: `security_metrics_${Date.now()}`, value: JSON.stringify({ attacksDetected: this.attacksDetected, reputationScores: Array.from(this.reputationSystem.scores.entries()), keyRotationEvents: this.keyRotationHistory }), namespace: 'consensus_security', ttl: 86400000 // 24 hours }); // Performance monitoring for security operations await this.mcpTools.metrics_collect({ components: [ 'signature_verification_time', 'zkp_generation_time', 'attack_detection_latency', 'key_rotation_overhead' ] });
javascript// Learn attack patterns await this.mcpTools.neural_patterns({ action: 'learn', operation: 'attack_pattern_recognition', outcome: JSON.stringify({ attackType: detectedAttack.type, patterns: detectedAttack.patterns, mitigation: appliedMitigation }) }); // Predict potential security threats const threatPrediction = await this.mcpTools.neural_predict({ modelId: 'security_threat_model', input: JSON.stringify(currentSecurityMetrics) });
javascriptclass ByzantineConsensusSecurityWrapper { constructor(byzantineCoordinator, securityManager) { this.consensus = byzantineCoordinator; this.security = securityManager; } async secureConsensusRound(proposal) { // Pre-consensus security checks await this.security.validateProposal(proposal); // Execute consensus with security monitoring const result = await this.executeSecureConsensus(proposal); // Post-consensus security analysis await this.security.analyzeConsensusRound(result); return result; } async executeSecureConsensus(proposal) { // Sign proposal with threshold signature const signedProposal = await this.security.thresholdSignature.sign(proposal); // Monitor consensus execution for attacks const monitor = this.security.startConsensusMonitoring(); try { // Execute Byzantine consensus const result = await this.consensus.initiateConsensus(signedProposal); // Verify result integrity await this.security.verifyConsensusResult(result); return result; } finally { monitor.stop(); } } }
javascriptclass ConsensusPenetrationTester { constructor(securityManager) { this.security = securityManager; this.testScenarios = new Map(); this.vulnerabilityDatabase = new VulnerabilityDatabase(); } async runSecurityTests() { const testResults = []; // Test 1: Byzantine attack simulation testResults.push(await this.testByzantineAttack()); // Test 2: Sybil attack simulation testResults.push(await this.testSybilAttack()); // Test 3: Eclipse attack simulation testResults.push(await this.testEclipseAttack()); // Test 4: DoS attack simulation testResults.push(await this.testDoSAttack()); // Test 5: Cryptographic security tests testResults.push(await this.testCryptographicSecurity()); return this.generateSecurityReport(testResults); } async testByzantineAttack() { // Simulate malicious nodes sending contradictory messages const maliciousNodes = this.createMaliciousNodes(3); const attack = new ByzantineAttackSimulator(maliciousNodes); const startTime = Date.now(); const detectionTime = await this.security.detectByzantineAttacks(attack.execute()); const endTime = Date.now(); return { test: 'Byzantine Attack', detected: detectionTime !== null, detectionLatency: detectionTime ? endTime - startTime : null, mitigation: await this.security.mitigateByzantineAttack(attack) }; } }
This security manager provides comprehensive protection for distributed consensus protocols with enterprise-grade cryptographic security, advanced threat detection, and robust key management capabilities.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 21 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.