● Notice //GitHub (@shehzade) is temporarily suspended pending an automated false-positive review. All tools are hosted on this Code Mirror and available on request (contact); GitHub links will return once reinstated.
PUBLIC MIRRORGo v1.0

Multi-protocol network egress assessment and DLP verification framework featuring automated L4 sweeps, corporate proxy traversal, and covert protocol smuggling across 20+ channels.

$ git clone https://shehzade.io/repos/contraband.git Copy
Source ZIP (1.93 MB)
Code 174 Commits 1
contraband / pkg / client / dlp / ssn.go
← Back to directory
120 lines · 2.9 KB
Raw
1package dlp
2
3import (
4 "fmt"
5 "math/rand"
6 "strconv"
7 "strings"
8)
9
10// GenerateSSN produces a valid US Social Security Number meeting SSA rules.
11func GenerateSSN(r *rand.Rand, formatted bool) string {
12 var area int
13 for {
14 area = 1 + r.Intn(899)
15 if area != 666 {
16 break
17 }
18 }
19 group := 1 + r.Intn(99)
20 serial := 1 + r.Intn(9999)
21
22 if formatted {
23 return fmt.Sprintf("%03d-%02d-%04d", area, group, serial)
24 }
25 return fmt.Sprintf("%03d%02d%04d", area, group, serial)
26}
27
28// ValidateSSN tests a string against US SSA rules.
29func ValidateSSN(ssn string) bool {
30 clean := strings.ReplaceAll(strings.ReplaceAll(ssn, "-", ""), " ", "")
31 if len(clean) != 9 {
32 return false
33 }
34 for _, c := range clean {
35 if c < '0' || c > '9' {
36 return false
37 }
38 }
39 area, _ := strconv.Atoi(clean[0:3])
40 group, _ := strconv.Atoi(clean[3:5])
41 serial, _ := strconv.Atoi(clean[5:9])
42
43 if area == 0 || area == 666 || (area >= 900 && area <= 999) {
44 return false
45 }
46 if group == 0 || serial == 0 {
47 return false
48 }
49 return true
50}
51
52// GenerateNINO produces a valid UK National Insurance Number.
53func GenerateNINO(r *rand.Rand) string {
54 const firstLetters = "ABCEGHJKLMNOPRSTWXYZ"
55 const secondLetters = "ABCEGHJKLMNPRSTWXYZ"
56 const suffixes = "ABCD"
57
58 f := firstLetters[r.Intn(len(firstLetters))]
59 s := secondLetters[r.Intn(len(secondLetters))]
60 digits := fmt.Sprintf("%06d", r.Intn(1000000))
61 suf := suffixes[r.Intn(len(suffixes))]
62
63 return fmt.Sprintf("%c%c%s%c", f, s, digits, suf)
64}
65
66// ValidateNINO validates UK NINO format and invalid prefix/suffix restrictions.
67func ValidateNINO(nino string) bool {
68 clean := strings.ToUpper(strings.ReplaceAll(strings.ReplaceAll(nino, "-", ""), " ", ""))
69 if len(clean) != 9 {
70 return false
71 }
72 invalidPrefix := "DFIQUV"
73 if strings.ContainsRune(invalidPrefix, rune(clean[0])) {
74 return false
75 }
76 invalidSecond := "DFIOQUV"
77 if strings.ContainsRune(invalidSecond, rune(clean[1])) {
78 return false
79 }
80 for _, c := range clean[2:8] {
81 if c < '0' || c > '9' {
82 return false
83 }
84 }
85 last := clean[8]
86 return last == 'A' || last == 'B' || last == 'C' || last == 'D' || last == ' '
87}
88
89// GenerateSIN produces a valid 9-digit Canadian SIN passing Luhn Mod-10.
90func GenerateSIN(r *rand.Rand, formatted bool) string {
91 validFirst := []int{1, 2, 3, 4, 5, 6, 7, 9}
92 first := validFirst[r.Intn(len(validFirst))]
93
94 var sb strings.Builder
95 sb.WriteByte(byte('0' + first))
96 for i := 0; i < 7; i++ {
97 sb.WriteByte(byte('0' + r.Intn(10)))
98 }
99 chk, _ := GenerateLuhnCheckDigit(sb.String())
100 sb.WriteByte(byte('0' + chk))
101 raw := sb.String()
102
103 if formatted {
104 return fmt.Sprintf("%s-%s-%s", raw[0:3], raw[3:6], raw[6:9])
105 }
106 return raw
107}
108
109// ValidateSIN validates a Canadian SIN.
110func ValidateSIN(sin string) bool {
111 clean := strings.ReplaceAll(strings.ReplaceAll(sin, "-", ""), " ", "")
112 if len(clean) != 9 {
113 return false
114 }
115 first := clean[0] - '0'
116 if first == 0 || first == 8 {
117 return false
118 }
119 return ValidateLuhn(clean)
120}