Changeset 4b1a357 for core


Ignore:
Timestamp:
Feb 21, 2018 8:10:14 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
2374471
Parents:
56c17300
Message:

Certs: Add policy extension

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/crypto/SelfSignedGenerator.java

    r56c17300 r4b1a357  
    5454    private static final boolean DEBUG = false;
    5555
     56    // Policy Qualifier CPS URI
     57    private static final String OID_QT_CPSURI = "1.3.6.1.5.5.7.2.1";
     58    // Policy Qualifier User Notice
     59    private static final String OID_QT_UNOTICE = "1.3.6.1.5.5.7.2.2";
    5660    private static final String OID_CN = "2.5.4.3";
    5761    private static final String OID_C = "2.5.4.6";
     
    7074    // CRL number
    7175    private static final String OID_CRLNUM = "2.5.29.20";
     76    // Certificate Policy
     77    private static final String OID_POLICY = "2.5.29.32";
     78    // Certificate Policy - Any
     79    private static final String OID_POLICY_ANY = "2.5.29.32.0";
    7280    // Authority Key Identifier
    7381    private static final String OID_AKI = "2.5.29.35";
     
    506514        byte[] oid4 = getEncodedOID(OID_SAN);
    507515        byte[] oid5 = getEncodedOID(OID_AKI);
     516        byte[] oid6 = getEncodedOID(OID_POLICY);
     517        byte[] oid7 = getEncodedOID(OID_POLICY_ANY);
     518        byte[] oid8 = getEncodedOID(OID_QT_UNOTICE);
     519        byte[] oid9 = getEncodedOID(OID_QT_CPSURI);
    508520        byte[] TRUE = new byte[] { 1, 1, (byte) 0xff };
     521
     522        // extXlen does NOT include the 0x30 and length
    509523
    510524        int wrap1len = spaceFor(sha.length);
     
    540554        int ext5len = oid5.length + spaceFor(wrap5len);
    541555
     556        byte[] policyTextBytes = DataHelper.getASCII("This self-signed certificate is required for secure local access to I2P services.");
     557        byte[] policyURIBytes = DataHelper.getASCII("https://geti2p.net/");
     558        int wrap61len = spaceFor(policyTextBytes.length); // usernotice ia5string
     559        int wrap62len = oid8.length + spaceFor(wrap61len); // PQ 1 Info OID + usernotice seq.
     560        int wrap63len = spaceFor(policyURIBytes.length); // uri ia5string
     561        int wrap64len = oid9.length + wrap63len; // PQ 2 Info OID + ia5string
     562        int wrap65len = spaceFor(wrap62len) + spaceFor(wrap64len); // qualifiers seq
     563        int wrap66len = spaceFor(oid7.length + wrap65len); // PInfo elements seq
     564        int wrap67len = spaceFor(wrap66len); // PInfo seq
     565        int wrap68len = spaceFor(wrap67len); // Policies seq
     566        int ext6len = oid6.length + spaceFor(wrap68len); // OID + octet string
     567
    542568        int extslen = spaceFor(ext1len) + spaceFor(ext2len) + spaceFor(ext4len) + spaceFor(ext5len);
    543569        if (isCA)
    544             extslen += spaceFor(ext3len);
     570            extslen += spaceFor(ext3len) + spaceFor(ext6len);
    545571        int seqlen = spaceFor(extslen);
    546572        int totlen = spaceFor(seqlen);
     
    640666        }
    641667
     668        // Policy
     669        // https://www.sysadmins.lv/blog-en/certificate-policies-extension-all-you-should-know-part-1.aspx
     670        if (isCA) {
     671            rv[idx++] = (byte) 0x30;
     672            idx = intToASN1(rv, idx, ext6len);
     673            System.arraycopy(oid6, 0, rv, idx, oid6.length);
     674            idx += oid6.length;
     675            rv[idx++] = (byte) 0x04;  // octet string wraps a sequence
     676            idx = intToASN1(rv, idx, wrap68len);
     677            rv[idx++] = (byte) 0x30;  // Policies seq
     678            idx = intToASN1(rv, idx, wrap67len);
     679            rv[idx++] = (byte) 0x30;  // Policy info seq
     680            idx = intToASN1(rv, idx, wrap66len);
     681            System.arraycopy(oid7, 0, rv, idx, oid7.length);
     682            idx += oid7.length;
     683            rv[idx++] = (byte) 0x30;  // Policy qualifiers seq
     684            idx = intToASN1(rv, idx, wrap65len);
     685
     686            // This should be what IE links to as "Issuer Statement"
     687            rv[idx++] = (byte) 0x30;  // Policy qualifier info 2 seq
     688            idx = intToASN1(rv, idx, wrap64len);
     689            System.arraycopy(oid9, 0, rv, idx, oid9.length);
     690            idx += oid9.length;
     691            rv[idx++] = (byte) 0x16;  // choice 0 URI ia5string
     692            idx = intToASN1(rv, idx, policyURIBytes.length);
     693            System.arraycopy(policyURIBytes, 0, rv, idx, policyURIBytes.length);
     694            idx += policyURIBytes.length;
     695
     696            // User notice text
     697            rv[idx++] = (byte) 0x30;  // Policy qualifier info 1 seq
     698            idx = intToASN1(rv, idx, wrap62len);
     699            System.arraycopy(oid8, 0, rv, idx, oid8.length);
     700            idx += oid8.length;
     701            rv[idx++] = (byte) 0x30;  // choice 1 notice seq.
     702            idx = intToASN1(rv, idx, wrap61len);
     703            rv[idx++] = (byte) 0x16;  // choice 0 ia5string
     704            idx = intToASN1(rv, idx, policyTextBytes.length);
     705            System.arraycopy(policyTextBytes, 0, rv, idx, policyTextBytes.length);
     706            idx += policyTextBytes.length;
     707        }
     708
    642709        return rv;
    643710    }
Note: See TracChangeset for help on using the changeset viewer.