# $Id$

"""Generate an RPKI test repository.

This script generates a toy RPKI repository for test purposes.  It's
designed to be relatively easy to reconfigure, making it simple to
test whatever is of interest on a given day, without a lot of setup
overhead.

Outputs are a bunch of config files for the OpenSSL CLI tool and a
makefile to drive everything.
"""

import rpki.resource_set, os

subdir  = "resource-cert-samples"
openssl = "../../openssl/openssl/apps/openssl"
keybits = 2048

def main():
  """Main program, including the toy database itself."""

  db = allocation_db()
  db.add("ISP1", ipv4="192.0.2.1-192.0.2.33", asn="64533")
  db.add("ISP2", ipv4="192.0.2.44-192.0.2.100")
  db.add("ISP3", ipv6="2001:db8::44-2001:db8::100")
  db.add("ISP4", ipv6="2001:db8::10:0:44/128", asn="64544")
  db.add("ISP5a", ipv4="10.0.0.0/24", ipv6="2001:db8::a00:0/120")
  db.add("ISP5b", ipv4="10.3.0.0/24", ipv6="2001:db8::a03:0/120")
  db.add("ISP5c", asn="64534-64540")
  db.add("LIR1", children=["ISP1", "ISP2"])
  db.add("LIR2", children=["ISP3", "ISP4"])
  db.add("LIR3", children=["ISP5a", "ISP5b", "ISP5c"])
  db.add("RIR",  children=["LIR1", "LIR2", "LIR3"])

  if not os.path.isdir(subdir):
    os.mkdir(subdir)

  for i in db:
    write_maybe("%s/%s.cnf" % (subdir, i.name), i.cfg_string())

  write_maybe("%s/Makefile" % subdir,
              "# Automatically generated, do not edit.\n" +
              "".join([i.makefile_rules() for i in db]))

def write_maybe(name, new_content):
  """Write a file if and only if its contents have changed.
  This simplifies interactions with "make".
  """
  old_content = None
  if os.path.isfile(name):
    f = open(name, "r")
    old_content = f.read()
    f.close()
  if old_content != new_content:
    print "Writing", name
    f = open(name, "w")
    f.write(new_content)
    f.close()

class allocation_db(list):
  """Class to represent an allocation database."""

  def __init__(self):
    self.allocation_map = {}

  def add(self, name, **kw):
    """Add a new entry to this allocation database.
    All arguments passed through to the allocation constructor.
    """
    self.insert(0, allocation(name = name, allocation_map = self.allocation_map, **kw))

class allocation(object):
  """Class representing one entity holding allocated resources.

  In order to simplify configuration, this class automatically
  computes the set of resources that this entity must hold in order to
  serve both itself and its children.
  """

  parent = None

  def __init__(self, name, asn = None, ipv4 = None, ipv6 = None, children = [], allocation_map = None):
    """Create a new allocation entry.

    This binds the parent attributes of any children, and computes the
    transitive closure of the set of resources this entity needs.
    """
    self.name = name
    self.children = [allocation_map[i] for i in children]
    for child in self.children:
      assert child.parent is None
      child.parent = self
    self.asn  = self.summarize("asn",  rpki.resource_set.resource_set_as(asn))
    self.ipv4 = self.summarize("ipv4", rpki.resource_set.resource_set_ipv4(ipv4))
    self.ipv6 = self.summarize("ipv6", rpki.resource_set.resource_set_ipv6(ipv6))
    allocation_map[name] = self

  def summarize(self, attrname, seed = None):
    """Compute the transitive resource closure for one resource attribute."""
    if seed is None:
      seed = getattr(self, attrname)
    for child in self.children:
      seed = seed.union(child.summarize(attrname))
    return seed

  def __str__(self):
    return "%s\n  ASN: %s\n IPv4: %s\n IPv6: %s" % (self.name, self.asn, self.ipv4, self.ipv6)

  def cfg_string(self):
    """Generate the OpenSSL configuration file needed for this entity."""
    keys = { "self"       : self.name,
             "keybits"    : keybits,
             "no_parent"  : "#",
             "no_asid"    : "#",
             "no_addr"    : "#",
             "parent"     : "???",
             "asid"       : "???",
             "addr"       : "???" }
    if self.parent:
      keys["no_parent"] = ""
      keys["parent"] = self.parent.name
    if self.asn:
      keys["no_asid"] = ""
      keys["asid"] = ",".join(["AS:" + str(x) for x in self.asn])
    if self.ipv4 or self.ipv6:
      keys["no_addr"] = ""
      keys["addr"] = ",".join(["IPv4:" + str(x) for x in self.ipv4] + ["IPv6:" + str(x) for x in self.ipv6])
    return openssl_cfg_fmt % keys

  def makefile_rules(self):
    """Generate the makefile rules needed for this entity."""
    keys = { "self"     : self.name,
             "keybits"  : keybits,
             "openssl"  : openssl }
    if self.parent:
      keys["signconf"] = "%s.cnf"           % self.parent.name
      keys["signdeps"] = "%s.key"           % self.parent.name
    else:
      keys["signconf"] = "%s.cnf -selfsign" % self.name
      keys["signdeps"] = "%s.key"           % self.name
    return makefile_fmt % keys

makefile_fmt = '''\

all:: %(self)s.cer

%(self)s.key:
	%(openssl)s genrsa -out $@ %(keybits)d

%(self)s.req: %(self)s.key %(self)s.cnf Makefile
	%(openssl)s req -new -config %(self)s.cnf -key %(self)s.key -out $@

%(self)s.cer: %(self)s.req %(self)s.cnf %(signdeps)s Makefile
	@test -d %(self)s || mkdir %(self)s
	@test -f %(self)s/index || touch %(self)s/index
	@test -f %(self)s/serial || echo 01 >%(self)s/serial
	%(openssl)s ca -batch -out $@ -in %(self)s.req -extfile %(self)s.cnf -config %(signconf)s


show_req::
	%(openssl)s req -noout -text -in %(self)s.req -config /dev/null

show_cer::
	%(openssl)s x509 -noout -text -in %(self)s.cer
'''

openssl_cfg_fmt = '''# Automatically generated, do not edit.

[ ca ]
default_ca = ca_default

[ ca_default ]
certificate = %(self)s.cer
serial = %(self)s/serial
private_key = %(self)s.key
database = %(self)s/index
new_certs_dir = %(self)s
name_opt = ca_default
cert_opt = ca_default
default_days = 365
default_crl_days = 30
default_md = sha256
preserve = no
copy_extensions = copy
policy = ca_policy_anything
unique_subject = no
x509_extensions = ca_x509_ext
crl_extensions = crl_x509_ext

[ ca_policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
givenName = optional
surname = optional

[ req ]
default_bits = %(keybits)d
encrypt_key = no
distinguished_name = req_dn
req_extensions = req_x509_ext
prompt = no

[ req_dn ]
CN = TEST ENTITY %(self)s

[ req_x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
keyUsage = critical,keyCertSign,cRLSign
subjectInfoAccess = 1.3.6.1.5.5.7.48.5;URI:rsync://wombats-r-us.hactrn.net/%(self)s/
%(no_parent)sauthorityInfoAccess = caIssuers;URI:rsync://wombats-r-us.hactrn.net/%(parent)s.cer
%(no_asid)ssbgp-autonomousSysNum = critical,%(asid)s
%(no_addr)ssbgp-ipAddrBlock = critical,%(addr)s

[ ca_x509_ext ]
basicConstraints = critical,CA:true
%(no_parent)sauthorityKeyIdentifier = keyid:always
keyUsage = critical,keyCertSign,cRLSign
subjectInfoAccess = 1.3.6.1.5.5.7.48.5;URI:rsync://wombats-r-us.hactrn.net/%(self)s/
%(no_parent)sauthorityInfoAccess = caIssuers;URI:rsync://wombats-r-us.hactrn.net/%(parent)s.cer
%(no_asid)ssbgp-autonomousSysNum = critical,%(asid)s
%(no_addr)ssbgp-ipAddrBlock = critical,%(addr)s

[ crl_x509_ext ]
authorityKeyIdentifier = keyid:always
'''

