crypto: template instantiation (maybe pcrypt) bug since 6.12

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Hi,

I've found an issue on mainline (since v6.12) where the pcrypt()
template seems completely broken:

$ python -c "import socket; socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0).bind(('aead', 'pcrypt(ccm(aes))'))"
...
OSError: [Errno 36] File name too long

and then...

$ grep 'pcrypt(' /proc/crypto
driver : pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic)))))))))))) driver : pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic))))))))))) driver : pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic)))))))))) driver : pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic))))))))) driver : pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic)))))))) driver : pcrypt(pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic))))))) driver : pcrypt(pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic)))))) driver : pcrypt(pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic))))) driver : pcrypt(pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic))))
driver       : pcrypt(ccm_base(ctr(aes-generic),cbcmac(aes-generic)))

Yeah... :-)

I've bisected it to these two commits:

e7a4142b35ce489fc8908d75596c51549711ade0 -- hangs
795f85fca229a88543a0a706039f901106bf11c1 -- bad

Basically pcrypt() seems trying to instantiate itself on the algorithm
it just registered (...a larval?).

I made this handy stack trace to try to understand what the flow is
since it involves multiple notifiers and kthreads:

bind
- alg_bind
  - aead_bind
    - crypto_alloc_tfm_node // loops over:
      - crypto_alg_mod_lookup
        - crypto_larval_lookup
          - crypto_alg_lookup
            - __crypto_alg_lookup // iterates over crypto_alg_list
        - crypto_larval_wait
          - crypto_alg_lookup
            - __crypto_alg_lookup // iterates over crypto_alg_list
        - crypto_probing_notify
          - blocking_notifier_call_chain
            - cryptomgr_notify
              - cryptomgr_schedule_probe
                - cryptomgr_probe <-- switch threads!
                  - pcrypt_create
                    - pcrypt_create_aead
                      - pcrypt_init_instance
                    - aead_register_instance
                      - crypto_register_instance
- __crypto_register_alg // iterates over crypto_alg_list (+ adds to it) - crypto_alg_finish_registration // iterates over crypto_alg_list
                            - crypto_notify

I tried a bunch of stuff but unfortunately I didn't manage to come up
with a fix on my own so far, maybe it's easy for somebody who already
knows this code though.

You'll obviously need these to run the repro:

CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_AEAD=y
CONFIG_CRYPTO_PCRYPT=y
CONFIG_CRYPTO_CCM=y
CONFIG_CRYPTO_AES=y

I do think it's probably a generic template instantiation issue but I
just happened to run into it for pcrypt.


Vegard




[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]
  Powered by Linux