var optab = []Optab{
// zero-length instructions
- Optab{i: 0, as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE},
- Optab{i: 0, as: obj.ATEXT, a1: C_ADDR, a3: C_LCON, a6: C_TEXTSIZE},
- Optab{i: 0, as: obj.APCDATA, a1: C_LCON, a6: C_LCON},
- Optab{i: 0, as: obj.AFUNCDATA, a1: C_SCON, a6: C_ADDR},
- Optab{i: 0, as: obj.ANOP},
- Optab{i: 0, as: obj.ANOP, a1: C_SAUTO},
+ {i: 0, as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE},
+ {i: 0, as: obj.ATEXT, a1: C_ADDR, a3: C_LCON, a6: C_TEXTSIZE},
+ {i: 0, as: obj.APCDATA, a1: C_LCON, a6: C_LCON},
+ {i: 0, as: obj.AFUNCDATA, a1: C_SCON, a6: C_ADDR},
+ {i: 0, as: obj.ANOP},
+ {i: 0, as: obj.ANOP, a1: C_SAUTO},
// move register
- Optab{i: 1, as: AMOVD, a1: C_REG, a6: C_REG},
- Optab{i: 1, as: AMOVB, a1: C_REG, a6: C_REG},
- Optab{i: 1, as: AMOVBZ, a1: C_REG, a6: C_REG},
- Optab{i: 1, as: AMOVW, a1: C_REG, a6: C_REG},
- Optab{i: 1, as: AMOVWZ, a1: C_REG, a6: C_REG},
- Optab{i: 1, as: AFMOVD, a1: C_FREG, a6: C_FREG},
- Optab{i: 1, as: AMOVDBR, a1: C_REG, a6: C_REG},
+ {i: 1, as: AMOVD, a1: C_REG, a6: C_REG},
+ {i: 1, as: AMOVB, a1: C_REG, a6: C_REG},
+ {i: 1, as: AMOVBZ, a1: C_REG, a6: C_REG},
+ {i: 1, as: AMOVW, a1: C_REG, a6: C_REG},
+ {i: 1, as: AMOVWZ, a1: C_REG, a6: C_REG},
+ {i: 1, as: AFMOVD, a1: C_FREG, a6: C_FREG},
+ {i: 1, as: AMOVDBR, a1: C_REG, a6: C_REG},
// load constant
- Optab{i: 26, as: AMOVD, a1: C_LACON, a6: C_REG},
- Optab{i: 26, as: AMOVW, a1: C_LACON, a6: C_REG},
- Optab{i: 26, as: AMOVWZ, a1: C_LACON, a6: C_REG},
- Optab{i: 3, as: AMOVD, a1: C_DCON, a6: C_REG},
- Optab{i: 3, as: AMOVW, a1: C_DCON, a6: C_REG},
- Optab{i: 3, as: AMOVWZ, a1: C_DCON, a6: C_REG},
- Optab{i: 3, as: AMOVB, a1: C_DCON, a6: C_REG},
- Optab{i: 3, as: AMOVBZ, a1: C_DCON, a6: C_REG},
+ {i: 26, as: AMOVD, a1: C_LACON, a6: C_REG},
+ {i: 26, as: AMOVW, a1: C_LACON, a6: C_REG},
+ {i: 26, as: AMOVWZ, a1: C_LACON, a6: C_REG},
+ {i: 3, as: AMOVD, a1: C_DCON, a6: C_REG},
+ {i: 3, as: AMOVW, a1: C_DCON, a6: C_REG},
+ {i: 3, as: AMOVWZ, a1: C_DCON, a6: C_REG},
+ {i: 3, as: AMOVB, a1: C_DCON, a6: C_REG},
+ {i: 3, as: AMOVBZ, a1: C_DCON, a6: C_REG},
// store constant
- Optab{i: 72, as: AMOVD, a1: C_SCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVW, a1: C_SCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVB, a1: C_SCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LAUTO},
- Optab{i: 72, as: AMOVD, a1: C_SCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVW, a1: C_SCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVB, a1: C_SCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LOREG},
- Optab{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LOREG},
+ {i: 72, as: AMOVD, a1: C_SCON, a6: C_LAUTO},
+ {i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LAUTO},
+ {i: 72, as: AMOVW, a1: C_SCON, a6: C_LAUTO},
+ {i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LAUTO},
+ {i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LAUTO},
+ {i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LAUTO},
+ {i: 72, as: AMOVB, a1: C_SCON, a6: C_LAUTO},
+ {i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LAUTO},
+ {i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LAUTO},
+ {i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LAUTO},
+ {i: 72, as: AMOVD, a1: C_SCON, a6: C_LOREG},
+ {i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LOREG},
+ {i: 72, as: AMOVW, a1: C_SCON, a6: C_LOREG},
+ {i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LOREG},
+ {i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LOREG},
+ {i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LOREG},
+ {i: 72, as: AMOVB, a1: C_SCON, a6: C_LOREG},
+ {i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LOREG},
+ {i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LOREG},
+ {i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LOREG},
// store
- Optab{i: 35, as: AMOVD, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVW, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVB, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LAUTO},
- Optab{i: 35, as: AMOVD, a1: C_REG, a6: C_LOREG},
- Optab{i: 35, as: AMOVW, a1: C_REG, a6: C_LOREG},
- Optab{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LOREG},
- Optab{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LOREG},
- Optab{i: 35, as: AMOVB, a1: C_REG, a6: C_LOREG},
- Optab{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LOREG},
- Optab{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LOREG},
- Optab{i: 74, as: AMOVD, a1: C_REG, a6: C_ADDR},
- Optab{i: 74, as: AMOVW, a1: C_REG, a6: C_ADDR},
- Optab{i: 74, as: AMOVWZ, a1: C_REG, a6: C_ADDR},
- Optab{i: 74, as: AMOVBZ, a1: C_REG, a6: C_ADDR},
- Optab{i: 74, as: AMOVB, a1: C_REG, a6: C_ADDR},
+ {i: 35, as: AMOVD, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVW, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVWZ, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVBZ, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVB, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVDBR, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVHBR, a1: C_REG, a6: C_LAUTO},
+ {i: 35, as: AMOVD, a1: C_REG, a6: C_LOREG},
+ {i: 35, as: AMOVW, a1: C_REG, a6: C_LOREG},
+ {i: 35, as: AMOVWZ, a1: C_REG, a6: C_LOREG},
+ {i: 35, as: AMOVBZ, a1: C_REG, a6: C_LOREG},
+ {i: 35, as: AMOVB, a1: C_REG, a6: C_LOREG},
+ {i: 35, as: AMOVDBR, a1: C_REG, a6: C_LOREG},
+ {i: 35, as: AMOVHBR, a1: C_REG, a6: C_LOREG},
+ {i: 74, as: AMOVD, a1: C_REG, a6: C_ADDR},
+ {i: 74, as: AMOVW, a1: C_REG, a6: C_ADDR},
+ {i: 74, as: AMOVWZ, a1: C_REG, a6: C_ADDR},
+ {i: 74, as: AMOVBZ, a1: C_REG, a6: C_ADDR},
+ {i: 74, as: AMOVB, a1: C_REG, a6: C_ADDR},
// load
- Optab{i: 36, as: AMOVD, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVW, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVWZ, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVBZ, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVB, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVDBR, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVHBR, a1: C_LAUTO, a6: C_REG},
- Optab{i: 36, as: AMOVD, a1: C_LOREG, a6: C_REG},
- Optab{i: 36, as: AMOVW, a1: C_LOREG, a6: C_REG},
- Optab{i: 36, as: AMOVWZ, a1: C_LOREG, a6: C_REG},
- Optab{i: 36, as: AMOVBZ, a1: C_LOREG, a6: C_REG},
- Optab{i: 36, as: AMOVB, a1: C_LOREG, a6: C_REG},
- Optab{i: 36, as: AMOVDBR, a1: C_LOREG, a6: C_REG},
- Optab{i: 36, as: AMOVHBR, a1: C_LOREG, a6: C_REG},
- Optab{i: 75, as: AMOVD, a1: C_ADDR, a6: C_REG},
- Optab{i: 75, as: AMOVW, a1: C_ADDR, a6: C_REG},
- Optab{i: 75, as: AMOVWZ, a1: C_ADDR, a6: C_REG},
- Optab{i: 75, as: AMOVBZ, a1: C_ADDR, a6: C_REG},
- Optab{i: 75, as: AMOVB, a1: C_ADDR, a6: C_REG},
+ {i: 36, as: AMOVD, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVW, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVWZ, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVBZ, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVB, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVDBR, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVHBR, a1: C_LAUTO, a6: C_REG},
+ {i: 36, as: AMOVD, a1: C_LOREG, a6: C_REG},
+ {i: 36, as: AMOVW, a1: C_LOREG, a6: C_REG},
+ {i: 36, as: AMOVWZ, a1: C_LOREG, a6: C_REG},
+ {i: 36, as: AMOVBZ, a1: C_LOREG, a6: C_REG},
+ {i: 36, as: AMOVB, a1: C_LOREG, a6: C_REG},
+ {i: 36, as: AMOVDBR, a1: C_LOREG, a6: C_REG},
+ {i: 36, as: AMOVHBR, a1: C_LOREG, a6: C_REG},
+ {i: 75, as: AMOVD, a1: C_ADDR, a6: C_REG},
+ {i: 75, as: AMOVW, a1: C_ADDR, a6: C_REG},
+ {i: 75, as: AMOVWZ, a1: C_ADDR, a6: C_REG},
+ {i: 75, as: AMOVBZ, a1: C_ADDR, a6: C_REG},
+ {i: 75, as: AMOVB, a1: C_ADDR, a6: C_REG},
// interlocked load and op
- Optab{i: 99, as: ALAAG, a1: C_REG, a2: C_REG, a6: C_LOREG},
+ {i: 99, as: ALAAG, a1: C_REG, a2: C_REG, a6: C_LOREG},
// integer arithmetic
- Optab{i: 2, as: AADD, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 2, as: AADD, a1: C_REG, a6: C_REG},
- Optab{i: 22, as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG},
- Optab{i: 22, as: AADD, a1: C_LCON, a6: C_REG},
- Optab{i: 12, as: AADD, a1: C_LOREG, a6: C_REG},
- Optab{i: 12, as: AADD, a1: C_LAUTO, a6: C_REG},
- Optab{i: 21, as: ASUB, a1: C_LCON, a2: C_REG, a6: C_REG},
- Optab{i: 21, as: ASUB, a1: C_LCON, a6: C_REG},
- Optab{i: 12, as: ASUB, a1: C_LOREG, a6: C_REG},
- Optab{i: 12, as: ASUB, a1: C_LAUTO, a6: C_REG},
- Optab{i: 4, as: AMULHD, a1: C_REG, a6: C_REG},
- Optab{i: 4, as: AMULHD, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 2, as: ADIVW, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 2, as: ADIVW, a1: C_REG, a6: C_REG},
- Optab{i: 10, as: ASUB, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 10, as: ASUB, a1: C_REG, a6: C_REG},
- Optab{i: 47, as: ANEG, a1: C_REG, a6: C_REG},
- Optab{i: 47, as: ANEG, a6: C_REG},
+ {i: 2, as: AADD, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 2, as: AADD, a1: C_REG, a6: C_REG},
+ {i: 22, as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG},
+ {i: 22, as: AADD, a1: C_LCON, a6: C_REG},
+ {i: 12, as: AADD, a1: C_LOREG, a6: C_REG},
+ {i: 12, as: AADD, a1: C_LAUTO, a6: C_REG},
+ {i: 21, as: ASUB, a1: C_LCON, a2: C_REG, a6: C_REG},
+ {i: 21, as: ASUB, a1: C_LCON, a6: C_REG},
+ {i: 12, as: ASUB, a1: C_LOREG, a6: C_REG},
+ {i: 12, as: ASUB, a1: C_LAUTO, a6: C_REG},
+ {i: 4, as: AMULHD, a1: C_REG, a6: C_REG},
+ {i: 4, as: AMULHD, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 2, as: ADIVW, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 2, as: ADIVW, a1: C_REG, a6: C_REG},
+ {i: 10, as: ASUB, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 10, as: ASUB, a1: C_REG, a6: C_REG},
+ {i: 47, as: ANEG, a1: C_REG, a6: C_REG},
+ {i: 47, as: ANEG, a6: C_REG},
// integer logical
- Optab{i: 6, as: AAND, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 6, as: AAND, a1: C_REG, a6: C_REG},
- Optab{i: 23, as: AAND, a1: C_LCON, a6: C_REG},
- Optab{i: 12, as: AAND, a1: C_LOREG, a6: C_REG},
- Optab{i: 12, as: AAND, a1: C_LAUTO, a6: C_REG},
- Optab{i: 6, as: AANDW, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 6, as: AANDW, a1: C_REG, a6: C_REG},
- Optab{i: 24, as: AANDW, a1: C_LCON, a6: C_REG},
- Optab{i: 12, as: AANDW, a1: C_LOREG, a6: C_REG},
- Optab{i: 12, as: AANDW, a1: C_LAUTO, a6: C_REG},
- Optab{i: 7, as: ASLD, a1: C_REG, a6: C_REG},
- Optab{i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG},
- Optab{i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG},
- Optab{i: 7, as: ASLD, a1: C_SCON, a6: C_REG},
- Optab{i: 13, as: ARNSBG, a1: C_SCON, a3: C_SCON, a4: C_SCON, a5: C_REG, a6: C_REG},
+ {i: 6, as: AAND, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 6, as: AAND, a1: C_REG, a6: C_REG},
+ {i: 23, as: AAND, a1: C_LCON, a6: C_REG},
+ {i: 12, as: AAND, a1: C_LOREG, a6: C_REG},
+ {i: 12, as: AAND, a1: C_LAUTO, a6: C_REG},
+ {i: 6, as: AANDW, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 6, as: AANDW, a1: C_REG, a6: C_REG},
+ {i: 24, as: AANDW, a1: C_LCON, a6: C_REG},
+ {i: 12, as: AANDW, a1: C_LOREG, a6: C_REG},
+ {i: 12, as: AANDW, a1: C_LAUTO, a6: C_REG},
+ {i: 7, as: ASLD, a1: C_REG, a6: C_REG},
+ {i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG},
+ {i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG},
+ {i: 7, as: ASLD, a1: C_SCON, a6: C_REG},
+ {i: 13, as: ARNSBG, a1: C_SCON, a3: C_SCON, a4: C_SCON, a5: C_REG, a6: C_REG},
// compare and swap
- Optab{i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG},
+ {i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG},
// floating point
- Optab{i: 32, as: AFADD, a1: C_FREG, a6: C_FREG},
- Optab{i: 33, as: AFABS, a1: C_FREG, a6: C_FREG},
- Optab{i: 33, as: AFABS, a6: C_FREG},
- Optab{i: 34, as: AFMADD, a1: C_FREG, a2: C_FREG, a6: C_FREG},
- Optab{i: 32, as: AFMUL, a1: C_FREG, a6: C_FREG},
- Optab{i: 36, as: AFMOVD, a1: C_LAUTO, a6: C_FREG},
- Optab{i: 36, as: AFMOVD, a1: C_LOREG, a6: C_FREG},
- Optab{i: 75, as: AFMOVD, a1: C_ADDR, a6: C_FREG},
- Optab{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LAUTO},
- Optab{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LOREG},
- Optab{i: 74, as: AFMOVD, a1: C_FREG, a6: C_ADDR},
- Optab{i: 67, as: AFMOVD, a1: C_ZCON, a6: C_FREG},
- Optab{i: 81, as: ALDGR, a1: C_REG, a6: C_FREG},
- Optab{i: 81, as: ALGDR, a1: C_FREG, a6: C_REG},
- Optab{i: 82, as: ACEFBRA, a1: C_REG, a6: C_FREG},
- Optab{i: 83, as: ACFEBRA, a1: C_FREG, a6: C_REG},
- Optab{i: 48, as: AFIEBR, a1: C_SCON, a2: C_FREG, a6: C_FREG},
- Optab{i: 49, as: ACPSDR, a1: C_FREG, a2: C_FREG, a6: C_FREG},
- Optab{i: 50, as: ALTDBR, a1: C_FREG, a6: C_FREG},
- Optab{i: 51, as: ATCDB, a1: C_FREG, a6: C_SCON},
+ {i: 32, as: AFADD, a1: C_FREG, a6: C_FREG},
+ {i: 33, as: AFABS, a1: C_FREG, a6: C_FREG},
+ {i: 33, as: AFABS, a6: C_FREG},
+ {i: 34, as: AFMADD, a1: C_FREG, a2: C_FREG, a6: C_FREG},
+ {i: 32, as: AFMUL, a1: C_FREG, a6: C_FREG},
+ {i: 36, as: AFMOVD, a1: C_LAUTO, a6: C_FREG},
+ {i: 36, as: AFMOVD, a1: C_LOREG, a6: C_FREG},
+ {i: 75, as: AFMOVD, a1: C_ADDR, a6: C_FREG},
+ {i: 35, as: AFMOVD, a1: C_FREG, a6: C_LAUTO},
+ {i: 35, as: AFMOVD, a1: C_FREG, a6: C_LOREG},
+ {i: 74, as: AFMOVD, a1: C_FREG, a6: C_ADDR},
+ {i: 67, as: AFMOVD, a1: C_ZCON, a6: C_FREG},
+ {i: 81, as: ALDGR, a1: C_REG, a6: C_FREG},
+ {i: 81, as: ALGDR, a1: C_FREG, a6: C_REG},
+ {i: 82, as: ACEFBRA, a1: C_REG, a6: C_FREG},
+ {i: 83, as: ACFEBRA, a1: C_FREG, a6: C_REG},
+ {i: 48, as: AFIEBR, a1: C_SCON, a2: C_FREG, a6: C_FREG},
+ {i: 49, as: ACPSDR, a1: C_FREG, a2: C_FREG, a6: C_FREG},
+ {i: 50, as: ALTDBR, a1: C_FREG, a6: C_FREG},
+ {i: 51, as: ATCDB, a1: C_FREG, a6: C_SCON},
// load symbol address (plus offset)
- Optab{i: 19, as: AMOVD, a1: C_SYMADDR, a6: C_REG},
- Optab{i: 93, as: AMOVD, a1: C_GOTADDR, a6: C_REG},
- Optab{i: 94, as: AMOVD, a1: C_TLS_LE, a6: C_REG},
- Optab{i: 95, as: AMOVD, a1: C_TLS_IE, a6: C_REG},
+ {i: 19, as: AMOVD, a1: C_SYMADDR, a6: C_REG},
+ {i: 93, as: AMOVD, a1: C_GOTADDR, a6: C_REG},
+ {i: 94, as: AMOVD, a1: C_TLS_LE, a6: C_REG},
+ {i: 95, as: AMOVD, a1: C_TLS_IE, a6: C_REG},
// system call
- Optab{i: 5, as: ASYSCALL},
- Optab{i: 77, as: ASYSCALL, a1: C_SCON},
+ {i: 5, as: ASYSCALL},
+ {i: 77, as: ASYSCALL, a1: C_SCON},
// branch
- Optab{i: 16, as: ABEQ, a6: C_SBRA},
- Optab{i: 11, as: ABR, a6: C_LBRA},
- Optab{i: 16, as: ABC, a1: C_SCON, a2: C_REG, a6: C_LBRA},
- Optab{i: 18, as: ABR, a6: C_REG},
- Optab{i: 18, as: ABR, a1: C_REG, a6: C_REG},
- Optab{i: 15, as: ABR, a6: C_ZOREG},
- Optab{i: 15, as: ABC, a6: C_ZOREG},
- Optab{i: 89, as: ACMPBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
- Optab{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_ADDCON, a6: C_SBRA},
- Optab{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_SCON, a6: C_SBRA},
- Optab{i: 89, as: ACMPUBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
- Optab{i: 90, as: ACMPUBEQ, a1: C_REG, a3: C_ANDCON, a6: C_SBRA},
+ {i: 16, as: ABEQ, a6: C_SBRA},
+ {i: 11, as: ABR, a6: C_LBRA},
+ {i: 16, as: ABC, a1: C_SCON, a2: C_REG, a6: C_LBRA},
+ {i: 18, as: ABR, a6: C_REG},
+ {i: 18, as: ABR, a1: C_REG, a6: C_REG},
+ {i: 15, as: ABR, a6: C_ZOREG},
+ {i: 15, as: ABC, a6: C_ZOREG},
+ {i: 89, as: ACMPBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
+ {i: 90, as: ACMPBEQ, a1: C_REG, a3: C_ADDCON, a6: C_SBRA},
+ {i: 90, as: ACMPBEQ, a1: C_REG, a3: C_SCON, a6: C_SBRA},
+ {i: 89, as: ACMPUBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
+ {i: 90, as: ACMPUBEQ, a1: C_REG, a3: C_ANDCON, a6: C_SBRA},
// move on condition
- Optab{i: 17, as: AMOVDEQ, a1: C_REG, a6: C_REG},
+ {i: 17, as: AMOVDEQ, a1: C_REG, a6: C_REG},
// find leftmost one
- Optab{i: 8, as: AFLOGR, a1: C_REG, a6: C_REG},
+ {i: 8, as: AFLOGR, a1: C_REG, a6: C_REG},
// population count
- Optab{i: 9, as: APOPCNT, a1: C_REG, a6: C_REG},
+ {i: 9, as: APOPCNT, a1: C_REG, a6: C_REG},
// compare
- Optab{i: 70, as: ACMP, a1: C_REG, a6: C_REG},
- Optab{i: 71, as: ACMP, a1: C_REG, a6: C_LCON},
- Optab{i: 70, as: ACMPU, a1: C_REG, a6: C_REG},
- Optab{i: 71, as: ACMPU, a1: C_REG, a6: C_LCON},
- Optab{i: 70, as: AFCMPO, a1: C_FREG, a6: C_FREG},
- Optab{i: 70, as: AFCMPO, a1: C_FREG, a2: C_REG, a6: C_FREG},
+ {i: 70, as: ACMP, a1: C_REG, a6: C_REG},
+ {i: 71, as: ACMP, a1: C_REG, a6: C_LCON},
+ {i: 70, as: ACMPU, a1: C_REG, a6: C_REG},
+ {i: 71, as: ACMPU, a1: C_REG, a6: C_LCON},
+ {i: 70, as: AFCMPO, a1: C_FREG, a6: C_FREG},
+ {i: 70, as: AFCMPO, a1: C_FREG, a2: C_REG, a6: C_FREG},
// test under mask
- Optab{i: 91, as: ATMHH, a1: C_REG, a6: C_ANDCON},
+ {i: 91, as: ATMHH, a1: C_REG, a6: C_ANDCON},
// insert program mask
- Optab{i: 92, as: AIPM, a1: C_REG},
+ {i: 92, as: AIPM, a1: C_REG},
// 32-bit access registers
- Optab{i: 68, as: AMOVW, a1: C_AREG, a6: C_REG},
- Optab{i: 68, as: AMOVWZ, a1: C_AREG, a6: C_REG},
- Optab{i: 69, as: AMOVW, a1: C_REG, a6: C_AREG},
- Optab{i: 69, as: AMOVWZ, a1: C_REG, a6: C_AREG},
+ {i: 68, as: AMOVW, a1: C_AREG, a6: C_REG},
+ {i: 68, as: AMOVWZ, a1: C_AREG, a6: C_REG},
+ {i: 69, as: AMOVW, a1: C_REG, a6: C_AREG},
+ {i: 69, as: AMOVWZ, a1: C_REG, a6: C_AREG},
// macros
- Optab{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LOREG},
- Optab{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LAUTO},
+ {i: 96, as: ACLEAR, a1: C_LCON, a6: C_LOREG},
+ {i: 96, as: ACLEAR, a1: C_LCON, a6: C_LAUTO},
// load/store multiple
- Optab{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LOREG},
- Optab{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LAUTO},
- Optab{i: 98, as: ALMG, a1: C_LOREG, a2: C_REG, a6: C_REG},
- Optab{i: 98, as: ALMG, a1: C_LAUTO, a2: C_REG, a6: C_REG},
+ {i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LOREG},
+ {i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LAUTO},
+ {i: 98, as: ALMG, a1: C_LOREG, a2: C_REG, a6: C_REG},
+ {i: 98, as: ALMG, a1: C_LAUTO, a2: C_REG, a6: C_REG},
// bytes
- Optab{i: 40, as: ABYTE, a1: C_SCON},
- Optab{i: 40, as: AWORD, a1: C_LCON},
- Optab{i: 31, as: ADWORD, a1: C_LCON},
- Optab{i: 31, as: ADWORD, a1: C_DCON},
+ {i: 40, as: ABYTE, a1: C_SCON},
+ {i: 40, as: AWORD, a1: C_LCON},
+ {i: 31, as: ADWORD, a1: C_LCON},
+ {i: 31, as: ADWORD, a1: C_DCON},
// fast synchronization
- Optab{i: 80, as: ASYNC},
+ {i: 80, as: ASYNC},
// store clock
- Optab{i: 88, as: ASTCK, a6: C_SAUTO},
- Optab{i: 88, as: ASTCK, a6: C_SOREG},
+ {i: 88, as: ASTCK, a6: C_SAUTO},
+ {i: 88, as: ASTCK, a6: C_SOREG},
// storage and storage
- Optab{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LOREG},
- Optab{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LAUTO},
- Optab{i: 84, as: AMVC, a1: C_SCON, a3: C_LAUTO, a6: C_LAUTO},
+ {i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LOREG},
+ {i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LAUTO},
+ {i: 84, as: AMVC, a1: C_SCON, a3: C_LAUTO, a6: C_LAUTO},
// address
- Optab{i: 85, as: ALARL, a1: C_LCON, a6: C_REG},
- Optab{i: 85, as: ALARL, a1: C_SYMADDR, a6: C_REG},
- Optab{i: 86, as: ALA, a1: C_SOREG, a6: C_REG},
- Optab{i: 86, as: ALA, a1: C_SAUTO, a6: C_REG},
- Optab{i: 87, as: AEXRL, a1: C_SYMADDR, a6: C_REG},
+ {i: 85, as: ALARL, a1: C_LCON, a6: C_REG},
+ {i: 85, as: ALARL, a1: C_SYMADDR, a6: C_REG},
+ {i: 86, as: ALA, a1: C_SOREG, a6: C_REG},
+ {i: 86, as: ALA, a1: C_SAUTO, a6: C_REG},
+ {i: 87, as: AEXRL, a1: C_SYMADDR, a6: C_REG},
// undefined (deliberate illegal instruction)
- Optab{i: 78, as: obj.AUNDEF},
+ {i: 78, as: obj.AUNDEF},
// vector instructions
// VRX store
- Optab{i: 100, as: AVST, a1: C_VREG, a6: C_SOREG},
- Optab{i: 100, as: AVST, a1: C_VREG, a6: C_SAUTO},
- Optab{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
- Optab{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
+ {i: 100, as: AVST, a1: C_VREG, a6: C_SOREG},
+ {i: 100, as: AVST, a1: C_VREG, a6: C_SAUTO},
+ {i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
+ {i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
// VRX load
- Optab{i: 101, as: AVL, a1: C_SOREG, a6: C_VREG},
- Optab{i: 101, as: AVL, a1: C_SAUTO, a6: C_VREG},
- Optab{i: 101, as: AVLEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
- Optab{i: 101, as: AVLEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
+ {i: 101, as: AVL, a1: C_SOREG, a6: C_VREG},
+ {i: 101, as: AVL, a1: C_SAUTO, a6: C_VREG},
+ {i: 101, as: AVLEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
+ {i: 101, as: AVLEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
// VRV scatter
- Optab{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
- Optab{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
+ {i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
+ {i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
// VRV gather
- Optab{i: 103, as: AVGEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
- Optab{i: 103, as: AVGEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
+ {i: 103, as: AVGEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
+ {i: 103, as: AVGEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
// VRS element shift/rotate and load gr to/from vr element
- Optab{i: 104, as: AVESLG, a1: C_SCON, a2: C_VREG, a6: C_VREG},
- Optab{i: 104, as: AVESLG, a1: C_REG, a2: C_VREG, a6: C_VREG},
- Optab{i: 104, as: AVESLG, a1: C_SCON, a6: C_VREG},
- Optab{i: 104, as: AVESLG, a1: C_REG, a6: C_VREG},
- Optab{i: 104, as: AVLGVG, a1: C_SCON, a2: C_VREG, a6: C_REG},
- Optab{i: 104, as: AVLGVG, a1: C_REG, a2: C_VREG, a6: C_REG},
- Optab{i: 104, as: AVLVGG, a1: C_SCON, a2: C_REG, a6: C_VREG},
- Optab{i: 104, as: AVLVGG, a1: C_REG, a2: C_REG, a6: C_VREG},
+ {i: 104, as: AVESLG, a1: C_SCON, a2: C_VREG, a6: C_VREG},
+ {i: 104, as: AVESLG, a1: C_REG, a2: C_VREG, a6: C_VREG},
+ {i: 104, as: AVESLG, a1: C_SCON, a6: C_VREG},
+ {i: 104, as: AVESLG, a1: C_REG, a6: C_VREG},
+ {i: 104, as: AVLGVG, a1: C_SCON, a2: C_VREG, a6: C_REG},
+ {i: 104, as: AVLGVG, a1: C_REG, a2: C_VREG, a6: C_REG},
+ {i: 104, as: AVLVGG, a1: C_SCON, a2: C_REG, a6: C_VREG},
+ {i: 104, as: AVLVGG, a1: C_REG, a2: C_REG, a6: C_VREG},
// VRS store multiple
- Optab{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SOREG},
- Optab{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SAUTO},
+ {i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SOREG},
+ {i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SAUTO},
// VRS load multiple
- Optab{i: 106, as: AVLM, a1: C_SOREG, a2: C_VREG, a6: C_VREG},
- Optab{i: 106, as: AVLM, a1: C_SAUTO, a2: C_VREG, a6: C_VREG},
+ {i: 106, as: AVLM, a1: C_SOREG, a2: C_VREG, a6: C_VREG},
+ {i: 106, as: AVLM, a1: C_SAUTO, a2: C_VREG, a6: C_VREG},
// VRS store with length
- Optab{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SOREG},
- Optab{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SAUTO},
+ {i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SOREG},
+ {i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SAUTO},
// VRS load with length
- Optab{i: 108, as: AVLL, a1: C_REG, a3: C_SOREG, a6: C_VREG},
- Optab{i: 108, as: AVLL, a1: C_REG, a3: C_SAUTO, a6: C_VREG},
+ {i: 108, as: AVLL, a1: C_REG, a3: C_SOREG, a6: C_VREG},
+ {i: 108, as: AVLL, a1: C_REG, a3: C_SAUTO, a6: C_VREG},
// VRI-a
- Optab{i: 109, as: AVGBM, a1: C_ANDCON, a6: C_VREG},
- Optab{i: 109, as: AVZERO, a6: C_VREG},
- Optab{i: 109, as: AVREPIG, a1: C_ADDCON, a6: C_VREG},
- Optab{i: 109, as: AVREPIG, a1: C_SCON, a6: C_VREG},
- Optab{i: 109, as: AVLEIG, a1: C_SCON, a3: C_ADDCON, a6: C_VREG},
- Optab{i: 109, as: AVLEIG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
+ {i: 109, as: AVGBM, a1: C_ANDCON, a6: C_VREG},
+ {i: 109, as: AVZERO, a6: C_VREG},
+ {i: 109, as: AVREPIG, a1: C_ADDCON, a6: C_VREG},
+ {i: 109, as: AVREPIG, a1: C_SCON, a6: C_VREG},
+ {i: 109, as: AVLEIG, a1: C_SCON, a3: C_ADDCON, a6: C_VREG},
+ {i: 109, as: AVLEIG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
// VRI-b generate mask
- Optab{i: 110, as: AVGMG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
+ {i: 110, as: AVGMG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
// VRI-c replicate
- Optab{i: 111, as: AVREPG, a1: C_UCON, a2: C_VREG, a6: C_VREG},
+ {i: 111, as: AVREPG, a1: C_UCON, a2: C_VREG, a6: C_VREG},
// VRI-d element rotate and insert under mask and
// shift left double by byte
- Optab{i: 112, as: AVERIMG, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
- Optab{i: 112, as: AVSLDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 112, as: AVERIMG, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 112, as: AVSLDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
// VRI-d fp test data class immediate
- Optab{i: 113, as: AVFTCIDB, a1: C_SCON, a2: C_VREG, a6: C_VREG},
+ {i: 113, as: AVFTCIDB, a1: C_SCON, a2: C_VREG, a6: C_VREG},
// VRR-a load reg
- Optab{i: 114, as: AVLR, a1: C_VREG, a6: C_VREG},
+ {i: 114, as: AVLR, a1: C_VREG, a6: C_VREG},
// VRR-a compare
- Optab{i: 115, as: AVECG, a1: C_VREG, a6: C_VREG},
+ {i: 115, as: AVECG, a1: C_VREG, a6: C_VREG},
// VRR-b
- Optab{i: 117, as: AVCEQG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
- Optab{i: 117, as: AVFAEF, a1: C_VREG, a2: C_VREG, a6: C_VREG},
- Optab{i: 117, as: AVPKSG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
+ {i: 117, as: AVCEQG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
+ {i: 117, as: AVFAEF, a1: C_VREG, a2: C_VREG, a6: C_VREG},
+ {i: 117, as: AVPKSG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
// VRR-c
- Optab{i: 118, as: AVAQ, a1: C_VREG, a2: C_VREG, a6: C_VREG},
- Optab{i: 118, as: AVAQ, a1: C_VREG, a6: C_VREG},
- Optab{i: 118, as: AVNOT, a1: C_VREG, a6: C_VREG},
- Optab{i: 123, as: AVPDI, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 118, as: AVAQ, a1: C_VREG, a2: C_VREG, a6: C_VREG},
+ {i: 118, as: AVAQ, a1: C_VREG, a6: C_VREG},
+ {i: 118, as: AVNOT, a1: C_VREG, a6: C_VREG},
+ {i: 123, as: AVPDI, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
// VRR-c shifts
- Optab{i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
- Optab{i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG},
+ {i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
+ {i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG},
// VRR-d
- Optab{i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
// VRR-e
- Optab{i: 121, as: AVSEL, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 121, as: AVSEL, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
// VRR-f
- Optab{i: 122, as: AVLVGP, a1: C_REG, a2: C_REG, a6: C_VREG},
+ {i: 122, as: AVLVGP, a1: C_REG, a2: C_REG, a6: C_VREG},
}
var oprange [ALAST & obj.AMask][]Optab
var nameConstraintsTests = []nameConstraintsTest{
// #0: dummy test for the certificate generation process itself.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
leaf: leafSpec{
sans: []string{"dns:example.com"},
},
// #1: dummy test for the certificate generation process itself: single
// level of intermediate.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #2: dummy test for the certificate generation process itself: two
// levels of intermediates.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #3: matching DNS constraint in root
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #4: matching DNS constraint in intermediate.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:example.com"},
},
},
},
// #5: .example.com only matches subdomains.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #6: .example.com matches subdomains.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:.example.com"},
},
},
},
// #7: .example.com matches multiple levels of subdomains
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #8: specifying a permitted list of names does not exclude other name
// types
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #9: specifying a permitted list of names does not exclude other name
// types
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:10.0.0.0/8"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #10: intermediates can try to permit other names, which isn't
// forbidden if the leaf doesn't mention them. I.e. name constraints
// apply to names, not constraints themselves.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:example.com", "dns:foo.com"},
},
},
// #11: intermediates cannot add permitted names that the root doesn't
// grant them.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:example.com", "dns:foo.com"},
},
},
},
// #12: intermediates can further limit their scope if they wish.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:.bar.example.com"},
},
},
// #13: intermediates can further limit their scope and that limitation
// is effective
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:.bar.example.com"},
},
},
},
// #14: roots can exclude subtrees and that doesn't affect other names.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #15: roots exclusions are effective.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #16: intermediates can also exclude names and that doesn't affect
// other names.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
bad: []string{"dns:.example.com"},
},
},
},
// #17: intermediate exclusions are effective.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
bad: []string{"dns:.example.com"},
},
},
},
// #18: having an exclusion doesn't prohibit other types of names.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"dns:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #19: IP-based exclusions are permitted and don't affect unrelated IP
// addresses.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"ip:10.0.0.0/8"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #20: IP-based exclusions are effective
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"ip:10.0.0.0/8"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #21: intermediates can further constrain IP ranges.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"ip:0.0.0.0/1"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
bad: []string{"ip:11.0.0.0/8"},
},
},
// #22: when multiple intermediates are present, chain building can
// avoid intermediates with incompatible constraints.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:.foo.com"},
},
- constraintsSpec{
+ {
ok: []string{"dns:.example.com"},
},
},
// #23: (same as the previous test, but in the other order in ensure
// that we don't pass it by luck.)
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:.example.com"},
},
- constraintsSpec{
+ {
ok: []string{"dns:.foo.com"},
},
},
// #24: when multiple roots are valid, chain building can avoid roots
// with incompatible constraints.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{},
- constraintsSpec{
+ {},
+ {
ok: []string{"dns:foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #25: (same as the previous test, but in the other order in ensure
// that we don't pass it by luck.)
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com"},
},
- constraintsSpec{},
+ {},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #26: chain building can find a valid path even with multiple levels
// of alternative intermediates and alternative roots.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com"},
},
- constraintsSpec{
+ {
ok: []string{"dns:example.com"},
},
- constraintsSpec{},
+ {},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
- constraintsSpec{
+ {
+ {},
+ {
ok: []string{"dns:foo.com"},
},
},
- []constraintsSpec{
- constraintsSpec{},
- constraintsSpec{
+ {
+ {},
+ {
ok: []string{"dns:foo.com"},
},
},
},
// #27: chain building doesn't get stuck when there is no valid path.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com"},
},
- constraintsSpec{
+ {
ok: []string{"dns:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
- constraintsSpec{
+ {
+ {},
+ {
ok: []string{"dns:foo.com"},
},
},
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ok: []string{"dns:bar.com"},
},
- constraintsSpec{
+ {
ok: []string{"dns:foo.com"},
},
},
},
// #28: unknown name types don't cause a problem without constraints.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #29: unknown name types are allowed even in constrained chains.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com", "dns:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #30: without SANs, a certificate with a CN is rejected in a constrained chain.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com", "dns:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #31: IPv6 addresses work in constraints: roots can permit them as
// expected.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:2000:abcd::/32"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #32: IPv6 addresses work in constraints: root restrictions are
// effective.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:2000:abcd::/32"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #33: An IPv6 permitted subtree doesn't affect DNS names.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:2000:abcd::/32"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #34: IPv6 exclusions don't affect unrelated addresses.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"ip:2000:abcd::/32"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #35: IPv6 exclusions are effective.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"ip:2000:abcd::/32"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #36: IPv6 constraints do not permit IPv4 addresses.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:2000:abcd::/32"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #37: IPv4 constraints do not permit IPv6 addresses.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:10.0.0.0/8"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #38: an exclusion of an unknown type doesn't affect other names.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"unknown:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #39: a permitted subtree of an unknown type doesn't affect other
// name types.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"unknown:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #40: exact email constraints work
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:foo@example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #41: exact email constraints are effective
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:foo@example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #42: email canonicalisation works.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:foo@example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #43: limiting email addresses to a host works.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #44: a leading dot matches hosts one level deep
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #45: a leading dot does not match the host itself
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #46: a leading dot also matches two (or more) levels deep.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:.example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #47: the local part of an email is case-sensitive
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:foo@example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #48: the domain part of an email is not case-sensitive
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:foo@EXAMPLE.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #49: the domain part of a DNS constraint is also not case-sensitive.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:EXAMPLE.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #50: URI constraints only cover the host part of the URI
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #51: URIs with IPs are rejected
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #52: URIs with IPs and ports are rejected
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #53: URIs with IPv6 addresses are also rejected
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #54: URIs with IPv6 addresses with ports are also rejected
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #55: URI constraints are effective
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #56: URI constraints are effective
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"uri:foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #57: URI constraints can allow subdomains
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #58: excluding an IPv4-mapped-IPv6 address doesn't affect the IPv4
// version of that address.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"ip:::ffff:1.2.3.4/128"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #59: a URI constraint isn't matched by a URN.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:example.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #60: excluding all IPv6 addresses doesn't exclude all IPv4 addresses
// too, even though IPv4 is mapped into the IPv6 range.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"ip:1.2.3.0/24"},
bad: []string{"ip:::0/0"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #61: omitting extended key usage in a CA certificate implies that
// any usage is ok.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #62: The “any” EKU also means that any usage is ok.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"any"},
},
},
// #63: An intermediate with enumerated EKUs causes a failure if we
// test for an EKU not in that set. (ServerAuth is required by
// default.)
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"email"},
},
},
// #64: an unknown EKU in the leaf doesn't break anything, even if it's not
// correctly nested.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"email"},
},
},
// #65: trying to add extra permitted key usages in an intermediate
// (after a limitation in the root) is acceptable so long as the leaf
// certificate doesn't use them.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ekus: []string{"serverAuth"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"serverAuth", "email"},
},
},
},
// #66: EKUs in roots are not ignored.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ekus: []string{"email"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"serverAuth"},
},
},
// #67: in order to support COMODO chains, SGC key usages permit
// serverAuth and clientAuth.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{},
+ {},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"netscapeSGC"},
},
},
// #68: in order to support COMODO chains, SGC key usages permit
// serverAuth and clientAuth.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"msSGC"},
},
},
},
// #69: an empty DNS constraint should allow anything.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #70: an empty DNS constraint should also reject everything.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"dns:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #71: an empty email constraint should allow anything
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"email:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #72: an empty email constraint should also reject everything.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"email:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #73: an empty URI constraint should allow anything
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"uri:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #74: an empty URI constraint should also reject everything.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"uri:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #75: serverAuth in a leaf shouldn't permit clientAuth when requested in
// VerifyOptions.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #76: However, MSSGC in a leaf should match a request for serverAuth.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #77: an invalid DNS or mail SAN will not be detected if name constaint
// checking is not triggered.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #78: an invalid DNS SAN will be detected if any name constraint checking
// is triggered.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"uri:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #79: an invalid email SAN will be detected if any name constraint
// checking is triggered.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
bad: []string{"uri:"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #80: if several EKUs are requested, satisfying any of them is sufficient.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #81: EKUs that are not asserted in VerifyOpts are not required to be
// nested.
- nameConstraintsTest{
- roots: []constraintsSpec{
- constraintsSpec{},
- },
+ {
+ roots: make([]constraintsSpec, 1),
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{
+ {
+ {
ekus: []string{"serverAuth"},
},
},
},
// #82: a certificate without SANs and CN is accepted in a constrained chain.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com", "dns:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #83: a certificate without SANs and with a CN that does not parse as a
// hostname is accepted in a constrained chain.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com", "dns:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
},
// #84: a certificate with SANs and CN is accepted in a constrained chain.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com", "dns:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{
// #85: without SANs, a certificate with a valid CN is accepted in a
// constrained chain if x509ignoreCN is set.
- nameConstraintsTest{
+ {
roots: []constraintsSpec{
- constraintsSpec{
+ {
ok: []string{"dns:foo.com", "dns:.foo.com"},
},
},
intermediates: [][]constraintsSpec{
- []constraintsSpec{
- constraintsSpec{},
+ {
+ {},
},
},
leaf: leafSpec{