Lines Matching defs:sa

273 	struct iked_sa		*sa = msg->msg_sa;
285 isnatt = (msg->msg_natt || (sa && sa->sa_natt));
318 if (sa != NULL && errno == EADDRNOTAVAIL) {
319 sa_state(env, sa, IKEV2_STATE_CLOSING);
320 timer_del(env, &sa->sa_timer);
321 timer_set(env, &sa->sa_timer,
322 ikev2_ike_sa_timeout, sa);
323 timer_add(env, &sa->sa_timer,
330 if (sa == NULL)
340 if (ikev2_msg_enqueue(env, &sa->sa_responses, m,
347 if (ikev2_msg_enqueue(env, &sa->sa_requests, m,
359 ikev2_msg_id(struct iked *env, struct iked_sa *sa)
361 uint32_t id = sa->sa_reqid;
363 if (++sa->sa_reqid == UINT32_MAX) {
376 ikev2_msg_encrypt_prepare(struct iked_sa *sa, struct ikev2_payload *pld,
382 if (sa == NULL ||
383 sa->sa_encr == NULL ||
384 sa->sa_integr == NULL) {
390 blocklen = cipher_length(sa->sa_encr);
391 integrlen = hash_length(sa->sa_integr);
392 ivlen = cipher_ivlength(sa->sa_encr);
394 outlen = cipher_outlength(sa->sa_encr, encrlen);
408 ikev2_msg_encrypt(struct iked *env, struct iked_sa *sa, struct ibuf *src,
422 if (sa == NULL ||
423 sa->sa_encr == NULL ||
424 sa->sa_integr == NULL) {
429 if (sa->sa_hdr.sh_initiator)
430 encr = sa->sa_key_iencr;
432 encr = sa->sa_key_rencr;
434 blocklen = cipher_length(sa->sa_encr);
435 integrlen = hash_length(sa->sa_integr);
453 cipher_setkey(sa->sa_encr, ibuf_data(encr), ibuf_size(encr));
454 cipher_setiv(sa->sa_encr, NULL, 0); /* XXX ivlen */
455 if (cipher_init_encrypt(sa->sa_encr) == -1) {
460 if ((dst = ibuf_dup(sa->sa_encr->encr_iv)) == NULL)
464 cipher_outlength(sa->sa_encr, encrlen))) == NULL)
470 if (sa->sa_integr->hash_isaead)
471 cipher_aad(sa->sa_encr, ibuf_data(aad), ibuf_size(aad),
474 if (cipher_update(sa->sa_encr, ibuf_data(src), encrlen,
480 if (cipher_final(sa->sa_encr) == -1) {
507 ikev2_msg_integr(struct iked *env, struct iked_sa *sa, struct ibuf *src)
517 if (sa == NULL ||
518 sa->sa_encr == NULL ||
519 sa->sa_integr == NULL) {
524 integrlen = hash_length(sa->sa_integr);
531 if ((tmp = ibuf_new(NULL, hash_keylength(sa->sa_integr))) == NULL)
534 if (!sa->sa_integr->hash_isaead) {
535 if (sa->sa_hdr.sh_initiator)
536 integr = sa->sa_key_iauth;
538 integr = sa->sa_key_rauth;
540 hash_setkey(sa->sa_integr, ibuf_data(integr),
542 hash_init(sa->sa_integr);
543 hash_update(sa->sa_integr, ibuf_data(src),
545 hash_final(sa->sa_integr, ibuf_data(tmp), &tmplen);
553 if (cipher_gettag(sa->sa_encr, ibuf_data(tmp), ibuf_size(tmp)))
572 ikev2_msg_decrypt(struct iked *env, struct iked_sa *sa,
581 if (sa == NULL ||
582 sa->sa_encr == NULL ||
583 sa->sa_integr == NULL) {
589 if (!sa->sa_hdr.sh_initiator) {
590 encr = sa->sa_key_iencr;
591 integr = sa->sa_key_iauth;
593 encr = sa->sa_key_rencr;
594 integr = sa->sa_key_rauth;
597 blocklen = cipher_length(sa->sa_encr);
598 ivlen = cipher_ivlength(sa->sa_encr);
600 integrlen = hash_length(sa->sa_integr);
620 if (!sa->sa_integr->hash_isaead) {
621 if ((tmp = ibuf_new(NULL, hash_keylength(sa->sa_integr))) == NULL)
624 hash_setkey(sa->sa_integr, ibuf_data(integr),
626 hash_init(sa->sa_integr);
627 hash_update(sa->sa_integr, ibuf_data(msg),
629 hash_final(sa->sa_integr, ibuf_data(tmp), &tmplen);
654 cipher_setkey(sa->sa_encr, ibuf_data(encr), ibuf_size(encr));
655 cipher_setiv(sa->sa_encr, ibuf_seek(src, ivoff, ivlen), ivlen);
656 if (cipher_init_decrypt(sa->sa_encr) == -1) {
662 if (sa->sa_integr->hash_isaead) {
666 if (cipher_settag(sa->sa_encr, integrdata, integrlen)) {
672 if ((out = ibuf_new(NULL, cipher_outlength(sa->sa_encr,
679 if (sa->sa_integr->hash_isaead) {
683 cipher_aad(sa->sa_encr, ibuf_data(msg),
688 if (cipher_update(sa->sa_encr, ibuf_seek(src, encroff, encrlen),
698 if (cipher_final(sa->sa_encr) == -1) {
721 ikev2_check_frag_oversize(struct iked_sa *sa, struct ibuf *buf) {
727 if (sa == NULL ||
728 sa->sa_encr == NULL ||
729 sa->sa_integr == NULL) {
734 sa_fam = ((struct sockaddr *)&sa->sa_local.addr)->sa_family;
739 blocklen = cipher_length(sa->sa_encr);
740 ivlen = cipher_ivlength(sa->sa_encr);
741 integrlen = hash_length(sa->sa_integr);
744 return ((len + ivlen + blocklen + integrlen) >= max) && sa->sa_frag;
748 ikev2_msg_send_encrypt(struct iked *env, struct iked_sa *sa, struct ibuf **ep,
758 if (ikev2_check_frag_oversize(sa, e)) {
759 return ikev2_send_encrypted_fragments(env, sa, e, exchange,
763 if ((buf = ikev2_msg_init(env, &resp, &sa->sa_peer.addr,
764 sa->sa_peer.addr.ss_len, &sa->sa_local.addr,
765 sa->sa_local.addr.ss_len, response)) == NULL)
768 resp.msg_msgid = response ? sa->sa_msgid_current : ikev2_msg_id(env, sa);
771 if ((hdr = ikev2_add_header(buf, sa, resp.msg_msgid, IKEV2_PAYLOAD_SK,
778 if (ikev2_msg_encrypt_prepare(sa, pld, buf, e, hdr, firstpayload, 0) == -1)
782 if ((e = ikev2_msg_encrypt(env, sa, e, buf)) == NULL) {
790 if (ikev2_msg_integr(env, sa, buf) != 0) {
796 resp.msg_sa = sa;
797 resp.msg_fd = sa->sa_fd;
813 ikev2_send_encrypted_fragments(struct iked *env, struct iked_sa *sa,
828 if (sa == NULL ||
829 sa->sa_encr == NULL ||
830 sa->sa_integr == NULL) {
836 sa_fam = ((struct sockaddr *)&sa->sa_local.addr)->sa_family;
841 blocklen = cipher_length(sa->sa_encr);
842 ivlen = cipher_ivlength(sa->sa_encr);
843 integrlen = hash_length(sa->sa_integr);
851 msgid = response ? sa->sa_msgid_current : ikev2_msg_id(env, sa);
854 if ((buf = ikev2_msg_init(env, &resp, &sa->sa_peer.addr,
855 sa->sa_peer.addr.ss_len, &sa->sa_local.addr,
856 sa->sa_local.addr.ss_len, response)) == NULL)
862 if ((hdr = ikev2_add_header(buf, sa, resp.msg_msgid,
886 if (ikev2_msg_encrypt_prepare(sa, pld, buf, e, hdr,
890 if ((e = ikev2_msg_encrypt(env, sa, e, buf)) == NULL) {
898 if (ikev2_msg_integr(env, sa, buf) != 0) {
909 resp.msg_sa = sa;
910 resp.msg_fd = sa->sa_fd;
939 ikev2_msg_auth(struct iked *env, struct iked_sa *sa, int response)
951 if ((nonce = sa->sa_rnonce) == NULL ||
952 (sa->sa_iid.id_type == 0) ||
953 (prfkey = sa->sa_key_iprf) == NULL ||
954 (buf = sa->sa_1stmsg) == NULL)
956 id = &sa->sa_iid;
958 if ((nonce = sa->sa_inonce) == NULL ||
959 (sa->sa_rid.id_type == 0) ||
960 (prfkey = sa->sa_key_rprf) == NULL ||
961 (buf = sa->sa_2ndmsg) == NULL)
963 id = &sa->sa_rid;
971 if ((hash_setkey(sa->sa_prf, ibuf_data(prfkey),
976 if (hash_keylength(sa->sa_prf) != hash_length(sa->sa_prf))
979 if ((ptr = ibuf_reserve(authmsg, hash_keylength(sa->sa_prf))) == NULL)
982 hash_init(sa->sa_prf);
983 hash_update(sa->sa_prf, ibuf_data(id->id_buf), ibuf_size(id->id_buf));
984 hash_final(sa->sa_prf, ptr, &tmplen);
986 if (tmplen != hash_length(sa->sa_prf))
1002 ikev2_msg_authverify(struct iked *env, struct iked_sa *sa,
1012 if (sa->sa_hdr.sh_initiator)
1013 id = &sa->sa_rcert;
1015 id = &sa->sa_icert;
1017 if ((dsa = dsa_verify_new(auth->auth_method, sa->sa_prf)) == NULL) {
1028 if ((keylen = ikev2_psk(sa, auth->auth_data,
1060 sa_state(env, sa, IKEV2_STATE_AUTH_SUCCESS);
1061 sa_stateflags(sa, IKED_REQ_AUTHVALID);
1064 sa_state(env, sa, IKEV2_STATE_AUTH_REQUEST);
1075 ikev2_msg_authsign(struct iked *env, struct iked_sa *sa,
1080 struct iked_hash *prf = sa->sa_prf;
1087 if (sa->sa_hdr.sh_initiator)
1088 id = &sa->sa_icert;
1090 id = &sa->sa_rcert;
1103 if ((keylen = ikev2_psk(sa, auth->auth_data,
1129 ibuf_free(sa->sa_localauth.id_buf);
1130 sa->sa_localauth.id_buf = NULL;
1151 sa->sa_localauth.id_type = auth->auth_method;
1152 sa->sa_localauth.id_buf = buf;
1165 struct iked_sa *sa = msg->msg_sa;
1170 if (sa == NULL ||
1174 if (!sa->sa_hdr.sh_initiator &&
1177 else if (sa->sa_hdr.sh_initiator &&
1279 ikev2_msg_retransmit_response(struct iked *env, struct iked_sa *sa,
1285 if ((mr = ikev2_msg_lookup(env, &sa->sa_responses, msg,
1293 log_debug("%s: ignoring fragment", SPI_SA(sa, __func__));
1296 log_debug("%s: first fragment", SPI_SA(sa, __func__));
1309 SPI_SA(sa, NULL),
1325 struct iked_sa *sa;
1327 sa = TAILQ_FIRST(&mr->mrt_frags)->msg_sa;
1328 ikev2_msg_dispose(env, &sa->sa_responses, mr);
1336 struct iked_sa *sa = msg->msg_sa;
1346 ikev2_ike_sa_setreason(sa, "retransmit failed");
1347 sa_free(env, sa);
1352 "local %s", SPI_SA(sa, NULL), mr->mrt_tries + 1,
1365 ikev2_ike_sa_setreason(sa, "retransmit limit reached");
1367 sa_free(env, sa);