main()
 href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
<a id='n594' href='#n594'>594</a>
<a id='n595' href='#n595'>595</a>
<a id='n596' href='#n596'>596</a>
<a id='n597' href='#n597'>597</a>
<a id='n598' href='#n598'>598</a>
<a id='n599' href='#n599'>599</a>
<a id='n600' href='#n600'>600</a>
<a id='n601' href='#n601'>601</a>
<a id='n602' href='#n602'>602</a>
<a id='n603' href='#n603'>603</a>
<a id='n604' href='#n604'>604</a>
<a id='n605' href='#n605'>605</a>
<a id='n606' href='#n606'>606</a>
<a id='n607' href='#n607'>607</a>
<a id='n608' href='#n608'>608</a>
<a id='n609' href='#n609'>609</a>
<a id='n610' href='#n610'>610</a>
<a id='n611' href='#n611'>611</a>
<a id='n612' href='#n612'>612</a>
<a id='n613' href='#n613'>613</a>
<a id='n614' href='#n614'>614</a>
<a id='n615' href='#n615'>615</a>
<a id='n616' href='#n616'>616</a>
<a id='n617' href='#n617'>617</a>
<a id='n618' href='#n618'>618</a>
<a id='n619' href='#n619'>619</a>
<a id='n620' href='#n620'>620</a>
<a id='n621' href='#n621'>621</a>
<a id='n622' href='#n622'>622</a>
<a id='n623' href='#n623'>623</a>
<a id='n624' href='#n624'>624</a>
<a id='n625' href='#n625'>625</a>
<a id='n626' href='#n626'>626</a>
<a id='n627' href='#n627'>627</a>
<a id='n628' href='#n628'>628</a>
<a id='n629' href='#n629'>629</a>
<a id='n630' href='#n630'>630</a>
<a id='n631' href='#n631'>631</a>
<a id='n632' href='#n632'>632</a>
<a id='n633' href='#n633'>633</a>
<a id='n634' href='#n634'>634</a>
<a id='n635' href='#n635'>635</a>
<a id='n636' href='#n636'>636</a>
<a id='n637' href='#n637'>637</a>
<a id='n638' href='#n638'>638</a>
<a id='n639' href='#n639'>639</a>
<a id='n640' href='#n640'>640</a>
<a id='n641' href='#n641'>641</a>
<a id='n642' href='#n642'>642</a>
<a id='n643' href='#n643'>643</a>
<a id='n644' href='#n644'>644</a>
<a id='n645' href='#n645'>645</a>
<a id='n646' href='#n646'>646</a>
<a id='n647' href='#n647'>647</a>
<a id='n648' href='#n648'>648</a>
<a id='n649' href='#n649'>649</a>
<a id='n650' href='#n650'>650</a>
<a id='n651' href='#n651'>651</a>
<a id='n652' href='#n652'>652</a>
<a id='n653' href='#n653'>653</a>
<a id='n654' href='#n654'>654</a>
<a id='n655' href='#n655'>655</a>
<a id='n656' href='#n656'>656</a>
<a id='n657' href='#n657'>657</a>
<a id='n658' href='#n658'>658</a>
<a id='n659' href='#n659'>659</a>
<a id='n660' href='#n660'>660</a>
<a id='n661' href='#n661'>661</a>
<a id='n662' href='#n662'>662</a>
<a id='n663' href='#n663'>663</a>
<a id='n664' href='#n664'>664</a>
<a id='n665' href='#n665'>665</a>
<a id='n666' href='#n666'>666</a>
<a id='n667' href='#n667'>667</a>
<a id='n668' href='#n668'>668</a>
<a id='n669' href='#n669'>669</a>
<a id='n670' href='#n670'>670</a>
<a id='n671' href='#n671'>671</a>
<a id='n672' href='#n672'>672</a>
<a id='n673' href='#n673'>673</a>
<a id='n674' href='#n674'>674</a>
<a id='n675' href='#n675'>675</a>
<a id='n676' href='#n676'>676</a>
<a id='n677' href='#n677'>677</a>
<a id='n678' href='#n678'>678</a>
<a id='n679' href='#n679'>679</a>
<a id='n680' href='#n680'>680</a>
<a id='n681' href='#n681'>681</a>
<a id='n682' href='#n682'>682</a>
<a id='n683' href='#n683'>683</a>
<a id='n684' href='#n684'>684</a>
<a id='n685' href='#n685'>685</a>
<a id='n686' href='#n686'>686</a>
<a id='n687' href='#n687'>687</a>
<a id='n688' href='#n688'>688</a>
<a id='n689' href='#n689'>689</a>
<a id='n690' href='#n690'>690</a>
<a id='n691' href='#n691'>691</a>
<a id='n692' href='#n692'>692</a>
<a id='n693' href='#n693'>693</a>
<a id='n694' href='#n694'>694</a>
<a id='n695' href='#n695'>695</a>
<a id='n696' href='#n696'>696</a>
<a id='n697' href='#n697'>697</a>
<a id='n698' href='#n698'>698</a>
<a id='n699' href='#n699'>699</a>
<a id='n700' href='#n700'>700</a>
<a id='n701' href='#n701'>701</a>
<a id='n702' href='#n702'>702</a>
<a id='n703' href='#n703'>703</a>
<a id='n704' href='#n704'>704</a>
<a id='n705' href='#n705'>705</a>
<a id='n706' href='#n706'>706</a>
<a id='n707' href='#n707'>707</a>
<a id='n708' href='#n708'>708</a>
<a id='n709' href='#n709'>709</a>
<a id='n710' href='#n710'>710</a>
<a id='n711' href='#n711'>711</a>
<a id='n712' href='#n712'>712</a>
<a id='n713' href='#n713'>713</a>
<a id='n714' href='#n714'>714</a>
<a id='n715' href='#n715'>715</a>
<a id='n716' href='#n716'>716</a>
<a id='n717' href='#n717'>717</a>
<a id='n718' href='#n718'>718</a>
<a id='n719' href='#n719'>719</a>
<a id='n720' href='#n720'>720</a>
<a id='n721' href='#n721'>721</a>
<a id='n722' href='#n722'>722</a>
<a id='n723' href='#n723'>723</a>
<a id='n724' href='#n724'>724</a>
<a id='n725' href='#n725'>725</a>
<a id='n726' href='#n726'>726</a>
<a id='n727' href='#n727'>727</a>
<a id='n728' href='#n728'>728</a>
<a id='n729' href='#n729'>729</a>
<a id='n730' href='#n730'>730</a>
<a id='n731' href='#n731'>731</a>
<a id='n732' href='#n732'>732</a>
<a id='n733' href='#n733'>733</a>
<a id='n734' href='#n734'>734</a>
<a id='n735' href='#n735'>735</a>
<a id='n736' href='#n736'>736</a>
<a id='n737' href='#n737'>737</a>
<a id='n738' href='#n738'>738</a>
<a id='n739' href='#n739'>739</a>
<a id='n740' href='#n740'>740</a>
<a id='n741' href='#n741'>741</a>
<a id='n742' href='#n742'>742</a>
<a id='n743' href='#n743'>743</a>
<a id='n744' href='#n744'>744</a>
<a id='n745' href='#n745'>745</a>
<a id='n746' href='#n746'>746</a>
<a id='n747' href='#n747'>747</a>
<a id='n748' href='#n748'>748</a>
<a id='n749' href='#n749'>749</a>
<a id='n750' href='#n750'>750</a>
<a id='n751' href='#n751'>751</a>
<a id='n752' href='#n752'>752</a>
<a id='n753' href='#n753'>753</a>
<a id='n754' href='#n754'>754</a>
<a id='n755' href='#n755'>755</a>
<a id='n756' href='#n756'>756</a>
<a id='n757' href='#n757'>757</a>
<a id='n758' href='#n758'>758</a>
<a id='n759' href='#n759'>759</a>
<a id='n760' href='#n760'>760</a>
<a id='n761' href='#n761'>761</a>
<a id='n762' href='#n762'>762</a>
<a id='n763' href='#n763'>763</a>
<a id='n764' href='#n764'>764</a>
<a id='n765' href='#n765'>765</a>
<a id='n766' href='#n766'>766</a>
<a id='n767' href='#n767'>767</a>
<a id='n768' href='#n768'>768</a>
<a id='n769' href='#n769'>769</a>
<a id='n770' href='#n770'>770</a>
<a id='n771' href='#n771'>771</a>
<a id='n772' href='#n772'>772</a>
<a id='n773' href='#n773'>773</a>
<a id='n774' href='#n774'>774</a>
<a id='n775' href='#n775'>775</a>
<a id='n776' href='#n776'>776</a>
<a id='n777' href='#n777'>777</a>
<a id='n778' href='#n778'>778</a>
<a id='n779' href='#n779'>779</a>
<a id='n780' href='#n780'>780</a>
<a id='n781' href='#n781'>781</a>
<a id='n782' href='#n782'>782</a>
<a id='n783' href='#n783'>783</a>
<a id='n784' href='#n784'>784</a>
<a id='n785' href='#n785'>785</a>
<a id='n786' href='#n786'>786</a>
<a id='n787' href='#n787'>787</a>
<a id='n788' href='#n788'>788</a>
<a id='n789' href='#n789'>789</a>
<a id='n790' href='#n790'>790</a>
<a id='n791' href='#n791'>791</a>
<a id='n792' href='#n792'>792</a>
<a id='n793' href='#n793'>793</a>
<a id='n794' href='#n794'>794</a>
<a id='n795' href='#n795'>795</a>
<a id='n796' href='#n796'>796</a>
<a id='n797' href='#n797'>797</a>
<a id='n798' href='#n798'>798</a>
<a id='n799' href='#n799'>799</a>
<a id='n800' href='#n800'>800</a>
<a id='n801' href='#n801'>801</a>
<a id='n802' href='#n802'>802</a>
<a id='n803' href='#n803'>803</a>
<a id='n804' href='#n804'>804</a>
<a id='n805' href='#n805'>805</a>
<a id='n806' href='#n806'>806</a>
<a id='n807' href='#n807'>807</a>
<a id='n808' href='#n808'>808</a>
<a id='n809' href='#n809'>809</a>
<a id='n810' href='#n810'>810</a>
<a id='n811' href='#n811'>811</a>
<a id='n812' href='#n812'>812</a>
<a id='n813' href='#n813'>813</a>
<a id='n814' href='#n814'>814</a>
<a id='n815' href='#n815'>815</a>
<a id='n816' href='#n816'>816</a>
<a id='n817' href='#n817'>817</a>
<a id='n818' href='#n818'>818</a>
<a id='n819' href='#n819'>819</a>
<a id='n820' href='#n820'>820</a>
<a id='n821' href='#n821'>821</a>
<a id='n822' href='#n822'>822</a>
<a id='n823' href='#n823'>823</a>
<a id='n824' href='#n824'>824</a>
<a id='n825' href='#n825'>825</a>
<a id='n826' href='#n826'>826</a>
<a id='n827' href='#n827'>827</a>
<a id='n828' href='#n828'>828</a>
<a id='n829' href='#n829'>829</a>
<a id='n830' href='#n830'>830</a>
<a id='n831' href='#n831'>831</a>
<a id='n832' href='#n832'>832</a>
<a id='n833' href='#n833'>833</a>
<a id='n834' href='#n834'>834</a>
<a id='n835' href='#n835'>835</a>
<a id='n836' href='#n836'>836</a>
<a id='n837' href='#n837'>837</a>
<a id='n838' href='#n838'>838</a>
<a id='n839' href='#n839'>839</a>
<a id='n840' href='#n840'>840</a>
<a id='n841' href='#n841'>841</a>
<a id='n842' href='#n842'>842</a>
<a id='n843' href='#n843'>843</a>
<a id='n844' href='#n844'>844</a>
<a id='n845' href='#n845'>845</a>
<a id='n846' href='#n846'>846</a>
<a id='n847' href='#n847'>847</a>
<a id='n848' href='#n848'>848</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888 } /* Comment */
.highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
.highlight .k { color: #080; font-weight: bold } /* Keyword */
.highlight .ch { color: #888 } /* Comment.Hashbang */
.highlight .cm { color: #888 } /* Comment.Multiline */
.highlight .cp { color: #C00; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888 } /* Comment.Single */
.highlight .cs { color: #C00; font-weight: bold; background-color: #FFF0F0 } /* Comment.Special */
.highlight .gd { color: #000; background-color: #FDD } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #A00 } /* Generic.Error */
.highlight .gh { color: #333 } /* Generic.Heading */
.highlight .gi { color: #000; background-color: #DFD } /* Generic.Inserted */
.highlight .go { color: #888 } /* Generic.Output */
.highlight .gp { color: #555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666 } /* Generic.Subheading */
.highlight .gt { color: #A00 } /* Generic.Traceback */
.highlight .kc { color: #080; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #080; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #080; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #080 } /* Keyword.Pseudo */
.highlight .kr { color: #080; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #00D; font-weight: bold } /* Literal.Number */
.highlight .s { color: #D20; background-color: #FFF0F0 } /* Literal.String */
.highlight .na { color: #369 } /* Name.Attribute */
.highlight .nb { color: #038 } /* Name.Builtin */
.highlight .nc { color: #B06; font-weight: bold } /* Name.Class */
.highlight .no { color: #036; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555 } /* Name.Decorator */
.highlight .ne { color: #B06; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #06B; font-weight: bold } /* Name.Function */
.highlight .nl { color: #369; font-style: italic } /* Name.Label */
.highlight .nn { color: #B06; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #369; font-weight: bold } /* Name.Property */
.highlight .nt { color: #B06; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #369 } /* Name.Variable */
.highlight .ow { color: #080 } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #00D; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #00D; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #00D; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #00D; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #00D; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #D20; background-color: #FFF0F0 } /* Literal.String.Affix */
.highlight .sb { color: #D20; background-color: #FFF0F0 } /* Literal.String.Backtick */
.highlight .sc { color: #D20; background-color: #FFF0F0 } /* Literal.String.Char */
.highlight .dl { color: #D20; background-color: #FFF0F0 } /* Literal.String.Delimiter */
.highlight .sd { color: #D20; background-color: #FFF0F0 } /* Literal.String.Doc */
.highlight .s2 { color: #D20; background-color: #FFF0F0 } /* Literal.String.Double */
.highlight .se { color: #04D; background-color: #FFF0F0 } /* Literal.String.Escape */
.highlight .sh { color: #D20; background-color: #FFF0F0 } /* Literal.String.Heredoc */
.highlight .si { color: #33B; background-color: #FFF0F0 } /* Literal.String.Interpol */
.highlight .sx { color: #2B2; background-color: #F0FFF0 } /* Literal.String.Other */
.highlight .sr { color: #080; background-color: #FFF0FF } /* Literal.String.Regex */
.highlight .s1 { color: #D20; background-color: #FFF0F0 } /* Literal.String.Single */
.highlight .ss { color: #A60; background-color: #FFF0F0 } /* Literal.String.Symbol */
.highlight .bp { color: #038 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #06B; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #369 } /* Name.Variable.Class */
.highlight .vg { color: #D70 } /* Name.Variable.Global */
.highlight .vi { color: #33B } /* Name.Variable.Instance */
.highlight .vm { color: #369 } /* Name.Variable.Magic */
.highlight .il { color: #00D; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="cm">/* asn1_gen.c */</span>
<span class="cm">/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL</span>
<span class="cm"> * project 2002.</span>
<span class="cm"> */</span>
<span class="cm">/* ====================================================================</span>
<span class="cm"> * Copyright (c) 2002 The OpenSSL Project.  All rights reserved.</span>
<span class="cm"> *</span>
<span class="cm"> * Redistribution and use in source and binary forms, with or without</span>
<span class="cm"> * modification, are permitted provided that the following conditions</span>
<span class="cm"> * are met:</span>
<span class="cm"> *</span>
<span class="cm"> * 1. Redistributions of source code must retain the above copyright</span>
<span class="cm"> *    notice, this list of conditions and the following disclaimer. </span>
<span class="cm"> *</span>
<span class="cm"> * 2. Redistributions in binary form must reproduce the above copyright</span>
<span class="cm"> *    notice, this list of conditions and the following disclaimer in</span>
<span class="cm"> *    the documentation and/or other materials provided with the</span>
<span class="cm"> *    distribution.</span>
<span class="cm"> *</span>
<span class="cm"> * 3. All advertising materials mentioning features or use of this</span>
<span class="cm"> *    software must display the following acknowledgment:</span>
<span class="cm"> *    &quot;This product includes software developed by the OpenSSL Project</span>
<span class="cm"> *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)&quot;</span>
<span class="cm"> *</span>
<span class="cm"> * 4. The names &quot;OpenSSL Toolkit&quot; and &quot;OpenSSL Project&quot; must not be used to</span>
<span class="cm"> *    endorse or promote products derived from this software without</span>
<span class="cm"> *    prior written permission. For written permission, please contact</span>
<span class="cm"> *    licensing@OpenSSL.org.</span>
<span class="cm"> *</span>
<span class="cm"> * 5. Products derived from this software may not be called &quot;OpenSSL&quot;</span>
<span class="cm"> *    nor may &quot;OpenSSL&quot; appear in their names without prior written</span>
<span class="cm"> *    permission of the OpenSSL Project.</span>
<span class="cm"> *</span>
<span class="cm"> * 6. Redistributions of any form whatsoever must retain the following</span>
<span class="cm"> *    acknowledgment:</span>
<span class="cm"> *    &quot;This product includes software developed by the OpenSSL Project</span>
<span class="cm"> *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)&quot;</span>
<span class="cm"> *</span>
<span class="cm"> * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS&#39;&#39; AND ANY</span>
<span class="cm"> * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
<span class="cm"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span>
<span class="cm"> * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR</span>
<span class="cm"> * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
<span class="cm"> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</span>
<span class="cm"> * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
<span class="cm"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
<span class="cm"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,</span>
<span class="cm"> * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span>
<span class="cm"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED</span>
<span class="cm"> * OF THE POSSIBILITY OF SUCH DAMAGE.</span>
<span class="cm"> * ====================================================================</span>
<span class="cm"> *</span>
<span class="cm"> * This product includes cryptographic software written by Eric Young</span>
<span class="cm"> * (eay@cryptsoft.com).  This product includes software written by Tim</span>
<span class="cm"> * Hudson (tjh@cryptsoft.com).</span>
<span class="cm"> *</span>
<span class="cm"> */</span>

<span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;cryptlib.h&quot;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;openssl/asn1.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;openssl/x509v3.h&gt;</span>

<span class="cp">#define ASN1_GEN_FLAG		0x10000</span>
<span class="cp">#define ASN1_GEN_FLAG_IMP	(ASN1_GEN_FLAG|1)</span>
<span class="cp">#define ASN1_GEN_FLAG_EXP	(ASN1_GEN_FLAG|2)</span>
<span class="cp">#define ASN1_GEN_FLAG_TAG	(ASN1_GEN_FLAG|3)</span>
<span class="cp">#define ASN1_GEN_FLAG_BITWRAP	(ASN1_GEN_FLAG|4)</span>
<span class="cp">#define ASN1_GEN_FLAG_OCTWRAP	(ASN1_GEN_FLAG|5)</span>
<span class="cp">#define ASN1_GEN_FLAG_SEQWRAP	(ASN1_GEN_FLAG|6)</span>
<span class="cp">#define ASN1_GEN_FLAG_SETWRAP	(ASN1_GEN_FLAG|7)</span>
<span class="cp">#define ASN1_GEN_FLAG_FORMAT	(ASN1_GEN_FLAG|8)</span>

<span class="cp">#define ASN1_GEN_STR(str,val)	{str, sizeof(str) - 1, val}</span>

<span class="cp">#define ASN1_FLAG_EXP_MAX	20</span>

<span class="cm">/* Input formats */</span>

<span class="cm">/* ASCII: default */</span>
<span class="cp">#define ASN1_GEN_FORMAT_ASCII	1</span>
<span class="cm">/* UTF8 */</span>
<span class="cp">#define ASN1_GEN_FORMAT_UTF8	2</span>
<span class="cm">/* Hex */</span>
<span class="cp">#define ASN1_GEN_FORMAT_HEX	3</span>
<span class="cm">/* List of bits */</span>
<span class="cp">#define ASN1_GEN_FORMAT_BITLIST	4</span>


<span class="k">struct</span><span class="w"> </span><span class="nc">tag_name_st</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">strnam</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">;</span>
<span class="w">	</span><span class="p">};</span>

<span class="k">typedef</span><span class="w"> </span><span class="k">struct</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">exp_tag</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">exp_class</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">exp_constructed</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">exp_pad</span><span class="p">;</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">exp_len</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span><span class="w"> </span><span class="n">tag_exp_type</span><span class="p">;</span>

<span class="k">typedef</span><span class="w"> </span><span class="k">struct</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">imp_tag</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">imp_class</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">format</span><span class="p">;</span>
<span class="w">	</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">;</span>
<span class="w">	</span><span class="n">tag_exp_type</span><span class="w"> </span><span class="n">exp_list</span><span class="p">[</span><span class="n">ASN1_FLAG_EXP_MAX</span><span class="p">];</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">exp_count</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span><span class="w"> </span><span class="n">tag_exp_arg</span><span class="p">;</span>

<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">bitstr_cb</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">elem</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">bitstr</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">asn1_cb</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">elem</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">bitstr</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">append_exp</span><span class="p">(</span><span class="n">tag_exp_arg</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_tag</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_class</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_constructed</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_pad</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">imp_ok</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">parse_tagging</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">vlen</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">ptag</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">pclass</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="nf">asn1_multi</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">utype</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">section</span><span class="p">,</span><span class="w"> </span><span class="n">X509V3_CTX</span><span class="w"> </span><span class="o">*</span><span class="n">cnf</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="nf">asn1_str2type</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">format</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">utype</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">asn1_str2tag</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">tagstr</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">);</span>

<span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="nf">ASN1_generate_nconf</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="n">CONF</span><span class="w"> </span><span class="o">*</span><span class="n">nconf</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="n">X509V3_CTX</span><span class="w"> </span><span class="n">cnf</span><span class="p">;</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">nconf</span><span class="p">)</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">ASN1_generate_v3</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>

<span class="w">	</span><span class="n">X509V3_set_nconf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cnf</span><span class="p">,</span><span class="w"> </span><span class="n">nconf</span><span class="p">);</span>
<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="n">ASN1_generate_v3</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">cnf</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="nf">ASN1_generate_v3</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="n">X509V3_CTX</span><span class="w"> </span><span class="o">*</span><span class="n">cnf</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="n">ret</span><span class="p">;</span>
<span class="w">	</span><span class="n">tag_exp_arg</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">;</span>
<span class="w">	</span><span class="n">tag_exp_type</span><span class="w"> </span><span class="o">*</span><span class="n">etmp</span><span class="p">;</span>

<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">;</span>

<span class="w">	</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">orig_der</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">new_der</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">	</span><span class="k">const</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">cpy_start</span><span class="p">;</span>
<span class="w">	</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">;</span>
<span class="w">	</span><span class="k">const</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">cp</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">cpy_len</span><span class="p">;</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">hdr_len</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">hdr_constructed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">hdr_tag</span><span class="p">,</span><span class="w"> </span><span class="n">hdr_class</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">r</span><span class="p">;</span>

<span class="w">	</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">	</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">	</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">;</span>
<span class="w">	</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">CONF_parse_list</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="sc">&#39;,&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">asn1_cb</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">asn1_tags</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">utype</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">V_ASN1_SEQUENCE</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">utype</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">V_ASN1_SET</span><span class="p">))</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">cnf</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_GENERATE_V3</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">asn1_multi</span><span class="p">(</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">utype</span><span class="p">,</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="n">cnf</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="k">else</span>
<span class="w">		</span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">asn1_str2type</span><span class="p">(</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">format</span><span class="p">,</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">utype</span><span class="p">);</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ret</span><span class="p">)</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">	</span><span class="cm">/* If no tagging return base type */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_count</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">))</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span>

<span class="w">	</span><span class="cm">/* Generate the encoding */</span>
<span class="w">	</span><span class="n">cpy_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i2d_ASN1_TYPE</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">orig_der</span><span class="p">);</span>
<span class="w">	</span><span class="n">ASN1_TYPE_free</span><span class="p">(</span><span class="n">ret</span><span class="p">);</span>
<span class="w">	</span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">	</span><span class="cm">/* Set point to start copying for modified encoding */</span>
<span class="w">	</span><span class="n">cpy_start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">orig_der</span><span class="p">;</span>

<span class="w">	</span><span class="cm">/* Do we need IMPLICIT tagging? */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="cm">/* If IMPLICIT we will replace the underlying tag */</span>
<span class="w">		</span><span class="cm">/* Skip existing tag+len */</span>
<span class="w">		</span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_get_object</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cpy_start</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">hdr_len</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">hdr_tag</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">hdr_class</span><span class="p">,</span><span class="w"> </span><span class="n">cpy_len</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="mh">0x80</span><span class="p">)</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">err</span><span class="p">;</span>
<span class="w">		</span><span class="cm">/* Update copy length */</span>
<span class="w">		</span><span class="n">cpy_len</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">cpy_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">orig_der</span><span class="p">;</span>
<span class="w">		</span><span class="cm">/* For IMPLICIT tagging the length should match the</span>
<span class="cm">		 * original length and constructed flag should be</span>
<span class="cm">		 * consistent.</span>
<span class="cm">		 */</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="mh">0x1</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="cm">/* Indefinite length constructed */</span>
<span class="w">			</span><span class="n">hdr_constructed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<span class="w">			</span><span class="n">hdr_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">else</span>
<span class="w">			</span><span class="cm">/* Just retain constructed flag */</span>
<span class="w">			</span><span class="n">hdr_constructed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">V_ASN1_CONSTRUCTED</span><span class="p">;</span>
<span class="w">		</span><span class="cm">/* Work out new length with IMPLICIT tag: ignore constructed</span>
<span class="cm">		 * because it will mess up if indefinite length</span>
<span class="cm">		 */</span>
<span class="w">		</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_object_size</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">hdr_len</span><span class="p">,</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_tag</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="k">else</span>
<span class="w">		</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cpy_len</span><span class="p">;</span>

<span class="w">	</span><span class="cm">/* Work out length in any EXPLICIT, starting from end */</span>

<span class="w">	</span><span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_list</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_count</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_count</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="o">--</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="cm">/* Content length: number of content octets + any padding */</span>
<span class="w">		</span><span class="n">len</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_pad</span><span class="p">;</span>
<span class="w">		</span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">len</span><span class="p">;</span>
<span class="w">		</span><span class="cm">/* Total object length: length including new header */</span>
<span class="w">		</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_object_size</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_tag</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/* Allocate buffer for new encoding */</span>

<span class="w">	</span><span class="n">new_der</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">OPENSSL_malloc</span><span class="p">(</span><span class="n">len</span><span class="p">);</span>

<span class="w">	</span><span class="cm">/* Generate tagged encoding */</span>

<span class="w">	</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new_der</span><span class="p">;</span>

<span class="w">	</span><span class="cm">/* Output explicit tags first */</span>

<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_list</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">exp_count</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="o">++</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1_put_object</span><span class="p">(</span><span class="o">&amp;</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_constructed</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_len</span><span class="p">,</span>
<span class="w">					</span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_tag</span><span class="p">,</span><span class="w"> </span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_class</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">etmp</span><span class="o">-&gt;</span><span class="n">exp_pad</span><span class="p">)</span>
<span class="w">			</span><span class="o">*</span><span class="n">p</span><span class="o">++</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/* If IMPLICIT, output tag */</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span>
<span class="w">		</span><span class="n">ASN1_put_object</span><span class="p">(</span><span class="o">&amp;</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">hdr_constructed</span><span class="p">,</span><span class="w"> </span><span class="n">hdr_len</span><span class="p">,</span>
<span class="w">					</span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_tag</span><span class="p">,</span><span class="w"> </span><span class="n">asn1_tags</span><span class="p">.</span><span class="n">imp_class</span><span class="p">);</span>

<span class="w">	</span><span class="cm">/* Copy across original encoding */</span>
<span class="w">	</span><span class="n">memcpy</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">cpy_start</span><span class="p">,</span><span class="w"> </span><span class="n">cpy_len</span><span class="p">);</span>

<span class="w">	</span><span class="n">cp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new_der</span><span class="p">;</span>

<span class="w">	</span><span class="cm">/* Obtain new ASN1_TYPE structure */</span>
<span class="w">	</span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">d2i_ASN1_TYPE</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">cp</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">);</span>

<span class="w">	</span><span class="nl">err</span><span class="p">:</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">orig_der</span><span class="p">)</span>
<span class="w">		</span><span class="n">OPENSSL_free</span><span class="p">(</span><span class="n">orig_der</span><span class="p">);</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">new_der</span><span class="p">)</span>
<span class="w">		</span><span class="n">OPENSSL_free</span><span class="p">(</span><span class="n">new_der</span><span class="p">);</span>

<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span>

<span class="w">	</span><span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">asn1_cb</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">elem</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">bitstr</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="n">tag_exp_arg</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bitstr</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">vlen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">vstart</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">tmp_tag</span><span class="p">,</span><span class="w"> </span><span class="n">tmp_class</span><span class="p">;</span>

<span class="w">	</span><span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">elem</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">len</span><span class="p">;</span><span class="w"> </span><span class="n">p</span><span class="o">++</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="cm">/* Look for the &#39;:&#39; in name value pairs */</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="sc">&#39;:&#39;</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">vstart</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w">			</span><span class="n">vlen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">len</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">vstart</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">elem</span><span class="p">);</span>
<span class="w">			</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">elem</span><span class="p">;</span>
<span class="w">			</span><span class="k">break</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="n">utype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">asn1_str2tag</span><span class="p">(</span><span class="n">elem</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">);</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">utype</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_CB</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_UNKNOWN_TAG</span><span class="p">);</span>
<span class="w">		</span><span class="n">ERR_add_error_data</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;tag=&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">elem</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/* If this is not a modifier mark end of string and exit */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">utype</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG</span><span class="p">))</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">utype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>
<span class="w">		</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">str</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">vstart</span><span class="p">;</span>
<span class="w">		</span><span class="cm">/* If no value and not end of string, error */</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">vstart</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">elem</span><span class="p">[</span><span class="n">len</span><span class="p">])</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_CB</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_MISSING_VALUE</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="k">switch</span><span class="p">(</span><span class="n">utype</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_IMP</span><span class="p">:</span>
<span class="w">		</span><span class="cm">/* Check for illegal multiple IMPLICIT tagging */</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_CB</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_NESTED_TAGGING</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">parse_tagging</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="n">vlen</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_tag</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_class</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_EXP</span><span class="p">:</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">parse_tagging</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="n">vlen</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">tmp_tag</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">tmp_class</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">append_exp</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="n">tmp_tag</span><span class="p">,</span><span class="w"> </span><span class="n">tmp_class</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_SEQWRAP</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">append_exp</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_SEQUENCE</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_SETWRAP</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">append_exp</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_SET</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_BITWRAP</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">append_exp</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BIT_STRING</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_OCTWRAP</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">append_exp</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_OCTET_STRING</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">ASN1_GEN_FLAG_FORMAT</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">strncmp</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;ASCII&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">))</span>
<span class="w">			</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">;</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">strncmp</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;UTF8&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">))</span>
<span class="w">			</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_UTF8</span><span class="p">;</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">strncmp</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;HEX&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">))</span>
<span class="w">			</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_HEX</span><span class="p">;</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">strncmp</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;BITLIST&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">))</span>
<span class="w">			</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_BITLIST</span><span class="p">;</span>
<span class="w">		</span><span class="k">else</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_CB</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_UNKOWN_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>

<span class="w">	</span><span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">parse_tagging</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">vlen</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">ptag</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">pclass</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="kt">char</span><span class="w"> </span><span class="n">erch</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">tag_num</span><span class="p">;</span>
<span class="w">	</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">eptr</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">vstart</span><span class="p">)</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="n">tag_num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">strtoul</span><span class="p">(</span><span class="n">vstart</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">eptr</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">);</span>
<span class="w">	</span><span class="cm">/* Check we haven&#39;t gone past max length: should be impossible */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">eptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">*</span><span class="n">eptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">eptr</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">vstart</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">vlen</span><span class="p">))</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tag_num</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_PARSE_TAGGING</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_INVALID_NUMBER</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="o">*</span><span class="n">ptag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tag_num</span><span class="p">;</span>
<span class="w">	</span><span class="cm">/* If we have non numeric characters, parse them */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">eptr</span><span class="p">)</span>
<span class="w">		</span><span class="n">vlen</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">eptr</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">vstart</span><span class="p">;</span>
<span class="w">	</span><span class="k">else</span><span class="w"> </span>
<span class="w">		</span><span class="n">vlen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">vlen</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">eptr</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>

<span class="w">			</span><span class="k">case</span><span class="w"> </span><span class="sc">&#39;U&#39;</span><span class="p">:</span>
<span class="w">			</span><span class="o">*</span><span class="n">pclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">;</span>
<span class="w">			</span><span class="k">break</span><span class="p">;</span>

<span class="w">			</span><span class="k">case</span><span class="w"> </span><span class="sc">&#39;A&#39;</span><span class="p">:</span>
<span class="w">			</span><span class="o">*</span><span class="n">pclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">V_ASN1_APPLICATION</span><span class="p">;</span>
<span class="w">			</span><span class="k">break</span><span class="p">;</span>

<span class="w">			</span><span class="k">case</span><span class="w"> </span><span class="sc">&#39;P&#39;</span><span class="p">:</span>
<span class="w">			</span><span class="o">*</span><span class="n">pclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">V_ASN1_PRIVATE</span><span class="p">;</span>
<span class="w">			</span><span class="k">break</span><span class="p">;</span>

<span class="w">			</span><span class="k">case</span><span class="w"> </span><span class="sc">&#39;C&#39;</span><span class="p">:</span>
<span class="w">			</span><span class="o">*</span><span class="n">pclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">V_ASN1_CONTEXT_SPECIFIC</span><span class="p">;</span>
<span class="w">			</span><span class="k">break</span><span class="p">;</span>

<span class="w">			</span><span class="k">default</span><span class="o">:</span>
<span class="w">			</span><span class="n">erch</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">*</span><span class="n">eptr</span><span class="p">;</span>
<span class="w">			</span><span class="n">erch</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_PARSE_TAGGING</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_INVALID_MODIFIER</span><span class="p">);</span>
<span class="w">			</span><span class="n">ERR_add_error_data</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Char=&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">erch</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">			</span><span class="k">break</span><span class="p">;</span>

<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="k">else</span>
<span class="w">		</span><span class="o">*</span><span class="n">pclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">V_ASN1_CONTEXT_SPECIFIC</span><span class="p">;</span>

<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>

<span class="w">	</span><span class="p">}</span>

<span class="cm">/* Handle multiple types: SET and SEQUENCE */</span>

<span class="k">static</span><span class="w"> </span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="nf">asn1_multi</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">utype</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">section</span><span class="p">,</span><span class="w"> </span><span class="n">X509V3_CTX</span><span class="w"> </span><span class="o">*</span><span class="n">cnf</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">typ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">	</span><span class="n">STACK_OF</span><span class="p">(</span><span class="n">ASN1_TYPE</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="n">sk</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">	</span><span class="n">STACK_OF</span><span class="p">(</span><span class="n">CONF_VALUE</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="n">sect</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">	</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">der</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">derlen</span><span class="p">;</span>
<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">is_set</span><span class="p">;</span>
<span class="w">	</span><span class="n">sk</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sk_ASN1_TYPE_new_null</span><span class="p">();</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">section</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">cnf</span><span class="p">)</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad</span><span class="p">;</span>
<span class="w">		</span><span class="n">sect</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">X509V3_get_section</span><span class="p">(</span><span class="n">cnf</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">section</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">sect</span><span class="p">)</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad</span><span class="p">;</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">sk_CONF_VALUE_num</span><span class="p">(</span><span class="n">sect</span><span class="p">);</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">typ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_generate_v3</span><span class="p">(</span><span class="n">sk_CONF_VALUE_value</span><span class="p">(</span><span class="n">sect</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">cnf</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">typ</span><span class="p">)</span>
<span class="w">				</span><span class="k">goto</span><span class="w"> </span><span class="n">bad</span><span class="p">;</span>
<span class="w">			</span><span class="n">sk_ASN1_TYPE_push</span><span class="p">(</span><span class="n">sk</span><span class="p">,</span><span class="w"> </span><span class="n">typ</span><span class="p">);</span>
<span class="w">			</span><span class="n">typ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/* Now we has a STACK of the components, convert to the correct form */</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">utype</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">V_ASN1_SET</span><span class="p">)</span>
<span class="w">		</span><span class="n">is_set</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w">	</span><span class="k">else</span>
<span class="w">		</span><span class="n">is_set</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>


<span class="w">	</span><span class="n">derlen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i2d_ASN1_SET_OF_ASN1_TYPE</span><span class="p">(</span><span class="n">sk</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">i2d_ASN1_TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">utype</span><span class="p">,</span>
<span class="w">					   </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">,</span><span class="w"> </span><span class="n">is_set</span><span class="p">);</span>
<span class="w">	</span><span class="n">der</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">OPENSSL_malloc</span><span class="p">(</span><span class="n">derlen</span><span class="p">);</span>
<span class="w">	</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">der</span><span class="p">;</span>
<span class="w">	</span><span class="n">i2d_ASN1_SET_OF_ASN1_TYPE</span><span class="p">(</span><span class="n">sk</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">i2d_ASN1_TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">utype</span><span class="p">,</span>
<span class="w">				  </span><span class="n">V_ASN1_UNIVERSAL</span><span class="p">,</span><span class="w"> </span><span class="n">is_set</span><span class="p">);</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_TYPE_new</span><span class="p">()))</span>
<span class="w">		</span><span class="k">goto</span><span class="w"> </span><span class="n">bad</span><span class="p">;</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">ret</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_STRING_type_new</span><span class="p">(</span><span class="n">utype</span><span class="p">)))</span>
<span class="w">		</span><span class="k">goto</span><span class="w"> </span><span class="n">bad</span><span class="p">;</span>

<span class="w">	</span><span class="n">ret</span><span class="o">-&gt;</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>

<span class="w">	</span><span class="n">ret</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">der</span><span class="p">;</span>
<span class="w">	</span><span class="n">ret</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">length</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">derlen</span><span class="p">;</span>

<span class="w">	</span><span class="n">der</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">	</span><span class="nl">bad</span><span class="p">:</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">der</span><span class="p">)</span>
<span class="w">		</span><span class="n">OPENSSL_free</span><span class="p">(</span><span class="n">der</span><span class="p">);</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sk</span><span class="p">)</span>
<span class="w">		</span><span class="n">sk_ASN1_TYPE_pop_free</span><span class="p">(</span><span class="n">sk</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_TYPE_free</span><span class="p">);</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">typ</span><span class="p">)</span>
<span class="w">		</span><span class="n">ASN1_TYPE_free</span><span class="p">(</span><span class="n">typ</span><span class="p">);</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sect</span><span class="p">)</span>
<span class="w">		</span><span class="n">X509V3_section_free</span><span class="p">(</span><span class="n">cnf</span><span class="p">,</span><span class="w"> </span><span class="n">sect</span><span class="p">);</span>

<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">append_exp</span><span class="p">(</span><span class="n">tag_exp_arg</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_tag</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_class</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_constructed</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exp_pad</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">imp_ok</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="n">tag_exp_type</span><span class="w"> </span><span class="o">*</span><span class="n">exp_tmp</span><span class="p">;</span>
<span class="w">	</span><span class="cm">/* Can only have IMPLICIT if permitted */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">!</span><span class="n">imp_ok</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_APPEND_EXP</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_IMPLICIT_TAG</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">exp_count</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_FLAG_EXP_MAX</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_APPEND_EXP</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_DEPTH_EXCEEDED</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="n">exp_tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">exp_list</span><span class="p">[</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">exp_count</span><span class="o">++</span><span class="p">];</span>

<span class="w">	</span><span class="cm">/* If IMPLICIT set tag to implicit value then</span>
<span class="cm">	 * reset implicit tag since it has been used.</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">exp_tmp</span><span class="o">-&gt;</span><span class="n">exp_tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_tag</span><span class="p">;</span>
<span class="w">		</span><span class="n">exp_tmp</span><span class="o">-&gt;</span><span class="n">exp_class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_class</span><span class="p">;</span>
<span class="w">		</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="n">arg</span><span class="o">-&gt;</span><span class="n">imp_class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="k">else</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">exp_tmp</span><span class="o">-&gt;</span><span class="n">exp_tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">exp_tag</span><span class="p">;</span>
<span class="w">		</span><span class="n">exp_tmp</span><span class="o">-&gt;</span><span class="n">exp_class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">exp_class</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="n">exp_tmp</span><span class="o">-&gt;</span><span class="n">exp_constructed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">exp_constructed</span><span class="p">;</span>
<span class="w">	</span><span class="n">exp_tmp</span><span class="o">-&gt;</span><span class="n">exp_pad</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">exp_pad</span><span class="p">;</span>

<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>


<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">asn1_str2tag</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">tagstr</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="w">	</span><span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">tag_name_st</span><span class="w"> </span><span class="o">*</span><span class="n">tntmp</span><span class="p">,</span><span class="w"> </span><span class="n">tnst</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BOOL&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BOOLEAN</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BOOLEAN&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BOOLEAN</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;NULL&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_NULL</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;INT&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_INTEGER</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;INTEGER&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_INTEGER</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;ENUM&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_ENUMERATED</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;ENUMERATED&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_ENUMERATED</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;OID&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_OBJECT</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;OBJECT&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_OBJECT</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;UTCTIME&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UTCTIME</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;UTC&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UTCTIME</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;GENERALIZEDTIME&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_GENERALIZEDTIME</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;GENTIME&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_GENERALIZEDTIME</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;OCT&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_OCTET_STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;OCTETSTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_OCTET_STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BITSTR&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BIT_STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BITSTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BIT_STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;UNIVERSALSTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSALSTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;UNIV&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UNIVERSALSTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;IA5&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_IA5STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;IA5STRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_IA5STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;UTF8&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UTF8STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;UTF8String&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_UTF8STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BMP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BMPSTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BMPSTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_BMPSTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;VISIBLESTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_VISIBLESTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;VISIBLE&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_VISIBLESTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;PRINTABLESTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_PRINTABLESTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;PRINTABLE&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_PRINTABLESTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;T61&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_T61STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;T61STRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_T61STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;TELETEXSTRING&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_T61STRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;GeneralString&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_GENERALSTRING</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;GENSTR&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_GENERALSTRING</span><span class="p">),</span>

<span class="w">		</span><span class="cm">/* Special cases */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;SEQUENCE&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_SEQUENCE</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;SEQ&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_SEQUENCE</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;SET&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">V_ASN1_SET</span><span class="p">),</span>
<span class="w">		</span><span class="cm">/* type modifiers */</span>
<span class="w">		</span><span class="cm">/* Explicit tag */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;EXP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_EXP</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;EXPLICIT&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_EXP</span><span class="p">),</span>
<span class="w">		</span><span class="cm">/* Implicit tag */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;IMP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_IMP</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;IMPLICIT&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_IMP</span><span class="p">),</span>
<span class="w">		</span><span class="cm">/* OCTET STRING wrapper */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;OCTWRAP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_OCTWRAP</span><span class="p">),</span>
<span class="w">		</span><span class="cm">/* SEQUENCE wrapper */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;SEQWRAP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_SEQWRAP</span><span class="p">),</span>
<span class="w">		</span><span class="cm">/* SET wrapper */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;SETWRAP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_SETWRAP</span><span class="p">),</span>
<span class="w">		</span><span class="cm">/* BIT STRING wrapper */</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;BITWRAP&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_BITWRAP</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;FORM&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_FORMAT</span><span class="p">),</span>
<span class="w">		</span><span class="n">ASN1_GEN_STR</span><span class="p">(</span><span class="s">&quot;FORMAT&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_GEN_FLAG_FORMAT</span><span class="p">),</span>
<span class="w">	</span><span class="p">};</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">len</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span>
<span class="w">		</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">strlen</span><span class="p">(</span><span class="n">tagstr</span><span class="p">);</span>
<span class="w">	</span>
<span class="w">	</span><span class="n">tntmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tnst</span><span class="p">;</span><span class="w">	</span>
<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">tnst</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">tag_name_st</span><span class="p">);</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">,</span><span class="w"> </span><span class="n">tntmp</span><span class="o">++</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">len</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">tntmp</span><span class="o">-&gt;</span><span class="n">len</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">!</span><span class="n">strncmp</span><span class="p">(</span><span class="n">tntmp</span><span class="o">-&gt;</span><span class="n">strnam</span><span class="p">,</span><span class="w"> </span><span class="n">tagstr</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">))</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">tntmp</span><span class="o">-&gt;</span><span class="n">tag</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span>
<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="nf">asn1_str2type</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">format</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">utype</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="n">ASN1_TYPE</span><span class="w"> </span><span class="o">*</span><span class="n">atmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">	</span><span class="n">CONF_VALUE</span><span class="w"> </span><span class="n">vtmp</span><span class="p">;</span>

<span class="w">	</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">rdata</span><span class="p">;</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">rdlen</span><span class="p">;</span>

<span class="w">	</span><span class="kt">int</span><span class="w"> </span><span class="n">no_unused</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">atmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_TYPE_new</span><span class="p">()))</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ERR_R_MALLOC_FAILURE</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">str</span><span class="p">)</span>
<span class="w">		</span><span class="n">str</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="p">;</span>

<span class="w">	</span><span class="k">switch</span><span class="p">(</span><span class="n">utype</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_NULL</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">str</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_NULL_VALUE</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_BOOLEAN</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_NOT_ASCII_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="n">vtmp</span><span class="p">.</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">		</span><span class="n">vtmp</span><span class="p">.</span><span class="n">section</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w">		</span><span class="n">vtmp</span><span class="p">.</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">str</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">X509V3_get_value_bool</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vtmp</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">boolean</span><span class="p">))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_BOOLEAN</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_INTEGER</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_ENUMERATED</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_INTEGER_NOT_ASCII_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">integer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s2i_ASN1_INTEGER</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">str</span><span class="p">)))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_INTEGER</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_OBJECT</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_OBJECT_NOT_ASCII_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">OBJ_txt2obj</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_OBJECT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_UTCTIME</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_GENERALIZEDTIME</span><span class="p">:</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_TIME_NOT_ASCII_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_STRING_new</span><span class="p">()))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ERR_R_MALLOC_FAILURE</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ASN1_STRING_set</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="p">,</span><span class="w"> </span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ERR_R_MALLOC_FAILURE</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ASN1_TIME_check</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="p">))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_TIME_VALUE</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_BMPSTRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_PRINTABLESTRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_IA5STRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_T61STRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_UTF8STRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_VISIBLESTRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_UNIVERSALSTRING</span><span class="p">:</span>
<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_GENERALSTRING</span><span class="p">:</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">)</span>
<span class="w">			</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MBSTRING_ASC</span><span class="p">;</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_UTF8</span><span class="p">)</span>
<span class="w">			</span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MBSTRING_UTF8</span><span class="p">;</span>
<span class="w">		</span><span class="k">else</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>


<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ASN1_mbstring_copy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">str</span><span class="p">,</span>
<span class="w">						</span><span class="mi">-1</span><span class="p">,</span><span class="w"> </span><span class="n">format</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_tag2bit</span><span class="p">(</span><span class="n">utype</span><span class="p">))</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ERR_R_MALLOC_FAILURE</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span>

<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_BIT_STRING</span><span class="p">:</span>

<span class="w">		</span><span class="k">case</span><span class="w"> </span><span class="no">V_ASN1_OCTET_STRING</span><span class="p">:</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_STRING_new</span><span class="p">()))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ERR_R_MALLOC_FAILURE</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_HEX</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>

<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">rdata</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">string_to_hex</span><span class="p">((</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">rdlen</span><span class="p">)))</span>
<span class="w">				</span><span class="p">{</span>
<span class="w">				</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_HEX</span><span class="p">);</span>
<span class="w">				</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>

<span class="w">			</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rdata</span><span class="p">;</span>
<span class="w">			</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">length</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rdlen</span><span class="p">;</span>
<span class="w">			</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>

<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">format</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_ASCII</span><span class="p">)</span>
<span class="w">			</span><span class="n">ASN1_STRING_set</span><span class="p">(</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="p">,</span><span class="w"> </span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">format</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_GEN_FORMAT_BITLIST</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">utype</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">V_ASN1_BIT_STRING</span><span class="p">))</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">CONF_parse_list</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="sc">&#39;,&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">bitstr_cb</span><span class="p">,</span><span class="w"> </span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">bit_string</span><span class="p">))</span>
<span class="w">				</span><span class="p">{</span>
<span class="w">				</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_LIST_ERROR</span><span class="p">);</span>
<span class="w">				</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="n">no_unused</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">			</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_ILLEGAL_BITSTRING_FORMAT</span><span class="p">);</span>
<span class="w">			</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_form</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">utype</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">V_ASN1_BIT_STRING</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">no_unused</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">			</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">flags</span>
<span class="w">				</span><span class="o">&amp;=</span><span class="w"> </span><span class="o">~</span><span class="p">(</span><span class="n">ASN1_STRING_FLAG_BITS_LEFT</span><span class="o">|</span><span class="mh">0x07</span><span class="p">);</span>
<span class="w">        		</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">asn1_string</span><span class="o">-&gt;</span><span class="n">flags</span>
<span class="w">				</span><span class="o">|=</span><span class="w"> </span><span class="n">ASN1_STRING_FLAG_BITS_LEFT</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>


<span class="w">		</span><span class="k">break</span><span class="p">;</span>

<span class="w">		</span><span class="k">default</span><span class="o">:</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_ASN1_STR2TYPE</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_UNSUPPORTED_TYPE</span><span class="p">);</span>
<span class="w">		</span><span class="k">goto</span><span class="w"> </span><span class="n">bad_str</span><span class="p">;</span>
<span class="w">		</span><span class="k">break</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>


<span class="w">	</span><span class="n">atmp</span><span class="o">-&gt;</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">utype</span><span class="p">;</span>
<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="n">atmp</span><span class="p">;</span>


<span class="w">	</span><span class="nl">bad_str</span><span class="p">:</span>
<span class="w">	</span><span class="n">ERR_add_error_data</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;string=&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">str</span><span class="p">);</span>
<span class="w">	</span><span class="nl">bad_form</span><span class="p">:</span>

<span class="w">	</span><span class="n">ASN1_TYPE_free</span><span class="p">(</span><span class="n">atmp</span><span class="p">);</span>
<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">	</span><span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">bitstr_cb</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">elem</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">bitstr</span><span class="p">)</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">bitnum</span><span class="p">;</span>
<span class="w">	</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">eptr</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">elem</span><span class="p">)</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="n">bitnum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">strtoul</span><span class="p">(</span><span class="n">elem</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">eptr</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">);</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">eptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">*</span><span class="n">eptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">eptr</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">elem</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">len</span><span class="p">))</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">bitnum</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_BITSTR_CB</span><span class="p">,</span><span class="w"> </span><span class="n">ASN1_R_INVALID_NUMBER</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ASN1_BIT_STRING_set_bit</span><span class="p">(</span><span class="n">bitstr</span><span class="p">,</span><span class="w"> </span><span class="n">bitnum</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">		</span><span class="n">ASN1err</span><span class="p">(</span><span class="n">ASN1_F_BITSTR_CB</span><span class="p">,</span><span class="w"> </span><span class="n">ERR_R_MALLOC_FAILURE</span><span class="p">);</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>
</pre></div>